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

Flask项目中使用docx2pdf实现DOCX转PDF功能遇AssertionError报错的求助

解决docx2pdf转换时的AssertionError问题

嘿,我一眼就揪出问题根源啦——那个AssertionError完全是因为你把docx2pdf的用法搞反了!这个库的核心功能是把DOCX文件转换成PDF,不是反向转换,而且它的convert函数强制要求输出路径必须以.pdf结尾,你第一个调用里输出的是.docx,直接触发了库内部的断言检查,这不报错才怪呢!

咱们先拆解你代码里的几个明显问题:

  • 连续调用三次convert完全是冗余操作,只会添乱;
  • 保存文件用了secure_filename(filename),但后续调用convert用的是原始filename,如果文件名有特殊字符(比如空格、中文),程序可能找不到你保存的文件;
  • 没有处理转换失败的情况,也没清理临时文件,时间长了服务器会堆满垃圾文件。

给你修正后的代码,每一步都加了注释说明:

import os
from flask import request, send_file, render_template
from werkzeug.utils import secure_filename
from docx2pdf import convert

# 限定仅允许上传DOCX文件(因为我们要转成PDF)
ALLOWED_EXTENSIONS = {'docx'}

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route("/pdf", methods=["POST"])
def docx_to_pdf():
    file = request.files.get('file')
    if not file or not allowed_file(file.filename):
        # 文件不符合要求,返回提示
        return render_template("pdf.html", wait="请上传有效的DOCX文件!")
    
    # 处理文件名,确保安全合规
    original_filename = secure_filename(file.filename)
    # 用绝对路径保存上传的DOCX文件,避免路径混乱
    docx_path = os.path.join(os.getcwd(), original_filename)
    file.save(docx_path)
    
    try:
        # 生成输出PDF的文件名,替换原后缀为.pdf
        pdf_filename = os.path.splitext(original_filename)[0] + '.pdf'
        pdf_path = os.path.join(os.getcwd(), pdf_filename)
        
        # 正确调用convert:输入DOCX文件路径,输出PDF文件路径
        convert(docx_path, pdf_path)
        
        # 发送生成的PDF文件,指定下载时的文件名
        return send_file(pdf_path, as_attachment=True, download_name=pdf_filename)
    except Exception as e:
        # 捕获转换过程中的异常,给用户反馈具体错误
        return render_template("pdf.html", wait=f"转换失败:{str(e)}")
    finally:
        # 不管成功失败,都清理临时文件,避免服务器堆积垃圾
        if os.path.exists(docx_path):
            os.remove(docx_path)
        if 'pdf_path' in locals() and os.path.exists(pdf_path):
            os.remove(pdf_path)

最后还要提醒你几个关键注意事项:

  • docx2pdf在Windows上依赖Microsoft Word,Mac上依赖Preview,必须确保你的服务器环境安装了对应软件,而且不能是精简版/绿色版,不然转换会失败;
  • 最好用绝对路径处理文件,避免因为当前工作目录变化导致找不到文件;
  • 如果用户可能上传大文件,建议在代码里加上文件大小限制,避免服务器资源被耗尽。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:52:55