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

使用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库的封装逻辑,优先采用升级库或手动实现的方案

验证步骤

  1. 执行升级命令后重新运行原代码
  2. 检查日志是否无错误,且PDF文件正常生成
  3. 若问题仍存在,替换为手动转换逻辑测试
  4. 确认手动转换Word文件无异常,排除文件损坏问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:23:18