2

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

在进行页面复制时是否有特殊原因不遵守这一点?

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

4

1 回答 1

2

您无需担心 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 7 0 R”行表示字体 FAAAAH 是对象 #7。如您所见,资源字典仅保留对字体对象的引用 (7 0 R)。实际的字体对象位于 PDF 中的其他位置。每个 PDF 阅读器和解析器都知道如何访问对象 #7。

如果您在复制或合并时遇到膨胀,那么 PDF 可能包含两次字体而不是仅一次,并且有两次对其的引用。/Resources 的位置与文件的膨胀没有任何关系,它是 PDF 中的内容增加了膨胀。

您可以通过在智能模式下运行 PdfWriter 在 iText 中解决此问题:

pdfWriter.setSmartMode();

我们将研究为什么 iText 不复制继承。

于 2016-09-13T09:11:48.970 回答