如何在 PDFSharp 中使用私有字体

How to use private fonts in PDFSharp

我正在尝试使用私有字体(即未安装在系统上的 TrueType 字体)将文本添加到 PDF 文档,但遇到了问题。我正在使用 NuGet 的 PDFSharp + MigraDoc WPF 版本 1.32.2608.0。

我在论坛和 Whosebug 上发现了很多项目。最新的是 PdfSharp 网站上的 this Whosebug article which refers to 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 方法中的变量有:

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

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

注意:我试过 .ttf 和 .otf 字体都无济于事。

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

更新

最后我换成 PDFSharp WPF 1.50 beta as its font handling is MUCH better. See this on my second issues and information on the new font resolver 解决了我的问题。现在一切正常。

回复 "line 22":PDFsharp 论坛仅显示示例中的一个片段。

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

另请参阅:

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

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

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

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

  1. 您必须使用 1.32 的 WPF 版本,而不是 GDI+ 版本。
  2. 我发现 PDFSharp 页面中名为“Private Fonts”的代码具有误导性。根据 ThomasH 的说法,PDFSharp 团队希望人们下载该示例,该示例中有一段非常不同的代码。
  3. 可以在 http://forum.pdfsharp.net/viewtopic.php?f=2&t=1880#p5395 找到有关如何编写代码的最佳示例。
    注意:作者关于两次加载字体导致异常的说明是正确的。他处理这个问题的方法有效,但速度很慢。我预先扫描我所有的字体并按名称对它们进行分组,以便只添加一次。
  4. 非常注意字体的名称(见末尾的注释)。很容易把名字弄错,如果弄错了,就会惹上各种各样的麻烦。发布的 NuGet 版本有一个令人讨厌的 Debugger.Break 而不是异常,在发布的代码中它只是停滞不前 - 在我的单元测试中我必须关闭 Visual Studio 才能摆脱它!
  5. 请注意,TrueType (.ttf) 字体可以采用 MAC 或 Windows 格式 - 这让我很吃惊。 OpenType (.otf) 字体很好。

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

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

更新

最后我换成了 PDFSharp WPF 1.50 beta as its font handling is MUCH better. See this on my problem and information on the new font resolver 这很有帮助。

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

GlobalFontSettings.FontResolver = new DemoFontResolver();

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

IFontResolver 接口需要两个方法:ResolveTypefaceGetFont

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

那里以 ZIP 文件的形式提供了完整的解决方案。