检查PDF文件的最佳工具?

时间:2010-08-23 16:22:45

标签: pdf

您建议使用哪种工具检查PDF文件?

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

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

10 个答案:

答案 0 :(得分:57)

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

qpdf(我最喜欢的)

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

qpdf --qdf --object-streams=disable orig.pdf uncompressed-qpdf.pdf

qpdf将自己描述为“结构化,内容保留PDF文件转换”的工具

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

mutool

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

mutool clean -d orig.pdf uncompressed-mutool.pdf

podofouncompress

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

podofouncompress orig.pdf uncompressed-podofo.pdf

peepdf.py

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

可以交互使用它来“浏览”PDF中包含的对象和流。

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

pdfid.pypdf-parser.py

pdfid.py pdf-parser.py 是两个用Python编写的 peepdf - PDF Analysis Tool

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

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

pdf-parser.py -o 5 -f -d obj5.dump my.pdf

最后的笔记

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

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

答案 1 :(得分:32)

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

以下是截图:

iText RUPS screenshot

答案 2 :(得分:15)

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

解释它

答案 3 :(得分: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());

答案 4 :(得分:4)

来自O2 Solutions的PDFXplorer在展示内部方面做得非常出色。

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

(底部自由,分散注意力的横幅)。

答案 5 :(得分:3)

Acrobat中的对象查看器很好,但Windjack Solution的PDF Canopener允许使用吸管更好地检查页面上的对象。还允许对PDF进行修改。

http://www.windjack.com/products/pdfcanopener.html

答案 6 :(得分:3)

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

  1. 打开预检
  2. 转到选项(右上角)
  3. 内部PDF结构
  4. 在顶部Adobe Acrobat Pro还可以在PDF中显示文档字体的内部结构,其他大部分“PDF树结构查看器”都没有这个动作

    enter image description here

答案 7 :(得分:0)

如果您想从Python内以编程方式工作,pdfminer是一个不错的选择。它使您可以将内存中的PDF结构作为对象层次结构使用,或将其序列化为XML。

答案 8 :(得分:0)

答案 9 :(得分:-3)

我的热情是Foxit PDF Reader,这对于对pdf文件进行重要的文本编辑工作非常有帮助。