2017-07-21 63 views
0

我正在使用PDFsharp的PDF打印處理器& MigraDoc。我正在生成合並的PDF,其中包含2,000到10,000頁。打印此程序生成的PDF的打印供應商抱怨文件大小以及由於所有嵌入字體而導致處理PDF所用的時間量。我在Adobe Acrobat Reader DC中查看了嵌入式字體,可以看到有大量完全嵌入的字體和子集。C#.NET - PDFsharp&MigraDoc - 無處不在的字體 - 海量文件大小

在整個文檔中只使用了兩種字體,但看起來每個頁面上的每個元素在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來保持嵌入字體,或知道這個問題的另一個很好的解決方案?

回答

0

如果您使用PDFsharp或MigraDoc創建新文檔,則無論有多少頁面,每個PDF文件只應嵌入一次字體,無論有多少元素使用字體。

如果您創建1000頁PDF文檔,並將它們合併到1000頁的一個文檔中,那麼您將擁有1000份字體副本。使用PDFsharp合併PDF文檔時,不會進行大小優化。
因此,在一次運行中創建一個包含所有頁面的文檔。

你寫道:「所以說,如果頁面上有10個元素,並且有10000個頁面,那就是20,000個嵌入字體集。這不應該發生,根據我的經驗,在單次運行中創建一個包含10,000頁的文檔時不會發生這種情況。
PDFsharp可以用來合併PDF文件,但是你會得到重複的字體。

您提到的字體嵌入選項適用於正在添加到PDF文件的新內容。它們對已經嵌入在合併或修改的PDF文件中的字體沒有影響。

+0

謝謝你的回答。它效果很好。把我的一個較大的PDF從幾乎1GB降到18MB。客戶非常高興。 – shaneOverby