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

印地语PDF转可编辑Docx文本:编码检测与转换报错排查

PDF转Docx脚本错误修复

问题根源

  1. 编码检测返回None:chardet无法识别部分PDF文件的编码,导致encoding变量为None,触发TypeError。
  2. 字符串解码逻辑错误:Python 3中StringIO.getvalue()返回的是str类型,而decode()是bytes类型的专属方法,直接调用会触发AttributeError。

修复步骤

  1. 添加编码默认值:当chardet检测失败时,指定PDF通用的默认编码(如latin-1,PDF内部文本多使用该编码)。
  2. 移除多余解码操作:pdfminer的TextConverter配合StringIO输出的已经是处理好的字符串,无需额外解码;同时在TextConverter初始化时显式指定编码,确保解析过程规范。

修改后的完整代码

import codecs
import chardet
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
from docx import Document

# 检测PDF文件编码,添加默认值避免None
with open("input.pdf", "rb") as pdf_file:
    result = chardet.detect(pdf_file.read())
    # 检测失败时用latin-1作为默认编码(PDF通用编码)
    encoding = result["encoding"] or "latin-1"

# 使用pdfminer提取PDF文本
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()
# 显式指定编码,让pdfminer直接按该编码解析文本
device = TextConverter(rsrcmgr, retstr, laparams=laparams, encoding=encoding)
with open("input.pdf", "rb") as pdf_file:
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    for page in PDFPage.get_pages(pdf_file):
        interpreter.process_page(page)
    text = retstr.getvalue()

# 直接保存文本到docx文档
doc = Document()
doc.add_paragraph(text)
doc.save("output.docx")

关键说明

  • 给encoding设置默认值latin-1,彻底避免chardet检测失败导致的None值问题。
  • 在TextConverter中显式传入encoding参数,让pdfminer直接按指定编码解析并输出正确的str类型文本,无需后续手动解码。

内容的提问来源于stack exchange,提问作者Pranav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:35:18