检查PDF文件的最佳工具?[关闭]


91

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

用例:我正在尝试以编程方式生成PDF文件(使用iText)。我在实现某些布局时遇到麻烦,但是我有PDF文件,其文本以我想要的方式布局(从Word生成)。我想对他们的工作进行反向工程。

PDF检查器似乎不错,但是我正在寻找Windows专用的东西。


PDF Inspector是基于Java的,因此是多平台的。
david.perez '17

2
似乎没有在Windows上运行。单击时,罐子不执行任何操作。当在命令行中调用时,我得到no main manifest attribute, in PDF Document Inspector.jar
Tom

@ david.perez,它是基于Java的,但经过苹果包装,因此有点像苹果专用发行版。有“ PDF Document Inspector.app/Contents/Resources/Java/PDF Document Inspector.jar”罐子,但无法以java -jar的形式启动“ PDF Document Inspector.jar”。com.apple.cocoa。*也很多。特定于平台。:(
andrej

我现在正在成功使用基于iText的Rups,多平台和Java。
david.perez,

Answers:


18

Adobe Acrobat具有非常酷但隐藏得很好的模式,可让您检查PDF文件。我在https://blog.idrsolutions.com/2009/04/viewing-pdf-objects/上写了一篇博客文章对其进行了解释。


这似乎需要一个插件。至少它在Linux上的Acrobat Reader 9.5.5中不可用。
亚当·斯皮尔斯

3
@AdamSpiers,预检对话框是Adobe Acrobat的功能,而不是Adobe Reader的功能
IPSUS 2015年

...并且Acrobat(以前是Acrobat Exchange)不适用于Linux:-/
Adam Spiers

7
印前检查对话框实际上需要Adobe Acrobat Pro。在Adobe Acrobat Standard中不可用。
致命的

1
这实际上是一个UI噩梦。
乔恩

83

除了其他答案中提到的基于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.pypdf-parser.py

pdfid.pypdf-parser.py两个迪迪埃·史蒂文斯PDF工具用Python编写的。

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

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

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

最后的笔记

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

  2. 如果将上述工具与给定的命令行示例进行比较,您会发现它们并不会产生完全相同的输出。比较它们本身差异的工作可以帮助您更好地了解PDF语法和文件格式的性质。


42

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

这是屏幕截图:

iText RUPS屏幕截图


9
java -jar itext-rups-5.5.6.jar-> Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/itextpdf/text/Version-您应该如何运行该程序?编辑:想通了。您不应下载SourceForge提供的默认文件,而需要下载包含依赖项的.jar。
Zero3

2
@ Zero3遇到了同样的事情。谢谢你的评论。
2015年

1
@KurtPfeifle我完全同意。不幸的是,许多软件(像这样!)只能通过SourceForge获得,因为维护者尚未将项目移到其他地方,而且可能永远也不会这样做。这些天从SourceForge下载任何内容时,您确实应该非常小心……
Zero3

7
是的-对于Windows用户,作为编译的jar甚至是exe。见github.com/itext/rups/releases/latest
Amedee Van Gasse

1
@AmedeeVanGasse此答案中的屏幕快照显示了页面视图(在文档树和外部参照选项卡之间)。如何在Windows的v5.5.9中显示该视图?
iPDFdev 2016年


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());


3

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

  1. 开启预检
  2. 转到选项(右上角)
  3. 内部PDF结构

最重要的是,Adobe Acrobat Pro还可以在PDF中显示文档字体的内部结构,其他大多数“ PDF树结构查看器”都没有此功能。

在此处输入图片说明


2
这就是@ mark-stephens在接受的答案中描述的内容。
koppor

3
@ mark-stephens的答案仅链接到将来可能会消失的博客文章(并且不鼓励这样做)。vadimo的实际上提供了答案。
海星

1

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



-6

我的建议是Foxit PDF Reader,它对在pdf文件上进行重要的文本编辑工作非常有帮助。


6
我在Foxit Reader中找不到任何方式可以查看类似于PDF Inspector(在问题中引用)的PDF的内部结构
bmaupin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.