为了检查上传的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感到迷茫。
答案 0 :(得分:1)
对于PdfReader
和PdfWriter
实例,您的方法使用相同的PdfDocument
和(甚至更糟)相同的PdfADocument
。由于两者都可以操纵PdfReader
并写入PdfWriter
,因此这种情况很可能在编写器中造成垃圾,因此您不应这样做。
通常总是将同时具有阅读器和书写器的文档视为正在进行中的文档,而有些文档不能视为完成的文档文件,例如提取以进行中间检查。
您要检查上传的PDF文件,为什么不将byte[]
从buffer.toByteArray()
转发到analyze
方法来创建一个单独的方法读者(如果需要的话,还有文件)从何而来?这确实可以检查上传的文件...
此外,如果您的输入文档可能符合PDF / A规范,并且在这种情况下经过特殊处理,那么是否也应将其当作PdfADocument
来处理?即您是否不应该首先检查分析仪是否符合要求,在肯定的情况下,在控制器类中也使用PdfADocument
吗?