Ruby提取PDF格式的阿拉伯语文本

我通常使用此代码从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对于阿拉伯语很好,所以,有什么解决方案吗?

此PDF中的文本未正确编码:屏幕上显示的内容与其代表的字符代码之间的关系未存储在此PDF中。 这就是你获得“随机”文本的原因。

字符定义

另外值得注意的是:文本以正确的顺序显示,但这是因为字体字符被镜像,文本本身也被镜像:

以镜像形状绘制的字符

– 一个典型的hack-ish解决方法,使用Quark XPress正确排版阿拉伯语(曾经有一个XTension(sp。?)’启用’这个)。

因为看起来错误的编码实际上是在字体内定义的(“Font使用内置编码”,根据Acrobat Pro的“库存”function),您可能能够在您正在阅读的字符之间找到一个转换表。他们究竟应该是什么。 请注意,对于本文档中的每种字体,这些表可能会有很大不同,因此您必须检查每个文本字符串使用的字体。


加成

我做了一些进一步的调查,他们同意你自己和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条目指向一个简单的索引>字符代码列表数组,而/ToUnicode指向一个更正式的表,它基本上包含相同的表。 两个列表都转换为相同的文本。

正如您在顶部图像中看到的,该字体包含阿拉伯字形(镜像),但链接到这些字形的代码对于阿拉伯语来说不正确。 这就像旧的“符号”字体黑客:键入’a’获取alpha,’b’获取beta,’g’获取gamma:屏幕上的文字显示为“ɑβɣ”但实际上它显示为“abg” ”。


增加2

另请参见此 Adobe论坛主题: 阿拉伯语 – ToUnicode Map不正确?

引用:

从操作系统的角度来看,阿拉伯语XT字体不是阿拉伯字体(MacOS或Windows)。 他们使用Mac Roman编码; 阿拉伯字形被放置在罗马字形的位置。

我试图找到你的字体的“纠正”编码,​​但迄今为止还没有成功。 如果我可以找到转换表,则应该可以将现有的/ToUnicode表与更正的表交换,并且在提取时您将获得正确的文本。 (尽管使用相同的表在您选择的编程语言中提取后更改文本字符串可能更简单。)