Python批量合并多个PDF

安装pymupdf

python 复制代码
pip install pymupdf

合并PDF文件

合并两个PDF

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

plain 复制代码
# append complete doc2 to the end of doc1
doc1.insert_pdf(doc2)
python 复制代码
import fitz  # PyMuPDF

def 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

python 复制代码
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. 利用磁盘而非内存
    • 可以采用文件缓存方式,将中间文件写入磁盘。合并完成后,删除不再需要的中间文件。

示例代码

python 复制代码
def merge_two_pdf(pdf1_path: str, pdf2_path: str, output_pdf):
    """
    1、合并pdf1和pdf2输出到output_pdf
    2、删除临时文件
    """
    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 = 0
    while 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 += 1
            else:
                merged_files.append(input_files[i])
        input_files = merged_files
    # Save the final merged PDF
    merge_two_pdf(input_files[0], input_files[1], output_file)
相关推荐
小熊美家熊猫系统5 分钟前
电子合同技术实现与合规实践
java·开发语言·分布式
云烟成雨TD6 分钟前
Agent Scope Java 2.x 系列【3】从零构建 ReActAgent
java·人工智能·agent
一只叫煤球的猫15 分钟前
ThreadForge 源码解读二:一个 Task 从 submit 到完成,内部到底发生了什么?
java·后端·面试
python-码博士27 分钟前
PyTorch 从零实现 Flow Matching:训练、采样、画图一条龙
人工智能·pytorch·python
阿狸猿1 小时前
论微服务架构及其应用
java·微服务·架构
王小王-1231 小时前
基于Python的车联网数据聚合与可视化分析平台设计与实现
python·车联网·新能源汽车·车联网聚合分析
程序员黑豆1 小时前
Java中的字符串【AI全栈开发】
java
叫我:松哥1 小时前
基于Flask框架的校园二手书籍交易平台,注重校园场景的特殊需求,通过学号认证保障用户真实性
后端·python·sqlite·flask·bootstrap
namexingyun2 小时前
开源前端生态如何成为 AI UI 生成的“燃料“:shadcn/ui、Tailwind CSS、Storybook 技术价值全解剖
java·前端·人工智能·python·ui·开源·ai编程
通信仿真爱好者2 小时前
第【17】期--考虑硬件损伤和不完美CSI的RIS-MISO系统的深度强化学习联合优化-python完整代码+参考文献
python·深度强化学习·ris