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

Python检测PDF单页磁盘占用,适配4MB限制的API处理需求

解决方案:增量式批量拆分PDF(接近4MB阈值)

直接检测PDF单页在原文件中的磁盘占用并不现实——PDF包含共享资源(如字体、嵌入图片)、压缩结构,单页单独提取后的大小和它在原PDF中的实际贡献量差异很大。更可靠的方法是增量式累加页面生成临时PDF,实时检查大小,尽量凑到接近4MB的阈值,减少拆分次数,比拆成单页更高效。

以下是用PyMuPDF(fitz)实现的核心代码:

import fitz
import os

def split_pdf_by_size(input_pdf_path, max_size_mb=4):
    max_size = max_size_mb * 1024 * 1024  # 转换为字节
    doc = fitz.open(input_pdf_path)
    total_pages = len(doc)
    current_start = 0

    while current_start < total_pages:
        temp_doc = fitz.open()
        # 逐步添加页面
        for page_num in range(current_start, total_pages):
            temp_doc.insert_pdf(doc, from_page=page_num, to_page=page_num)
            # 生成字节流检测大小(无需写入磁盘)
            pdf_bytes = temp_doc.write()
            # 如果超过阈值,移除最后添加的页面并终止当前批次
            if len(pdf_bytes) > max_size:
                temp_doc.delete_page(len(temp_doc)-1)
                pdf_bytes = temp_doc.write()
                break
            # 如果是最后一页,直接结束当前批次
            if page_num == total_pages - 1:
                break
        
        # 这里添加调用API处理pdf_bytes的逻辑
        print(f"处理批次: 页面范围{current_start+1}-{page_num+1},大小{len(pdf_bytes)/1024/1024:.2f}MB")
        
        current_start = page_num + 1
        temp_doc.close()
    
    doc.close()

# 使用示例
split_pdf_by_size("large_file.pdf")

关键说明:

  • 每次添加一页后生成内存字节流检测大小,避免频繁磁盘IO,确保批次大小不超过4MB阈值。如果添加后超量,就移除该页,当前批次结束,下一批从该页重新开始。
  • 这种方法会自动处理共享资源问题,临时生成的PDF字节流包含当前批次页面所需的共享对象,大小和实际发送到API的文件尺寸一致。
  • 相比拆成单页,该方式能最大化每个批次的页面数量,减少API调用次数。

内容的提问来源于stack exchange,提问作者Orsu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:05:20