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,以及告知图像宽度和高度的头文件。
该问题寻求以下信息:
/Filter /DCTDecode?/DCTDecode数据的pdf流对象的内容和JPGE文件格式有什么区别?其核心是寻求有关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) 标记双方JPEG/Exif并JPEG/JFIF保持这些标记,并补充一个App0应用标记0xFF 0xE0段提供了一些额外的(但不是绝对必要的)信息。
/Filter /DCTDecode
正如在另一个答案中已经提到的那样,至少:
DCTDecode 过滤器解码以 JPEG 基线格式编码的灰度或彩色图像数据。[.....] Acrobat 产品中的 JPEG 过滤器实现不支持与图像无关的 JPEG 标准功能。此外,还对保留标记代码和标准的其他可选功能进行了某些选择。有关详细信息,请参阅 Adobe 技术说明 #5116,支持 PostScript 级别 2 中的 DCT 过滤器。
这暗示了一个事实,即 PDF/Filter /DCTDecode流中存储的数据是JPEG Interchange Format,这意味着它不需要JPEG/Exif或的附加标记JPEG/JFIF。然而给出提供所需DCTDecode各信息的前缀的机制/通过标记它的APP0厂商标明任一JPEG/Exif,JPEG/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 标记或其他标记都应该被忽略。