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

使用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识别天城文:

  1. 先安装依赖:

    pip install pytesseract pillow pymupdf
    

    同时安装Tesseract OCR引擎,并下载印地语语言包(hin),确保引擎支持天城文识别。

  2. 实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:03:27