C# .NET - PDFsharp 和 MigraDoc - 无处不在的字体 - 巨大的文件大小
C# .NET - PDFsharp & MigraDoc - Fonts Embedded Everywhere - Massive File Size
我正在使用 PDFsharp 和 MigraDoc 开发 PDF 打印处理器。我正在生成包含 2,000 到 10,000 页的合并 PDF。打印从该程序生成的 PDF 的打印供应商抱怨文件大小和处理 PDF 所需的时间,因为所有嵌入的字体。我查看了 Adobe 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 and/or MigraDoc 来防止嵌入字体,或者知道解决此问题的另一个好方法?
如果您使用 PDFsharp 或 MigraDoc 创建一个新文档,那么每个 PDF 文件中的每种字体都应该只嵌入一次,无论有多少页,无论有多少元素使用一种字体。
如果您创建 1000 个 PDF 文档,每个文档一页,并将它们合并为一个 1000 页的文档,那么您将拥有 1000 个字体副本。使用 PDFsharp 合并 PDF 文档时未进行大小优化。
因此,创建一个包含所有页面的文档 运行.
您写道:"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 文件中的字体没有影响。
我正在使用 PDFsharp 和 MigraDoc 开发 PDF 打印处理器。我正在生成包含 2,000 到 10,000 页的合并 PDF。打印从该程序生成的 PDF 的打印供应商抱怨文件大小和处理 PDF 所需的时间,因为所有嵌入的字体。我查看了 Adobe 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 and/or MigraDoc 来防止嵌入字体,或者知道解决此问题的另一个好方法?
如果您使用 PDFsharp 或 MigraDoc 创建一个新文档,那么每个 PDF 文件中的每种字体都应该只嵌入一次,无论有多少页,无论有多少元素使用一种字体。
如果您创建 1000 个 PDF 文档,每个文档一页,并将它们合并为一个 1000 页的文档,那么您将拥有 1000 个字体副本。使用 PDFsharp 合并 PDF 文档时未进行大小优化。
因此,创建一个包含所有页面的文档 运行.
您写道:"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 文件中的字体没有影响。