pdf - JPEG 文件与 pdf 的 DCTDecode 流中包含的内容之间的区别?
问题描述
这个问题是关于 pdf 文件格式的内部结构及其对/Filter /DCTDecode
.
基本上,这个过滤器允许使用与我们在 jpeg 文件中找到的类似(或相同)压缩的图像数据。
想要在我的小 javascript 生成的 pdf 文件中不耐烦地包含/显示 jpeg 图像,我试图简单地将 jpeg 文件的逐字内容插入代表要显示的图像的 pdf 流对象中。
尽管我预计这不是“标准”方式,但有趣的是,它在 poppler、evince、xpdf 和 pdf.js 等众多观众中产生了正确的结果。
我粗略/外行的理解是,jpeg 文件包含一种文件容器内容,例如 MAGIC FILE STRING,以及通知图像宽度和高度的头文件。
该问题寻求以下信息:
- 包含完整的 JPEG 文件是否正确,其中 pdf 格式需要 a 的流数据
/Filter /DCTDecode
? - 如果不正确,数据的 pdf 流对象的内容
/DCTDecode
与 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) 标记- ETC...
两者都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
可以包含在数据流中,而不会妨碍正确解释它。实际上,应该有可能在流数据中浪费空间,在标记段之间,或者在标记中浪费空间,例如0xFF 0xFE
引入评论部分,而不需要解码图像数据。
** 基线/渐进式/特殊 **
JPEG 交换格式,如前所述,形成了数据如何存储在“JPEG 文件”和 pdf 的/Filter /DCTDecode
流对象中的基础,它提供了不同类型的图像编码。为了获得最佳兼容性,PDF 查看器可能只支持“基线”编码。
底线/总结
有使用0xFF XX
标记的 JIF(JPEG 交换格式)构成 JPEG 文件格式的基础,也是/Filter /DCTDecode
. 为了获得最佳兼容性(例如 PDF 1.4 和更早版本),仅支持作为“基线”的 JIF 编码图像数据的一部分,在这种情况下,当直接插入 pdf 文件时,JPEG 文件的内容很可能会正确显示/Filter /DCTDecode
流,假定应忽略任何 APP0 标记或其他标记。
推荐阅读
- c# - WPF:在后面的代码中动态更改 ScrollBarWidth
- python - 用逗号分隔符注释数据点
- sql - Postgres - 按会话聚合用户事件
- angular - 动态(深层)属性的角度绑定
- java - 使用 ORMLite 在数据库中存储枚举集合
- python - 如何找到解决任务的数学解决方案?
- azure - Azure 数据工厂 - 为每行导入的数据调用 REST 调用
- javascript - 如何实现底部 javascript 以与 PHP 和 HTML 结合使用
- javascript - 在 PHP 中为 AngularJS 生成 json 数组时出现问题
- typescript - 打字稿中的接口无法识别正确的类型