logo资料库

PDF文件文本内容提取的设计与实现.pdf

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
中国科技论文在线 http://www.paper.edu.cn PDF 文件文本内容提取的设计与实现 孟美华,王宏伟 大连理工大学电信学院自动化系,辽宁大连 (116023) E-mail:meihuaqiu@yahoo.cn 摘 要:PDF 文件格式是面向显示的,本身缺乏语义信息,如果不将其内容提取出来,就 不能实现基于语义的查询。本文设计并实现了一款 PDF 内容提取的工具,首先对 PDF 文件 进行了文本解析,将正文内容字符串流从源码中提取出,并对提取后的字符串流利用解密算 法进行解密,然后利用 Filter 解码算法进行解码,最后将 PDF 的文本内容从解码后的字符串 流中提取出。结果表明本文提出的方法不但能够非常准确的实现 PDF 文件格式的转换,而 且可以非常方便的嵌入到搜索引擎中。 关键词:PDF 文件;文件解析;解密;解码;文本提取 中图分类号:TP391 文献标识码:B 1 引言 PDF(Portable Document Format 便携文档格式)是 Adobe 公司创建的用于进行全球电子 文档存储与分发的一种电子文件格式。PDF 文件格式以其卓越的特性成为在 Internet 上进行 电子文档发行和格式化信息传播的理想文档格式。当前,在 Internet 中的科技论文以 PDF 格 式提交变得越来越流行,如万方数据库等,同时个人电脑中的 PDF 文件也占了文件格式的 很大一部分。现在所有的搜索引擎都只能对纯文本文件进行索引,进而实现对该文件的检索, 但 PDF 文件本身是面向显示的,搜索引擎无法对其进行索引,只有通过先将其转换为纯文 本文件的方法,才能进行索引以及检索,所以将 PDF 格式的文件转化为纯文本文件已经成 为一个亟待解决的问题。 由于开源软件成本低,弹性大,适应能力强以及可以再改进开发等特点受到了广大开发 者的青睐,现在流行的几款开源的 PDF 文件解析工具有:PDFBox,Xpdf,iText,其中 PDFBox 和 iText 都是用 Java 实现的 PDF 文档协作类库,提供 PDF 文档的创建、处理以及文档内容 提取功能,Xpdf 是一款使用 Java 设计的软件。另外文献[1]-[3]提出的 PDF 文件解析方法很 好,首先提取存放 PDF 文档中各页的内容流,然后调用开源软件包中的算法对得到的内容 流进行解码,文献[4]的对内容提取方面做得很成功。经过分析,以上文献还存在一些不足, 例如: (1) PDFBox,Xpdf,iText 对中文的支持都不够好,并且 iText 的体积相对来说很大; (2) 文献[1]-[3]对内容提取方面处理的不够精确; (3) 文献[1]-[4]都没有对加密的 PDF 文件进行处理的功能; (4) 以上介绍的方法用 Java 实现的,由于 Java 是解释型,源码被编译成二进制伪代码, 由 Java 虚拟机解释执行,而 C/C++是编译型的,最终将源码编译成机器代码,并且对于普 通的本地应用程序,一般 C/C++要快于 Java。 基于以上几点,本文提出了在对 PDF 文件执行解析算法时,加入解密算法的思想,首 先对 PDF 的文件结构进行分析,根据其结构特点,对 PDF 文件进行解析,其中解析过程包 括将 PDF 正文内容字符串流从源码中提取出,并对其进行解密、解码,然后从解析完的字 符串流中将 PDF 的文本内容提取出。出于项目和效率的需求,系统采用 C++实现。最后将 本次开发的工具嵌入到一款已开发完的桌面搜索引擎中,然后对 PDF 文件进行检索,结果 证明通过本文提出的方法可以准确的将 PDF 文件转换为纯文本文件。 -1-
中国科技论文在线 2 PDF 文件结构 http://www.paper.edu.cn PDF 的文件的物理结构包括[1]:文件头、文件体、交叉引用表和文件尾。其中文件头是 表示当前 PDF 文件的版本号。PDF 文件中用到的所有对象,包括文本\加密信息等等都属于文 件体。交叉引用表代表所有 PDF 对象的引用表,以 xref 为开始标志。文件尾是整个 PDF 文 件的入口点,主要包含了交叉引用表的地址,文件体的根对象 Catalog 的地址及加密信息等。 PDF 文件的逻辑结构是一种树型结构[2]。目录对象 Catalog 是 PDF 文档的根对象,可以 通过对交叉引用表的查询找到。它包含 PDF 文档的大纲(outline)和页面组对象(pages)引用。 大纲是指 PDF 文件的书签树;页面组对象(pages)包含该文件的页面数,各个页面对象(page) 的对象号。 3 PDF 文件内容提取的设计与实现 3.1 PDF 文件内容提取的总设计框架 通过现有的方法可以将普通的 PDF 文件内容提取出来,但是如果要提取的 PDF 文件被 加密了,则无法得到提取结果。针对这个问题,本文重新设计了 PDF 文件内容提取框架(如 图 1): (1) 提取存放 PDF 文档中各页的内容流; (2) 将提取到的内容流进行解密; (3) 用 Filter 解码算法对解密后的内容流进行解码; (4) 从解码后的内容流中提取文本内容及其相关信息; 提取存放PDF文档中各页 的内容流 统称为PDF文件 解析 对得到的内容流进行解密 对解密后的内容进行解码 提取文本内容及其相关 信息 图 1 PDF 文件内容提取的总设计框架 Fig.1 The General Design Framework of the PDF Extraction 3.2 PDF 文件解析流程 根据上面的关于 PDF 文件结构的分析可以看出,解析 PDF 文件时应用程序应首先访问 文件尾,从文件尾中读取交叉引用表的地址和 PDF 文件的 Catalog 根节点。然后根据交叉引 用表访问 PDF 文档中的间接对象,从而读取整个 PDF 文档。所以整个处理流程将从寻找文 件尾的 Trailer 关键字开始。具体解析过程为: (1) 首先查找文件尾 Trailer,查找关键字“/root”,root 后的值即为 Catalog 字典的对象号。 -2-
中国科技论文在线 http://www.paper.edu.cn 查找关键字“/Encrypt”,/Encrypt 后的值即为加密字典的对象号,如果没有此关键字则说明此 PDF 没有被加密。 (2) 通过 Catalog 根节点(其标签为/Type/Catalog)找到页树节点/pages。如果在第一步中 找到关键字“/Encrypt”,则转入其加密字典处,利用 MD5,RC4 算法获得其加密密钥。 (3) 转入/pages 里,查找关键字 Kids,其后的对象号标志着页对象/page 的位置,但也有 可能仍是页树节点。 (4) 转入到页对象/page 中,查找关键字“/Contents”,如果没有,则说明这是一空页。查 找关键字“/Font”,读取其字体信息。 (5) 转入到/Contents 里,读取 stream 和 endstream 之间的内容存放到一个数组中,如果 在(2)中获得了加密密钥,则用获得的密钥对数组中的内容通过 MD5 和 RC4 算法进行解密, 否则直接进行下一步。 (6) 读取关键字“/Filter”后的解码名,对解密后的内容流进行解码,然后进行解压缩。 图 2 为 PDF 设计的解析流程,本文设计的解析过程的改进点是对 PDF 文件内容实现了 解密。 读取“trailer”里的信息 查找值关键字 “/Encrypt, 读取加密字典号 找到/Encrypt N Y 读取加密字典 ,用 MD5,RC4获得密钥 查找关键字 “/root,读 取Catalog字典号 转到Catalog字典处 ,查 找页树节点/pages 转到/pages里,查找关键字 Kids,读取/page对象号 找到/page里,查找关键字 /contents 转到contents里,读取stream 和endstream之间的内容 有密钥 Y N 用获得的密钥,对内容用 MD5和RC4算法解密 读取关键字 “/Filter, 获得解码名 ,解码 图 2 PDF 文件的解析过程 Fig.2 The Resolving of PDF File 3.3 PDF 文本内容解密框架的设计 PDF 文件是通过 RC4 加密算法对内容进行加密的,加密长度为(40-128)位。PDF 文 -3-
中国科技论文在线 http://www.paper.edu.cn 件支持比较成熟的单向散列 Hash 算法:MD5。 PDF 的加密口令有两种:权限口令和打开口令。PDF 格式的权限控制是通过为 PDF 格 式的正文部分加上操作允许口令来实现的。如果操作允许口令为空,则没有权限控制。经过 权限控制的 PDF 文档的内容虽然也是加密的,但是加密密钥可以通过文体本身包含的加密 字典对象计算得到,因此可以通过加密字典对象和 PDF 生成加密密钥的规则来得到加密密 钥,从而对内容进行破解。 本文实现了对用 RC4 和 MD5 进行加密的 PDF 文件的解密。 MD5 的全称是 Message-digest Algorithm 5(信息-摘要算法),用于确保信息传输完整 一致。MD5 被广泛的用于各种软件的密码认证和钥匙识别上[5]。对 MD5 算法简要的叙述可 以为:MD5 以 512 位分组来处理输入的信息,且每一分组又被划分为 16 个 32 位子分组, 经过了一系列的处理后,算法的输出由四个 32 位分组组成,将这四个 32 位分组级联后将生 成一个 128 位散列值。 RC4 算法的原理很简单[6],包括初始化算法和伪随机子密码生成算法两大部分。在初始 化的过程中,密钥的主要功能是将其核心部分 S-box 搅乱,而不同的 S-box 在经过伪随机子 密码生成算法的处理后可以得到不同的子密钥序列,并且该序列是随机的,得到的子密码 sub_k 用以和明文进行 xor 运算,得到密文,解密过程也完全相同,即将密文再加密一次, 就是解密了。 首先介绍一下加密字典对象[7],它一般包括下面的条目: /Length 密钥的长度 /Filter 生成密钥的方法 /O 是由用户口令和权限口令得到的,用来生成密钥和验证输入的权限口令 /P 访问权限的标志 /R 标准加密的(standard security handler)的版本 /U 由用户口令生成,用来验证输入的用户口令或权限口令,是否要提醒用户输入 密码 /V 可选,用来指明加密的算法。 PDF 文件的加密过程为: (1) 生成加密字典和加密密钥 ① 生成加密字典条目 O; ② 得到全局加密密钥; ③ 生成加密字典条目 U。 (2) 生成对象加密密钥并将对象加密。 因此 PDF 文件的解密过程设计如图 3,其中第二步补充或截取权限口令字符串为:如 果输入的口令大于 32 个字节,那么只保留前 32 个字节,如果少于 32 个字节,那么就按下 面的字符串补上所缺少的字节数: <0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41,0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a> 如果用户口令为空,那么就意味着没有用户口令,用这 32 个字节完全填充。 -4-
中国科技论文在线 http://www.paper.edu.cn 读取文件尾,获取加密字典 号和文件ID 补充或截取权限口令字符串 将权限口令字符串用MD5函 数进行运算 生成加密字典对象条目O 将加密字典O条目输入MD5函数 中进行运算 读取加密字典对象条目P,将其输 入到MD5函数中进行运算 PDF文档的ID标识输入到 MD5函数中运算 用MD5函数产生全局加密密 钥 生成加密字典条目U 用RC4加密全局加密密钥得 到对象加密密钥 Y 对象加密密钥==权 限口令 N 对得到的全局加密密钥分别用 MD5和RC4算法将全文内容进行 解密 解密失败 图 3 PDF 文件的解密流程 Fig.3 The Decryption process of PDF File 3.4 PDF 文本提取的设计 3.4.1 stream 流解码后的字符串 stream 流解码后的字符串中存放的不仅有文本,还有许多字体、字号、色彩空间、图形、 图像等信息。因此需要首先明确哪些内容对提取文本有帮助[4]。 文本对象:文本对象描述了文本的相关信息。文本对象以关键字 BT 开始,以关键字 ET 结束。其中既包括文本内容,也包括字体,位置等格式信息。 字体信息:关键字 Tf 可以设置字体信息。第一个参数描述字体名称,第二个参数描述 字体大小。 位置信息:PDF 文件将打印区的左下角设置为打印原点,Td/TD 操作符可以设置文本行 的位置 Td 操作符是移动到下一行。TD 操作符除了做与 Td 相同的工作外,还要设置文本状 态参数。 文本矩阵:文本矩阵描述了字体和位置信息。关键字 Tm 可以设置文本矩阵,Tm 共有 6 个参数,即 ,其中参数 X1 和 X2 体现了字体的宽度和高度, 而参数 X3 和 X4 则体现了当前行的水平和垂直位置。 0 0 X [ X X X ] 4 1 2 3 -5-
中国科技论文在线 http://www.paper.edu.cn 文本内容:关键字 TJ/Tj 可以设置文本内容,括号内的参数就是希望获得的文本串。 3.4.2 文本及其相关信息提取的实现 根据文本对象的定义,若要提取 PDF 文件中的文本内容,只需要处理关键字 BT 与 ET 之间的信息。具体提取流程为[4]: (1) 寻找 Tj 和 TJ 提取文本。 对 Tj 将括号内的内容取出,对 TJ 将数字信息去掉,只取出括号内的内容,如有转义 字符标志“\”则应去掉。 (2) 寻找 Tf 提取字体信息。 Tf 的第 1 个操作数为字体信息。 (3) 寻找 Tm 提取字号信息。 Tm 的第 1 个操作数为字号信息。 (4) 寻找 Td/TD,与 Tm 结合来判断是否换行。 Tm 操作符通常与 TD 操作符连用,为 TD 操作符提供可比较的参考位置,它的第六个 参数描述了当前行相对于打印原点的绝对垂直位置。 4 PDF 文件内容提取实例验证 实验的系统环境为 Windows XP,开发环境为 Visual Studio 2008 SP1,编程语言为 C++, 测试的项目环境是本次开发的桌面搜索引擎,实验数据为随机抽取的 PDF 文件,如图 4。 图 4 待解析的 PDF 文件 图 5 处理后的 PDF 文件 Fig.4 The Original PDF File Fig.5 The Processed PDF File 定义解析 PDF 文件的函数为:ExtractPdfText(szOut, pdoc);其中 pdoc 为原 PDF 文件, szOut 为解析后的输出文件。 首先将 PDF 文件进行解析,读取 Catalog 字典号。然后依次获得 content,resource 和 font 信息,本文中测试的 PDF 文件的文件尾的信息为: trailer <<964F0AF91370B94B81F62F89F71531D2> ]>> startxref 0 -6-
中国科技论文在线 http://www.paper.edu.cn %%EOF 其中“Encrypt 26 0 R”,是比未加密文件多出的加密信息,可以看出加密字典的对象号为 26,获取全局加密密钥,解密全文内容,解密流程参考 3.3,然后执行解码过程,首先查看 是否被压缩了,随后查看压缩算法,常见 PDF 压缩算法有 ASCIIHex、ASCII85、Flate、LZW、 RunLength、CCITTFax 等,针对不同的压缩算法实行解码。最后将文本内容从解码后的内 容流中提取出来,最后结果为图 5。 本文设计的类库可以直接嵌入到本次开发的桌面搜索引擎中,并能非常准确的完成对 PDF 文件格式的转换,最终实现对 PDF 文件进行检索如图 6。图 6 是对三个 PDF 文件对关 键字 tunnel 进行查询的结果显示对话框。其中标出的查找文件为 Original PDF.pdf。可以看 出搜索引擎成功的对该文件进行了检索。 图 6 用本文的方法搜索 PDF 文件 Fig.6 Search the PDF file with the method proposed in this paper 为了形成对比,本文用文献[2][3]所描述的方法嵌入到同一个桌面搜索引擎中对同样的 文件夹进行检索,其结果如图 7。从图中我们可以看到他们提出的方法无法将加密的 PDF 文件 Original PDF.pdf 进行内容提取,搜索引擎无法对该文件进行检索。 -7-
中国科技论文在线 http://www.paper.edu.cn 图 7 用其他的方法搜索 PDF 文件 Fig.7 Search the PDF file with the other method 本文设计的软件可以直接嵌入到本次开发的桌面搜索引擎中,也可以方便嵌入到其他用 C++ 开 发 的 搜 索 引 擎 中 , 完 成 对 PDF 文 件 格 式 的 转 换 , 其 对 外 接 口 很 简 单 : ExtractPdfText(szOut, pdoc);其中 pdoc 为原 PDF 文件,szOut 为解析后的输出文件。 5 结论 通过实验结果可以看到本文成功的实现了 PDF 文件格式的解析,并实现了对用权限口 令的加密 PDF 文件进行解密,最后将其文本内容准确的提取出。并且通过对比,可以看出 本文比其他的提取方法更准确有效。通过对内容的提取,我们可以从提取出的内容中获得文 件标题,作者,生成时间等信息,但是由于网上的 PDF 文件很多,不同 PDF 文件 stream 流 中的内容编排也有很多种,本文是在考察了大量实例,并通过大量的实验归纳出的方法,但 由于考察的 PDF 文件的范围相对来说还是不够大,无法涵盖所有的 PDF 文件,所以对其他 的 PDF 文件可能存在一定的误差,因此本文仍有待进一步的优化。 -8-
分享到:
收藏