1 回答
TA贡献1826条经验 获得超6个赞
除了您已标记为已更新的词典
tmpPage.getCOSObject().setNeedToBeUpdated(true);
tmpPage.getResources().getCOSObject().setNeedToBeUpdated(true);
doc.getDocumentCatalog().getPages().getCOSObject().setNeedToBeUpdated(true);
doc.getDocumentCatalog().getCOSObject().setNeedToBeUpdated(true);
还请将资源字典中的XObject条目标记为已更新:
tmpPage.getResources().getCOSObject().getCOSDictionary(COSName.XOBJECT).setNeedToBeUpdated(true);
您想知道为什么在添加第一张图片时不需要这样做吗?
在原始 PDF 中,资源字典中还没有XObject条目。因此,它是重新生成的,因此隐式标记为更新。
您想知道为什么在添加到已经有图像的文件时不需要这样做?
在那个其他文件中,资源字典中的XObject条目是直接对象,即它立即包含在资源字典中。
4 0 obj
<<
/Type /Page
/Resources <<
/ProcSets [/PDF /Text /ImageB /ImageC /ImageI]
/ExtGState <</G3 5 0 R /gs2 6 0 R /gs3 7 0 R>>
/XObject <</Im1 8 0 R /Im2 9 0 R>>
>>
/MediaBox [0 0 611.03998 864.95996]
/Contents [10 0 R 11 0 R 12 0 R 13 0 R 14 0 R]
/StructParents 0
/Parent 2 0 R
>>
endobj
因此,每当写入资源字典的新副本时,也会隐含地写入XObject条目的新副本。
但是,在 PDFBox 在资源字典中创建XObject条目的文件中,PDFBox 将其创建为间接对象,即在资源字典中 XObject仅映射到对对象编号的引用,而在具有该编号的对象中实际条目字典可以查到。
2 0 obj
<<
/Type /Page
/Resources <<
/ProcSets [/PDF /Text /ImageB /ImageC /ImageI]
/ExtGState <</G3 3 0 R>>
/XObject 7 0 R
>>
/MediaBox [0 0 611.03998 864.95996]
/Contents [8 0 R 4 0 R 9 0 R]
/StructParents 0
/Parent 5 0 R
>>
endobj
7 0 obj
<<
/Im1 10 0 R
>>
endobj
因此,当写入资源字典的新副本时,在这种情况下不会写入XObject条目字典的隐式新副本。
顺便说一句,您当前的方法不会帮助您完成任务
因为我也使用签名的 PDF,所以所有更改都必须保存为“saveIncremental”。
向页面内容添加图像是不允许对已签名 PDF 进行的更改,因此 Adobe Reader 仍会指示您的签名无效。有关签名后允许和不允许的更改的摘要,请查看此答案和从中引用的文档。
您应该尝试在注释中添加图像。
添加回答
举报