我正在使用pdfbox示例签名CreateVisableSignature,我希望代码将签名的图像写入名为" ApplicantSignature"在第三页。
有人能说明为什么它会在第一页的左上角写下签名吗?
以下是代码:
public static void main(String[] args) throws KeyStoreException,
NoSuchAlgorithmException, CertificateException,
FileNotFoundException, IOException, COSVisitorException,
SignatureException {
if (args.length != 4) {
usage();
System.exit(1);
} else {
File ksFile = new File(args[0]);
KeyStore keystore = KeyStore.getInstance("PKCS12", provider);
char[] pin = args[1].toCharArray();
keystore.load(new FileInputStream(ksFile), pin);
File document = new File(args[2]);
CreateVisibleSignature signing = new CreateVisibleSignature(
keystore, pin.clone());
String jpgFile = CreateVisibleSignature.convertPngToJpeg( args[3] );
FileInputStream image = new FileInputStream( jpgFile );
PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(
args[2], image, 1);
visibleSig.xAxis(0).yAxis(0).zoom(-75)
.signatureFieldName("ApplicantSignature");
PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties();
signatureProperties.signerName("name").signerLocation("location")
.signatureReason("Security").preferredSize(0).page(3)
.visualSignEnabled(true).setPdVisibleSignature(visibleSig)
.buildSignature();
signing.signPDF(document, signatureProperties);
}
}
我也尝试过:
PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(
args[2], image, 3);
visibleSig.xAxis(0).yAxis(0).zoom(-75)
.signatureFieldName("ApplicantSignature");
PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties();
signatureProperties.signerName("name").signerLocation("location")
.signatureReason("Security").preferredSize(0).page(1)
.visualSignEnabled(true).setPdVisibleSignature(visibleSig)
.buildSignature();
我试过了:
PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(
args[2], image, 3);
visibleSig.xAxis(0).yAxis(0).zoom(-75)
.signatureFieldName("ApplicantSignature");
PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties();
signatureProperties.signerName("name").signerLocation("location")
.signatureReason("Security").preferredSize(0).page(3)
.visualSignEnabled(true).setPdVisibleSignature(visibleSig)
.buildSignature();
答案 0 :(得分:1)
根据回答我问题的人给我的页面设置,我发布了一个答案,基于我目前对pdfbox中签名如何工作的了解。
首先,我正在使用的预先存在的表单,至少从pdfbox的角度来看,似乎只有一个页面。当我使用adobe DC pro来显示坐标时,它只显示坐标直到第二页的中间。因此,即使我将X,Y坐标设置为100,715,签名图像也会显示在第一页的底部,而不是第3页。
如果我错了,请纠正我,但我相信pdfbox只允许您签署整个文档,而不是文档中已存在的单个签名字段。预先存在的签名字段不受pdfbox的影响,因为pdfbox似乎无法引用它们。
如果您在adobe dc pro上显示pdf并单击签名面板,您可以看到pdf是由pdfbox签名的,但预先存在的签名字段仍然表明它们需要签名。
我在这一点上猜测,pdfbox会将它签名的签名添加到预先存在的文档中。
我还注意到pdfbox签名是不可见的,即使已经设置了" who"," location"," reason"和date,以及您放置在pdfbox签名的签名中的图像是唯一在生成的输出pdf中实际可见的图像。如果没有图像,则硬拷贝打印输出不会显示文档已签名。
如果我错了,请随时纠正我。
答案 1 :(得分:0)
在signPDF()中的CreateVisibleSignature.java中查看此行(未包含在您的问题中,但您提到的PDFBox中的示例代码的一部分):
// options.setPage(signatureProperties.getPage());
删除" //"签名出现在第3页。
重新定位,更改代码的这一部分
xAxis(0).yAxis(0)
到其他坐标,例如这些:
xAxis(100).yAxis(715)
现在关于问题中哪些代码是正确的问题 - 最后一个是:
PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(args[2], image, 3);
visibleSig.xAxis(0).yAxis(0).zoom(-75).signatureFieldName("ApplicantSignature");
PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties();
signatureProperties.signerName("name").signerLocation("location")
.signatureReason("Security").preferredSize(0).page(3)
.visualSignEnabled(true).setPdVisibleSignature(visibleSig)
.buildSignature();
PDVisibleSignDesigner中的3是选择页面的大小。第二个是存储页面的编号以供日后使用。这里的页码是从1开始的。