繁体   English   中英

使用Java从pdf文件提取文本时面临的问题

[英]Facing issues on extracting text from pdf file using java

无法从具有客户加密字体的pdf中提取文本,该字体可以通过Adobe Reader中的文件->属性->字体进行标识。 其中一种字体称为C0EX02Q0_22类型:Type 3编码:自定义实际字体:C0EX02Q0_22实际字体类型:Type 3

让我知道有什么方法可以从此类pdf文件中提取文本内容。 目前,我正在使用pdf实用工具中的PDFText2HTML。 在提取此类pdf文件时获取“ÁÙÅ@ÅÕãÉ”之类的值

样本pdf: tesis completa.pdf

在此pdf中,您可以看到所使用的字体具有自定义编码,例如:T3Font_1(请通过File-> Properties-> Adob​​e Reader中的Font进行引用)由于无法上传我的pdf更新了具有相同问题的样本

如标准中所述提取

PDF规范ISO 32000-1在9.10节中描述了文本内容的提取,如果PDF提供了所需的信息并且正确地进行了提取,那么如何进行文本提取。

但是,使用此算法只能在文档的几个页面范围内使用(即摘要,内容列表,感谢函和Publicación7部分),但在其他范围内则导致乱码,例如8QLYHUVLWDWGH/OHLGD Universitat de Lleida 查看有问题的PDF对象可以清楚地看到所需的信息已丢失(没有ToUnicode映射,并且在Encoding基于WinAnsiEncoding的情况下 ,所有使用中的位置均通过Differences映射到非标准名称)。

同样,尝试使用Adobe Reader中的复制粘贴来提取文本会返回该乱码。 通常,这表明不可能进行通用提取。

解决方法

但是,检查PDF对象和常规文本提取尝试的输出会产生这样的想法:对于所有使用的字体,提取为乱码的文本的实际编码是相同的,并且是一些基于ASCII的编码,偏移了一个常数:在Universitat de Lleida的提取的8QLYHUVLWDWGH/OHLGD结果的每个字符中添加'U' - '8' 只要文本仅使用ASCII字符,向从文档中其他位置提取的文本的char中添加相同的常量也将导致正确的文本。

用这种简单的方法无法正确映射ASCII范围以外的字符,但它们似乎总是被提取为相同的错误字符,例如,字形“ó”始终被提取为“ y”。

因此,您可以通过以下方法从该(以及类似创建的)文档中提取文本:首先使用标准算法提取文本,然后在乱码部分(可能可以由字体名称标识)中,通过添加'U' - '8'替换每个字符'U' - '8'表示较小的值,并通过根据某些映射进行替换以获得较高的值。

正如您在问题中提到的Java一样,我已经通过iText和PDFBox文本提取来运行您的文档,并且带有或不带有'U' - '8'移位,结果看起来很有希望。 我认为其他通用Java PDF库也将起作用。

另一个解决方法

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM