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 仍會指示您的簽名無效。有關簽名后允許和不允許的更改的摘要,請查看此答案和從中引用的文檔。
您應該嘗試在注釋中添加圖像。
添加回答
舉報