如何从PDF中提取文本?

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

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

有什么建议么?

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

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

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

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。

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

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

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

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

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

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

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

 VIA}A {I ~NV|}|TURILE SFANTULUI IERARH NIFON 

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

iText怎么样: http : //itextpdf.com/

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