如何从PDF到文字提取?

时间:2013-12-05 14:35:24

标签: java pdf unicode

我需要从罗马尼亚语的PDF中提取文本。使用pdfBox或Snowtide无法正确提取符号:ŢţŞşĂăÎîÂ。

以下是无效的示例文件: ftp://ftp.logos.md/Biblioteca/_Colectie_RO/2nefon.pdf

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

我担心OP指出的PDF(2nefon.pdf)不提供根据规范提取文本所需的信息。

尝试从Adobe Reader复制和粘贴导致特殊字符导出错误,并且由于Adobe Reader包含非常好的文本提取功能,这已经是一个不好的迹象。

检查文件会显示问题。例如。让我们来看看标题

Screen shot of the title of 2nefon.pdf

内容流的相应部分是:

/F1 24 Tf
-148.44 -26.16 TD
(VIA}A  {I  ~NV|}|TURILE) Tj
296.88 0 TD
( ) Tj
-308.16 -29.28 TD
(SFANTULUI  IERARH  NIFON) Tj

让我们检查使用过的字体 F1

469 0 obj
<< 
/Type /Font 
/Subtype /TrueType 
/Name /F1 
/BaseFont /TimesR 
/FirstChar 32 
/LastChar 255 
/Widths [ 250 333 444 722 500 833 778 [...] 500 500 500 500 500 500 500 ] 
/Encoding /WinAnsiEncoding 
/FontDescriptor 468 0 R 
>> 
endobj 

因此,字体声称使用 WinAnsiEncoding 而不做任何更改(没有差异)。

最后看一下字体描述符:

468 0 obj
<< 
/Type /FontDescriptor 
/FontName /TimesR 
/Flags 34 
/FontBBox [ -167 -307 1009 913 ] 
/StemV 90 
/ItalicAngle 0 
/CapHeight 913 
/Ascent 913 
/Descent -307 
/FontFile2 474 0 R 
>> 
endobj

这里没有暗示前面提到的 WinAnsiEncoding 可能不是全部真相。

根据PDF规范ISO 32000-1

  

符合本标准的读者可以在给定的优先级中使用这些方法将字符代码映射到Unicode值。特别是标记的PDF文档应至少提供其中一种方法(参见14.8.2.4.2,“标记PDF中的Unicode映射”):

     
      
  • 如果字体字典包含 ToUnicode CMap(参见9.10.3,“ToUnicode CMaps”),请使用该CMap将字符代码转换为Unicode。

  •   
  • 如果字体是使用预定义编码 MacRomanEncoding MacExpertEncoding WinAnsiEncoding 之一的简单字体,或者有一个编码,差异数组只包含取自Adobe标准拉丁字符集的字符名称和符号字体中的命名字符集(见附件D):

         

    a)根据表D.1和字体的差异数组将字符代码映射到字符名称。

         

    b)在Adobe Glyph列表中查找字符名称(参见参考书目)以获取相应的Unicode值。

  •   
  • 如果字体是复合字体[...缩短,因为字体 F1 不是复合字体...]

  •   
     

如果这些方法无法生成Unicode值,则无法确定字符代码表示的内容,在这种情况下,符合本标准的读者可以选择自己选择的字符代码。

     

(第9.10.2节将字符代码映射到Unicode值)

因此,当报告文档声称这两行说:

时,文本提取和复制以及粘贴完全遵循规范
VIA}A {I ~NV|}|TURILE
SFANTULUI IERARH NIFON

你可能想检查一下,例如, Ă(带有短信的大写字母A)始终以 | 的形式导出;这实际上并非不可能,将特殊字符映射到符号的字符代码在上个世纪的某个时期非常普遍。如果确实如此,文本提取后的全局搜索和替换将为您提供所需的文本。

答案 1 :(得分:-2)

iText如何:http://itextpdf.com/

“iText®是一个开源库,允许您创建和操作PDF文档。它使开发人员能够通过动态PDF文档生成和/或操作来增强Web和其他应用程序。”