PyMuPDF提取印地语PDF文本不符:原因排查及非OCR解决方案
印地语PDF文本提取异常问题解决
问题描述
使用PyMuPDF提取Microsoft Word生成的印地语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 कहै कबीर दीवाना पहला प्रवचन मैं ही इक बौराना जब मैं भूला रे भाई, मेरे सि गुरु जुगि लखाई। ककररया करम अचार मैं छाड़ा, छाड़ा िीरथ नहाना। सगरी दुतनया भई सुनायी, मैं ही इक बौराना।। ना मैं जानूं सेवा बंदगी ना मैं घंट बजाई। ना मैं मूरि धरर ससंहासन ना मैं पुहुप चढ़ाई।। ना हरर रीझै जब िप कीन्हे ना काया के जारे। ना हरर रीझै धोति छाड़े ना पांचों के मारे।। दाया रतख धरम को पाले जगसूं रहै उदासी। अपना सा तजव सबको जाने िातह तमले अतनवासी।। सहे कसबद बदा को त्यागे छाड़े गरब गुमाना। सत्य नाम िातह को तमतल है कहै कबीर कदवाना।।
原因分析
核心问题出在Microsoft Word生成PDF时的字体处理:
- Word默认使用子集化字体导出PDF(仅嵌入文档中用到的字符),但印地语的复杂字符(基础字符+变音符号组合)在子集化过程中,Unicode映射关系被破坏,导致提取时字符被错误解析。
- 部分印地语字形的组合结构未被PDF正确保留,提取工具无法识别正确的字符组合,从而输出错误字符。
解决方案(非OCR)
1. 重新生成带完整字体嵌入的PDF
这是最根本的解决方法,修复PDF本身的字体问题:
- 打开原Word文档,依次点击「文件」→「导出」→「创建PDF/XPS」。
- 点击对话框中的「选项」,勾选**「嵌入所有字体」**,同时取消「只嵌入所用字符(减小文件大小)」的勾选。
- 重新生成PDF后,再用原PyMuPDF代码提取即可得到正确文本。
2. 切换PyMuPDF的文本提取模式
尝试使用raw模式直接读取PDF字符流,绕过部分映射错误:
import pymupdf def extract_pdf_text_raw(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("raw") full_text += text + "\n\n" return full_text pdf_path = r"Kahai Kabir Diwana (Kabir)-2.pdf" full_text = extract_pdf_text_raw(pdf_path) print(full_text)
3. 使用其他PDF文本提取库
pdfplumber对复杂非英语字体的支持更优,可尝试替换:
import pdfplumber def extract_pdf_text_pdfplumber(pdf_path): full_text = "" with pdfplumber.open(pdf_path) as pdf: for page in pdf.pages: text = page.extract_text() full_text += text + "\n\n" return full_text pdf_path = r"Kahai Kabir Diwana (Kabir)-2.pdf" full_text = extract_pdf_text_pdfplumber(pdf_path) print(full_text)
非OCR替代方案总结
优先选择重新生成完整字体嵌入的PDF,从根源解决问题;若无法重新生成PDF,可尝试切换PyMuPDF的提取模式或使用pdfplumber库,无需依赖OCR即可修复文本提取错误。
内容的提问来源于stack exchange,提问作者User_4373
相关产品推荐
相关产品推荐

