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

