如何从itext7中的现有PdfDocument打开PdfADocument?

时间:2019-05-28 21:30:31

标签: java itext itext7

为了检查上传的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感到迷茫。

1 个答案:

答案 0 :(得分:1)

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

通常总是将同时具有阅读器和书写器的文档视为正在进行中的文档,而有些文档不能视为完成的文档文件,例如提取以进行中间检查。

您要检查上传的PDF文件,为什么不将byte[]buffer.toByteArray()转发到analyze方法来创建一个单独的方法读者(如果需要的话,还有文件)从何而来?这确实可以检查上传的文件...

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