您建议使用哪种工具检查PDF文件?
用例:我正在尝试以编程方式生成PDF文件(使用iText)。我在实现某些布局方面遇到了麻烦,但是我的PDF文件的文本按我想要的方式布局(从Word生成)。我想逆向工程他们是如何做到的。
PDF Inspector似乎很好,但我正在为Windows寻找一些东西。
答案 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.py
和pdf-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
请注意,PDF中的某些二进制部分不一定是不可压缩的(或可解码为人类可读的ASCII代码),因为它们是嵌入式的,并以PDF格式的原生格式使用。这些PDF部分是JPEG图像,字体或ICC颜色配置文件。
如果您比较上面的工具和给出的命令行示例,您会发现它们 NOT 都生成相同的输出。将它们本身的差异进行比较的努力可以帮助您更好地理解PDF语法和文件格式的本质。
答案 1 :(得分:32)
我在Linux中使用iText RUPS(阅读和更新PDF语法)。由于它是用Java编写的,因此它也适用于Windows。您可以在树结构中浏览PDF文件中的所有对象。它还可以即时解码Flate编码流,使检查更容易。
以下是截图:
答案 2 :(得分:15)
Adobe 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)
http://www.o2sol.com/pdfxplorer/overview.htm
(底部自由,分散注意力的横幅)。
答案 5 :(得分:3)
Acrobat中的对象查看器很好,但Windjack Solution的PDF Canopener允许使用吸管更好地检查页面上的对象。还允许对PDF进行修改。
答案 6 :(得分:3)
还有另一种选择。 Adobe Acrobat Pro还能够显示PDF的内部树结构。
答案 7 :(得分:0)
如果您想从Python内以编程方式工作,pdfminer是一个不错的选择。它使您可以将内存中的PDF结构作为对象层次结构使用,或将其序列化为XML。
答案 8 :(得分:0)
PDF Analyzer与PDFXplorer类似,但有更多选择。 一次注册也免费。
答案 9 :(得分:-3)
我的热情是Foxit PDF Reader,这对于对pdf文件进行重要的文本编辑工作非常有帮助。