您建议使用什么工具检查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.py
和 pdf-parser.py
pdfid.py
并且pdf-parser.py
是Didier 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)
请注意,PDF中的某些二进制部分不一定是不可压缩的(或可解码为人类可读的ASCII代码),因为它们是嵌入式的,并以PDF格式的原生格式使用.这些PDF部件是JPEG图像,字体或ICC颜色配置文件.
如果比较上面的工具和给出的命令行示例,您会发现它们并非都生成相同的输出.将它们本身的差异进行比较的努力可以帮助您更好地理解PDF语法和文件格式的本质.
gkc*_*kcn 38
我在Linux中使用iText RUPS(读取和更新PDF语法).由于它是用Java编写的,因此它也适用于Windows.您可以在树结构中浏览PDF文件中的所有对象.它还可以即时解码Flate编码流,使检查更容易.
这是一个截图:
mar*_*ens 18
Adobe Acrobat有一个非常酷但很好隐藏的模式,允许您检查PDF文件.我在https://blog.idrsolutions.com/2009/04/viewing-pdf-objects/写了一篇博客文章解释它.
还有另一种选择。Adobe Acrobat Pro 还能够显示 PDF 的内部树结构。
在上面 Adobe Acrobat Pro 还可以显示 PDF 中文档字体的内部结构,大多数其他“PDF 树结构查看器”没有这个选项
我使用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)
O2 Solutions的PDFXplorer在显示内部结构方面做得非常出色。
http://www.o2sol.com/pdfxplorer/overview.htm
(免费,分散注意力的横幅位于底部)。