PDF文件中的相邻页面合并成一页,例如将第1页和第2页合并,第3页和第4页合并

PDF页面合并工具

这个工具可以将PDF文件中的相邻页面合并成一页,例如将第1页和第2页合并,第3页和第4页合并,以此类推。

功能

  • 自动检测PDF文件中的页面数量
  • 将相邻的页面合并成一页
  • 处理奇数页数的PDF文件(最后一页单独保留)
  • 生成新的PDF文件,不修改原始文件

使用方法

  1. 确保已安装Python环境
  2. 安装PyMuPDF库:pip install PyMuPDF
  3. 将要处理的PDF文件重命名为1.pdf,并放在与脚本相同的目录下
  4. 运行脚本:python pdf_hb.py
  5. 合并后的PDF文件将保存为merged_output.pdf

注意事项

  • 程序会自动处理奇数页数的PDF文件,最后一页将保持原样
  • 合并后的页面宽度为原相邻两页的宽度之和,高度为两页中较高的那一页
  • 如果遇到程序运行问题,请使用Python的完整路径来运行,例如:
    C:\Users\AI\AppData\Local\Programs\Python\Python312\python.exe pdf_hb.py

文件说明

  • pdf_hb.py: 主程序文件

  • 1.pdf: 输入的PDF文件(需要用户提供的原始文件)

  • merged_output.pdf: 输出的合并后PDF文件(程序生成)

    import os
    import traceback
    import sys
    import fitz # PyMuPDF

    def merge_pdf_pages(input_path, output_path):
    """
    将PDF文件的相邻页面合并:第1页和第2页,第3页和第4页,以此类推

    复制代码
      参数:
      input_path: 输入PDF文件的路径
      output_path: 输出PDF文件的路径
      """
      try:
          # 打开输入PDF文件
          doc = fitz.open(input_path)
          
          # 创建新的PDF文档
          new_doc = fitz.open()
          
          # 获取总页数
          total_pages = len(doc)
          print(f"PDF总页数: {total_pages}")
          
          # 遍历每一对页面
          for i in range(0, total_pages, 2):
              if i + 1 < total_pages:
                  # 获取当前页和下一页
                  page1 = doc.load_page(i)
                  page2 = doc.load_page(i + 1)
                  
                  # 获取页面尺寸
                  rect1 = page1.rect
                  rect2 = page2.rect
                  
                  # 创建一个新的页面,宽度为两页之和,高度为两页中较高的
                  new_width = rect1.width + rect2.width
                  new_height = max(rect1.height, rect2.height)
                  
                  # 创建新页面
                  new_page = new_doc.new_page(width=new_width, height=new_height)
                  
                  # 将第一页内容插入到新页面的左侧
                  new_page.show_pdf_page(rect1, doc, i)
                  
                  # 将第二页内容插入到新页面的右侧
                  rect2_right = fitz.Rect(rect1.width, 0, rect1.width + rect2.width, rect2.height)
                  new_page.show_pdf_page(rect2_right, doc, i + 1)
              else:
                  # 如果总页数为奇数,最后一页单独处理
                  page = doc.load_page(i)
                  new_doc.insert_pdf(doc, from_page=i, to_page=i)
          
          # 保存输出PDF文件
          # 如果输出文件已存在,先尝试删除
          if os.path.exists(output_path):
              try:
                  os.remove(output_path)
              except Exception as e:
                  print(f"警告:无法删除已存在的输出文件 {output_path}: {str(e)}")
                  # 使用临时文件名
                  output_path = output_path.replace(".pdf", "_new.pdf")
                  print(f"将使用临时文件名: {output_path}")
          
          new_doc.save(output_path)
          new_doc.close()
          doc.close()
          
          print(f"成功合并PDF页面,输出文件: {output_path}")
      except Exception as e:
          print(f"合并PDF时发生错误: {str(e)}")
          print("详细错误信息:")
          traceback.print_exc()
          return False
      return True

    def main():
    # 输入和输出文件路径
    input_pdf = "3.pdf" # 您的PDF文件名
    output_pdf = "3_new.pdf" # 输出文件名

    复制代码
      # 检查输入文件是否存在
      if not os.path.exists(input_pdf):
          print(f"错误:输入文件 '{input_pdf}' 不存在")
          return
      
      print(f"开始处理PDF文件: {input_pdf}")
      # 执行合并操作
      success = merge_pdf_pages(input_pdf, output_pdf)
      if success:
          print(f"PDF页面合并完成!输出文件: {output_pdf}")
      else:
          print("PDF页面合并失败!")

    if name == "main":
    try:
    main()
    except Exception as e:
    print(f"程序执行时发生未捕获的错误: {str(e)}")
    traceback.print_exc()

相关推荐
VidDown8 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
蛋蛋的就会顺顺的9 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8269 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡10 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
死磕音视频10 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林10 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne11 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_12 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
pride.li12 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
databook12 小时前
用 Pydantic AI 从零搭建一个能干活的 AI Agent
人工智能·python