如何在Flask应用中提取用户上传PDF文件的文本
基于内存流的Flask上传PDF文本提取方案
目前主流的Python PDF处理库均原生支持类文件对象输入,无需传入实际磁盘路径,可直接对接Flask上传生成的文件对象或BytesIO内存流,完全不需要将文件存储到服务端磁盘,从根源避免文件冲突问题。以下是两种常用实现方案:
方案1:使用PyPDF2实现(轻量通用)
适合常规原生PDF的文本提取,依赖轻量,部署简单。
- 安装依赖
pip install pypdf2 - 示例代码
from flask import Flask, request from PyPDF2 import PdfReader from io import BytesIO app = Flask(__name__) @app.route('/pdf-extract', methods=['POST']) def extract_pdf(): # 直接获取上传的PDF文件对象,无需落盘 upload_pdf = request.files.get('pdf_file') # 转换为BytesIO内存流(部分场景下直接传upload_pdf也可运行,显式转换兼容性更强) pdf_stream = BytesIO(upload_pdf.read()) # 从内存流读取PDF并提取文本 reader = PdfReader(pdf_stream) full_text = "" for page in reader.pages: full_text += page.extract_text() + "\n" return {"extracted_text": full_text}
方案2:使用pdfplumber实现(精度更高)
对复杂排版、表格类PDF的提取效果优于PyPDF2,同样支持内存流输入。
- 安装依赖
pip install pdfplumber - 示例代码
from flask import Flask, request import pdfplumber from io import BytesIO app = Flask(__name__) @app.route('/pdf-extract', methods=['POST']) def extract_pdf(): upload_pdf = request.files.get('pdf_file') pdf_stream = BytesIO(upload_pdf.read()) full_text = "" with pdfplumber.open(pdf_stream) as pdf: for page in pdf.pages: # 如需提取表格可替换为 page.extract_table() full_text += page.extract_text() + "\n" return {"extracted_text": full_text}
注意事项
- 无需额外写入磁盘,所有操作在内存中完成,完全避免多请求下的文件命名冲突问题
- 请求处理完成后内存流会被自动回收,无冗余存储开销
- 若上传的是扫描件类的图像PDF,可基于同一内存流接入pytesseract等OCR工具实现文本提取,仍无需落盘
内容的提问来源于stack exchange,提问作者Woox
相关产品推荐
相关产品推荐

