【发布时间】:2020-06-08 21:27:53
【问题描述】:
我想用多个签名签署一个 pdf,但我只能用一个签名。 我正在使用 Itext 库。
public static void sign(InputStream src,OutputStream dest, InputStream p12Stream, char[] password, String reason, String location, String imagePath) throws Exception {
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(p12Stream, password);
String alias = ks.aliases().nextElement();
PrivateKey pk = (PrivateKey) ks.getKey(alias, password);
Certificate[] chain = ks.getCertificateChain(alias);
PdfReader reader = new PdfReader(src);
PdfStamper stamper = PdfStamper.createSignature(reader, dest, '\0', null, true);
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setReason(reason);
appearance.setLocation(location);
appearance.setVisibleSignature(new Rectangle(300, 600, 630, 500), 1, "sig");
Image image = Image.getInstance(imagePath);
appearance.setSignatureGraphic(image);
appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.GRAPHIC);
appearance.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED);
ExternalDigest digest = new BouncyCastleDigest();
ExternalSignature signature = new PrivateKeySignature(pk, DigestAlgorithms.SHA256, null);
MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, MakeSignature.CryptoStandard.CMS);
}
public static void main(String[] args) throws Exception {
sign(new FileInputStream(basePath+"nonsigned.pdf"), new FileOutputStream(basePath+"signed.pdf"), new FileInputStream(basePath+"mycert3.p12"), "mycert3".toCharArray(), "something", "something", basePath + "signing1.png");
sign(new FileInputStream(basePath+"nonsigned.pdf"), new FileOutputStream(basePath+"signed.pdf"), new FileInputStream(basePath+"mycert4.p12"), "mycert4".toCharArray(), "something", "something", basePath + "signing2.png");
}
我已经尝试使用附加模式作为 true 并删除图像签名,但它只显示为一个签名。 image showing pdf signed
【问题讨论】:
-
首先 - 您的第一个
sign调用使用相同的文件进行输入和输出。这行不通。此外,您想添加两个具有认证级别的签名。但只有第一个签名 -
我知道,它的 signed.pdf 在输出,但我仍然不能在文件中制作多个签名
-
更改后,您现在将未签名的 pdf 作为两次签名尝试的输入。对于第二次签名尝试,如果第一次尝试作为输入,您需要将输出作为输入并写入另一个文件。
标签: java pdf itext certificate sign