gpt4 book ai didi

java - sohronit如何将pdf文件中的byte字节[]分页并恢复回来

转载 作者:太空宇宙 更新时间:2023-11-04 12:22:31 24 4
gpt4 key购买 nike

我需要通过页面解析 PDF 文件并将每个页面单独加载到 byte[] 中。我使用 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();

为什么尺寸会有这么大的差别?为什么文件和页面都用byte[]来创建文件?

最佳答案

让我们从您的尺寸问题开始:

byte[] in = pdfData.getBytes(); // size file 88747
...
byte[] transform = pdfDocument.getPage(1).getContentBytes(); // 1907 size page

...

Why are there such a difference in size?

因为 PdfPage.getContentBytes() 不会返回您期望的内容。

您似乎期望它返回给定页面内容的完整表示,并且该方法的 Javadoc 可能会被解释为(“获取整个页面内容的解码字节。”)来表示这一点。

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

  • 当在 PDF 页面上绘制文本时,内容流包含选择字体的操作,但描述字体的数据以及嵌入字体的情况下,字体程序本身位于内容流之外;
  • 当绘制位图图像时,内容流通常包含一个引用内容流外部图像数据的操作;
  • 有一些引用所谓的 xobject 的操作,这些操作本质上是可以从任何页面调用的独立内容流;这些xobject也不包含在页面内容流中。

此外,还有带有自己的内容流的注释(例如表单字段),这些内容流存储在单独的结构中。许多页面属性也位于外部。

因此,大小存在如此大的差异,因为使用 getContentBytes 只能获取页面定义的一小部分。

<小时/>

现在让我们看看“恢复文件”的代码。

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

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

<小时/>

你可以做什么......

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

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

关于java - sohronit如何将pdf文件中的byte字节[]分页并恢复回来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38695484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com