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

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

如何使用pdfbox在pdf最后一頁的左下角位置應用數字簽名圖像?

如何使用pdfbox在pdf最后一頁的左下角位置應用數字簽名圖像?

動漫人物 2023-11-01 22:46:59
標題說明了一切,我能夠使用 pdfbox 版本 2.0.8 對 pdf 進行可視化簽名。目前我必須在代碼中對圖像的起始協調進行硬編碼。但隨著 PDF 的變化,圖像的位置總是需要相應地改變。我想在 pdf 末尾的左角應用簽名圖像。我如何在代碼中獲得該位置?這是我的代碼,使用 _x 和 _y 進行硬編碼坐標。在代碼中,'signing'是可見的簽名對象,'page'是pdf的最后一頁,'args[2]'是要簽名的pdf文件:int _x = 30;int _y = 420;signing.setVisibleSignDesigner(args[2], _x, _y, -50, imageStream, page);imageStream.close();signing.setExternalSigning(externalSig);signing.signPDF(documentFile, signedDocumentFile, tsaClient);removeFile(imageResult);我想要的簽名示例:編輯:添加圖像以澄清我希望簽名字段位于文檔的末尾,而不是最后一頁的末尾。文檔可以在最后一頁的頂部完成,因此字段也應該位于文本后面而不是頁面的末尾。抱歉,我之前的問題不清楚。
查看完整描述

1 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

根據問題評論中的說明,您嘗試將簽名放置在最后一個文檔頁面現有內容的邊界框下方。


但正如您在對此評論的回應中發現的那樣,您不能簡單地使用其結果作為輸入,因為CreateVisibleSignature.setVisibleSignDesigner假定了不同的坐標系:

  • 使用相關頁面的 PDF 默認用戶空間坐標:它們由相關頁面的MediaBoxBoundingBoxFinder給出,并且y坐標向上增加。通常原點位于頁面的左下角。

  • CreateVisibleSignature另一方面,使用單位長度相同但原點位于頁面左上角且 y坐標向下增加的坐標系。

因此,必須轉換坐標,例如:

File documentFile = new File(SOURCE);

File signedDocumentFile = new File(RESULT);


Rectangle2D boundingBox;

PDRectangle mediaBox;

try (? ?PDDocument document = PDDocument.load(documentFile) ) {

? ? PDPage pdPage = document.getPage(0);

? ? BoundingBoxFinder boundingBoxFinder = new BoundingBoxFinder(pdPage);

? ? boundingBoxFinder.processPage(pdPage);

? ? boundingBox = boundingBoxFinder.getBoundingBox();

? ? mediaBox = pdPage.getMediaBox();

}


CreateVisibleSignature signing = new CreateVisibleSignature(ks, PASSWORD.clone());

try (? ?InputStream imageStream = IMAGE_STREAM) {

? ? signing.setVisibleSignDesigner(documentFile.getPath(), (int)boundingBox.getX(), (int)(mediaBox.getUpperRightY() - boundingBox.getY()), -50, imageStream, 1);

}

signing.setVisibleSignatureProperties("name", "location", "Security", 0, 1, true);

signing.setExternalSigning(false);

signing.signPDF(documentFile, signedDocumentFile, null);

評論

將上面的代碼應用到該文件,人們會發現最后可見的文本行和圖像之間有一個小間隙。此間隙是由“請訪問我們的網站”行下方的一行中的一些空格字符引起的。它BoundingBoxFinder不會檢查繪圖指令最終是否會產生可見的結果,它總是將有問題的區域添加到邊界框。

一般來說,您可能需要從上面代碼計算出的y坐標中減去一點點,以在以前的頁面內容和新的簽名小部件之間創建視覺間隙。

查看源代碼CreateVisibleSignature會發現,實際上y坐標是通過從MediaBox 的高度減去它們來轉換的,而不是從其上邊框值中減去它們。最終這些坐標被復制到目標文檔中。因此,可能需要在上面的代碼中使用而不是。mediaBox.getHeight()mediaBox.getUpperRightY()

查看源代碼后CreateVisibleSignature2發現,實際上使用了CropBox而不是MediaBox。如果您的代碼源自該示例,您可能必須在上面的代碼中替換pdPage.getMediaBox()為。pdPage.getCropBox()

一般來說,任意使用不同的坐標系是使用 PDFBox 時相當少的令人煩惱的來源之一。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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