iText不会从PDF文档的/ Pages复制资源字典

时间:2016-09-09 16:51:01

标签: pdf itext7

我有一个Pdf,其字体存储在Document的/ Pages级别的/ Resources字典中,以便它们可以重复用于每个页面。这似乎实现了两件事:当然正确显示,但文件大小也较小。当使用iText从这个Pdf复制页面时,我注意到,无论使用更高级别或更低级别的功能(例如PdfPage的copyTo或copyFormAsXObject),生成的Pdf都没有这个特性 - 相反,资源存储在每个单独的页面上。

在进行页面复印时,有没有特别的理由说明为什么不遵守这一规定?

此外,我自己试图这样做,但似乎没有任何方法可以将资源放在文档的页面上。我可以在PdfPages上使用.put方法为单个页面执行此操作,但是对于PdfDocument,它似乎并不等同。有没有办法使用iText创建具有此结构的PdfDocument?

1 个答案:

答案 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不会复制继承。