如何在PDFSharp中使用私有字体

Jon*_*ith 4 c# wpf fonts pdfsharp

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

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

this.fontFamilies.Add(key, fontFamily);
Run Code Online (Sandbox Code Playgroud)

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

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

var font = new XFont(fontStyle.Name, new XUnit(fontStyle.SizePt, XGraphicsUnit.Point), XFontStyle.Regular, _fontOptions);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

更新

最后我换成了PDFSharp WPF 1.50 beta,因为它的字体处理要好得多.请参阅我在第二期的SO帖子以及解决我的问题的新字体解析器的信息.现在一切都运转良好.

Jon*_*ith 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)字体很好.

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

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

更新

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


Je *_*not 5

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

GlobalFontSettings.FontResolver = new DemoFontResolver();
Run Code Online (Sandbox Code Playgroud)

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

IFontResolver 接口需要两个方法:ResolveTypefaceGetFont

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

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