我有一个Pdf,它的字体存储在文档的/Pages级别的/Resources字典中,以便它们可以在每个页面上重复使用。这似乎实现了两件事:正确的显示,当然也是一个较小的文件大小。当使用iText从这个Pdf复制页面时,我注意到,无论使用高级还是低级函数(比如PdfPage的copyTo或copyFormAsXObject),生成的Pdf都不具有这种特性——资源被存储在每个单独的页面上。
在进行页面复制时,是否有什么特别的原因导致没有遵守这个规则?
此外,我试图自己做这件事,但似乎没有任何方法将资源放在文档的页面上。我可以用PdfPages上的.put方法为单个页面做到这一点,但是,对于PdfDocument,似乎没有等效的。是否有一种方法,我可以创建一个PdfDocument与此结构使用iText?
你不需要担心增大你的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
>>
>>
>>
"/FAAAAH 70 0 R"行表示字体FAAAAH是对象# 7。正如您所看到的,资源字典只保留了对字体对象的引用(70 R)。实际的字体对象驻留在PDF中的其他位置。每个PDF阅读器和解析器都知道如何访问对象# 7。
如果您在复制或合并时遇到膨胀,那么PDF可能包含两次字体,而不是只有一次,并且有两个引用它。/Resources的位置与文件的膨胀没有任何关系,是PDF内部的内容增加了文件的膨胀。
你可以通过在smartmode下运行PdfWriter来解决这个问题:
pdfWriter.setSmartMode();
我们将研究为什么ittext不复制继承