为了检查上传的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感到迷茫。
最佳答案
您的方法对PdfReader
和PdfWriter
实例使用相同的PdfDocument
和(甚至更糟)相同的PdfADocument
。由于两者都可以操纵PdfReader
并写入PdfWriter
,因此这种情况很可能在编写器中造成垃圾,因此您不应这样做。
只需始终将同时具有阅读者和作者的文档视为正在进行中的文档,就不能将某些文档视为完成的文档文件,例如提取以进行中间检查。
当您要检查上载的PDF文件时,为什么不简单地将byte[]
从buffer.toByteArray()
转发到analyze
方法,以从中创建单独的阅读器(如果需要,还可以是文档)?这确实会检查上传的文件...
此外,如果您输入的文件可能是PDF / A规范,并且在这种情况下经过特殊处理,那么您是否也应将它当作PdfADocument
来处理?即您是否不应该首先检查分析仪是否符合要求,在肯定的情况下,在控制器类中也使用PdfADocument
进行符合性检查?
关于java - 如何从itext7中的现有PdfDocument打开PdfADocument?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56350284/