使用docx2pdf转换DOCX到PDF时遇'NoneType'无write属性错误求助
解决docx2pdf 0.1.8版本中'NoneType' object has no attribute 'write'错误
问题背景
使用docx2pdf 0.1.8版本转换DOCX文件到PDF时,转换流程执行完毕(PDF文件已生成),但日志触发错误:
2024-08-02 11:44:26,978 - ERROR - Erreur lors de la conversion DOCX en PDF : 'NoneType' object has no attribute 'write'
已安装依赖pywin32、tqdm,且系统装有Microsoft Word,代码如下:
import os import logging from docx2pdf import convert # Configure logging logging.basicConfig( filename='conversion.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s' ) def convert_docx_to_pdf(docx_path, output_path): logging.debug(f"Début de la conversion : {docx_path} -> {output_path}") try: # Check if DOCX file exists if not os.path.exists(docx_path): raise FileNotFoundError(f"Le fichier DOCX spécifié n'existe pas : {docx_path}") # Convert DOCX to PDF convert(docx_path, output_path) # Check if PDF file was created if not os.path.exists(output_path): raise FileNotFoundError(f"Le fichier PDF n'a pas été créé : {output_path}") logging.info(f"Conversion réussie : {output_path}") except FileNotFoundError as e: logging.error(f"Erreur de fichier : {e}") except PermissionError: logging.error(f"Erreur de permission lors de la conversion : {docx_path}") except Exception as e: logging.error(f"Erreur lors de la conversion DOCX en PDF : {e}") def main(): docx_file = r'C:\Users\hbab\Desktop\document.docx' pdf_from_docx = r'C:\Users\hbab\Desktop\document.pdf' logging.debug(f"Début de la conversion de {docx_file} vers {pdf_from_docx}") convert_docx_to_pdf(docx_file, pdf_from_docx) if os.path.exists(pdf_from_docx): logging.info(f"Le fichier PDF a été créé avec succès : {pdf_from_docx}") else: logging.error(f"Le fichier PDF n'a pas été créé : {pdf_from_docx}") if __name__ == '__main__': main()
可能原因
该错误源于docx2pdf 0.1.8版本内部调用Word COM对象时,某个预期返回可写对象的属性返回了None,通常和以下情况相关:
- 库版本存在已知bug,旧版本未处理Word进程释放或路径解析的边缘情况
- 输出路径存在权限问题,或路径包含特殊字符导致Word无法正确写入
- Word进程未被正确释放,导致后续操作中对象状态异常
解决方案
1. 升级docx2pdf到最新版本
旧版本的bug在后续更新中已被修复,执行以下命令升级:
pip install --upgrade docx2pdf
升级后重新运行转换代码,检查错误是否消失。
2. 验证输出路径合法性
- 确认输出路径所在文件夹有写入权限,避免系统保护目录(如
C:\Windows)或需要管理员权限的路径 - 避免路径中包含特殊字符(如非ASCII字符、未转义的空格等),可尝试使用短路径或不含空格的路径测试
3. 手动实现Word转换逻辑(绕过docx2pdf库)
如果升级库后问题仍存在,可直接使用pywin32控制Word完成转换,避免库的封装问题:
import win32com.client import os import logging def convert_docx_to_pdf(docx_path, output_path): logging.debug(f"Début de la conversion : {docx_path} -> {output_path}") word = None try: # 初始化Word应用 word = win32com.client.Dispatch("Word.Application") word.Visible = False # 后台运行,不显示Word窗口 # 打开DOCX文件 doc = word.Documents.Open(docx_path) # 另存为PDF(FileFormat=17对应PDF格式) doc.SaveAs(output_path, FileFormat=17) doc.Close() if os.path.exists(output_path): logging.info(f"Conversion réussie : {output_path}") else: raise FileNotFoundError(f"Le fichier PDF n'a pas été créé : {output_path}") except FileNotFoundError as e: logging.error(f"Erreur de fichier : {e}") except PermissionError: logging.error(f"Erreur de permission lors de la conversion : {docx_path}") except Exception as e: logging.error(f"Erreur lors de la conversion DOCX en PDF : {e}") finally: # 确保Word进程退出 if word: word.Quit()
4. 检查DOCX文件完整性
尝试用Microsoft Word手动打开目标DOCX文件,执行"另存为PDF"操作:
- 如果手动转换失败,说明文件本身存在损坏,需修复DOCX文件后再尝试
- 如果手动转换成功,说明问题完全源于docx2pdf库的封装逻辑,优先采用升级库或手动实现的方案
验证步骤
- 执行升级命令后重新运行原代码
- 检查日志是否无错误,且PDF文件正常生成
- 若问题仍存在,替换为手动转换逻辑测试
- 确认手动转换Word文件无异常,排除文件损坏问题
内容的提问来源于stack exchange,提问作者Hbab
相关产品推荐
相关产品推荐

