【发布时间】:2013-12-22 13:19:47
【问题描述】:
我需要从 PDF 中提取罗马尼亚语文本。使用 pdfBox 或 Snowtide 无法正确提取符号:ȚțȘșĂăÎîÂâ。
这是一个不工作的示例文件: ftp://ftp.logos.md/Biblioteca/_Colectie_RO/2nefon.pdf
有什么建议吗?
【问题讨论】:
-
请提供样本 PDF。可能有问题的 PDF 没有根据规范提供文本提取所需的信息。
我需要从 PDF 中提取罗马尼亚语文本。使用 pdfBox 或 Snowtide 无法正确提取符号:ȚțȘșĂăÎîÂâ。
这是一个不工作的示例文件: ftp://ftp.logos.md/Biblioteca/_Colectie_RO/2nefon.pdf
有什么建议吗?
【问题讨论】:
恐怕 OP 指向的 PDF (2nefon.pdf) 没有提供根据规范提取文本所需的信息。
尝试从 Adobe Reader 复制粘贴会导致特殊字符被错误导出,并且由于 Adobe Reader 包含相当好的文本提取功能,这已经是一个不好的迹象。
检查文件显示问题。例如。看标题
内容流对应的段是:
/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 之一的简单字体,或者具有编码其 Differences 数组仅包含取自 Adobe 标准拉丁字符集的字符名称和 Symbol 字体中的命名字符集(参见附录 D):
a) 根据表 D.1 和字体的 Differences 数组将字符代码映射到字符名称。
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 和其他应用程序的开发人员。”
【讨论】: