印地语PDF转可编辑Docx文本:编码检测与转换报错排查
PDF转Docx脚本错误修复
问题根源
- 编码检测返回None:chardet无法识别部分PDF文件的编码,导致
encoding变量为None,触发TypeError。 - 字符串解码逻辑错误:Python 3中
StringIO.getvalue()返回的是str类型,而decode()是bytes类型的专属方法,直接调用会触发AttributeError。
修复步骤
- 添加编码默认值:当chardet检测失败时,指定PDF通用的默认编码(如
latin-1,PDF内部文本多使用该编码)。 - 移除多余解码操作: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
相关产品推荐
相关产品推荐

