Python对PDF文件的合并操作

在处理 PDF 文件时,合并多个 PDF 文件为一个单一文件或者将某个单一文件插入某个PDF文件是一个常见的需求。Python 提供了多种库来实现这一功能,其中 PyPDF2 是一个非常流行的选择。该库提供了简单易用的接口,包括 merge() 方法,可以将多个 PDF 文件合并成一个文件。

基本概念

  • PDF 合并: 将两个或更多的 PDF 文件组合成一个新的 PDF 文件,保留所有原始文件的页面和内容。
  • PDF插入:将某个PDF文件插入到PDF文件的指定位置,最终形成一个新的文件。
  • merge() 方法: 在 PyPDF2 中,此方法用于将一个 PDF 文件的内容追加到另一个 PDF 文件中。
  • 环境准备

    首先,确保已经安装了 PyPDF2 库。如果尚未安装,可以通过以下命令安装:

    pip install PyPDF2
    

    使用示例(1)

    下面是使用 PyPDF2merge() 方法合并 PDF 文件的基本示例:

    例如某文件夹(本例是practice_files)中有merge1.pdf、merge2.pdf、merge3.pdf这样3个PDF。如下所示:

    利用PdfMerger实例通过.append()方法将merge1.pdf和merge2.pdf拼接到一起。将拼接后的PDF保存为home目录中的concatenated.pdf文件。

    from pathlib import Path
    from PyPDF2 import PdfMerger
    
    # 定义 PDF 文件所在的目录路径,使用当前工作目录下的 'practice_files' 文件夹
    pdf_dirs = Path.cwd() / 'practice_files'
    
    # 使用 glob 方法查找以 'mer' 开头并以 '.pdf' 结尾的所有 PDF 文件
    pdf_files = list(pdf_dirs.glob('mer*.pdf'))  
    
    # 将文件列表按数字顺序排列
    pdf_files.sort() 
    
    # 创建一个 PdfMerger 对象,用于合并 PDF 文件
    pdf_merger = PdfMerger()
    
    # 遍历排序后的 PDF 文件列表,最多合并前两个文件
    for pdf_file in pdf_files[:2]:  # 只处理前两个文件
        pdf_merger.append(pdf_file)  # 将每个 PDF 文件添加到合并器中
    
    # 在用户主目录下创建一个新的 PDF 文件 'concatenated.pdf',以写入模式打开
    with Path.home().joinpath('concatenated.pdf').open('wb') as f:
        pdf_merger.write(f)  # 将合并后的内容写入新文件
    
    

    运行结果如下:

    代码解释

    1. 导入模块:
    2. from pathlib import Path: 导入 Path 类,用于处理文件路径。
    3. from PyPDF2 import PdfMerger: 导入 PdfMerger 类,用于合并 PDF 文件。
    4. 定义 PDF 文件目录:
    5. pdf_dirs = Path.cwd() / 'practice_files': 使用 Path.cwd() 获取当前工作目录,并与 'practice_files' 连接,构建包含待合并 PDF 文件的目录路径。
    6. 查找 PDF 文件:
    7. pdf_files = list(pdf_dirs.glob('mer*.pdf')): 使用 glob 方法查找该目录下所有以 'mer' 开头且以 .pdf 结尾的文件。返回的是一个生成器,所以需要将其转换为列表。
    8. 排序文件:
    9. pdf_files.sort(): 对找到的 PDF 文件进行排序。这会按字母顺序排列,但如果文件名中包含数字(如 mer1.pdf, mer10.pdf),则可能不符合预期的数值顺序。如果需要按数值顺序进行更复杂的排序,可以使用自定义排序函数。
    10. 创建 PDF 合并器:
    11. pdf_merger = PdfMerger(): 实例化一个 PdfMerger 对象,以便在后续步骤中合并 PDF 文件。
    12. 合并文件:
    13. for pdf_file in pdf_files[:2]: 迭代排序后的 PDF 文件列表,但仅限于前两个文件。
    14. pdf_merger.append(pdf_file): 将当前 PDF 文件添加到 PdfMerger 对象中供合并。
    15. 写入合并结果:
    16. with Path.home().joinpath('concatenated.pdf').open('wb') as f: 创建一个新的文件路径,位于用户的主目录中,文件名为 concatenated.pdf,以二进制写入模式打开。
    17. pdf_merger.write(f): 将合并后的 PDF 内容写入到打开的文件对象 f 中。

    小结

    这段代码的整体功能是从当前工作目录下的 practice_files 文件夹中查找以 'mer' 开头的 PDF 文件,按顺序排序,然后合并前两个文件,并将合并后的结果保存为 concatenated.pdf 到用户的主目录下。

    使用示例(2)

    创建一个新的PdfMerger实例,使用.merge()方法将merge3.pdf插入到示例(1)中的concatenated.pdf文件的两页之间。将新的文件保存为home目录中的merged.pdf,最终应该得到一个有3页的PDF。第1页数字1,第2页数字2,第3页数字3。

    代码如下:

    from pathlib import Path
    from PyPDF2 import PdfMerger
    
    # 创建 PdfMerger 对象,用于合并 PDF 文件
    pdf_merger = PdfMerger()
    
    # 定义合并后的 PDF 文件路径,位置在用户的主目录下,文件名为 'concatenated.pdf'
    pdf_path = Path.home().joinpath('concatenated.pdf')
    
    # 获取当前工作目录下所有以 'mer' 开头的 PDF 文件,并将其转换为列表
    pdf_lst = list(Path.cwd().glob('mer*.pdf'))
    # 对列表进行排序
    pdf_lst.sort()
    
    # 将已存在的 'concatenated.pdf' 文件添加到合并器中
    pdf_merger.append(str(pdf_path))
    
    # 在现有的合并结果后,将 pdf_lst 列表中的第三个 PDF 文件(索引为 2)合并进来
    pdf_merger.merge(1, pdf_lst[2])
    
    # 在当前工作目录下创建一个新的 PDF 文件 'mer1.pdf',以写入模式打开
    with Path.cwd().joinpath('mer1.pdf').open('wb') as f:
        # 将合并后的内容写入到新创建的文件中
        pdf_merger.write(f)
    
    

    运行结果如下:

    代码解释

    1. 导入模块:
    2. from pathlib import Path: 导入 Path 类,以便处理路径。
    3. from PyPDF2 import PdfMerger: 导入 PdfMerger 类,用于合并 PDF 文件。
    4. 创建合并器:
    5. pdf_merger = PdfMerger(): 实例化一个 PdfMerger 对象,准备对 PDF 文件进行合并操作。
    6. 定义输出路径:
    7. pdf_path = Path.home().joinpath('concatenated.pdf'): 创建一个包含合并后 PDF 文件路径的对象,指向用户主目录下的 concatenated.pdf
    8. 查找 PDF 文件:
    9. pdf_lst = list(Path.cwd().glob('mer*.pdf')): 使用 glob 方法获取当前工作目录下所有以 'mer' 开头的 PDF 文件,并将其转换为列表。
    10. pdf_lst.sort(): 对找到的 PDF 文件按字母顺序进行排序。
    11. 添加文件到合并器:
    12. pdf_merger.append(str(pdf_path)): 将之前定义的 concatenated.pdf 文件路径添加到 PDF 合并器中。由于该文件可能已经存在,这一行的作用可能是将其作为已有的合并基础。
    13. 合并另一个 PDF 文件:
    14. pdf_merger.merge(1, pdf_lst[2]): 将 pdf_lst 列表中的第三个 PDF 文件(由于索引从零开始,所以是 pdf_lst[2])合并到第一个位置之后(位置索引为 1)。这意味着合并操作将在已经存在的内容之后添加新的页面。
    15. 写入新的合并文件:
    16. with Path.cwd().joinpath('mer1.pdf').open('wb') as f: 在当前工作目录下创建一个名为 mer1.pdf 的新 PDF 文件,并以二进制写入模式打开它。
    17. pdf_merger.write(f): 将合并后的 PDF 内容写入到新创建的 mer1.pdf 文件中。

    小结

    此段代码实现的功能是:

    1. 查找当前工作目录下所有以 'mer' 开头的 PDF 文件,并按字母顺序排列。
    2. 将用户主目录下的 concatenated.pdf 文件添加到 PDF 合并器中。
    3. 从先前获得的列表中合并第三个 PDF 文件(pdf_lst[2]),插入到合并的内容后面。
    4. 最后将合并的结果保存为 mer1.pdf 到当前工作目录。

    需要注意的是,在执行 merge() 方法时,合并的顺序和目标插入位置 (1) 可能会影响最终生成的 PDF 文件的内容顺序。

    注意事项

  • 合并的 PDF 文件必须存在,并且路径需正确。
  • 合并时可以选择合并特定的页面(如第 n 页)或者合并整个文件。
  • 合并后的文件通常会包含所有添加的页面,并按顺序排列。
  • 使用 PyPDF2 库的 merge() 操作可以方便快捷地将多个 PDF 文件合并为一个文件。此功能在文档处理、报告生成等工作中十分实用。通过简单的代码,就可以实现复杂的 PDF 文件操作,为开发者节省大量时间与精力。

    欢迎点赞、关注、转发!!!

    作者:Bruce_xiaowei

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python对PDF文件的合并操作

    发表回复