使用Python将印地语天城文PDF转CSV时的编码异常问题
解决印地语天城文PDF文本提取乱码问题
问题根源
这种乱码通常是因为PDF中的印地语文字使用了非标准编码的嵌入字体,或是字体缺少正确的Unicode字符映射(CMAP),导致文本提取库无法解析出正确的天城文字符,输出了错误的编码序列。
解决方案
1. 优化PyMuPDF的文本提取参数
尝试使用PyMuPDF的高级文本提取选项,强制以UTF-8编码输出,同时调整提取规则减少布局干扰:
import fitz def extract_text_from_pdf(pdf_file): text = "" with fitz.open(pdf_file) as pdf_document: for page_num in range(len(pdf_document)): page = pdf_document.load_page(page_num) # 忽略布局格式,优先提取原生字符 text += page.get_text(flags=fitz.TEXTFLAGS_IGNORE_LAYOUT) # 确保文本以UTF-8编码处理 return text.encode('utf-8').decode('utf-8') def main(): pdf_file = 'data/agra_2010.pdf' extracted_text = extract_text_from_pdf(pdf_file) # 直接输出印地语文本,无需转罗马化 print(extracted_text) # 保存到CSV时指定UTF-8编码,避免乱码 with open('output.csv', 'w', encoding='utf-8') as f: f.write(extracted_text) if __name__ == "__main__": main()
2. 使用OCR提取(最可靠方案,适用于扫描件或字体异常的PDF)
如果PDF是扫描生成的,或是文字被渲染为图片,原生文本提取会失效,此时需要用OCR识别天城文:
先安装依赖:
pip install pytesseract pillow pymupdf同时安装Tesseract OCR引擎,并下载印地语语言包(hin),确保引擎支持天城文识别。
实现OCR提取的代码:
import fitz import pytesseract from PIL import Image def ocr_pdf_page(page): # 将PDF页面转为高DPI图片,提升识别精度 pix = page.get_pixmap(dpi=300) img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples) # 指定印地语语言进行OCR识别 text = pytesseract.image_to_string(img, lang='hin') return text def extract_text_with_ocr(pdf_file): text = "" with fitz.open(pdf_file) as pdf_document: for page_num in range(len(pdf_document)): page = pdf_document.load_page(page_num) text += ocr_pdf_page(page) + "\n" return text def main(): pdf_file = 'data/agra_2010.pdf' extracted_text = extract_text_with_ocr(pdf_file) print(extracted_text) # 保存CSV时指定UTF-8编码 with open('output.csv', 'w', encoding='utf-8') as f: f.write(extracted_text) if __name__ == "__main__": main()
3. 排查PDF字体映射(进阶操作)
如果想确认字体问题,可以先查看PDF页面的字体信息:
import fitz def check_fonts(pdf_file): with fitz.open(pdf_file) as pdf_document: page = pdf_document.load_page(0) for font in page.get_fonts(): print(f"字体名称: {font[3]}, 是否嵌入: {font[2] == 1}, 编码: {font[4]}") check_fonts('data/agra_2010.pdf')
如果输出中显示字体编码为WinAnsiEncoding或其他非Unicode编码,说明字体缺少天城文的正确映射,此时OCR是最优解。
内容的提问来源于stack exchange,提问作者cedratcarlisle
相关产品推荐
相关产品推荐

