PDF文档的数字签名



是否可以为已签名的PDF文档生成数字签名?我正在使用以下代码为PDF文档生成数字签名。

public void sign(String src, String dest, Certificate[] chain, PrivateKey 
pk, String digestAlgorithm,String provider, CryptoStandard subfilter, 
String reason, String location) {

PdfReader reader;
FileOutputStream os;
PdfStamper stamper;
try {
reader = new PdfReader(src);
File destFile = new File(dest);
String destFilePath = destFile.getAbsolutePath();
System.out.println("destFilePath=====" + destFilePath);
os = new FileOutputStream(dest);
System.out.println("File output " + os);
stamper = PdfStamper.createSignature(reader, os, '');
System.out.println("stamper " + stamper.getSignatureAppearance());
// Creating the appearance
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
System.out.println("Appearance " + appearance);
// appearance.setImage(Image.getInstance("F:/Unibrain/EbidUploadedFolder/" +
// "/resources/55.png"));
appearance.setImage(Image.getInstance("F:\55.png"));
// appearance.setReason(reason);
// appearance.setLocation(location);
appearance.setVisibleSignature(new Rectangle(800, 732, 512, 780), 1, "sig");
appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION);
appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.NAME_AND_DESCRIPTION);
Rectangle cropbox = reader.getCropBox(1);
float width = 250;
float height = 50;
Rectangle rectangle = new Rectangle(cropbox.getRight(width), cropbox.getBottom(), cropbox.getRight(),
cropbox.getBottom(height));
cropbox.setBorderWidth(5);
appearance.setVisibleSignature(rectangle, 1, "sig");
// Creating the signature
ExternalDigest digest = new BouncyCastleDigest();
System.out.println("digest " + digest);
ExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm, provider);
System.out.println("Signature " + signature);
MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter);
} catch (Exception e) {
e.printStackTrace();
}
}

是否可以为已签名的PDF文档生成数字签名?

通常是的,但必须在增量更新中添加附加签名,以免使预先存在的签名无效。对于某些背景,请参阅此答案。

如果你的代码,这意味着你必须更换行

stamper = PdfStamper.createSignature(reader, os, '');

通过

stamper = PdfStamper.createSignature(reader, os, '', null, true);

true表示签名应在附加模式中应用,这是用于在增量更新中添加更改的iText行话。

此外,您必须确保在不同的表单字段中创建新签名。您的代码将签名添加到已编码字段"sig"中:

appearance.setVisibleSignature(new Rectangle(800, 732, 512, 780), 1, "sig");

如果您知道预先存在的签名的字段名称不同,这是可以的。否则,您可能希望用null替换"sig",这将使iText为新签名创建一个唯一的字段名称。


上面我说"一般是的"-有一个例外,如果原始签名是"不允许更改"的认证签名,则应用附加签名将破坏原始签名,因为应用它是一个更改。

最新更新