JPEG 文件与 pdf 的 DCTDecode 流中包含的内容之间的区别?

hum*_*ace 4 pdf jpeg pdf-generation

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

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

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

尽管我希望这不是“标准”方式,但有趣的是,它在一堆观众中产生了正确的结果,其中包括 poppler、evince、xpdf 和 pdf.js。

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

该问题寻求以下信息:

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

hum*_*ace 5

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

JPEG 文件

首先,更仔细地了解一下什么是“JPEG 文件”是有帮助的。事实证明,它的定义并不像人们想象的那样清晰:

“JPEG 文件”的文件扩展名都有一些变化,因为这两个.jpg/.jpeg都是常用的,更重要的是它们的文件格式是JPEG/ExifJPEG/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) 标记
  • 等等...

双方JPEG/ExifJPEG/JFIF保持这些标记,并补充一个App0应用标记0xFF 0xE0段提供了一些额外的(但不是绝对必要的)信息。

/Filter /DCTDecode

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

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

这暗示了一个事实,即 PDF/Filter /DCTDecode流中存储的数据是JPEG Interchange Format,这意味着它不需要JPEG/Exif或的附加标记JPEG/JFIF。然而给出提供所需DCTDecode各信息的前缀的机制/通过标记它的APP0厂商标明任一JPEG/ExifJPEG/JFIF或甚至JPEG/Adobe可以被包含在数据流的内部,而不会impeeding它被正确地解释。实际上,应该有可能在流数据中、标记段之间浪费空间,或者在标记中浪费空间,例如0xFF 0xFE引入评论部分,而不是解码图像数据所必需的。

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

JPEG交换格式,其如所提到的形式二者的数据是如何存储在“JPEG文件”和wihtin的PDF的基础/Filter /DCTDecode流对象,提供了不同类型的图像编码。为获得最佳兼容性,预计 PDF 查看器仅支持“基线”编码。

底线/总结

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