Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将页面pdf文件转换为byte[]并还原回来_Java_Itext_Itext7 - Fatal编程技术网

Java 如何将页面pdf文件转换为byte[]并还原回来

Java 如何将页面pdf文件转换为byte[]并还原回来,java,itext,itext7,Java,Itext,Itext7,我需要通过页面解析一个PDF文件,并将每个文件分别加载到字节[]。我使用itext库 我下载了一个包含以下代码的页面的文件: public Document addPageInTheDocument(String namePage, MultipartFile pdfData, Long documentId) throws IOException { notNull(namePage, INVALID_PARAMETRE); notNull(pdfData, IN

我需要通过页面解析一个PDF文件,并将每个文件分别加载到
字节[]
。我使用itext库

我下载了一个包含以下代码的页面的文件:

   public Document addPageInTheDocument(String namePage, MultipartFile pdfData, Long documentId) throws IOException {
      notNull(namePage, INVALID_PARAMETRE);
      notNull(pdfData, INVALID_PARAMETRE);
      notNull(documentId, INVALID_PARAMETRE);
      byte[] in = pdfData.getBytes(); // size file 88747
      Page page = new Page(namePage);
      Document document = new Document();
      document.setId(documentId);
      PdfReader reader = new PdfReader(new ByteArrayInputStream(pdfData.getBytes()));
      PdfDocument pdfDocument = new PdfDocument(reader);
      if (pdfDocument.getNumberOfPages() != 1) {
          throw new IllegalArgumentException();
      }
      byte[] transform = pdfDocument.getPage(1).getContentBytes(); // 1907 size page
      page.setPageData(pdfDocument.getPage(1).getContentBytes());
      return addPageInTheDocument(document, page);
  }
ByteBuffer byteContent = new ByteBuffer() ;
    for (Map.Entry<String, Page> page : pages.entrySet()) {
       byteContent.append(page.getValue().getPageData());
    }
    PdfWriter writer = new PdfWriter(new FileOutputStream(book.getName() + modification + FORMAT));
    byte[] df = byteContent.toByteArray();
    PdfReader reader = new PdfReader(new ByteArrayInputStream(byteContent.toByteArray()));
    com.itextpdf.layout.Document itextDocument = new com.itextpdf.layout.Document(new PdfDocument(reader, writer));
    itextDocument.close();
我正在尝试使用以下代码还原文件:

   public Document addPageInTheDocument(String namePage, MultipartFile pdfData, Long documentId) throws IOException {
      notNull(namePage, INVALID_PARAMETRE);
      notNull(pdfData, INVALID_PARAMETRE);
      notNull(documentId, INVALID_PARAMETRE);
      byte[] in = pdfData.getBytes(); // size file 88747
      Page page = new Page(namePage);
      Document document = new Document();
      document.setId(documentId);
      PdfReader reader = new PdfReader(new ByteArrayInputStream(pdfData.getBytes()));
      PdfDocument pdfDocument = new PdfDocument(reader);
      if (pdfDocument.getNumberOfPages() != 1) {
          throw new IllegalArgumentException();
      }
      byte[] transform = pdfDocument.getPage(1).getContentBytes(); // 1907 size page
      page.setPageData(pdfDocument.getPage(1).getContentBytes());
      return addPageInTheDocument(document, page);
  }
ByteBuffer byteContent = new ByteBuffer() ;
    for (Map.Entry<String, Page> page : pages.entrySet()) {
       byteContent.append(page.getValue().getPageData());
    }
    PdfWriter writer = new PdfWriter(new FileOutputStream(book.getName() + modification + FORMAT));
    byte[] df = byteContent.toByteArray();
    PdfReader reader = new PdfReader(new ByteArrayInputStream(byteContent.toByteArray()));
    com.itextpdf.layout.Document itextDocument = new com.itextpdf.layout.Document(new PdfDocument(reader, writer));
    itextDocument.close();
ByteBuffer byteContent=new ByteBuffer();
对于(Map.Entry页面:pages.entrySet()){
追加(page.getValue().getPageData());
}
PdfWriter writer=新的PdfWriter(新的FileOutputStream(book.getName()+修改+格式));
byte[]df=byteContent.toByteArray();
PdfReader=newpdfReader(newbytearrayinputstream(byteContent.toByteArray());
com.itextpdf.layout.Document itextDocument=新的com.itextpdf.layout.Document(新的PdfDocument(读写器));
itextDocument.close();
为什么尺寸有这么大的差异? 为什么要使用文件和页面,以及
字节[]
来创建文件?

让我们从您的大小问题开始:

为什么尺寸有这么大的差异

因为
PdfPage.getContentBytes()
不会返回您期望的结果

您似乎期望它返回给定页面内容的完整表示,该方法的javadoc可能被解释为(“获取整个页面内容的解码字节”)

事实并非如此
PdfPage.getContentBytes()
返回页面内容流的内容。这些内容流包含构建页面的一系列命令。但这些命令采用引用内容流以外数据的参数,例如:

  • 在PDF页面上绘制文本时,内容流包含选择字体的操作,但描述字体的数据以及嵌入字体的字体程序本身在内容流之外
  • 当绘制位图图像时,内容流通常包含一个引用内容流之外的图像数据的操作
  • 有些操作引用所谓的XObject,这些XObject本质上是可以从任何页面调用的独立内容流;这些xobject也不包含在页面内容流中
此外,还有注释(例如表单字段),其自身的内容流存储在单独的结构中。许多页面属性也在外部

因此,大小上存在这样的差异,因为使用
getContentBytes
只获得页面定义的一小部分


现在让我们看一下“恢复文件”代码

作为上面的推论,很明显,您的代码只是连接了一些内容流,但没有提供这些流所引用的外部资源

但除此之外,您的代码还指出了一个关于PDF页面性质的误解:它们不仅仅是blob,您可以根据需要再次拆分和连接。它们是分布在整个PDF文件中的PDF对象集合;不同的页面可以共享一些对象(例如常用图像的字体)


你能做的是

作为单个页面的表示,您应该使用包含该页面引用的数据的PDF。iText示例演示了如何做到这一点

要再次加入这些单页PDF,可以使用iText
PdfMerger
。请记住设置智能模式(
PdfWriter.setSmartMode(true)
)以防止结果中的资源重复。

让我们从您的大小问题开始:

为什么尺寸有这么大的差异

因为
PdfPage.getContentBytes()
不会返回您期望的结果

您似乎期望它返回给定页面内容的完整表示,该方法的javadoc可能被解释为(“获取整个页面内容的解码字节”)

事实并非如此
PdfPage.getContentBytes()
返回页面内容流的内容。这些内容流包含构建页面的一系列命令。但这些命令采用引用内容流以外数据的参数,例如:

  • 在PDF页面上绘制文本时,内容流包含选择字体的操作,但描述字体的数据以及嵌入字体的字体程序本身在内容流之外
  • 当绘制位图图像时,内容流通常包含一个引用内容流之外的图像数据的操作
  • 有些操作引用所谓的XObject,这些XObject本质上是可以从任何页面调用的独立内容流;这些xobject也不包含在页面内容流中
此外,还有注释(例如表单字段),其自身的内容流存储在单独的结构中。许多页面属性也在外部

因此,大小上存在这样的差异,因为使用
getContentBytes
只获得页面定义的一小部分


现在让我们看一下“恢复文件”代码

作为上面的推论,很明显,您的代码只是连接了一些内容流,但没有提供这些流所引用的外部资源

但除此之外,您的代码还指出了一个关于PDF页面性质的误解:它们不仅仅是blob,您可以根据需要再次拆分和连接。它们是分布在整个PDF文件中的PDF对象集合;不同的页面可以共享一些对象(例如常用图像的字体)


你能做的是

作为单个页面的表示,您应该使用包含该页面引用的数据的PDF。iText示例演示了如何执行此操作