如何在使用pdfbox阅读阿拉伯语PDF文本时避免重复字符?
这个例子这是一个词:
بهم
当我们读到这个词时,我们得到了这个结果
بهرم
非常感谢
答案 0 :(得分:1)
为了更容易地分析问题,OP提供了一个示例文件,并在评论中指出了一个说明问题的词:
左边pdf文件第一行中的第一个单词有3个字母,这个单词在输出中变成4个字母(单词中还有其他字母!),请检查pdf流中是否存在这个单词有3个字母还是4个字母?
Adobe Reader中显示的PDF的第一行如下所示:
PDFBox通过激活排序提取的文本的第一行是
طعمالرضراوالسرعادة,ويحيراحيراةطيبرةمرعغيرره,فيسرعدبهرم
在Total Commander中看起来像这样:
第一行复制&从Adobe Reader粘贴结果
طعمالرضراوالسرعادة,ويحيراحيراةطيبرةمرعغيرره,فيسرعدبهرم
因此,看起来像PDFBox和Adobe Reader对所包含的文本达成一致,至少在我看来没有阿拉伯文写作经验。由于Adobe Reader通常非常擅长文本提取,因此这提示PDFBox会像PDF声称的那样提取文本。
查看PDF的内部结果,我们发现输出最左边部分的操作(字形在这里从左到右呈现):
[<000303E10467>-2<03EC03910003>-3<03A903CC>3<0467>-2<03B3>3<03F3>-3<03D3>] TJ
因此,最左边的字形由这些代码表示:
0003 03E1 0467 03EC 0391 0003
使用此处使用的字体的 ToUnicode 映射,这些字形对应于以下Unicode字符:
0003 0020 Space
03E1 0645 Meem م
0467 0631 Reh ر
03EC 0647 Heh ه
0391 0628 Beh ب
0003 0020 Space
所以,这确实是一个4个字母的单词。
这还匹配PDFBox提取的文本第一行的最后一个字符:
0020 0628 0647 0631 0645 0020
因此,至少在OP指出的单词的情况下,PDFBox提取的数据正是PDF内容中的数据所表达的。如果根据字体程序绘制的字形读取不同,则PDF信息不一致。
PS:在评论中,OP要求
此字体的ToUnicode映射
就是这样:
/CIDInit /ProcSet findresource begin
26 dict begin
begincmap
/CIDSystemInfo
<< /Registry (Adobe)
/Ordering (UCS)
/Supplement 0
>> def
/CMapName /Adobe-Identity-UCS def
/CMapType 2 def
1 begincodespacerange
<0000> <FFFF>
endcodespacerange
2 beginbfchar
<0003> <0020>
<0005> <0022>
endbfchar
2 beginbfrange
<000B> <000D> [<0029> <0028> <002A>]
<0010> <0012> <002D>
endbfrange
4 beginbfchar
<001D> <003A>
<003E> <005D>
<0040> <005B>
<00B1> <2013>
endbfchar
5 beginbfrange
<02EC> <02F4> [<060C> <0020> <061F> <0621> <0640> <064B> <0020> <0020> <0020>]
<02F5> <02F6> <064F>
<02F7> <02F8> [<0020> <0652>]
<0348> <0349> [<0020> <0647>]
<034A> <034B> <0651064F>
endbfrange
1 beginbfchar
<037F> <0631>
endbfchar
4 beginbfrange
<0381> <0385> [<0622> <062E> <0623> <0647> <0624>]
<0387> <038B> [<0625> <0645> <0020> <0626> <0626>]
<038D> <038D> [<0627>]
<038E> <038F> <0627>
endbfrange
1 beginbfchar
<0391> <0628>
endbfchar
2 beginbfrange
<0393> <0393> [<0629>]
<0394> <0395> <0629>
endbfrange
3 beginbfchar
<0397> <062A>
<0399> <062B>
<039B> <062B>
endbfchar
3 beginbfrange
<039D> <039F> [<062C> <062C> <062C>]
<03A1> <03A3> [<062D> <062D> <062D>]
<03A6> <03A7> [<062E> <062E>]
endbfrange
14 beginbfchar
<03A9> <062F>
<03AB> <0630>
<03AD> <0631>
<03AF> <0632>
<03B1> <0633>
<03B3> <0633>
<03B5> <0634>
<03B7> <0634>
<03B9> <0635>
<03BB> <0635>
<03BD> <0636>
<03BF> <0636>
<03C1> <0637>
<03C5> <0638>
endbfchar
5 beginbfrange
<03C9> <03D1> [<0639> <0639> <0639> <0639> <0020> <0629> <063A> <063A> <0641>]
<03D3> <03D3> [<0641>]
<03D4> <03D5> <0641>
<03D7> <03D7> [<0642>]
<03D8> <03D9> <0642>
endbfrange
2 beginbfchar
<03DB> <0643>
<03DD> <0644>
endbfchar
2 beginbfrange
<03DF> <03DF> [<0644>]
<03E0> <03E1> <0644>
endbfrange
3 beginbfchar
<03E3> <0645>
<03E5> <0646>
<03E7> <0646>
endbfchar
4 beginbfrange
<03E9> <03EB> [<0647> <0647> <0647>]
<03EC> <03ED> <0647>
<03EF> <03F3> [<0649> <0649> <0020> <0020> <064A>]
<03F5> <03FC> [<06440622> <0626> <06440623> <06440623> <06440625> <06440625> <06440627> <06440627>]
endbfrange
3 beginbfchar
<0467> <0631>
<0B09> <0650>
<0BCC> <0627064406440651064E>
endbfchar
endcmap
CMapName currentdict /CMap defineresource pop
end
end