如何在PDFSharp中使用私有字体

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

我在论坛和StackOverFlow上找到了很多项目。 最新的是这篇stackoverflow文章,它引用了PdfSharp站点上的这个例子 。 但是,此示例包含以下代码:

this.fontFamilies.Add(key, fontFamily); 

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

因此,我遵循了看起来很好的例子 ,但它对我不起作用。 当我使用这种方法时,我可以成功添加字体但是当我来使用命令时:

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

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

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

  1. 找到了字体系列,即this.family != null
  2. 找到了字体,即this.typeface != null

我假设它在线上断开if (!typeface2.TryGetGlyphTypeface(out typeface))但我不能确定。

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

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

更新

最后我换成了PDFSharp WPF 1.50 beta,因为它的字体处理要好得多。 在我的第二个问题上看到这篇SOpost ,以及解决我问题的新字体解析器的信息。 现在一切都很好。

好吧,对此的答案相当复杂,但如果它对其他人有帮助,那么这就是答案。

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

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

  1. 您必须使用1.32的WPF版本,而不是GDI +版本。
  2. 我在PDFSharp页面中发现名为“ 私有字体 ”的代码具有误导性。 根据ThomasH的说法,PDFSharp团队希望人们下载样本,样本中的代码片段非常不同。
  3. 有关如何编写代码的最佳示例,请访问http://forum.pdfsharp.net/viewtopic.php?f=2&t=1880#p5395 。
    注意:作者关于加载字体两次的说明导致exception是正确的。 他的处理方法很有效,但速度很慢。 我预扫描所有字体并按名称分组,以便只添加一次。
  4. 非常小心字体的名称 (请参阅结尾处的注释)。 很容易让名字出错,如果你这么做,你会遇到各种各样的麻烦。 发布的NuGet版本有一个令人讨厌的Debugger.Break而不是exception,并且在发布的代码中它只是停顿 – 在我的unit testing中我必须关闭Visual Studio才能摆脱它!
  5. 请注意,TrueType(.ttf)字体可以采用MAC或Windows格式 – 这让我感到震惊。 OpenType(.otf)字体很好。

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

最后,我要感谢@ThomasH,他指导我使用PDFSharp 1.32源代码。 这有私有字体的’正确’示例,也没有那个讨厌的Debugger.Break但是当你要求的字体名称不存在时,这是正确的例外。

更新

最后我换成了PDFSharp WPF 1.50 beta,因为它的字体处理要好得多。 关于我的问题和有关新帮助的字体解析器的信息,请参阅此SOpost 。

对于PDFsharp 1.50,您必须实现IFontResolver接口并将您的实现分配给全局PDFsharp属性。

 GlobalFontSettings.FontResolver = new DemoFontResolver(); 

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

IFontResolver接口需要两个方法: ResolveTypefaceGetFont

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

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

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

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

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

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