我怎样才能直观地检查一个 PDF 文件? 有什么工具可以在窗口上工作吗?

如何检查 PDF 文件,最好使用工具?

用例: 我正在尝试以编程方式生成 PDF 文件(使用 iText)。我有困难实现某些布局,但我有 PDF 文件与文本布局的方式,我想(从 Word 生成)。我想逆向工程他们如何做到这一点。

PDF 检视器 看起来不错,但是我正在为 Windows 寻找一些东西。

169779 次浏览

I've used PDF 文件夹 with good success. Here's a sample of what the code looks like (back from version 0.7.2), that likely came from one of the provided examples:

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

AdobeAcrobat 有一个非常酷但相当好的隐藏模式,允许你检查 PDF 文件。我在 https://blog.idrsolutions.com/2009/04/viewing-pdf-objects/上写了一篇博客文章来解释这个问题

Acrobat 中的对象查看器不错,但 Windjack Solution 有一个 Acrobat 的插件 PDF Canopener,它可以用吸管更好地检查页面上的对象。还允许对 PDF 进行修改。

Https://www.windjack.com/product/pdfcanopener/

我在 Linux 中使用 IText RUPS(阅读和更新 PDF 语法)。因为它是用 Java 编写的,所以也可以在 Windows 上运行。您可以以树形结构浏览 PDF 文件中的所有对象。它还可以对 Flate 编码的流进行动态解码,使检查更加容易。

下面是一个截图:

iText RUPS screenshot

除了其他答案中提到的基于 GUI 的工具之外,还有一些命令行工具可以将原始 PDF 源代码转换成不同的表示形式,让您使用文本编辑器检查(现在已经修改的文件)。下面的所有工具都可以在 Linux、 MacOSX、其他 Unix 系统或 Windows 上使用。

qpdf(我的最爱)

使用 翻译: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳校对: 奇芳来解压缩(大多数)对象的流,还可以将 ObjStm对象分解为单个的间接对象:

qpdf --qdf --object-streams=disable orig.pdf uncompressed-qpdf.pdf

qpdf将自己描述为执行 “ PDF 文件的结构化、保存内容的转换”的工具。

然后只要打开 + 检查 uncompressed-qpdf.pdf文件在您最喜欢的文本编辑器。以前压缩的(因此也是二进制)大部分字节现在都是纯文本。

mutool

还有 mutool命令行工具,它与 翻译: 奇芳 PDF 浏览器捆绑在一起(翻译: 奇芳 PDF 浏览器是 Ghostscript 的姊妹产品,由同一家公司 艺术品生产)。下面的命令还可以解压缩流,使得通过文本编辑器可以更容易地检查它们:

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.py pdf-parser.py是用 Python 编写的两个 译自: 美国《科学》杂志网站(http://blog.didierstevens.com/program/PDF-tools/)原著: Didier Stevens

他们的背景也有助于研究 恶意的 PDF 文件——但是我发现分析良性 PDF 文件的结构和内容也很有用。

下面是一个例子,我将如何提取未压缩的 PDF 对象编号5流到一个 * . dump 文件:

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

最后一点

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

  2. 如果将上面的工具和给出的命令行示例进行比较,您将发现它们的 < em > NOT 输出都是相同的。通过比较它们本身的差异,可以帮助您更好地理解 PDF 语法和文件格式的本质。

还有另一个选择,AdobeAcrobatPro 也可以显示 PDF 的内部树状结构。

  1. 打开飞行前准备
  2. 转到 Options (右上角)
  3. 内部 PDF 结构

在顶部,Adobe Acrobat Pro 还可以在 PDF 中显示文档字体的内部结构,大多数其他“ PDF 树结构查看器”没有这个选项

enter image description here

我的建议是 Foxit PDF 阅读器,这是非常有帮助的做重要的文本编辑工作的 pdf 文件。

如果您在 Windows 机器上,O2解决方案的 PDFXplorer 在显示内部结构方面做得很好。

Http://www.o2sol.com/pdfxplorer/overview.htm

(底部有免费的分散注意力的横幅)。

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

如果你在 Windows 上,PDF 分析器PDFXplorer很相似,但是它有更多的选项。 单次注册后也是免费的。

enter image description here