我有一个Pdf,其字体存储在Document的/ Pages级别的/ Resources字典中,以便它们可以重复用于每个页面。这似乎实现了两件事:当然正确显示,但文件大小也较小。当使用iText从这个Pdf复制页面时,我注意到,无论使用更高级别或更低级别的功能(例如PdfPage的copyTo或copyFormAsXObject),生成的Pdf都没有这个特性 - 相反,资源存储在每个单独的页面上。
在进行页面复印时,有没有特别的理由说明为什么不遵守这一规定?
此外,我自己试图这样做,但似乎没有任何方法可以将资源放在文档的页面上。我可以在PdfPages上使用.put方法为单个页面执行此操作,但是对于PdfDocument,它似乎并不等同。有没有办法使用iText创建具有此结构的PdfDocument?
答案 0 :(得分:1)
您不必担心膨胀PDF。资源作为间接对象添加到资源字典中。这意味着资源字典将保留对实际资源对象的引用,并且不需要将其嵌入到字典中。这是PDF的/ Pages条目:
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
>>
>>
>>
&#34; / FAAAAH 7 0 R&#34; line表示字体FAAAAH是对象#7。如您所见,资源字典仅保留对字体对象的引用(7 0 R)。实际的字体对象位于PDF中的其他位置。每个PDF阅读器和解析器都知道如何访问对象#7。
如果您在复制或合并时遇到膨胀,那么PDF可能包含两次字体,而不是仅包含一次,并且有两次引用。 / Resources的位置与文件的膨胀没有任何关系,它是PDF中增加膨胀的内容。
您可以通过在smartmode中运行PdfWriter来解决这个问题:
pdfWriter.setSmartMode();
我们将研究为什么iText不会复制继承。