0

As the picture show , I need to get byte array from ByteRange to do some verify , they are 0 to 840 and 960 to 1200.

enter image description here

I found the similar question : In Itext 7, how to get the range stream to sign a pdf?

JDChi
  • 240
  • 3
  • 18

1 Answers1

1

iText in its own verification code needs to do the same thing. It does so in its SignatureUtil class. Thus, one can simply borrow from that code, e.g. like this:

try (   PdfReader pdfReader = new PdfReader(SOURCE_PDF);
        PdfDocument pdfDocument = new PdfDocument(pdfReader);) {
    SignatureUtil signatureUtil = new SignatureUtil(pdfDocument);
    for (String name : signatureUtil.getSignatureNames()) {
        PdfSignature signature = signatureUtil.getSignature(name);
        PdfArray b = signature.getByteRange();
        RandomAccessFileOrArray rf = pdfReader.getSafeFile();
        try (   InputStream rg = new RASInputStream(new RandomAccessSourceFactory().createRanged(rf.createSourceView(), SignatureUtil.asLongArray(b)));
                OutputStream result = TARGET_STREAM_FOR_name_BYTES) {
            byte[] buf = new byte[8192];
            int rd;
            while ((rd = rg.read(buf, 0, buf.length)) > 0) {
                result.write(buf, 0, rd);
            }
        }
    }
}

(RetrieveSignedRanges test testExtractSignedBytes)

If you want the byte range as a byte[] in memory, you can use a ByteArrayOutputStream as TARGET_STREAM_FOR_name_BYTES and retrieve the resulting byte array from it.

mkl
  • 90,588
  • 15
  • 125
  • 265