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

如何在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中无文本的页面,避免返回空值

测试流程:

  1. 先通过POST请求将PDF上传到/upload接口
  2. 发送GET请求到http://localhost:5000/get-pdf-content/你的PDF文件名.pdf,即可获取提取的文本内容

如果需要更精准的格式保留(比如表格、换行),可以替换为pdfplumber库,它的文本提取能力更细致,用法和PyPDF2类似,只需修改读取部分的代码即可。

内容的提问来源于stack exchange,提问作者Arslaan Muhammad Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:32:26