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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:30:14