如何通过iText7获取ByteRange?

时间:2017-11-03 09:41:26

标签: itext itext7

如图所示,我需要从ByteRange获取字节数组进行验证,它们分别为0到840和960到1200。

enter image description here

我发现了类似的问题:In Itext 7, how to get the range stream to sign a pdf?

1 个答案:

答案 0 :(得分:1)

iText在自己的验证码中需要做同样的事情。它在SignatureUtil类中这样做。因此,人们可以简单地从该代码借用,例如像这样:

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

如果您希望字节范围在内存中为byte[],则可以使用ByteArrayOutputStream作为TARGET_STREAM_FOR_name_BYTES并从中检索生成的字节数组。