1 回答

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個贊
根據(jù)問題評論中的說明,您嘗試將簽名放置在最后一個文檔頁面現(xiàn)有內(nèi)容的邊界框下方。
但正如您在對此評論的回應(yīng)中發(fā)現(xiàn)的那樣,您不能簡單地使用其結(jié)果作為輸入,因?yàn)?code>CreateVisibleSignature.setVisibleSignDesigner假定了不同的坐標(biāo)系:
使用相關(guān)頁面的 PDF 默認(rèn)用戶空間坐標(biāo):它們由相關(guān)頁面的MediaBox
BoundingBoxFinder
給出,并且y坐標(biāo)向上增加。通常原點(diǎn)位于頁面的左下角。CreateVisibleSignature
另一方面,使用單位長度相同但原點(diǎn)位于頁面左上角且 y坐標(biāo)向下增加的坐標(biāo)系。
因此,必須轉(zhuǎn)換坐標(biāo),例如:
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);
評論
將上面的代碼應(yīng)用到該文件,人們會發(fā)現(xiàn)最后可見的文本行和圖像之間有一個小間隙。此間隙是由“請訪問我們的網(wǎng)站”行下方的一行中的一些空格字符引起的。它BoundingBoxFinder
不會檢查繪圖指令最終是否會產(chǎn)生可見的結(jié)果,它總是將有問題的區(qū)域添加到邊界框。
一般來說,您可能需要從上面代碼計算出的y坐標(biāo)中減去一點(diǎn)點(diǎn),以在以前的頁面內(nèi)容和新的簽名小部件之間創(chuàng)建視覺間隙。
查看源代碼CreateVisibleSignature
會發(fā)現(xiàn),實(shí)際上y坐標(biāo)是通過從MediaBox 的高度中減去它們來轉(zhuǎn)換的,而不是從其上邊框值中減去它們。最終這些坐標(biāo)被復(fù)制到目標(biāo)文檔中。因此,可能需要在上面的代碼中使用而不是。mediaBox.getHeight()
mediaBox.getUpperRightY()
查看源代碼后CreateVisibleSignature2
發(fā)現(xiàn),實(shí)際上使用了CropBox而不是MediaBox。如果您的代碼源自該示例,您可能必須在上面的代碼中替換pdPage.getMediaBox()
為。pdPage.getCropBox()
一般來說,任意使用不同的坐標(biāo)系是使用 PDFBox 時相當(dāng)少的令人煩惱的來源之一。
添加回答
舉報