首页 文章

如何在PDFSharp中使用私有字体

提问于
浏览
4

我试图使用私有文本添加文本到PDF文档,即没有安装在系统上,TrueType字体和麻烦 . 我正在使用NuGet的PDFSharp MigraDoc WPF版本1.32.2608.0 .

我在论坛和StackOverFlow上找到了很多项目 . 最新的是this stackoverflow文章,它引用了PdfSharp网站上的this example . 但是,此示例包含以下代码:

this.fontFamilies.Add(key, fontFamily);

在第22行,但我在汇编中找不到任何对fontFamilies的引用 .

因此,我遵循了看似excellent example的内容,但它对我不起作用 . 当我使用这种方法时,我可以成功添加字体但是当我来使用命令时:

var font = new XFont(fontStyle.Name, new XUnit(fontStyle.SizePt, XGraphicsUnit.Point), XFontStyle.Regular, _fontOptions);

fontStyle.Name 是前面没有#的字体名称 . 此时,PdfSharp在PdfSharp.Drawing命名空间内的 private void Initialise() 方法内部中断 .

此时检查 Initialise 方法中的变量它具有:

  • 找到字体系列,即 this.family != null

  • 找到字体,即 this.typeface != null

我假设它突破 if (!typeface2.TryGetGlyphTypeface(out typeface)) 但我无法确定 .

注意:我已经尝试过.ttf和.otf字体无济于事 .

有人能指出我正确的方向吗?

更新

最后我交换到了PDFSharp WPF 1.50 beta,因为它的字体处理要好得多 . 请参阅SO post关于我的第二个问题以及new font resolver上解决了我的问题的信息 . 现在一切都运转良好 .

3 回答

  • 5

    好吧,答案是相当复杂的,但如果它能帮助别人,那么这就是答案 .

    如果要使用私有字体(即系统上尚未安装的字体)和PDFSharp,则需要执行以下操作 .

    目前,2015年3月,唯一发布的使用私有字体的NuGet库是PDFsharp MigraDoc(WPF)1.32.2608版本 . 1.50有很多beta版本,但这个答案大约是1.32版本 .

    • 您必须使用1.32的WPF版本,而不是GDI版本 .

    • 我发现PDFSharp页面中名为'Private Fonts'的代码具有误导性 . 根据ThomasH的说法,PDFSharp团队希望人们下载样本,样本中的代码片段非常不同 .

    • 如何编写代码的最佳示例可以在http://forum.pdfsharp.net/viewtopic.php?f=2&t=1880#p5395找到 .
      Note: 作者关于加载字体两次的说明导致异常是正确的 . 他的处理方法很有效,但速度很慢 . 我预扫描所有字体并按名称对它们进行分组,以便只添加一次 .

    • Be VERY careful about the name of the font (见末尾的注释) . 很容易让名字出错,如果你这样做,你会遇到各种各样的麻烦 . 发布的NuGet版本有一个讨厌的 Debugger.Break 而不是异常,在发布的代码中它只是停顿 - 在我的单元测试中我必须关闭Visual Studio才能摆脱它!

    • 请注意,TrueType(.ttf)字体可以采用MAC或Windows格式 - 这让我感到震惊 . OpenType(.otf)字体很好 .

    NOTE: 在字体名称上,在Windows中查找它的最佳方法是双击字体文件 . Windows然后会在第一行显示名称中带有名称的字体 . 正如我所说,做错了,你可以得到一个停滞不前的系统 .

    最后,我要感谢@ThomasH,他指导我使用PDFSharp 1.32源代码 . 这有私有字体的'proper'示例,并且没有那令人讨厌的 Debugger.Break ,但是当您要求的字体名称不存在时,这是正确的例外 .

    更新

    最后我交换到了PDFSharp WPF 1.50 beta,因为它的字体处理要好得多 . 关于我的问题和有关new font resolver的信息,请参阅SO post .

  • 2

    And for PDFsharp 1.50 您必须实现 IFontResolver 接口并将您的实现分配给全局PDFsharp属性 .

    GlobalFontSettings.FontResolver = new DemoFontResolver();
    

    PDFsharp提供了一个FontResolverBase类,您可以使用它来派生自己的类 . 只需为您的私有字体添加代码,并将调用传递给其他字体的基类 .

    IFontResolver接口需要两种方法: ResolveTypefaceGetFont .

    更多信息可以在我的博客文章中找到:
    http://developer.th-soft.com/developer/?p=11

    这里提供了一个完整的解决方案作为ZIP文件 .

  • 4

    重新“第22行”:PDFsharp论坛只显示示例中的一个片段 .

    For PDFsharp 1.3x: 您可以从CodePlex或SourceForge下载完整的示例代码,其中包含完整的工作示例(包括项目,解决方案,示例TTF文件) .

    也可以看看:
    https://stackoverflow.com/a/21545488/1015447

    版本1.32的完整源代码:
    http://pdfsharp.codeplex.com/releases

相关问题