You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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顺序调整,就能输出正确的显示文本。
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:32:20