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



我有一个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不复制继承

相关内容

  • 没有找到相关文章

最新更新