如何在Python Flask REST API中获取已上传PDF文件的内容并通过GET请求返回
解决方案:添加GET路由提取PDF内容并返回
首先,你需要一个PDF处理库来读取文件内容,最常用的是PyPDF2或者pdfplumber。这里我们用PyPDF2做示例,先安装依赖:
pip install PyPDF2
接下来,修改你的app.py代码,新增一个GET路由来处理PDF内容提取。我们可以创建/get-pdf-content/<filename>路由,核心逻辑包括:校验文件存在性、确认是PDF类型、读取所有页面文本、返回结构化响应,同时覆盖各种错误场景。
以下是修改后的完整代码:
from flask import Flask, json, request, jsonify import os from werkzeug.utils import secure_filename from PyPDF2 import PdfReader # 导入PDF读取工具 app = Flask(__name__) UPLOAD_FOLDER = r'E:\Uploaded_Files' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.route('/') def main(): return 'Homepage' @app.route('/upload', methods=['POST']) def upload_file(): # 原上传逻辑保持不变 if 'files[]' not in request.files: resp = jsonify({'message' : 'No file part in the request'}) resp.status_code = 400 return resp files = request.files.getlist('files[]') errors = {} success = False for file in files: if file and allowed_file(file.filename): filename = secure_filename(file.filename) file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) success = True else: errors[file.filename] = 'File type is not allowed' if success and errors: errors['message'] = 'File(s) successfully uploaded' resp = jsonify(errors) resp.status_code = 500 return resp if success: resp = jsonify({'message' : 'Files successfully uploaded'}) resp.status_code = 201 return resp else: resp = jsonify(errors) resp.status_code = 500 return resp @app.route('/get-pdf-content/<filename>', methods=['GET']) def get_pdf_content(filename): # 安全处理文件名,避免路径遍历攻击 safe_filename = secure_filename(filename) file_path = os.path.join(app.config['UPLOAD_FOLDER'], safe_filename) # 检查文件是否存在 if not os.path.exists(file_path): return jsonify({'error': 'File not found'}), 404 # 校验是否为PDF文件 if not allowed_file(safe_filename) or safe_filename.rsplit('.',1)[1].lower() != 'pdf': return jsonify({'error': 'Only PDF files are supported for content extraction'}), 400 try: # 读取并提取PDF所有页面文本 reader = PdfReader(file_path) pdf_content = "" for page in reader.pages: # 处理可能无文本的页面 pdf_content += page.extract_text() or "" return jsonify({ 'filename': safe_filename, 'content': pdf_content.strip() if pdf_content else 'No text found in PDF' }), 200 except Exception as e: # 捕获读取异常并返回友好提示 return jsonify({'error': f'Failed to read PDF: {str(e)}'}), 500 if __name__ == '__main__': app.run(debug=True)
关键细节说明:
- 安全防护:用
secure_filename处理传入的文件名,避免恶意路径遍历 - 错误覆盖:包含文件不存在、非PDF文件、读取失败等多种异常处理
- 内容兼容性:处理PDF中无文本的页面,避免返回空值
测试流程:
- 先通过POST请求将PDF上传到
/upload接口 - 发送GET请求到
http://localhost:5000/get-pdf-content/你的PDF文件名.pdf,即可获取提取的文本内容
如果需要更精准的格式保留(比如表格、换行),可以替换为pdfplumber库,它的文本提取能力更细致,用法和PyPDF2类似,只需修改读取部分的代码即可。
内容的提问来源于stack exchange,提问作者Arslaan Muhammad Ali
相关产品推荐
相关产品推荐

