2016-09-09 34 views
1

我對他們進行重新用於每個頁面上已經儲存在該文件的/頁水平/資源字典爲了字體的PDF文件。這似乎達到2件事:當然適當的顯示,但也是一個較小的文件大小。當利用iText從這個PDF文檔的頁面,我注意到,無論使用更高級別或更低級別的功能(如PdfPage的CopyTo用於或copyFormAsXObject),生成的PDF不具備的特性 - 的資源,而不是存儲在每個個人頁面。iText的不復制的資源字典從/頁PDF文檔

有什麼特別的原因,這是不堅持做頁複印時?

此外,我試圖做這自己,但似乎沒有是把資源在頁文檔的任何方式。我可以使用PdfPages上的.put方法爲單個頁面執行此操作,但對於PdfDocument,似乎並不是等價的。有沒有一種方法可以創建一個使用iText的這種結構的PdfDocument?

回答

1

你不必擔心你的腹脹PDF。資源將作爲間接對象添加到您的資源字典中。這意味着資源字典將保留對實際資源對象的引用,並且不需要將其嵌入到字典中。這裏的一個PDF的/頁條目:

3 0 obj 
<< 
    /Type /Pages 
    /Count 3 
    /Kids [5 0 R 13 0 R 23 0 R ] 
    /Resources << 
     /Font << 
      /FAAAAH 7 0 R 
      /FAAABG 16 0 R 
     >> 
     /ExtGState << 
      /GS1 15 0 R 
      /GS2 21 0 R 
      /GS3 25 0 R 
     >> 
    >> 
>> 

在「/ FAAAAH 7 0 R」行表示字體FAAAAH是對象#7。可以看到資源字典只保持一個參考(7 0 R)到字體對象。實際的字體對象位於PDF中的其他位置。每個PDF閱讀器和解析器都知道如何訪問對象#7。

如果您在複製或合併時遇到膨脹,那麼PDF可能包含字體兩次而不是一次,並且有兩次引用。/Resources的位置與文件的膨脹沒有任何關係,這是PDF內部增加了膨脹的內容。

您可以通過在智能模式運行PdfWriter在iText的解決這個:

我們會調查的iText爲何不復制繼承。

+1

「嚴格來說有不應該在/頁水平/資源字典」 - 這是不對的。 **資源**在PDF規範中被標記爲「可繼承」,*完全[在**頁**字典中]省略條目表示資源應從頁樹中的祖先節點繼承。例外情況是線性化的PDF:*在符合線性化PDF組織的文檔中(見附錄F),所有頁面屬性應明確指定爲它們所應用的頁面詞典中的條目;他們不應該從祖先節點繼承。* – mkl

+0

我編輯了我的答案以反映您的評論。 –