【问题标题】:How to open PDF raw?如何打开PDF raw?
【发布时间】:2011-09-27 13:56:46
【问题描述】:

我一直想看看 PDF 的内部,比如它的原始源代码,以便我可以查看它。有什么办法吗?

【问题讨论】:

  • 十六进制编辑器...?基本的 pdf 可以用文本编辑器编写,或多或少... pdf 规格可用adobe.com/devnet/pdf/pdf_reference.html (也许不是免费的全部东西,虽然我记得几年前我从 Adob​​e 那里得到了一份免费的合法副本,可能更旧PDF 版本?)

标签: pdf adobe


【解决方案1】:

除非您也了解其内部结构,否则查看 PDF 的原始代码对您没有多大帮助。你应该得到一份official PDF reference (download PDF) 的副本,并且你应该先阅读一些介绍性文章,例如 this [gone] this

即使经过这样的准备,您在查看原始代码时也不会发现太多用处。因为 PDF 通常会包含“过滤”的部分(即:压缩)。

如何查看“原始”二进制部分背后的真实 PDF 源代码

Jay Birkenbilt 的qpdf 是一个非常有用的命令行工具(可用于 Linux、Mac OSX 和作为源代码,在开源艺术许可下),它可以解压缩大多数过滤的内容并以某种方式重新组织内部结构这使您可以更深入地了解它(所有对象都按数字顺序排列,等等)。实现这一点的命令行是:

 qpdf  --qdf  original.pdf  unpacked.pdf

查看 PDF 的另一个有用且免费的工具(GPL 许可,但仅限 Linux AFAIK)当然是PDFEdit。这个甚至来自with a GUI(如果您愿意的话),同时仍然允许您访问内部结构和“原始” PDF 代码。

【讨论】:

【解决方案2】:

使用Hex editor。当然,除非您知道PDF specification(PDF,8.6 MB),否则您不会认识太多。

【讨论】:

  • Adobe 链接指向 ISO 32000-1 的补充不是实际规范。
【解决方案3】:

如果目的只是查看文件,那么任何简单的文本编辑器都可以,例如记事本。 PDF 只是一种基于文本的格式,包括嵌入的内容字节流。原始 PDF 如下所示:

>>
/Border [0 0 0]
/Rect [121.02 332.48 363.24 343.64]
/StructParent 1321
/Subtype /Link
/Type /Annot
>>
endobj
64579 0 obj
<<
/Filter /FlateDecode
/Length 5771
>>
stream
Ũn0x/�+�}�ǹ����\֛ bYO�5[��X��W��L��(�������V�A3�C���������u큋_�a��ךm2N�6�    ��A��8
�d���NQ⺢GI��G�[��)�̉Y��R�y{R����&�&�;��g�k1���ҋeTC�(W��`���*��(;�AEc<=  mnZ+��|T��v
�.��зe�aޞ��V4�b���L����k�Oj.ֿ�y�����kc|I��  ��C�0��Hf�7d�/�z���m��o��A��B��IJ�%�. 
!�%f�б���&�ޒ�4Ύ7�l�3���3`�
endstream
endobj
64580 0 obj
<<
/Border [0 0 0]
/Dest <E4AE7DD2769553EF1668>
/Rect [219 648.5 256.8 659.66]
/StructParent 1323
/Subtype /Link
/Type /Annot
>>

您看到的是基本的 COS 对象,例如名称、字典、流等。所有对象都在PDF 32000 标准中进行了描述,请参阅7.3 对象部分。

【讨论】:

  • 有什么方法可以用 JavaScript 将这些文本数据转换为 PDF 文件?
  • 据我所知,没有。实际上 PDF 数据是二进制格式,而不是文本格式。您可以打开它并作为文本进行分析,但您不能只用任何内容更新它。要更新 PDF,您需要使用二进制数据进行操作。要将某些内容转换为 PDF,您需要使用环境中可用的 API。
【解决方案4】:

除了将 qpdf 工具转换为 postscript 可能会有所帮助。 PDF 是 PS 的子集。通常它很容易弄清楚,例如图的标签在哪里。您可以使用 pdf2ps 或调用 ghostscript

gs -sDEVICE=pswrite some.pdf -sOutputFile=some.ps -dNOPAUSE -c quit

当您使用 pdflatex 生成 PDF 时,您可以使用一个选项禁用压缩。这使 PDF 更具可读性。

【讨论】:

  • 不,PDF 不能准确地描述为“PostScript 的子集”。它源自 PostScript 是的:它的图形模型大致相同,它的语言语义是 PostScript 的一个子集,并且它使用的一些运算符在 PostScript 中具有相同的匹配项(使用较短的名称)。然而,与 PostScript 相比,图形功能得到了很大的改进和扩展(字体、色彩空间、透明度......)
  • 我在使用该命令时出错:Unknown device: pswrite,发现它现在应该是ps2write。我的整个命令是gs -sDEVICE=ps2write -sOutputFile=some.ps -dNOPAUSE -dBATCH example.pdf