检查PDF文件的最佳工具?

bmm*_*m6o 74 pdf

您建议使用什么工具检查PDF文件?

使用案例:我正在尝试以编程方式生成PDF文件(使用iText).我在实现某些布局方面遇到了麻烦,但是我的PDF文件的文本按我想要的方式布局(从Word生成).我想逆向工程他们是如何做到的.

PDF Inspector似乎很好,但我正在为Windows寻找一些东西.

Kur*_*fle 64

除了其他答案中提到的基于GUI的工具外,还有一些命令行工具可以将原始PDF源代码转换为不同的表示形式,使您可以使用文本编辑器检查(现在已修改的文件).以下所有工具均适用于Linux,Mac OS X,其他Unix系统或Windows.

qpdf (我的最爱)

使用qpdf解压缩(大多数)对象的流,并将ObjStm对象分解为单个间接对象:

qpdf --qdf --object-streams=disable orig.pdf uncompressed-qpdf.pdf
Run Code Online (Sandbox Code Playgroud)

qpdf将自己描述为"在PDF文件上进行结构化,内容保留转换"的工具.

然后uncompressed-qpdf.pdf在您喜欢的文本编辑器中打开+检查文件.大多数先前压缩的(因此,二进制)字节现在将是纯文本.

mutool

还有mutool命令行工具与MuPDF PDF查看器捆绑在一起(这是Ghostscript的姐妹产品,由同一家公司Artifex制作).以下命令还会解压缩流并使它们更容易通过文本编辑器进行检查:

mutool clean -d orig.pdf uncompressed-mutool.pdf
Run Code Online (Sandbox Code Playgroud)

podofouncompress

PoDoFo是一个FreeSoftware/OpenSource库,可以使用PDF格式,它包括一些命令行工具,包括podofouncompress.像这样使用它来解压缩PDF流:

podofouncompress orig.pdf uncompressed-podofo.pdf
Run Code Online (Sandbox Code Playgroud)

peepdf.py

PeePDF是一个基于Python的工具,可以帮助您探索PDF文件.它最初的目的是研究和剖析基于PDF的恶意软件,但我发现调查完全良性PDF文件的结构也很有用.

它可以以交互方式用于"浏览"PDF中包含的对象和流.

我不会在这里给出一个用法示例,但只提供其文档的链接:

pdfid.pypdf-parser.py

pdfid.py并且pdf-parser.pyDidier Stevens用Python编写的两个PDF工具.

他们的背景也是为了帮助探索恶意 PDF - 但我也发现分析良性PDF文件的结构和内容很有用.

这是一个如何提取未压缩的PDF对象流的示例.5进入*.dump文件:

pdf-parser.py -o 5 -f -d obj5.dump my.pdf
Run Code Online (Sandbox Code Playgroud)

最后的笔记

  1. 请注意,PDF中的某些二进制部分不一定是不可压缩的(或可解码为人类可读的ASCII代码),因为它们是嵌入式的,并以PDF格式的原生格式使用.这些PDF部件是JPEG图像,字体或ICC颜色配置文件.

  2. 如果比较上面的工具和给出的命令行示例,您会发现它们并非都生成相同的输出.将它们本身的差异进行比较的努力可以帮助您更好地理解PDF语法和文件格式的本质.


gkc*_*kcn 38

我在Linux中使用iText RUPS(读取和更新PDF语法).由于它是用Java编写的,因此它也适用于Windows.您可以在树结构中浏览PDF文件中的所有对象.它还可以即时解码Flate编码流,使检查更容易.

这是一个截图:

iText RUPS截图

  • `java -jar itext-rups-5.5.6.jar` - >`线程中的异常"AWT-EventQueue-0"java.lang.NoClassDefFoundError:com/itextpdf/text/Version` - 你应该怎么运行这个东西?编辑:想出来.您不应下载SourceForge提供的默认文件,您需要下载包含依赖项的.jar. (9认同)
  • 是 - 对于Windows用户,作为编译的jar甚至是exe.请参阅http://github.com/itext/rups/releases/latest (6认同)
  • @ Zero3刚刚遇到同样的事情.谢谢你的评论. (2认同)

mar*_*ens 18

Adobe Acrobat有一个非常酷但很好隐藏的模式,允许您检查PDF文件.我在https://blog.idrsolutions.com/2009/04/viewing-pdf-objects/写了一篇博客文章解释它.

  • @AdamSpiers,预检对话框是 Adob​​e Acrobat 的功能,而不是 Adob​​e Reader (3认同)
  • 印前检查对话框实际上需要Adobe Acrobat Pro。在Adobe Acrobat Standard中不可用。 (3认同)
  • 实际使用起来这是一场 UI 噩梦。 (2认同)

Vad*_*imo 7

还有另一种选择。Adobe Acrobat Pro 还能够显示 PDF 的内部树结构。

  1. 打开预检
  2. 转到选项(右上角)
  3. 内部PDF结构

在上面 Adob​​e Acrobat Pro 还可以显示 PDF 中文档字体的内部结构,大多数其他“PDF 树结构查看器”没有这个选项

在此处输入图片说明

  • @mark-stephens 的回答只是链接到将来可能会消失的博客文章(因此不鼓励这样做)。vadimo 实际上提供了答案。 (5认同)
  • 这就是@mark-stephens 在接受的答案中所描述的。 (3认同)

Kal*_*son 5

我使用PDFBox取得了很好的成功.以下是代码外观的示例(从0.7.2版开始),可能来自提供的示例之一:

// load the document
System.out.println("Reading document: " + filename);
PDDocument doc = null;                                                                                                                                                                                                          
doc = PDDocument.load(filename);

// look at all the document information
PDDocumentInformation info = doc.getDocumentInformation();
COSDictionary dict = info.getDictionary();
List l = dict.keyList();
for (Object o : l) {
    //System.out.println(o.toString() + " " + dict.getString(o));
    System.out.println(o.toString());
}

// look at the document catalog
PDDocumentCatalog cat = doc.getDocumentCatalog();
System.out.println("Catalog:" + cat);

List<PDPage> lp = cat.getAllPages();
System.out.println("# Pages: " + lp.size());
PDPage page = lp.get(4);
System.out.println("Page: " + page);
System.out.println("\tCropBox: " + page.getCropBox());
System.out.println("\tMediaBox: " + page.getMediaBox());
System.out.println("\tResources: " + page.getResources());
System.out.println("\tRotation: " + page.getRotation());
System.out.println("\tArtBox: " + page.getArtBox());
System.out.println("\tBleedBox: " + page.getBleedBox());
System.out.println("\tContents: " + page.getContents());
System.out.println("\tTrimBox: " + page.getTrimBox());
List<PDAnnotation> la = page.getAnnotations();
System.out.println("\t# Annotations: " + la.size());
Run Code Online (Sandbox Code Playgroud)


Pie*_*rre 5

O2 Solutions的PDFXplorer在显示内部结构方面做得非常出色。

http://www.o2sol.com/pdfxplorer/overview.htm

(免费,分散注意力的横幅位于底部)。