检查PDF文件的最佳工具?
如何检查PDF文件,最好使用工具 用例:我正在尝试以编程方式生成PDF文件(使用iText)。我在实现某些布局时遇到困难,但我有PDF文件,其中的文本按我想要的方式排列(由Word生成)。我想逆向工程他们是如何做到这一点的 看起来不错,但我正在寻找适合Windows的产品。我已经成功地使用了。下面是代码的示例(从版本0.7.2开始),可能来自提供的示例之一:检查PDF文件的最佳工具?,pdf,Pdf,如何检查PDF文件,最好使用工具 用例:我正在尝试以编程方式生成PDF文件(使用iText)。我在实现某些布局时遇到困难,但我有PDF文件,其中的文本按我想要的方式排列(由Word生成)。我想逆向工程他们是如何做到这一点的 看起来不错,但我正在寻找适合Windows的产品。我已经成功地使用了。下面是代码的示例(从版本0.7.2开始),可能来自提供的示例之一: // load the document System.out.println("Reading document: " + filena
// 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());
//加载文档
System.out.println(“读取文档:“+filename”);
PDDocument=null;
doc=PDDocument.load(文件名);
//查看所有文档信息
PDDocumentInformation info=doc.getDocumentInformation();
COSDictionary dict=info.getDictionary();
列表l=dict.keyList();
用于(对象o:l){
//System.out.println(o.toString()+“”+dict.getString(o));
System.out.println(o.toString());
}
//查看文档目录
PDDocumentCatalog cat=doc.getDocumentCatalog();
系统输出打印项次(“目录:+cat”);
List lp=cat.getAllPages();
System.out.println(“#Pages:+lp.size());
PDPage=lp.get(4);
System.out.println(“第:“+页”);
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(“\t内容:+page.getContents());
System.out.println(“\tTrimBox:+page.getTrimBox());
List la=page.getAnnotations();
System.out.println(“\t#注释:“+la.size());
Adobe Acrobat有一个非常酷但隐藏良好的模式,允许您检查PDF文件。我在上写了一篇博客文章解释了这一点,Acrobat中的对象查看器很好,但Windjack解决方案的PDF Canopener允许使用滴管更好地检查页面上的对象。还允许对PDF进行修改
我在Linux中使用(读取和更新PDF语法)。因为它是用Java编写的,所以它也可以在Windows上运行。您可以在树结构中浏览PDF文件中的所有对象。它还可以动态解码扁平编码流,以便于检查
以下是一个屏幕截图:
除了其他答案中提到的基于GUI的工具外,还有一些命令行工具可以将原始PDF源代码转换为不同的表示形式,让您可以使用文本编辑器检查(现在已修改的文件)。以下所有工具都适用于Linux、Mac OS X、其他Unix系统或Windows
qpdf
(我的最爱)
使用解压(大多数)对象的流,并将ObjStm
对象分解为单独的间接对象:
qpdf --qdf --object-streams=disable orig.pdf uncompressed-qpdf.pdf
qpdf
将自己描述为一种“对PDF文件进行结构化、内容保留转换”的工具
然后只需在您喜爱的文本编辑器中打开并检查未压缩的qpdf.pdf
文件。以前压缩的(因此是二进制的)字节现在大部分是纯文本
mutool
还有mutool
命令行工具,它与PDF查看器捆绑在一起(这是Ghostscript的姊妹产品,由同一家公司生产)。以下命令还可以解压缩流,并使其更易于通过文本编辑器进行检查:
mutool clean -d orig.pdf uncompressed-mutool.pdf
podofocompress
是一个用于PDF格式的免费软件/开源库,它包括一些命令行工具,包括podofouncompress
。像这样使用它来解压缩PDF流:
podofouncompress orig.pdf uncompressed-podofo.pdf
peepdf.py
是一个基于Python的工具,可帮助您浏览PDF文件。它最初的目的是研究和剖析基于PDF的恶意软件,但我发现它对研究完全良性PDF文件的结构也很有用
它可以交互地用于“浏览”PDF中包含的对象和流
这里我不提供使用示例,只提供指向其文档的链接:
pdfid.py
和pdf parser.py
pdfid.py
和pdf parser.py
是用Python编写的两个
他们的背景也有助于探索恶意PDF——但我发现分析良性PDF文件的结构和内容也很有用
下面是一个示例,我将如何将5号PDF对象的未压缩流提取到*.dump文件中:
pdf-parser.py -o 5 -f -d obj5.dump my.pdf
最后说明
还有另一种选择。Adobe Acrobat Pro还能够显示PDF的内部树结构