如何使用 iText7 获取 ByteRange?
How can I get ByteRange with iText7?
如图所示,我需要从 ByteRange 获取字节数组来做一些验证,它们是 0 到 840 和 960 到 1200。
我发现了类似的问题:在 Itext 7 中,如何获取范围流来签署 pdf?
iText在自己的验证码中也需要做同样的事情。它在 SignatureUtil
class 中这样做。因此,可以简单地借用该代码,例如像这样:
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
并从中检索结果字节数组。
如图所示,我需要从 ByteRange 获取字节数组来做一些验证,它们是 0 到 840 和 960 到 1200。
我发现了类似的问题:在 Itext 7 中,如何获取范围流来签署 pdf?
iText在自己的验证码中也需要做同样的事情。它在 SignatureUtil
class 中这样做。因此,可以简单地借用该代码,例如像这样:
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
并从中检索结果字节数组。