我通常使用此代码从PDF中提取文本:
require 'rubygems'
require 'pdf/reader'
filename = File.expand_path(File.dirname(__FILE__)) + "/myfile.pdf"
PDF::Reader.open(filename) do |reader|
reader.pages.each do |page|
puts page.text
end
end
这次我想解析阿拉伯语PDF,但是,使用这段代码,我得到了一堆奇怪的字符。例如:±πNuô ≠ö ¥πbËÊ ´Lö Ë«_°u«» ±GKIW √±U±Nr ËîUÅW √Ê ´bœ Ë≠w «∞LπLuŸ, ¥L
我已经读过coding: utf-8
对阿拉伯语没问题,所以有什么办法吗?
答案 0 :(得分:3)
此PDF中的文字未正确编码:屏幕上显示的内容与其代表的字符代码之间的关系未存储在此PDF中。这就是你获得“随机”文本的原因。
另外值得注意的是:文本以正确的顺序显示,但这是因为字体字符是绘制镜像的,文本本身也是镜像的:
- 使用Quark XPress正确排版阿拉伯语的典型hack-ish解决方法(曾经有一个“启用”这个的XTension(sp。?)。
因为看起来这个错误的编码实际上是在字体内部定义的(“Font使用内置编码”,根据Acrobat Pro的“库存”功能),你或许可以在字符之间找到一个转换表正在阅读,他们实际应该是什么。请注意,对于本文档中的每种字体,这些表可能会有很大不同,因此您必须检查每个文本字符串使用的字体。
我做了一些进一步的调查,他们同意你自己和Acrobat Pro的调查结果。您的示例文本如下所示:
/F1 1 Tf % set font and size "HGKECF+PHBagdad"
...
[ (´Mb ) -24.4 (¢'b¥b ) -24.4 («®{05}d«ØU¢Nr, ) -24.4 (Ë«ù´öÂ ) -24.4 (°LDU{03}&Nr.) ] TJ
通常,PDF中的字体条目包含一个“转换”为实际字符代码的表格。对于这种字体(以及所有其他字体)也是如此:
<<
/Type /Font
/Subtype /Type1
/BaseFont /HGKECF+PHBagdad
/Encoding 66 0 R
/ToUnicode 69 0 R
>>
(仅列出相关条目)。 /Encoding
条目指向一个简单的索引数组&gt;字符代码列表,/ToUnicode
到更正式的表,基本上包含相同的表。两个列表都翻译成相同的文本。
正如您在顶部图片中看到的, font 包含阿拉伯字形(镜像),但链接到这些字形的代码对于阿拉伯语来说不正确。它就像旧的“符号”字体黑客:键入'a'获取alpha,'b'获取beta,'g'获取gamma:屏幕上的文本出现为“ɑβɣ”但事实上它说“abg”。
另请参阅此Adobe论坛主题:Arabic - ToUnicode Map incorrect?
引用:
从操作系统的角度来看,阿拉伯语XT字体不是阿拉伯字体(MacOS或Windows)。他们使用Mac Roman编码;阿拉伯字形被放置在罗马字形的位置。
我试图为你的字体找到一个“纠正”编码,但迄今为止还没有成功。如果我可以找到转换表,则应该可以将现有的/ToUnicode
表与更正的表进行交换,并在提取时获得正确的文本。 (尽管在您选择的编程语言中使用相同的表来提取文本字符串可能更简单。)