C# MigraDoc/PDFsharp使用中文YaHei字体引发异常

C# MigraDoc/PDFsharp使用中文YaHei字体引发异常,c#,pdf,pdfsharp,migradoc,C#,Pdf,Pdfsharp,Migradoc,最近,在将我们的网站从Windows Server 2008移至Server 2016之后,我们开始面临从使用MigraDoc/PDFsharp库的C#代码导出PDF文档的问题。 这个问题也可以在windows 10上重现。完全相同的代码在Windows 7上运行良好,或者如前所述,在server 2016之前的任何服务器操作系统上运行良好。 以前我们遇到过这样的例外情况: 分析OpenType字体时出错。 InnerException:InvalidOperationException:字体没

最近,在将我们的网站从Windows Server 2008移至Server 2016之后,我们开始面临从使用MigraDoc/PDFsharp库的C#代码导出PDF文档的问题。
这个问题也可以在windows 10上重现。完全相同的代码在Windows 7上运行良好,或者如前所述,在server 2016之前的任何服务器操作系统上运行良好。
以前我们遇到过这样的例外情况:

分析OpenType字体时出错。 InnerException:InvalidOperationException:字体没有可用的 平台或编码ID。它不能与PDFsharp一起使用

因此,我们尝试将引用升级到最新的程序集版本,但现在出现了不同的错误:

PDFsharp尚不支持TrueType集合字体

请不要仓促行事,并将此标记为其他一些问题的副本,其中汉字显示为正方形或???在导出的PDF中。这不是字体嵌入问题。与此不同。在Windows 10和Server 2016上,如果您尝试使用Microsoft Ya Hei(微软雅黑) font然后它就不工作了。奇怪的是,在迁移到Server 2016之前,使用相同的代码和相同的版本程序集,一切都正常工作。下面是一个没有工具的相关代码

.
.
.
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
.
.

Document document = new Document();
document.Info.Title = "Report";
document.Styles["Normal"].Font.Name = "微软雅黑";   // Microsoft YaHei Chinese Font

Section section = document.AddSection();
document.LastSection.AddParagraph("### This font is: 微软雅黑");

PdfDocumentRenderer renderer = new PdfDocumentRenderer(true);
renderer.Document = document;

renderer.RenderDocument();
renderer.PdfDocument.Save(@"Test.pdf");

有人能帮我了解更大的情况吗:中文字体发生了什么变化?这里到底发生了什么?

错误消息告诉我:字体集合(extension.ttc)还不受支持,TrueType字体(extension.ttf)受支持

因此,解决方法可能是使用旧版本Windows中的字体文件,因为它们似乎与当前版本的PDFsharp兼容。
在Windows的字体文件夹中安装旧版本Windows的字体时可能会出现问题。
PDFsharp/MigraDoc的WPF版本的
ifontesolver
接口允许使用计算机上未安装的字体。也许可以尝试使用EZFontResolver使其保持简单:forum.PDFsharp.net/viewtopic.php?f=8&t=3244


添加对字体集合的支持似乎不是很复杂,但必须有人来实现它。当前版本1.50.4845-RC2a还不支持它们。

根本原因是字体更改为ttcf格式。 在windows中,有两种字体:TrueType,扩展名为.ttf.;TrueType Collection,扩展名为ttc。您可以转到\windows\Fonts文件夹,列出字体文件以使其有效。字体文件应为msyh.ttc

PdfSharp使用GetFontData Windows API获取字体数据

// Get size of the font file.
bool isTtcf = false;
int size = NativeMethods.GetFontData(hdc, 0, 0, null, 0);
if (size == NativeMethods.GDI_ERROR)
{
     // Assume that the font file is a true type collection.
     size = NativeMethods.GetFontData(hdc, ttcf, 0, null, 0);
     isTtcf = true;
}

byte[] bytes = new byte[size];
int effectiveSize = NativeMethods.GetFontData(hdc, isTtcf ? ttcf : 0, 0, bytes, size);
见:

但是,Windows API无法按预期工作。如果字体为ttcf,Windows API不会返回GDI_错误,它将返回偏移量错误的无效truetype数据

GetFontData Windows API不确定返回的数据是TrueType文件的完整数据,还是TrueType字体集合的一部分。更糟糕的是。 见:


这是根本原因。

我从Windows 7复制了msyh.ttf文件,并试图在Windows 10上安装它,此时会显示一条消息Microsoft YaHei已安装。如果您仍尝试继续安装,则会显示成功安装。但最终结果相同,您仍然会收到与TTC相关的错误。@dNyaanopasak PDFsharp/MigraDoc的WPF版本的
ifontesolver
界面允许使用计算机上未安装的字体。请尝试
ezfontsolver
以保持简单:谢谢,包括来自Windows 7的“msyh.ttf”文件和“ezfontsolver.cs”使用上述链接中的文件,只添加了3行代码。谢谢。EZFontResolver fontResolver=EZFontResolver.Get;GlobalFontSettings.fontResolver=fontResolver;fontResolver.AddFont(“微软雅黑", XFontStyle.Regular,@“.\..\msyh.ttf”,true,true);