【发布时间】:2015-12-07 01:36:14
【问题描述】:
我正在使用pdfbox-1.8.8对PDF文件做签名功能。
当我签署文件时,我得到了
这是我的代码:
public void signDetached(String inputFilePath, String outputFilePath, String signatureImagePath, Sign signProperties) {
OutputStream outputStream = null;
InputStream inputStream = null;
PDDocument document = null;
InputStream signImageStream = null;
try {
setTsaClient(null);
document = PDDocument.load(inputFilePath);
// create signature dictionary
PDSignature signature = new PDSignature();
signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
signature.setName("VANDUC1102");
signature.setLocation(null);
String displayName = "Hello World, Document signed by VANDUC1102";
String reason = reasonText+ " " + displayName;
signature.setReason(reason);
// the signing date, needed for valid signature
signature.setSignDate(Calendar.getInstance());
int signatureInPage = signProperties.getPageNumber() + 1;
signImageStream = new FileInputStream(new File(signatureImagePath));
PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(inputFilePath, signImageStream, signatureInPage);
float xAxis = convertPixel2Point(signProperties.getX()) ;
float yAxis = convertPixel2Point(signProperties.getY());
float signImageHeight = convertPixel2Point(signImageHeight);
float signImageWidth = convertPixel2Point(signImageWidth);
visibleSig.xAxis(xAxis)
.yAxis(yAxis)
.zoom(0)
.signatureFieldName("Signature")
.height(signImageHeight)
.width(signImageWidth);
PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties();
signatureProperties.signerName(eiUser.getName())
.signerLocation(null)
.signatureReason(reason)
.preferredSize(0)
.page(signProperties.getPageNumber())
.visualSignEnabled(true)
.setPdVisibleSignature(visibleSig)
.buildSignature();
// register signature dictionary and sign interface
SignatureOptions signatureOptions = new SignatureOptions();
signatureOptions.setVisualSignature(signatureProperties);
signatureOptions.setPage(signatureInPage);
document.addSignature(signature, this, signatureOptions);
File outputFile = new File(outputFilePath);
outputStream = new FileOutputStream(outputFile);
inputStream = new FileInputStream(inputFilePath);
IOUtils.copyStream(inputStream, outputStream);
document.saveIncremental(inputStream, outputStream);
outputStream.flush();
} catch (COSVisitorException | SignatureException | IOException ex) {
log.error("signDetached ", ex);
} finally {
IOUtils.closeStream(outputStream);
IOUtils.closeStream(inputStream);
IOUtils.closeStream(signImageStream);
IOUtils.closeStream(document);
}
}
private float convertPixel2Point(float pixel){
return pixel * (float) 72/96;
}
所以,我这个问题是因为我使用了自签名证书或我的代码有问题。
这里是sample file的链接。
谢谢
【问题讨论】:
-
请分享一个签名的 PDF 样本以供检查。
-
1.8.10 或 2.0 RC2 是否仍然存在问题?使用示例代码?我可以测试自己,但我还需要未签名的 PDF。
-
我意识到我根本不需要未签名的 PDF,我可以从已签名的文件中创建那个。我刚刚用普通示例进行了测试,它工作正常(在 2.0 RC2 中)。
-
是的。我测试了 2.0RC2 版本。成功了,谢谢@TilmanHauserr
标签: java pdf pdfbox self-signed