PDF提取阿拉伯文本时RTL连字错位问题及解决办法咨询
解决阿拉伯语PDF文本提取中的连字与RTL顺序问题
调整PyMuPDF提取参数拆分连字
PyMuPDF(fitz)自带禁用连字的选项,提取时强制拆分连字为原始字符,避免后续处理出错:import fitz doc = fitz.open("目标文件.pdf") page = doc[0] # 启用文本提取+禁用连字合并 raw_text = page.get_text(flags=fitz.TEXTFLAGS_TEXT | fitz.TEXTFLAGS_NO_LIGATURES)这样提取的文本会保留"لا"对应的
uni0644和uni0627原始字符,再用双向算法处理顺序就能得到正确结果。用
python-bidi+arabic-reshaper组合修正显示
单独用bidi算法不足以处理阿拉伯语的字形变化,配合整形库能同时解决顺序和连字问题:from bidi.algorithm import get_display from arabic_reshaper import reshape # 假设已提取到原始文本 processed_text = get_display(reshape(raw_text)) # 此时输出应为正确的"الشــــــتراك"关键是要先确保提取的文本是未合并连字的原始字符,否则整形库无法正确识别。
别自己写连字分解逻辑
完全没必要自行实现双向文本连字分解,现有工具已经覆盖了绝大多数场景:- PyMuPDF的
TEXTFLAGS_NO_LIGATURES直接从PDF底层拿到原始字符,跳过连字合并; arabic-reshaper自动处理阿拉伯语的连字、字形变体,搭配python-bidi的RTL顺序调整,就能输出正确的显示文本。
- PyMuPDF的
PDFMiner的对应优化
如果用PDFMiner,修改LAParams禁用连字即可:from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfpage import PDFPage import io def extract_arabic_text(pdf_path): rsrcmgr = PDFResourceManager() retstr = io.StringIO() # 禁用连字处理 laparams = LAParams(ligatures=False) device = TextConverter(rsrcmgr, retstr, laparams=laparams) with open(pdf_path, 'rb') as fp: interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.get_pages(fp): interpreter.process_page(page) text = retstr.getvalue() device.close() retstr.close() return text提取后同样用
python-bidi和arabic-reshaper处理显示。
内容的提问来源于stack exchange,提问作者Naourass Derouichi
相关产品推荐
相关产品推荐

