为了检查上传的PDF文件是否符合基本的PDF / A规范,我需要以PdfADocuments的形式阅读它们。
但是从版本7.1.6开始,它将不再起作用,但会引发PdfException(PdfException.PdfReaderHasBeenAlreadyUtilized)

class Controller
...
// get uploaded data into PdfDocument, which is passed
// on to different services.

InputStream filecontent = fileupload.getInputStream();
int read = 0;
byte[] bytes = new byte[1024];
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
while ((read = filecontent.read(bytes,0,bytes.length)) != -1) {
    filesize += read;
    buffer.write(bytes, 0, read);
}

ByteArrayInputStream input = new ByteArrayInputStream(buffer.toByteArray());
PdfReader reader = new PdfReader(input);
PdfWriter writer = new PdfWriter(new ByteArrayOutputStream());

PdfDocument pdf = new PdfDocument(reader, writer);

AnalyzerService analyzer = new AnalyzerService();
if(analyzer.analyze(pdf)) {
    otherService.doSomethingWith(pdf);
}
...




class AnalyzerService
...
public boolean analyze(PdfDocument pdf) {
    PdfADocument pdfa = new PdfADocument(
        pdf.getReader(), pdf.getWriter() <-- PdfException here
    );
...
}


直到并包括iText 7.1.5都有效。

在7.1.6中,我得到“ com.itextpdf.kernel.PdfException:鉴于已经使用了PdfReader实例。不能重用PdfReader,请创建一个新实例。”

看来我需要从PdfDocument中获取字节作为byte [],然后从中创建一个新的PdfReader。我已经尝试从pdf.getReader()。getOutputStream()。toByteArray()中获取它们,但这不起作用。

我现在对如何从给定的PdfDocument创建PdfADocument感到迷茫。

最佳答案

您的方法对PdfReaderPdfWriter实例使用相同的PdfDocument和(甚至更糟)相同的PdfADocument。由于两者都可以操纵PdfReader并写入PdfWriter,因此这种情况很可能在编写器中造成垃圾,因此您不应这样做。

只需始终将同时具有阅读者和作者的文档视为正在进行中的文档,就不能将某些文档视为完成的文档文件,例如提取以进行中间检查。

当您要检查上载的PDF文件时,为什么不简单地将byte[]buffer.toByteArray()转发到analyze方法,以从中创建单独的阅读器(如果需要,还可以是文档)?这确实会检查上传的文件...

此外,如果您输入的文件可能是PDF / A规范,并且在这种情况下经过特殊处理,那么您是否也应将它当作PdfADocument来处理?即您是否不应该首先检查分析仪是否符合要求,在肯定的情况下,在控制器类中也使用PdfADocument进行符合性检查?

关于java - 如何从itext7中的现有PdfDocument打开PdfADocument?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56350284/

10-10 17:04