如果签名后更改了PDF表单,请使用PDFBox v2.x.x进行检查

时间:2017-05-16 12:15:19

标签: java pdf itext digital-signature pdfbox

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

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

1 个答案:

答案 0 :(得分:2)

没有完美的答案,但是做出决定的策略:

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开始,len 192,然后是签名,然后是10094的其余数据,使用len 162062.你会注意到10094 + 162062 == 172156,192 + 9902 == 10094

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