Django/Python实现无本地存储拆分PDF并返回压缩包
无本地存储实现Django API拆分PDF并返回压缩包
可以完全通过内存字节流实现全程无本地文件落地的操作,核心是用io.BytesIO替代本地文件路径,结合PyPDF2、zipfile和Django的HttpResponse完成流程。
实现代码
from django.http import HttpResponse, BadRequest from PyPDF2 import PdfReader, PdfWriter import io import zipfile def split_pdf_to_zip(request): # 校验请求合法性 if request.method != 'POST' or 'pdf_file' not in request.FILES: return BadRequest("请通过POST请求上传PDF文件") # 读取上传PDF到内存流 uploaded_pdf = request.FILES['pdf_file'] pdf_memory_stream = io.BytesIO(uploaded_pdf.read()) # 初始化PDF阅读器 pdf_reader = PdfReader(pdf_memory_stream) total_pages = len(pdf_reader.pages) # 创建内存ZIP压缩包 zip_memory_stream = io.BytesIO() with zipfile.ZipFile(zip_memory_stream, 'w', zipfile.ZIP_DEFLATED) as zip_file: for page_idx in range(total_pages): # 生成单页PDF内存流 single_page_writer = PdfWriter() single_page_writer.add_page(pdf_reader.pages[page_idx]) page_stream = io.BytesIO() single_page_writer.write(page_stream) page_stream.seek(0) # 重置流指针到起始位置 # 将单页PDF写入ZIP包 zip_file.writestr(f"page_{page_idx + 1}.pdf", page_stream.getvalue()) # 重置ZIP流指针,准备返回 zip_memory_stream.seek(0) # 构建下载响应 response = HttpResponse(zip_memory_stream, content_type='application/zip') response['Content-Disposition'] = 'attachment; filename="split_pdf_pages.zip"' return response
关键细节说明
- 无本地存储核心:所有文件操作基于
io.BytesIO内存流,替代传统本地文件路径,完全避免磁盘IO开销 - 上传文件处理:直接读取
request.FILES中的文件内容到内存,无需调用save()方法落地到本地 - ZIP包构建:在内存中创建ZIP对象,通过
writestr方法直接将单页PDF的字节内容写入ZIP,无需生成中间文件 - 响应返回:将内存中的ZIP流直接作为HttpResponse内容,设置正确的MIME类型和下载头,浏览器会自动识别为压缩包下载
注意事项
- 处理超大PDF时内存占用会上升,可根据场景限制上传文件大小或实现分块处理逻辑
- 确保安装依赖库:
pip install PyPDF2 django - 可额外添加PDF格式校验逻辑,避免非PDF文件导致的解析错误
内容的提问来源于stack exchange,提问作者Poojesshwaran V
相关产品推荐
相关产品推荐

