我正在尝试使用私有文本添加文本到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。一切都运转良好。
答案 0 :(得分:5)
好的,对此的答案相当复杂,但如果它能帮助其他人,那么这就是答案。
如果您想使用私人字体,即您系统上尚未安装的字体,使用PDFSharp,则需要执行以下操作。
目前,2015年3月,唯一发布的使用私有字体的NuGet库是PDFsharp + MigraDoc(WPF)1.32.2608版本。 1.50有很多beta版本,但这个答案大约是1.32版本。
Debugger.Break
而不是一个例外,在发布的代码中它只是停顿 - 在我的单元测试中我必须关闭Visual Studio才能摆脱它!注意:在字体名称上,在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界面需要两种方法:ResolveTypeface
和GetFont
。
更多信息可以在我的博客文章中找到:
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