检查 PDFBox v2.x.x 签名后是否更改了 PDF 表单

Check with PDFBox v2.x.x if a PDF Form was changed after signing

我有一个 pdf 表格。如果在添加签名后更改了 pdf 表单,如何使用 PDFBox v2.x.x 检查?我认为 itext 4.2.1 中的等价物是 signaturecoverswholedocument 方法。我唯一能找到的是如何检查签名本身:

        if (signerInformation.verify(new JcaSimpleSignerInfoVerifierBuilder().build(certificateHolder))) {

没有完美答案,只有做决定的策略:

try (PDDocument document = PDDocument.load(new File(infile), password))
{
    for (PDSignature sig : document.getSignatureDictionaries())
    {
        int[] byteRange = sig.getByteRange();
        System.out.println("byteRange: " + Arrays.toString(byteRange));
        System.out.println("Range max: " + (byteRange[byteRange.length-2] + byteRange[byteRange.length-1]));
        // multiply content length with 2 (because it is in hex in the PDF) and add 2 for < and >
        System.out.println("Content len: " + (sig.getCOSObject().getString(COSName.CONTENTS).length() * 2 + 2));
        System.out.println("File len: " + new File(infile).length());
(...)

现在用 this file 测试一下。你会得到这个输出:

byteRange: [0, 192, 10094, 162062]
Range max: 172156
Content len: 9902
File len: 172156

签名的数据从 0 开始,长度为 192,然后是签名,然后是 10094 处的其余数据,长度为 162062。您会注意到 10094 + 162062 == 172156,而 192 + 9902 = = 10094.

当然如果有多个签名就不会那么完美了。