1 回答
TA贡献2011条经验 获得超2个赞
根据问题评论中的说明,您尝试将签名放置在最后一个文档页面现有内容的边界框下方。
但正如您在对此评论的回应中发现的那样,您不能简单地使用其结果作为输入,因为CreateVisibleSignature.setVisibleSignDesigner
假定了不同的坐标系:
使用相关页面的 PDF 默认用户空间坐标:它们由相关页面的MediaBox
BoundingBoxFinder
给出,并且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 时相当少的令人烦恼的来源之一。
添加回答
举报