首页 > 解决方案 > JPEG 文件与 pdf 的 DCTDecode 流中包含的内容之间的区别?

问题描述

这个问题是关于 pdf 文件格式的内部结构及其对/Filter /DCTDecode.

基本上,这个过滤器允许使用与我们在 jpeg 文件中找到的类似(或相同)压缩的图像数据。

想要在我的小 javascript 生成的 pdf 文件中不耐烦地包含/显示 jpeg 图像,我试图简单地将 jpeg 文件的逐字内容插入代表要显示的图像的 pdf 流对象中。

尽管我预计这不是“标准”方式,但有趣的是,它在 poppler、evince、xpdf 和 pdf.js 等众多观众中产生了正确的结果。

我粗略/外行的理解是,jpeg 文件包含一种文件容器内容,例如 MAGIC FILE STRING,以及通知图像宽度和高度的头文件。

该问题寻求以下信息:

  1. 包含完整的 JPEG 文件是否正确,其中 pdf 格式需要 a 的流数据/Filter /DCTDecode
  2. 如果不正确,数据的 pdf 流对象的内容/DCTDecode与 JPGE 文件格式有什么区别?

标签: pdfpdf-generationjpeg

解决方案


其核心是寻求有关a)存储在“JPEG 文件”中的数据内容和b)存储在/Filter /DCTDecode嵌入 PDF 文件的流对象中的数据内容之间差异的信息。需要提及的一些方面是:

JPEG 文件

首先,更仔细地查看一下实际上是什么“JPEG 文件”会很有帮助。事实证明,它的定义并不像人们预期的那样明确:

“JPEG 文件”的文件扩展名都有一些变化,因为.jpg/.jpeg都是常用的,更重要的是它们的文件格式是要么JPEG/Exif要么JPEG/JFIF. 尽管这两种格式提供了一些不同的方式来将 JPEG 编码的图像数据存储在一个文件中,但它们非常相似,因为它们都依赖于底层的JPEG Interchange Format. 数据的组织方式JPEG Interchange Format是通过使用两个字节0xFF<XX>标记,例如:

  • 0xFF 0xD8图像开始 (SOI) 标记
  • 0xFF 0xD9图像结束 (EOI) 标记
  • 0xFF 0xC4定义霍夫曼表 (DHT) 标记
  • 0xFF 0xDB定义量化表 (DQT) 标记
  • 0xFF 0xDA扫描开始 (SOS) 标记
  • 0xFF 0xC0帧开始 (SOF 0) 标记
  • ETC...

两者都JPEG/Exif保留JPEG/JFIF这些标记,并补充一个App0应用程序标记0xFF 0xE0段,该段提供一些额外的(但不是绝对必要的)信息。

/Filter /DCTDecode

正如另一个答案中已经提到的那样,至少:

DCTDecode 过滤器对以 JPEG 基线格式编码的灰度或彩色图像数据进行解码。[.....] Acrobat 产品中的 JPEG 过滤器实施不支持与图像无关的 JPEG 标准功能。此外,已对保留的标记代码和标准的其他可选功能做出了某些选择。有关详细信息,请参阅 Adob​​e 技术说明 #5116,在 PostScript 级别 2 中支持 DCT 过滤器。

这暗示了存储在 PDF/Filter /DCTDecode流中的数据将是JPEG Interchange Format,这意味着它不需要额外的标记JPEG/ExifJPEG/JFIF。然而,考虑到为 DCTDecode 提供前缀/标记所需的相应信息的机制,它的 APP0 制造商JPEG/ExifJPEG/JFIF什至JPEG/Adobe可以包含在数据流中,而不会妨碍正确解释它。实际上,应该有可能在流数据中浪费空间,在标记段之间,或者在标记中浪费空间,例如0xFF 0xFE引入评论部分,而不需要解码图像数据。

** 基线/渐进式/特殊 **

JPEG 交换格式,如前所述,形成了数据如何存储在“JPEG 文件”和 pdf 的/Filter /DCTDecode流对象中的基础,它提供了不同类型的图像编码。为了获得最佳兼容性,PDF 查看器可能只支持“基线”编码。

底线/总结

有使用0xFF XX标记的 JIF(JPEG 交换格式)构成 JPEG 文件格式的基础,也是/Filter /DCTDecode. 为了获得最佳兼容性(例如 PDF 1.4 和更早版本),仅支持作为“基线”的 JIF 编码图像数据的一部分,在这种情况下,当直接插入 pdf 文件时,JPEG 文件的内容很可能会正确显示/Filter /DCTDecode流,假定应忽略任何 APP0 标记或其他标记。


推荐阅读