2017-08-13 699 views
1

我有一個文件夾,其中多個客戶端上傳多個PDF文件。其中一些正在使用嵌入式字體,有些則不。
我一直在努力優化(在文件大小方面)該文件夾中的PDF文件的服務。
每個用戶可能上傳大約400個文件,重量介於80K到10M之間,我的任務是優化所有文件,儘可能減小文件大小,減少質量損失。如何檢查PDF文件是否使用嵌入字體?

PDF庫在這方面做得很好。我唯一的問題是,我無法從所有文件中刪除所有嵌入的字體,因爲某些文件可能會使用這些字體,結果將成爲我無法使用的文件。

所以我的問題是:

  1. 我如何檢測哪些文件使用,哪些文件不使用嵌入字體?
  2. 優化使用嵌入字體的文件時,如何才能刪除未使用的字體?

我想要實現的是從大多數文件中刪除所有嵌入字體,但將嵌入字體保留在實際需要它們的文件中。我知道這取決於我在我的系統中使用的字體(這些文件應該保留在一個系統中,因此可移植性對我來說並不重要),所以我試圖找到一種方法來在優化之前識別哪些文件看起來OK沒有嵌入字體,以及我需要保留嵌入字體的文件。

+0

的建議@mjwills感謝。我想這可能是可能的,但我有點希望避免使用多個第三方課程。 PDF庫是由Adobe編寫的,已經支付了,所以我希望我可以得到一個解決方案,只基於此... –

+0

@mjwills對不起,但沒有。首先,我正在尋找一種方法來刪除未使用的嵌入字體,而不是添加嵌入字體(如您提供的鏈接的註釋中的描述),其次,我不會說cpp ... –

+0

我不喜歡不認爲第一個可用,但第二個是(我可以得到一個嵌入式字體列表)。但是,這不是問題。從該列表中我想知道是否在文檔中沒有使用嵌入字體,以便我可以刪除它們,或者更好,然後查明是否可以安全地刪除所有嵌入字體。我的目標是最小化文件大小,所以如果我能從哪些文件中找到可以安全刪除所有嵌入字體的文件,它可以對輸出文件產生非常顯着的影響。 –

回答

0

APDFL有一個PDFontIsEmbedded()調用。 DotNet接口的Font類具有Embedded屬性。使用GarbageCollect SaveFlag保存應該刪除任何未引用的間接對象,包括字體。

請注意,資源字典可能會被多個頁面共享,以便一個頁面未使用的字體可能被另一個使用相同資源字典的頁面使用。

+0

謝謝,明天我會試一試。我可能會有後續問題,但這看起來很有希望。 –

+0

我編輯了我的問題來解釋我想要做的更好一點。請檢查。 –

+0

不幸的是,我只能在保存文檔時使用保存標誌,我沒有找到任何方式將其與PDFOptimizer一起使用。 –

0

Adob​​e PDF Library 15及更高版本有一項服務可以爲您優化PDF文件。

優化器具有對所有嵌入字體進行子集的功能。這將做的是創建一個字體的子集,僅限於文檔實際使用的字體的字形。 API如下。

void Datalogics::PDFL::PDFOptimizer::SetOption (OptimizerOption option, bool value) 
void Datalogics::PDFL::PDFOptimizer::Optimize (Document document, string newPath) 

這是選項,你需要

SubsetAllEmbeddedFonts  
+0

謝謝,我已經將它設置爲true,但即使在刪除所有嵌入字體後,文件看起來仍然可用,但此選項與「RemoveAllEmbeddedFonts」選項不具有相同的文件大小的顯着效果。 –

+0

我編輯了我的問題來解釋我想要做的更好一點。請檢查。 –

相關問題