代码之家  ›  专栏  ›  技术社区  ›  JDChi

我如何使用iText7获得ByteRange?

  •  0
  • JDChi  · 技术社区  · 8 年前

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

    enter image description here

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   mkl    8 年前

    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 测验 testExtractSignedBytes )

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

    推荐文章