如何从PDF中提取文本?

Joh*_*ith 2 java pdf unicode

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

这是一个不起作用的示例文件:ftp: //ftp.logos.md/Biblioteca/_Colectie_RO/2nefon.pdf

有什么建议?

mkl*_*mkl 5

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

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

检查文件显示问题.我们来看看标题吧

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
Run Code Online (Sandbox Code Playgroud)

让我们检查使用过的字体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 
Run Code Online (Sandbox Code Playgroud)

因此,字体声称使用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
Run Code Online (Sandbox Code Playgroud)

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

根据PDF规范ISO 32000-1

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

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

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

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

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

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

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

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

因此,文档提取和复制和粘贴完全遵循规范,当报告文档声称这两行说:

VIA}A {I ~NV|}|TURILE
SFANTULUI IERARH NIFON
Run Code Online (Sandbox Code Playgroud)

但是,您可能想要检查是否例如Ă(带有brevis的资本A)始终导出为| ; 这实际上并非不可能,将特殊字符映射到符号的字符代码在上个世纪的某个时期非常普遍.如果确实如此,文本提取后的全局搜索和替换将为您提供所需的文本.