当前位置: 首页 > 知识库问答 >
问题:

如何从iText7中已有的PDF文档中打开PdfADocument?

乐华晖
2023-03-14

为了检查上传的PDF文件是否符合基本的PDF/A,我需要将它们作为PDFaduments阅读。但从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之前(包括iText 7.1.5),这是可行的。

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

我现在对如何从给定的PDFDocument创建PdfADocument很迷茫。

共有1个答案

邬楚青
2023-03-14

您的方法对PDFDocumentPDFAdocument实例使用相同的PDFReader和(更糟糕的是)相同的PDFWriter。由于两者都可以操作PDFReader并写入PDFWriter,这种情况很可能会导致写入器中的垃圾,因此您不应该这样做。

只需将同时具有读取器和写入器的文档视为正在进行中的工作,而不能将其视为已完成的文档文件,例如用于中间检查的提取。

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

此外,如果您的输入文档可能是PDF/a格式的,并且在这种情况下被特殊处理,那么如果是的话,您不应该也将其作为PDFADocument来操作吗?即。难道您不应该首先检查分析器的一致性,如果是,还应该在controller类中使用pdfadocument吗?

 类似资料:
  • 问题内容: 如何 使用PHP 从PDF文档中提取文本? (我不能使用其他工具,我没有root用户访问权限) 我发现一些函数可用于纯文本,但是它们不能很好地处理Unicode字符: http://www.hashbangcode.com/blog/zend-lucene-and-pdf-documents-part-2-pdf- data-extraction-437.html 问题答案: 下载 c

  • 我有一本书的多份副本。不同用户评论的pdf文档。我想把所有这些评论合并成一个新的pdf“合并”。 我在一个名为“路径”和“目录”属性的文档类中编写了这个子类。 这段代码导致了一个我无法解决的异常。 iText。内核PDFEException:“Pdf间接对象属于其他Pdf文档。将对象复制到当前pdf文档。' 要执行此任务,我需要更改什么?还是我完全摆脱了我的代码块?

  • 我现在试图修改一个只有文本内容的PDF文件。当我使用 谢谢

  • 我试图在html页面的页脚部分实现Y的第X页。 我通过调用GetPageNumber(PdfPage)来检索X,通过调用GetNumberOfPages()来检索Y。 在iText. Kernel. Pdf中引用了PdfDocumi。但是每次我调用GetNumberOfPages()时,它每次只返回一个页面。 例如:当我的总页面为4时,我得到的页脚值如下所示。 第一页-

  • 我使用iText7生成PDF,然后在新选项卡中打开它。 用户的意图始终是打印,因此显示PDF并让他单击打印按钮并不方便。这就是为什么我想在PDF打开时立即打开打印对话框。 这个解决方案不起作用 使用iText打开PDF时自动打开打印对话框 因为我是派系。iText7中不存在PRINTDIALOG。 我还尝试了各种不起作用的JavaScript选项,比如 如何在页面加载后直接打开打印对话框?

  • 我正在尝试向PDF文档的第一页添加一些内容。这样做的合适方式是什么? 目前,我的代码可以工作,但它会在文档的第一页之前添加(插入)一个新页面。这里可以用什么来代替 因此,我正在阅读的文档中的内容将作为内容而不是新页面添加到现有的第一页