您建议使用哪种工具检查PDF文件?
用例:我正在尝试以编程方式生成PDF文件(使用iText)。我在实现某些布局时遇到麻烦,但是我有PDF文件,其文本以我想要的方式布局(从Word生成)。我想对他们的工作进行反向工程。
PDF检查器似乎不错,但是我正在寻找Windows专用的东西。
您建议使用哪种工具检查PDF文件?
用例:我正在尝试以编程方式生成PDF文件(使用iText)。我在实现某些布局时遇到麻烦,但是我有PDF文件,其文本以我想要的方式布局(从Word生成)。我想对他们的工作进行反向工程。
PDF检查器似乎不错,但是我正在寻找Windows专用的东西。
no main manifest attribute, in PDF Document Inspector.jar
Answers:
Adobe Acrobat具有非常酷但隐藏得很好的模式,可让您检查PDF文件。我在https://blog.idrsolutions.com/2009/04/viewing-pdf-objects/上写了一篇博客文章对其进行了解释。
除了其他答案中提到的基于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
MuPDF PDF查看器(这是同一公司Artifex制造的Ghostscript的姊妹产品)mutool
附带有一个命令行工具。以下命令还会解压缩流,并使它们更易于通过文本编辑器检查:
mutool clean -d orig.pdf uncompressed-mutool.pdf
podofouncompress
PoDoFo是一个使用PDF格式的FreeSoftware / OpenSource库,它包含一些命令行工具,包括podofouncompress
。像这样使用它解压缩PDF流:
podofouncompress orig.pdf uncompressed-podofo.pdf
peepdf.py
PeePDF是基于Python的工具,可帮助您浏览PDF文件。它的最初目的是研究和剖析基于PDF的恶意软件,但我发现研究完全良性的PDF文件的结构也很有用。
可以交互使用它来“浏览” PDF中包含的对象和流。
我在这里不提供用法示例,而仅提供其文档的链接:
pdfid.py
和 pdf-parser.py
pdfid.py
和pdf-parser.py
两个迪迪埃·史蒂文斯PDF工具用Python编写的。
它们的背景还可以帮助探索恶意 PDF,但是我也发现分析良性PDF文件的结构和内容很有用。
这是一个示例,我将如何提取未压缩的PDF对象编号流。5进入* .dump文件:
pdf-parser.py -o 5 -f -d obj5.dump my.pdf
请注意,PDF内的某些二进制部分不一定是不可压缩的(或可解码为人类可读的ASCII代码),因为它们已嵌入并以其本机格式在PDF内使用。此类PDF部分是JPEG图像,字体或ICC颜色配置文件。
如果将上述工具与给定的命令行示例进行比较,您会发现它们并不会产生完全相同的输出。比较它们本身差异的工作可以帮助您更好地了解PDF语法和文件格式的性质。
我在Linux中使用iText RUPS(读取和更新PDF语法)。由于它是用Java编写的,因此也可以在Windows上运行。您可以树状结构浏览PDF文件中的所有对象。它还可以即时解码Flate编码的流,从而使检查变得更加容易。
这是屏幕截图:
java -jar itext-rups-5.5.6.jar
-> Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/itextpdf/text/Version
-您应该如何运行该程序?编辑:想通了。您不应下载SourceForge提供的默认文件,而需要下载包含依赖项的.jar。
O2 Solutions的PDFXplorer在显示内部结构方面做得非常出色。
http://www.o2sol.com/pdfxplorer/overview.htm
(免费,分散注意力的横幅位于底部)。
我已经成功使用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());
Acrobat中的对象查看器很好,但是Windjack Solution的PDF Canopener可以使用吸管更好地检查以选择页面上的对象。还允许对PDF进行修改。
如果要在Python中以编程方式进行工作,pdfminer是一个不错的选择。它允许您将内存中的PDF结构作为对象层次结构使用或将其序列化为XML。
我的建议是Foxit PDF Reader,它对在pdf文件上进行重要的文本编辑工作非常有帮助。