65.9K
CodeProject 正在变化。 阅读更多。
Home

PdfView - 窥探 PDF 的内部

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.55/5 (26投票s)

2005年9月25日

5分钟阅读

viewsIcon

204294

downloadIcon

6789

用于查看 PDF 文档内部结构的实用工具。

引言

PdfView 是一个显示 PDF 文档结构元素的实用工具。自 1993 年诞生以来,PDF 已成为交换电子文档和表单的***格式,并广受欢迎。使用文本编辑器就可以创建格式良好的 PDF。该格式的简洁性使得开发人员无需依赖任何外部工具包,就可以使用内部解决方案创建 PDF 文档。然而,一段时间后,由于该格式的层级结构以及对象中常用到的间接引用,要遍历您创建的文档会变得很困难。更何况,大多数 PDF 文档都是文本和二进制数据的混合体。PdfView 实用工具试图解决这个问题,并能够以可视化的方式遍历 PDF 文档树。

背景

可移植文档格式 (PDF) 是由 Adobe Systems 开发的一种文件格式,用于以独立于创建这些文档的原始应用程序软件、硬件和操作系统的方式来表示文档。PDF 文件可以描述包含文本、图形和图像任意组合的文档,并且是设备无关、分辨率无关的格式。这些文档可以是一页或数千页,非常简单或极其复杂,并且可以大量使用字体、图形、颜色和图像。PDF 是一种开放标准,任何人都可以免费编写可以读写 PDF 的应用程序。

主要的 PDF 概念

PDF 支持七种基本类型的对象:布尔值、数字、字符串、名称、数组、字典和流。布尔值、数字和字符串是简单值。由于它们不是嵌套的,PdfView 仅将它们显示为值()。数组()是一系列 PDF 对象。数组可以包含不同类型的对象。字典()是一个包含对象对的关联表。每对的第一个元素称为***键***,第二个元素称为***值***。键必须是一个名称。值可以是任何类型的对象,包括字典。流()由一个描述字符序列的字典组成,后跟关键字 stream,然后是零个或多个字符行,最后是关键字 endstream。由于流基本上是二进制数据块,PdfView 会忽略并跳过流块。间接引用()是对间接对象的引用,由间接对象的对象编号、代数编号以及关键字 R 组成。交叉引用表包含允许对文件中的间接对象进行随机访问的信息,因此不必读取整个文件即可找到任何特定对象。

Trailer 使读取 PDF 文件的应用程序能够快速找到交叉引用表和某些特殊对象。应用程序应从文件末尾开始读取 PDF 文件。***Trailer 字典***位于 PDF 文档的末尾附近。它是 PDF 对象树的根。

使用代码

PdfView 是一个典型的 MFC 文档/视图应用程序。它本身就是一个实用工具,其中的代码并不打算在其他应用程序中重用。不过,我可以总结一下主要的类:

CBRawPdf:此类将当前显示的文件存储为字节数组。CBPdf 使用它来遍历该字节数组。此类不包含有关字典、数组和交叉引用表等更高层 PDF 结构的信息。它执行导航任务,例如获取下一个/上一个令牌/行。

CBPdf:此类处理 PDF 的更高层结构。它使用 CRawPdf 来遍历文档。它可以将 PDF 文件渲染到树形控件或富文本控件中。

CBPdfValueCBPdfReferenceCBPdfArrayCBPdfDictionaryCBPdfStream:这些类中的每一个都存储一种类型的 PDF 对象,即***值***、***引用***、***数组***、***字典***和***流***。它们都继承自同一个基类 CBPdfObject

PDF 对象的图形化可视化

该实用工具还可以选择性地创建 PDF 文件中对象的关系图。为此,它需要 **Graphviz**。

Graphviz 是一款开源图形可视化软件。它有几个主要的图布局程序。Graphviz 布局程序以简单的文本语言接受图形描述,并生成多种有用格式的图,例如用于网页的图像和 SVG,用于包含在 PDF 或其他文档中的 PostScript;或在交互式图形浏览器中显示。

使用该实用工具打开 PDF 文件后,您可以通过选择“File | Save As Dot File...”来创建兼容 Graphviz 的文本文件。之后,以下命令会将该文本文件转换为图像文件:

dot.exe -Tgif pdf.dot -o pdf.gif

这将为您生成一个类似的图像:

需要注意的是,大型 PDF 文件包含数千个对象。自然,Graphviz 无法处理这些文件,因为输出的图像文件往往非常大。为防止这种情况,我在该实用工具中硬编码了一个最大限制为 250 个对象。有经验的用户可以删除此限制,通过删除图中不需要的对象来简化生成的文本文件,然后创建图像文件。

最后说明

由于存在数十种 PDF 生成器,很可能有一些 PDF 文档此实用工具无法正确解析。如果您将这些文档的链接通过电子邮件发送给我,我将可以更新该实用工具以支持这些文档。

历史

  • 2005 年 10 月 7 日:版本 1.1 (图形可视化)
  • 2005 年 9 月 25 日:版本 1.0
© . All rights reserved.