pdf - iText 不会从 PDF 文档的页面复制资源字典

标签 pdf itext7

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

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

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

最佳答案

您无需担心 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 不复制继承。

关于pdf - iText 不会从 PDF 文档的页面复制资源字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39416336/

相关文章:

xml - 使用 Gradle 构建 Java 项目时从 docbook XML 生成 PDF

javascript - 生成并存储电子(数字)签名

java - 为什么我的表单在没有调用 flattenFields 方法的情况下就被展平了?

html - 下载 pdf 文件的按钮

java - Itext7 - 自动调整图像大小

javascript - 如何使用 NodeJS 下载 pdf 并将其发送到客户端?

java - 如何检索 PdfStampAnnotation 旋转

visual-studio-2019 - Visual Studio 更新会破坏 iText7 吗?

java - itext7 标记和编辑注释不起作用

java - 记录数量过多时 PDF 生成失败