当前位置: 首页 > news >正文

Python批量合并多个PDF

安装pymupdf

pip install pymupdf

合并PDF文件

合并两个PDF

方法Document.insert_pdf()可以在不同的 PDF 文档之间复制页面。示例(doc1和doc2是打开的 PDF):

# append complete doc2 to the end of doc1
doc1.insert_pdf(doc2)
import fitz  # PyMuPDFdef merge_two_pdf(pdf1_path: str, pdf2_path: str, output_pdf):pdf1 = fitz.open(pdf1_path)pdf2 = fitz.open(pdf2_path)pdf1.insert_pdf(pdf2)pdf1.save(output_pdf, garbage=4)pdf1.close()pdf2.close()

合并多个PDF

def merge_pdfs0(input_files: list, output_file: str):final_pdf = fitz.open()for temp_file in input_files:with fitz.open(temp_file) as temp_pdf:final_pdf.insert_pdf(temp_pdf)# 保存最终合并结果final_pdf.save(output_file, garbage=4)final_pdf.close()print(f"合并完成,输出文件为:{output_file}")

如果PDF非常多,或者单个PDF文件特别大,会导致final_pdf占用大量的内存,针对大文件和大量 PDF 的合并需求,可以进一步优化以减少内存占用和提高效率。以下是优化策略和改进代码示例:

优化策略

  1. 分批处理并写入
    • 大量文件时可以分批加载和合并,避免一次性加载所有文件。
    • 例如,每处理一组文件就保存一次部分结果,释放内存。
  2. 避免逐页插入
    • 如果文件页数很多,可以通过直接将整个 PDF 插入到目标文档中,而不是逐页插入,减少 insert_pdf 的调用次数。
  3. 多次保存分批结果,避免中间缓存
    • 分批处理每组文件后保存一个中间文件,再加载这个中间文件继续合并下一组。最终再合并中间文件。
  4. 利用磁盘而非内存
    • 可以采用文件缓存方式,将中间文件写入磁盘。合并完成后,删除不再需要的中间文件。

示例代码

def merge_two_pdf(pdf1_path: str, pdf2_path: str, output_pdf):"""1、合并pdf1和pdf2输出到output_pdf2、删除临时文件"""pdf1 = fitz.open(pdf1_path)pdf2 = fitz.open(pdf2_path)pdf1.insert_pdf(pdf2)pdf1.save(output_pdf, garbage=4)pdf1.close()pdf2.close()if pdf1_path.endswith('.tmp'):os.remove(pdf1_path)if pdf2_path.endswith('.tmp'):os.remove(pdf2_path)def merge_pdfs(input_files, output_file):tmp_count = 0while len(input_files) > 2:merged_files = []for i in range(0, len(input_files), 2):if i + 1 < len(input_files):tmp_file = output_file + f'{tmp_count}.tmp'merge_two_pdf(input_files[i], input_files[i + 1], tmp_file)merged_files.append(tmp_file)tmp_count += 1else:merged_files.append(input_files[i])input_files = merged_files# Save the final merged PDFmerge_two_pdf(input_files[0], input_files[1], output_file)

http://www.mrgr.cn/news/66552.html

相关文章:

  • 基础大模型 vs 应用大模型
  • springboot集成onlyoffice(部署+开发)
  • SEO
  • 第二届新生程序设计竞赛热身赛(C语言)
  • 配置文件格式(xml、properties、yml/yaml)
  • 编程和英语
  • Java 运算符和表达式
  • 译码方案译码错误
  • D-FINE:在DETRs模型中将回归任务重新定义为细粒度分布优化
  • C语言 | Leetcode C语言题解之第540题有序数组中的单一元素
  • dom4j实现xml转map,xml转json字符串
  • 前端八股文(二)CSS 持续更新中。。。
  • ffmpeg视频解码
  • 看看你的电脑可以跑 AI 模型吗?
  • 基于图像处理的硬币个数识别系统
  • Rust 跨平台构建与部署实战:构建并部署跨平台应用
  • 网关 Spring Cloud Gateway
  • Hive操作库、操作表及数据仓库的简单介绍
  • 受控制组件与非受控组件
  • 基于Matlab的语音识别
  • 苍穹外卖 各状态的订单数量统计
  • 【拥抱AI】如何让软件开发在保证数据安全的同时更加智能与高效?
  • 使用 Visual Studio Installer 彻底卸载 Visual Studio方法与下载
  • MySQL事务管理
  • window 利用Putty免密登录远程服务器
  • 读代码题 错题集