首页 >后端开发 >Python教程 >使用 Python 递归合并 PDF

使用 Python 递归合并 PDF

Susan Sarandon
Susan Sarandon原创
2024-12-29 21:16:14416浏览

Merge PDFs Recursively Using Python

介绍

将多个 PDF 文件合并到一个文档中可能是一项繁琐的任务,尤其是当文件分布在多个目录中时。使用 Python,这项任务变得无缝且自动化。在本教程中,我们将使用 PyPDF2 创建一个命令行界面 (CLI) 工具,然后单击合并目录(包括其子目录)中的所有 PDF 文件,同时排除 .venv 和 .git 等特定目录。


先决条件

开始之前,请确保您具备以下条件:

  1. Python:版本 3.7 或更高版本。
  2. pip:Python 的包管理器。
  3. 所需的库

    • 安装 PyPDF2 进行 PDF 操作:
     pip install PyPDF2
    
  • 安装单击以创建 CLI:

     pip install click
    

代码演练

这是我们的 CLI 工具的完整代码:

import click
from pathlib import Path
from PyPDF2 import PdfMerger
import os

EXCLUDED_DIRS = {".venv", ".git"}

@click.command()
@click.argument("directory", type=click.Path(exists=True, file_okay=False, path_type=Path))
@click.argument("output_file", type=click.Path(dir_okay=False, writable=True, path_type=Path))
def merge_pdfs(directory: Path, output_file: Path):
    """
    Merge all PDF files from DIRECTORY and its subdirectories into OUTPUT_FILE,
    excluding specified directories like .venv and .git.
    """
    # Initialize the PdfMerger
    merger = PdfMerger()

    # Walk through the directory tree, including the base directory
    for root, dirs, files in os.walk(directory):
        # Exclude specific directories
        dirs[:] = [d for d in dirs if d not in EXCLUDED_DIRS]

        # Convert the root to a Path object
        current_dir = Path(root)

        click.echo(f"Processing directory: {current_dir}")

        # Collect PDF files in the current directory
        pdf_files = sorted(current_dir.glob("*.pdf"))

        if not pdf_files:
            click.echo(f"No PDF files found in {current_dir}")
            continue

        # Add PDF files from the current directory
        for pdf in pdf_files:
            click.echo(f"Adding {pdf}...")
            merger.append(str(pdf))

    # Write the merged output file
    output_file.parent.mkdir(parents=True, exist_ok=True)
    merger.write(str(output_file))
    merger.close()

    click.echo(f"All PDFs merged into {output_file}")

if __name__ == "__main__":
    merge_pdfs()

它是如何运作的

  1. 目录遍历:

    • os.walk()函数递归遍历指定目录。
    • 使用目录过滤器排除特定目录(例如 .venv、.git)。
  2. PDF 文件集合:

    • current_dir.glob("*.pdf") 收集当前目录下的所有 PDF 文件。
  3. 合并 PDF:

    • PyPDF2 中的 PdfMerger 用于附加所有 PDF。
    • 合并后的输出写入指定文件。
  4. CLI 集成:

    • 点击库可以轻松提供目录和输出文件路径作为参数。

运行工具

将代码保存到文件中,例如 merge_pdfs.py。从终端运行它,如下所示:

python merge_pdfs.py /path/to/directory /path/to/output.pdf

例子

假设您有以下目录结构:

/documents
├── file1.pdf
├── subdir1
│   ├── file2.pdf
├── subdir2
│   ├── file3.pdf
├── .git
│   ├── ignored_file.pdf

按如下方式运行该工具:

python merge_pdfs.py /documents /merged.pdf

这会将 file1.pdf、file2.pdf 和 file3.pdf 合并为 merged.pdf,跳过 .git。


特征

  1. 递归合并:

    • 该工具自动包含所有子目录中的 PDF。
  2. 目录排除:

    • 排除 .venv 和 .git 等目录以避免不相关的文件。
  3. 排序合并:

    • 确保 PDF 按排序顺序添加以获得一致的结果。
  4. CLI 简单性:

    • 为用户提供直观的界面来指定输入和输出路径。

注意事项和限制

  1. 大文件

    • 合并大量 PDF 可能会消耗大量内存。首先使用较小的数据集进行测试。
  2. PDF 兼容性:

    • 确保所有输入的 PDF 有效且未损坏。
  3. 自定义排除

    • 修改 EXCLUDED_DIRS 设置以根据需要排除其他目录。

结论

本教程演示如何使用 Python 自动合并目录结构中的 PDF。提供的 CLI 工具非常灵活,可以适应更复杂的工作流程。尝试一下,让我们知道它如何为您服务!

编码愉快! ?

以上是使用 Python 递归合并 PDF的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn