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.mzph.cn/bicheng/59741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WSL开发--利用Git连接远程仓库(详细步骤)

这篇文章主要介绍了如何将本地项目推送到 GitLab 上&#xff0c;并且避免每次提交都需要输入用户名和密码。文中分步讲解了配置 GitLab SSH 密钥以及配置 Git 远程仓库地址的方法。以下是文章的优化和简洁版&#xff1a; 将本地项目推送到 GitLab 并配置 SSH 免密登录 为了方便…

Hive中各种Join的实现

一. 数据准备 1. 创建两张表 create table tablea (id int, name string) row format delimited fields terminated by ,; create table tableb (id int, age int) row format delimited fields terminated by ,;2. 准备两份数据 tablea.txt文件数据如下&#xff1a; 1,hua…

快消零售行业企业员工培训的数字化转型

在快速消费品&#xff08;FMCG&#xff09;行业中&#xff0c;员工培训对于保持企业的竞争力至关重要。随着电子商务的兴起和消费者行为的变化&#xff0c;快消零售行业需要不断适应新的市场趋势。数字化转型为员工培训提供了新的机遇&#xff0c;尤其是在构建在线培训知识库方…

java的体系结构

1. 题记&#xff1a; 其实很早就打算来写java的体系结构这一文章&#xff0c;但是有诸多担忧就一直搁置。其一担心自己水平有限&#xff0c;恐不能讲得太透彻&#xff0c;因为java的体系结构宏大精深。其二不知道怎么去把控文章的难度及深度&#xff0c;因为需要给大部分看&am…

基于STM32的实时时钟(RTC)教学

引言 实时时钟&#xff08;RTC&#xff09;是微控制器中的一种重要功能&#xff0c;能够持续跟踪当前时间和日期。在许多应用中&#xff0c;RTC用于记录时间戳、定时操作等。本文将指导您如何使用STM32开发板实现RTC功能&#xff0c;通过示例代码实现当前时间的读取和显示。 环…

探索开放资源上指令微调语言模型的现状

人工智能咨询培训老师叶梓 转载标明出处 开放模型在经过适当的指令调整后&#xff0c;性能可以与最先进的专有模型相媲美。但目前缺乏全面的评估&#xff0c;使得跨模型比较变得困难。来自Allen Institute for AI和华盛顿大学的研究人员们进行了一项全面的研究&#xff0c;探索…

WebSocket详解:从前端到后端的全栈理解

文章目录 前言一、WebSocket简介二、WebSocket的特点三、WebSocket的工作原理3.1 握手过程3.2 数据传输 四、WebSocket在前端的应用五、WebSocket在后端的应用六、WebSocket的局限与解决方案结语 前言 随着互联网技术的发展&#xff0c;传统的HTTP协议在某些场景下的局限性逐渐…

2024 CCPC Liaoning Provincial Contest

tot&#xff1a;赛时是6题723罚时&#xff0c;还是差劲了。省赛&#xff0c;特别是这场省赛&#xff0c;难度低很多。前面4&#xff0c;5题都是签到题。第六题是一个关于闰年的容斥&#xff0c;脑子乱了&#xff0c;然后越来越绕。然后就没出。出的是一个诈骗题&#xff0c;题面…

使用k8s管理应用以及java案例

使用k8s管理应用 制作镜像控制器管理podpod数据持久化创建service四层代理创建ingress规则对外发布应用日志与监控应用案例(因无开发代码&#xff0c;最终跑不起来)编写java代码编写 Dockerfile构建 Docker 镜像在 Kubernetes 上运行应用程序创建 Kubernetes 服务service创建in…

【论文阅读笔记】CamoFormer: Masked Separable Attention for Camouflaged Object Detection

1.论文介绍 CamoFormer: Masked Separable Attention for Camouflaged Object Detection CamoFormer&#xff1a;用于隐藏目标检测的掩蔽可分离注意力 TPAMI 2024 Paper Code 2.摘要 如何从背景中识别和分割隐藏的对象是一个挑战。受transformer中多头自注意的启发&#xf…

【从零开始的LeetCode-算法】3254. 长度为 K 的子数组的能量值 I

给你一个长度为 n 的整数数组 nums 和一个正整数 k 。一个数组的 能量值 定义为&#xff1a; 如果 所有 元素都是依次 连续 且 上升 的&#xff0c;那么能量值为 最大 的元素。否则为 -1 。 你需要求出 nums 中所有长度为 k 的子数组的能量值。 请你返回一个长度为 n - k 1…

LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略

LLMs之PDF&#xff1a;zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略 目录 zeroX的简介 1、支持的文件类型 zeroX的安装和使用方法 T1、Node.js 版本&#xff1a; 安装 使用方法 使用文件 URL&#xff1a; 使用本地路径&…

【使用 Python 和 ADB 检查 Android 设备的 Wi-Fi 状态】

引言 在现代移动设备中,Wi-Fi 连接的稳定性和安全性至关重要。本文将介绍如何使用 Python 和 ADB(Android Debug Bridge)命令来检查 Android 设备的 Wi-Fi 连接状态,包括获取连接的 SSID、信号强度、链路速度、频段和安全类型。我们将编写一个 Python 脚本,该脚本能够解析…

htop-2.2.0在arm64上的手工编译

背景&#xff1a;在一款国产的arm上的linux 64位的系统上&#xff0c;没有htop&#xff0c;这里是手工交叉编译的部分笔记 文章目录 写在前面下载包二、编译脚本1.ncurses2.htop之后我会把压缩包放在这里 资源 写在前面 因为种种原因&#xff0c;需要手工编译 网上有几篇&…

qt QStandardItemModel详解

1、概述 QStandardItemModel是Qt框架中提供的一个基于项的模型类&#xff0c;用于存储和管理数据&#xff0c;这些数据可以以表格的形式展示在视图控件&#xff08;如QTableView、QTreeView等&#xff09;中。QStandardItemModel支持丰富的数据操作&#xff0c;包括添加、删除…

docker安装zookeeper,以及zk可视化界面介绍

1. zookeeper 1.1. zookeeper简单介绍 ZooKeeper 是一个分布式的开源协调服务,最初由 Apache Hadoop 项目开发,用于构建分布式应用程序。它提供了一个简单的接口,允许开发人员实现诸如配置维护、域名服务、分布式同步、组服务等常见任务。ZooKeeper 的设计目标是提供高性能…

思源笔记轻松连接本地Ollama大语言模型,开启AI写作新体验!

文章目录 前言1. 下载运行Ollama框架2. Ollama下载大语言模型3. 思源笔记设置连接Ollama4. 测试笔记智能辅助写作5. 安装Cpolar工具6. 配置Ollama公网地址7. 笔记设置远程连接Ollama8. 固定Ollama公网地址 前言 今天我们要聊聊如何通过cpolar内网穿透技术&#xff0c;把国产笔…

基于C++的决策树C4.5机器学习算法(不调包)

目前玩机器学习的小伙伴&#xff0c;上来就是使用现有的sklearn机器学习包&#xff0c;写两行代码&#xff0c;调调参数就能跑起来&#xff0c;看似方便&#xff0c;实则有时不利于个人能力发展&#xff0c;要知道现在公司需要的算法工程师&#xff0c;不仅仅只是会调参&#x…

这款Chrome 插件,使浏览器页面快速滑动到最底部和最顶部,并且还能...

前言 前几日我在使用谷歌浏览器&#xff0c;也就是chrome的时候&#xff0c;浏览一个内容很长的页面&#xff0c;由于页面上的内容有前后关联&#xff0c;所以我必须不停地切换到上面和下面。这非常不方便。使我非常抓狂。后来&#xff0c;我灵机一动&#xff0c;去谷歌浏览器…

汉诺塔问题代码分享及思路分享(c基础)

可以先自己尝试&#xff0c;只要看见过递归即可写。&#xff08;我自己是&#xff09;希望能自己尝试出来。 两种方法迭代比递归快很多.(不发代码的原因是想让你自己动手) 1 递归 2 迭代 猜数游戏是自己写的第一个有互动的程序。对我很有意义。 我绑定资源了的&#xff0c;大…