如何打开PDF原始文件?

48

我一直想看到PDF的内部结构,比如它的原始源代码,这样我就能查看它。有什么方法可以做到吗?


1
十六进制编辑器...?基本的PDF文件可以使用文本编辑器编写,或多或少... PDF规范可在http://www.adobe.com/devnet/pdf/pdf_reference.html上获得(也许不是完整的免费内容,尽管我记得几年前我从Adobe获得了一个免费的合法副本,也许是旧版本的PDF?) - ShinTakezou
5个回答

67
查看PDF的原始代码并不会对您有太大帮助,除非您也了解其内部结构。您应该获取官方PDF参考资料(下载PDF)的副本,并阅读一些介绍性文章,例如 this 作为开始。
即使进行了这样的准备,当您盯着原始代码时,您也不会发现太多有用的信息。因为PDF通常会包含“过滤”(即:压缩)的部分。
如何查看“原始”二进制部分背后的真实PDF源
杰伊·伯肯比尔特的qpdf是一个非常有用的命令行工具(可在Linux、Mac OSX、Windows和源代码下开放源代码授权下使用),可以解压大多数过滤内容并重新组织内部结构,从而使您能够更深入地了解它(所有对象都按数字顺序排列等)。实现此操作的命令行为:
 qpdf  --qdf  original.pdf  unpacked.pdf

另一个有用且免费的工具(GPL许可证,但据我所知仅适用于Linux)来查看PDF文件是当然PDFEdit。这个甚至带有图形用户界面(如果你喜欢),同时仍然允许您访问内部结构和“原始” PDF代码。


2
如果有人正在寻找PDF参考的最新链接,可以在此处找到:https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf(至少截至今天...)如果它被移动了,谷歌搜索PDF32000_2008.pdf应该会帮助你找到它。 - Jonáš Jančařík

8
如果只是查看文件的话,任何简单的文本编辑器都可以,例如记事本。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文件? - Shishir Shetty
1
据我所知,不行。实际上,PDF数据是一种二进制格式,而不是文本格式。你可以将其作为文本打开并进行分析,但不能随意更新它。要更新PDF,您需要操作二进制数据。要将某些内容转换为PDF,您需要使用环境中可用的API。 - user07

6

那个Adobe链接指向的是ISO 32000-1的补充,而不是实际规范。 - pavium

0

其他答案的一些最新观察。

Adobe不断地移动他们开源的2008标准副本,目前在此处 https://opensource.adobe.com/dc-acrobat-sdk-docs/standards/pdfstandards/pdf/PDF32000_2008.pdf
Web Archive目前在这里有一份副本 https://ia601003.us.archive.org/5/items/pdf320002008/PDF32000_2008.pdf

它们应该是相同的22,491,828个字节,所以要注意,它们都不包含任何勘误表。

PDF可以是纯mime "text/pdf",如完美注释生成自控制台键盘或命令行(速度太慢)或批处理文件。我不会让你看整个文件,但它是这样开始的:

REM Start with File "Magic" Signatures for a PDF
echo %%PDF-1.0>!Fname!
echo %%âãÏÓ>>!Fname!

echo %%01) Prepare file references>>!Fname!
for %%Z in (!Fname!) do set "FZ1=%%~zZ"
echo 1 0 obj>>!Fname!
echo ^<^</Names^<^</Dests 2 0 R^>^>/Outlines 3 0 R>>/PageLayout/OneColumn/PageMode/UseOutlines>>!Fname!

REM ToDo add files
REM /Lang (ga-IE)/MarkInfo^<^</Marked true^>^>/Names ^<^<^/EmbeddedFiles [(file.ext) 3 0 R]^>^>>>!Fname!

echo /Pages 4 0 R/Type/Catalog/ViewerPreferences^<^</DisplayDocTitle true^>^>^>^>>>!Fname!
echo endobj>>!Fname!

echo %%02) Prepare Named Destinations>>!Fname!

因此,经过注释的RAW PDF文件(请注意,我已经编辑了cmd文件的顺序,以便为XMP数据部分做准备,因此它们并不完全相同)可能如下所示:

%PDF-1.3 
%âãÏÓ
%01) Prepare file references
1 0 obj
<</Lang(ga-IE)/Names<</Dests 3 0 R>>/Outlines 4 0 R/PageLayout/OneColumn/PageMode/UseOutlines
/PageLabels<</Nums[0<</S/A>>]>>/Pages 5 0 R/Type/Catalog/ViewerPreferences<</DisplayDocTitle true>>>>
endobj
%02) Reserved for big meta data
2 0 obj
<< >>
endobj
%03) Prepare Named Destinations
3 0 obj
<</Names [(Page1) [6 0 R /XYZ 0 792 null] (QRCode) [6 0 R /XYZ 25.0 317.0 1]]>>
endobj
%04) Prepare Outline / Bookmarks
...
...

许多人建议将二进制应用程序/PDF解压为文本/PDF,其中一些可能是混合的,因此仍然具有二进制应用程序文本。

针对此任务设计的三个最常见工具是qpdf(已提到,但使用混合QDF)、PDFtk(解压)和Mutool(不同的CLI选项),我最常用的是Mutool,因为在GL GUI中更容易更改输出设置。可以在MS Notepad中修改输出并预览结果。

因此任何文本编辑脚本都可以编写或编辑PDF,即使带有图形,而且几个应用程序可以将原始“二进制”PDF转换为原始“文本”PDF。但是,在其文本base64 RePrEx中暂时尝试编辑PDF是不可行的(虽然可能)。

enter image description here


0
除了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相比,PDF的图形能力已经大大改进和扩展(字体、颜色空间、透明度等)。 - Kurt Pfeifle
当我使用该命令时,出现了错误:Unknown device: pswrite,并发现现在应该是ps2write。我的整个命令是 gs -sDEVICE=ps2write -sOutputFile=some.ps -dNOPAUSE -dBATCH example.pdf - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接