如何在PDFSharp中使用私有字体

时间:2015-03-11 20:17:32

标签: c# wpf fonts pdfsharp

我正在尝试使用私有文本添加文本到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方法中的变量有:

  1. 找到字体系列,即this.family != null
  2. 找到字体,即this.typeface != null
  3. 我假设它在if (!typeface2.TryGetGlyphTypeface(out typeface))行中断,但我无法确定。

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

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

    更新

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

3 个答案:

答案 0 :(得分:5)

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

如果您想使用私人字体,即您系统上尚未安装的字体,使用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)字体很好。
  6. 注意:在字体名称上,在Windows中找到它的最佳方法是双击字体文件。 Windows然后会在第一行显示名称中带有名称的字体。正如我所说,做错了,你可以得到一个停滞不前的系统。

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

    更新

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

答案 1 :(得分:4)

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

GlobalFontSettings.FontResolver = new DemoFontResolver();

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

IFontResolver界面需要两种方法:ResolveTypefaceGetFont

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

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

答案 2 :(得分:2)

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

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

另见:
https://stackoverflow.com/a/21545488/1015447

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