Java PDF文档的数字签名

Java PDF文档的数字签名,java,pdf,itext,digital-signature,pdfstamper,Java,Pdf,Itext,Digital Signature,Pdfstamper,是否可以为已签名的PDF文档生成数字签名?我使用以下代码为PDF文档生成数字签名 public void sign(String src, String dest, Certificate[] chain, PrivateKey pk, String digestAlgorithm,String provider, CryptoStandard subfilter, String reason, String location) { PdfReader rea

是否可以为已签名的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, '\0');
            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, '\0');

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

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

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



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

@Amedee Van Gasse谢谢。谢谢。以及如何使用iText库检查PDF文档是否已签名?谢谢。如何使用iText库检查PDF文档是否已签名?@VIJAYAKUMAR“如何检查PDF文档是否已使用iText签名”-cf。
stamper = PdfStamper.createSignature(reader, os, '\0', null, true);
appearance.setVisibleSignature(new Rectangle(800, 732, 512, 780), 1, "sig");