有没有任何python包可以很好地从RTL语言的PDF中提取文本



我曾使用过著名的PDF文件python包,如PDFminer、PyMuPDF、PyPDF2等。但它们都无法从用从右到左语言(波斯语、阿拉伯语(编写的PDF文件中正确提取文本。

例如:

import fitz
doc = fitz.open("*/path/to/file.pdf")
txt = doc.getPageText(0)
print(txt)

它返回如下内容:

。。。

اﯾﻨﺘﺮﻧﺖوﮐﺎﻣﭙﯿﻮﺗﺮ ﺑﻪ ﻣﺴﻠﻂ

ﻣﺴﻠﻂ ﻫﺎیﺑﺎن

有时单词写反(第一个字符排在最后(,单词在句子中交换,有时单词写对。但它不知道如何处理零宽度非joiner(نیم‌فااله(,常用于波斯语。

我试了很多,但都没有成功。提前感谢您的帮助。

我遇到了这个问题,我写了以下代码:

import sys
from builtins import print
import fitz
input_file = "p.pdf"
line_list = []
doc = fitz.Document(input_file)
page_count = doc.pageCount
for i in range(page_count):
load_page = doc.loadPage(i)
page = load_page.getText() # read a page
page = str(page)
line_list.append(page.splitlines()) # split every page based on n
for j in range (len(line_list)):
for k in range(3): 
line_list[j][k] = line_list[j][k][::-1]
print(line_list[j][k])

但这个方案有两个问题。1( 反转单词(例如"الام"-"gt;"(我在这个代码中解决了它。2( 它在使用波斯语和英语等多种语言的文档方面存在问题。

我认为答案是你可以做到这一点,但目前没有一个包能很好地处理RTL语言,所以你必须在使用任何一种语言后进行一些清理。

我已经成功地使用pdfplumber从(天生的数字(PDF中提取了阿拉伯语文本。通过";一些成功;我的意思是,这是一个巨大的痛苦在。。。脖子,最后没有达到我的目的。痛苦的部分是因为提取的文本是向后的,在每个变音符号旁边都插入了一个空格。(我想你需要去掉波斯语中的零宽度连字,作为前处理或后处理步骤。(至少在阿拉伯语中,这些都是可以修复的——下面是一些代码。

但准确性问题是因为我使用的是一本阿拉伯语小说的PDF,这本小说的字体很漂亮,有些字母叠在一起。pdfplumber大多能够提取出有哪些字母,但不能提取出哪个顺序。(这并不奇怪——这对阿拉伯语的人类学生来说也很难。(我不确定波斯语是否也有同样的问题。但是如果你的源代码使用普通字体,你可能会得到更好的结果。

以下示例中的文本应为:فيرداينهجبيالدبيااددمعليهي。الهدوء

import pdfplumber
file = 'sample_page.pdf'
pdf = pdfplumber.open(file)
page = pdf.pages[0]
text = page.extract_text()
print(text[:110])
output:
دّ لخا قوف ترّ قتسا يتلا ةيّ ساحنلا بابلا ةقّ دم تنيّ بت جهنلا سأر في لاإ مٌ يّ مخ ءودلها .ةمومضم فصن دي ةض

^这是向后的,所有的变音符号旁边都有空格

# Reverse text with bidi
from bidi import algorithm
text_rev = algorithm.get_display(text)
print(text_rev[:110])
output:
يف رأس النهج تب ّينت مد ّقة الباب النحاس ّية التي استق ّرت فوق اخل ّد 
اخلشب ّي الضخم عىل هيئة قبضة يد نصف مضم

^不再向后,但仍然是变音符号问题

# Strip most common diacritic — in real use you would need to get all of them
shadda = unichr(0x0651)
text_rev_dediac = text_rev.replace(" "+shadda, '')
print(text_rev_dediac[:110])
output:
يف رأس النهج تبينت مدقة الباب النحاسية التي استقرت فوق اخلد 
اخلشبي الضخم عىل هيئة قبضة يد نصف مضمومة. اهلدوء 

^这是对的,除非堆叠的字母顺序错误(就像第一个单词应该是في(fy'in'(,但它是ي\1601(yf(。你可以看到这个时期(在单词مد\1605ونة之后(仍然在正确的位置。因此,这是非常成功的,并且可能是100%准确的更容易的字体。

祝你好运!

最新更新