亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PDFBox - 插入第二張圖像后的“saveIncremental”不起作用

PDFBox - 插入第二張圖像后的“saveIncremental”不起作用

莫回無 2022-11-10 15:02:48
我在使用 PDFBox 時遇到問題。我在 PDF 中有一個空白頁,我想在其中插入圖像。因為我也使用簽名的 PDF,所以所有更改都必須保存為“saveIncremental”。當我只插入一張圖片時,一切都很好(圖片已插入)。當我嘗試在此 PDF 中插入另一個圖像時,它尚未插入,并且在 Adobe Acrobat Reader 中打開時顯示“此頁面上存在錯誤。Adobe 可能無法正確顯示頁面......”。奇怪的事情 - 當 PDF 不僅是空白頁,而且例如帶有圖像的空白頁時,一切都很好(第一個和第二個圖像已使用 saveIncremental 正確插入)。插入和保存圖像的代碼:PDImageXObject pdImage = PDImageXObject.createFromFile(tmpSig.getFileName(), doc);PDPageContentStream contentStream = new PDPageContentStream(doc, tmpPage, PDPageContentStream.AppendMode.APPEND, true, true);contentStream.drawImage(pdImage, finalX, (finalPageHeight - finalY - finalHeight), finalWidth, finalHeight);contentStream.close();// update before savetmpPage.getCOSObject().setNeedToBeUpdated(true);tmpPage.getResources().getCOSObject().setNeedToBeUpdated(true);doc.getDocumentCatalog().getPages().getCOSObject().setNeedToBeUpdated(true);doc.getDocumentCatalog().getCOSObject().setNeedToBeUpdated(true);// savedoc.saveIncremental(new FileOutputStream(pdfFile));此處提供的所有文件使用 PDFBox 2.0.7 版,但我也嘗試了最新的(2.0.15),但沒有幫助。感謝所有的想法!編輯:我嘗試像這樣更新 XObject 和資源(在注釋“保存前更新”下添加了此代碼):pdImage.getCOSObject().setNeedToBeUpdated(true);PDResources pdResources = tmpPage.getResources();for (COSName name : pdResources.getXObjectNames()) {    pdResources.getXObject(name).getCOSObject().setNeedToBeUpdated(true);}問題仍然存在,沒有任何改變......
查看完整描述

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 仍會指示您的簽名無效。有關簽名后允許和不允許的更改的摘要,請查看此答案和從中引用的文檔。


您應該嘗試在注釋中添加圖像。


查看完整回答
反對 回復 2022-11-10
  • 1 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號