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
相关产品推荐
相关产品推荐

