从 byte[] 识别分页符

Identifying page break from byte[]

我有一个用例,我通过将字节写入 ServletOutputStream 下载一个大文件,我想 return 一些指定的页面而不完全加载内存中的文件和使用库。

  1. 是否可以从字节流中识别分页符?
  2. 如果是,正确的做法应该是什么?

编辑 该文件是使用 Apache PDFBox 创建和存储的。

Is it possible to identify the page break from the byte stream?

没有。原因很简单,字节流没有分页。

PDF 文件包含大量对象(字体、色彩空间、位图...),可在多个页面上使用。在某些 PDF 中,所有页面甚至共享所有资源。因此,您在 PDF 字节数组中没有用于页面的部分,只有该页面。

此外,这些对象是通过交叉引用流或表通过它们在文件中的偏移量来引用的。因此,仅服务于某些给定页面所需的字节流区域无法开始,因为那时偏移量是错误的。

理论上可以确定 PDF 字节流中哪些区域 不是 被那些给定页面使用,而是传输 0s。如果您使用一些传输压缩,这些区域会压缩得很好。但是要确定这些区域,您需要一个您不想做的 PDF 库。

或者,有一种特殊的方法可以保存针对部分文件访问优化的 PDF 文件(这样保存的文件称为“线性化”),但这对您也没有帮助,因为 PDFBox 不提供这样的保存 PDF 和因为利用该优化需要支持 HTTP 范围,而 servlet 容器或 servlet 本身很少支持这些范围。


IMO,您最好的选择是更改大文件的生成以生成您想要的较小文件,而不是(或除此之外)大文件。

你问的是什么

有了 PDF 文档,您可以编写代码来创建只有一页的小型 PDF 文档。一个 10 页的 PDF 将提供 10 个单独的 PDF,总字节数比原始 PFD 多得多。

这真令人失望,据我所知,没有简单的分页系统。

围绕 PDF 流

可以生成针对网络流优化的 PDF:

  • 顺序,in-order 元素呈现
  • 使用前的图像数据
  • 最好使用标准字体,它们已经存在于 PDF 查看器中。 仅传输使用的字符的嵌入式字体次之,但是 不适合 PFD 表格。
  • PDFBox 及其线性化 PDF 的功能我不知道,但它可能足以创建 PDF in-order。

当然,页面徽标等只需定义一次。

图像必须有适合打印的解决方案。

矢量图可以是理想的 (eps, svg)。