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

Flask开发PDF转DOCX工具,转换后生成的DOCX为空求助

问题排查与修复方案

1. 缺失关键配置与导入

你的代码未配置上传文件夹、允许的文件类型,也缺少必要依赖的导入语句,这会直接导致流程中断:

  • 补充开头的导入代码:
import os
from flask import Flask, request, redirect, render_template, send_file, io
from werkzeug.utils import secure_filename
from flask_sqlalchemy import SQLAlchemy
import fitz  # PyMuPDF库
from docx import Document  # python-docx库
  • 添加核心配置项:
app.config['UPLOAD_FOLDER'] = './uploads'
app.config['ALLOWED_EXTENSIONS'] = {'pdf'}
  • 启动前自动创建上传文件夹:
if __name__ == '__main__':
    os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
    app.run(debug=True)

2. 冗余表单参数导致逻辑异常

上传函数里的docx_data参数检查完全多余——前端表单大概率没有这个字段,会直接触发跳转,跳过转换逻辑。即使侥幸执行,也可能因为参数为空导致后续异常。删掉该检查:

# 原代码
if not pdf_file or not allowed_file(pdf_file.filename) or not docx_data:
    return redirect(request.url)

# 修改后
if not pdf_file or not allowed_file(pdf_file.filename):
    return redirect(request.url)

3. PDF文本提取失败

如果你的PDF是扫描件(纯图片格式),PyMuPDF的get_text("text")无法提取任何内容,生成的DOCX自然为空:

  • 先测试可复制文本的PDF,验证转换逻辑是否正常;
  • 若需处理扫描件,需额外集成OCR工具(如pytesseract)提取图片中的文字。

4. 文件命名与路径优化

原代码生成的DOCX文件名是原PDF名.pdf.docx(比如test.pdf.docx),既不美观也容易混淆,修正命名逻辑:

# 原代码
docx_path = os.path.join(app.config['UPLOAD_FOLDER'], f"{filename}.docx")

# 修改后
docx_path = os.path.join(app.config['UPLOAD_FOLDER'], f"{os.path.splitext(filename)[0]}.docx")

修复后的核心上传函数片段

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        pdf_file = request.files.get('file')

        if not pdf_file or not allowed_file(pdf_file.filename):
            return redirect(request.url)

        filename = secure_filename(pdf_file.filename)
        pdf_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
        docx_path = os.path.join(app.config['UPLOAD_FOLDER'], f"{os.path.splitext(filename)[0]}.docx")

        pdf_file.save(pdf_path)
        print(f"PDF file saved to: {pdf_path}")
        pdf_to_docx(pdf_path, docx_path)

        # 检查DOCX是否为空,提前拦截异常
        if os.path.getsize(docx_path) == 0:
            print("转换后的DOCX文件为空")
            return redirect(request.url)

        pdf_file_data = open(pdf_path, 'rb').read()
        upload = PDFFile(filename=filename, data=pdf_file_data)
        db.session.add(upload)
        db.session.commit()

        docx_file_data = open(docx_path, 'rb').read()
        docx_filename = os.path.basename(docx_path)
        upload = PDFFile(filename=docx_filename, data=docx_file_data)
        db.session.add(upload)
        db.session.commit()

        return render_template('main_page.html', download_filename=docx_filename)

    return render_template('main_page.html')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:36:19