面对使用java从pdf文件中提取文本的问题

时间:2014-01-22 09:56:22

标签: java pdf text-extraction

无法从包含客户加密字体的pdf中提取文本,该加密字体可通过文件识别 - >属性 - > Adobe阅读器中的字体。 其中一种字体被提及为, C0EX02Q0_22 类型:类型3 编码:自定义 实际字体:C0EX02Q0_22 实际字体类型:类型3

让我知道有没有办法从这些pdf文件中提取文本内容。 目前我正在使用pdf util的PDFText2HTML。 在提取此类pdf文件时获取“ÁÙÅ@ÅÕãÉ”等值;

示例pdf:tesis completa.pdf

在这个pdf中你可以看到使用自定义编码的字体例如:T3Font_1(请参阅文件 - >属性 - > Adob​​e阅读器中的字体) 由于我无法上传我的pdf更新了具有相同问题的样本

1 个答案:

答案 0 :(得分:1)

如标准

中所述的提取

PDF规范ISO 32000-1在第9.10节文本内容提取中描述了如果PDF提供所需信息并正确完成,可以如何进行文本提取。

但是,使用此算法仅适用于文档的几个页面范围(即摘要,内容列表,感谢信息和Publicación7部分),但在其他范围内会产生乱码,例如: 8QLYHUVLWDWGH/OHLGD代替Universitat de Lleida。查看有问题的PDF对象可以清楚地看到所需信息缺失(没有 ToUnicode 地图,而编码基于 WinAnsiEncoding ,所有使用中的位置通过差异映射到非标准名称。

尝试使用Adobe Reader中的复制和粘贴提取文本会返回那些乱码。这通常表明通用提取是不可能的。

解决方法

检查PDF对象和通用文本提取尝试的输出会产生这样的想法:对于所有使用的字体,提取为乱码的文本的实际编码是相同的,并且它是基于ASCII的编码按常数移动:向提取的'U' - '8'的每个字符添加8QLYHUVLWDWGH/OHLGD会导致Universitat de Lleida。只要文本只使用ASCII字符,就可以从文档中其他位置提取的文本中为字符添加相同的常量也会生成正确的文本。

ASCII范围之外的字符未通过该简单方法正确映射,但它们似乎也总是被提取为相同的错误字符,例如字形“ó”始终被提取为“y”。

因此,您可以通过首先使用标准算法提取文本,然后在乱码部分(可能通过字体名称识别)中通过添加{{替换每个字符来提取文本(以及类似创建的)文档。 1}}用于小值,并根据某些映射替换更高的值。

正如您在问题中提到的Java,我已经通过iText和PDFBox文本提取运行您的文档,有{和{1}}移位和不移动,结果看起来很有希望。我假设其他通用Java PDF库也可以工作。

另一种解决方法

您可以尝试通过将 ToUnicode 映射条目添加到相关字体来修复相关PDF,而不是创建自定义提取例程。之后,正常的文本提取程序应该能够正确地提取内容。