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
相关产品推荐
相关产品推荐

