首页 文章

C#.NET - PDFsharp和MigraDoc - 无处不在的字体 - 大规模文件大小

提问于
浏览
1

我正在使用PDFsharp和MigraDoc开发PDF打印处理器 . 我正在生成合并的PDF,包含2,000到10,000页 . 正在打印从该程序生成的PDF的打印供应商抱怨文件大小以及由于所有嵌入字体而处理PDF所花费的时间 . 我在Adobe Acrobat Reader DC中查看了嵌入字体,可以看到有大量完全嵌入的字体和子集 .

整个文档中只使用了两种字体,但看起来每个页面上的每个元素都嵌入了这两种字体 . 所以,就是说,如果一个页面上有10个元素,并且有10,000个页面,那就是20,000个嵌入字体集 .

我看到的第一件事是PDFsharp和MigraDoc中使用的字体选项 . 有一个字体嵌入选项 .

var renderer = new PdfDocumentRenderer(true, PdfFontEmbedding.None);

var options = new XPdfFontOptions(PdfFontEmbedding.None);

using (var gfx = XGraphics.FromPdfPage(currentPage))//currentPage is of type PdfPage
{
    gfx.MFEH = PdfFontEmbedding.None;
    ...

最初这些嵌入选项设置为 PdfFontEmbedding.Always ,但我将它们更改为 .None ,希望问题能够得到解决 . 事实并非如此 . 事实上,没有任何改变 . 嵌入的字体数量仍然相同,大小相同 .

打印供应商打电话给我,告诉我他已经取得了PDF,将其转换为postscript,然后再转换为PDF,文件大小减少了三分之二,所有字体嵌入都消失了 .

对于我对postscript的了解(基本上没什么),我假设字体不再嵌入,因为文件是某种矢量格式或某种东西而且文本不再能够被选中 . 我想这对客户或供应商来说不是问题 . 他们似乎对将生成的PDF转换为postscript文件然后再转换为PDF的想法感到满意 .

所以,我一直在研究在C#中进行这些转换的可能方法,但是并没有真正发现它 . 我看过一些关于使用Ghostscript或Ghostscript.Net的事情 . 关于这些的文档非常缺乏,我没有看到任何好的例子 .

有没有人知道进行这些转换的好方法,使用PDFsharp和/或MigraDoc来防止嵌入字体,或者知道这个问题的另一个好方法?

1 回答

  • 1

    如果使用PDFsharp或MigraDoc创建新文档,则无论有多少个元素使用字体,每个PDF文件只应嵌入一次,无论有多少页 .

    如果您创建1000个PDF文档,每个文档有一个页面,并将它们合并到一个包含1000页的文档,那么您将拥有1000个字体副本 . 将PDF文档与PDFsharp合并时,不会进行大小优化 .
    因此,在一次运行中创建一个包含所有页面的文档 .

    您写道:"So, just say, if there are 10 elements on a page and there are 10,000 pages, that's 20,000 embedded font sets."这不应该发生,根据我的经验,在一次运行中创建一个包含10,000页的文档时不会发生这种情况 .
    PDFsharp可用于合并PDF文件,但随后您将获得重复的字体 .

    您提到的字体嵌入选项适用于添加到PDF文件的新内容 . 它们对已嵌入到合并或修改的PDF文件中的字体没有影响 .

相关问题