【问题标题】:C# .NET - PDFsharp & MigraDoc - Fonts Embedded Everywhere - Massive File SizeC# .NET - PDFsharp 和 MigraDoc - 随处嵌入的字体 - 巨大的文件大小
【发布时间】:2017-12-27 20:22:51
【问题描述】:

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

整个文档中只使用了两种字体,但看起来 PDF 中的每个元素、每个页面上都嵌入了这两种字体。所以,只要说,如果一个页面上有 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 来防止字体被嵌入,或者知道解决这个问题的另一个好方法吗?

【问题讨论】:

    标签: c# .net fonts pdfsharp migradoc


    【解决方案1】:

    如果您使用 PDFsharp 或 MigraDoc 创建一个新文档,那么每个 PDF 文件中的每种字体都应该只嵌入一次,无论有多少页,无论有多少元素使用一种字体。

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

    您写道:“所以,只要说,如果一个页面上有 10 个元素并且有 10,000 个页面,那就是 20,000 个嵌入字体集。”这不应该发生,根据我的经验,在一次运行中创建包含 10,000 页的文档时不会发生这种情况。
    PDFsharp 可以用来合并 PDF 文件,但是你会得到重复的字体。

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

    【讨论】:

    • 感谢您的回答。效果很好。将我的一个较大的 PDF 从近 1gb 减少到 18mb。客户很高兴。
    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多