我使用以下 Python 代码和 PyMuPDF (MuPDF) 从 PDF 文件中提取印地语文本。我的目标是完全按照 PDF 中显示的方式提取文本,但输出与原始文本不同。
import pymupdf
def extract_pdf_text_font_adjust(pdf_path):
doc = pymupdf.open(pdf_path)
full_text = ""
for page_num in range(doc.page_count):
page = doc.load_page(page_num)
text = page.get_text("text")
full_text += text + "\n\n"
return full_text
pdf_path = r"Kahai Kabir Diwana (Kabir)-2.pdf"
full_text = extract_pdf_text_font_adjust(pdf_path)
print(full_text)
生成输出:
;2
कहै कबीर दीवाना
पहला प्रवचन
मैं ही इक बौराना
जब मैं भूला रे भाई, मेरे सि गुरु जुगि लखाई।
ककररया करम अचार मैं छाड़ा, छाड़ा िीरथ नहाना।
सगरी दुतनया भई सुनायी, मैं ही इक बौराना।।
ना मैं जानूं सेवा बंदगी ना मैं घंट बजाई।
ना मैं मूरि धरर ससंहासन ना मैं पुहुप चढ़ाई।।
ना हरर रीझै जब िप कीन्हे ना काया के जारे।
ना हरर रीझै धोति छाड़े ना पांचों के मारे।।
दाया रतख धरम को पाले जगसूं रहै उदासी।
अपना सा तजव सबको जाने िातह तमले अतनवासी।।
सहे कसबद बदा को त्यागे छाड़े गरब गुमाना।
सत्य नाम िातह को तमतल है कहै कबीर कदवाना।।
我已经强调了输出和原始文本的差异。
PDF 是从 Office 文档生成的,此外,当我从 pdf 复制文本时,我得到与代码生成的输出完全相同的输出,但这仍然无效。
如何处理这个字体?这是什么原因呢?除了 OCR 之外还有其他选择吗?
这通常是文本写入 PDF 的方式,尤其是那些不像欧洲-拉丁美洲顺序文本那样简化的语言。
您可以在此处查看 MS WORD 的书写顺序。单个字母效果最好,但像连字(fi fl 等)这样的组合字母通常会导致编码/解码失败。我还看到该文件已“优化!”
ककररया
क
र
म
文件中有许多不规则之处,因此让我们将它们剪辑掉,因为遇到的许多不规则之处可能只会增加混乱。
/Producer(iLovePDF)
/Lang(ru-RU)
/P <</Lang(en-US)
BT
/F0 12 Tf 1 0 0 1 100.62 676.35 Tm
[<1CF0>7.0000007<0577>-20.000002<1CEF>7.0000007<0592>-13<0591>-24.000002<059E>] TJ
/F1 12 Tf 1 0 0 1 133.68001 676.35 Tm ( ) Tj
/F0 12 Tf 1 0 0 1 136.68001 676.35 Tm <0577> Tj
1 0 0 1 144.72 676.35 Tm <0592> Tj
1 0 0 1 150.6 676.35 Tm <0590> Tj
/F1 12 Tf 1 0 0 1 158.45001 676.35 Tm ( ) Tj
/F0 12 Tf 1 0 0 1 161.45001 676.35 Tm [<0567>6.0000007<057C059E>7.0000007<0592>] TJ
所以内容要么是美式英语,要么是俄语!!
文本行是 Arial Unicode (/F0) 和 Arial 空格键 (/F1) 的 2 种混合字体
文字呢?从逻辑上讲,它看起来不错。<0577>=
क
<0592>=र
看起来位置不错,但不是亚美尼亚语和希伯来语!
<1CF0><0577><1CEF><0592><0591><059E>
( ) <0577><0592><0590>
当我们尝试看看如何将这些数字重新分配到现实世界的 Unicode 中时,我们发现表格真的很混乱,就像它被扔进了压缩的数字研磨机中一样,现在没有真正的人类含义。也许有什么东西被用作 PDF 压缩器?或者它们一开始就没有正确编译。
该领域常见的 PDF 奇怪现象之一是反向配对。因此,要获得左侧的纯文本
किरिया करम
,墨水复制中的顺序需要通过移动第一个和第三个字形来在视觉上颠倒!
如何替换这种混合,就是在 MS 文字处理器中将代码编写为
BT
/F1 11 Tf
1 0 0 1 36 789.5 Tm
<059f0577059f05920591059e0003057705920590> Tj
ET
并添加翻译表,例如
7 beginbfrange
<0003><0003><0020>
<0577><0577><0915>
<0590><0590><092e>
<0591><0591><092f>
<0592><0592><0930>
<059e><059e><093e>
<059f><059f><093f>
endbfrange
所以我们看到
059f
= "ि" U+093F 天城文元音符号 I Unicode 字符等
<059f0577059f05920591059e0003057705920590>
=िकिरयाकरम
主要问题是 PDF 作为打印输出格式,其设计不能反转为输入。