Использование PdfFileMerger в Python для объединения PDF с одинаковыми именами, но разными номерами

Вопрос или проблема

У меня есть каталог с отдельными PDF-файлами, которые нужно объединить, основываясь на их названии. Каждый отдельный PDF-файл содержит одну страницу. Система именования для каждого файла состоит из строкового имени и номера. Вот как примерно выглядит мой каталог:

A_001.pdf
A_002.pdf
A_003.pdf
B_001.pdf
B_002.pdf
B_003.pdf
B_004.pdf

В основном мне нужен один PDF для A (PDF будет содержать 3 страницы) и один PDF для B (PDF будет содержать 4 страницы). Числа _001 и так далее должны быть номером страницы. Мой текущий Python-скрипт генерирует A.pdf и B.pdf, но включает страницы как из A, так и из B.

import PyPDF2, os
from PyPDF2 import PdfFileReader, PdfFileWriter, PdfFileMerger
from pathlib import Path

single_file_dir = r'Y:\Python\Single_PDFs'
binder_file_dir = r'Y:\Python\Combined_PDFs'

# получить список всех файлов в каталоге с отдельными PDF
single_file_list = []
for file in os.listdir(single_file_dir):
    if file.endswith(".pdf"):
        single_file_list.append(single_file_dir + "\\" + file)

print(single_file_list)

# собрать имена файлов для выходных многостраничных PDF

file_name_list = []
for file in single_file_list:
    name = os.path.basename(file)
    new_name = name[:-8]
    file_name_list.append(new_name)
    unique_file_name_list = list(set(file_name_list))

merger = PdfFileMerger()

print(unique_file_name_list)

# попытаться сопоставить имя входного файла с именем выходного файла
for file in single_file_list:
    for name in unique_file_name_list:
        if name in file:
            merger.append(file)
            merger.write(binder_file_dir + "\\" + name + ".pdf")

Этот скрипт действительно генерирует A.pdf и B.pdf, но оба выходных PDF включают множество дубликатов как отдельных PDF A, так и отдельных PDF B. Моя цель — объединить A_001.pdf, A_002.pdf, A_003.pdf в один многостраничный PDF. То же самое с PDF-сериалами B.

Я думаю, что ваша проблема может быть связана с повторным использованием вашего PDF-объединителя.

Этот код адаптирован из другого скрипта, который я использую для объединения PDF. Дайте мне знать, если он работает для вас.

from collections import defaultdict
from pathlib import Path

from PyPDF2 import PdfMerger

single_file_dir = Path("Y:/") / "Python" / "Single_PDFs"
binder_file_dir = Path("Y:/") / "Python" / "Combined_PDFs"

file_groups: defaultdict[str, list[Path]] = defaultdict(list)
for file in single_file_dir.glob("*.pdf"):
    group = file.name[0]  # Как вы хотите определить группу по имени файла
    file_groups[group].append(file)

for group, files in file_groups.items():
    merger = PdfMerger()
    for file in sorted(files):
        merger.append(file)

    with open(binder_file_dir / f"{group}.pdf", "wb") as binder:
        merger.write(binder)

Примечания:

Мне нравится использовать модуль pathlib, чтобы избежать работы с специфическими для платформы особенностями путей (особенно \‘s на Windows)

Ответ или решение

Конечно! Ниже приведен целостный ответ на ваш вопрос о том, как с помощью PdfFileMerger в Python объединить PDF-файлы с одинаковым именем, но с разными номерами.

Задача

У вас есть каталог, содержащий отдельные PDF-файлы, каждый из которых состоит из одной страницы. Вам нужно объединить эти файлы в один PDF для каждой группы на основе имени файла. Пример структуры ваших имен файлов:

A_001.pdf
A_002.pdf
A_003.pdf
B_001.pdf
B_002.pdf
B_003.pdf
B_004.pdf

Решение

Вы можете использовать библиотеку PyPDF2. Ниже приведен код, который решает вашу задачу. Мы будем группировать файлы по первой букве имени и объединять их в один PDF для каждой группы.

from collections import defaultdict
from pathlib import Path
from PyPDF2 import PdfMerger

# Укажите путь к директориям
single_file_dir = Path("Y:/Python/Single_PDFs")
binder_file_dir = Path("Y:/Python/Combined_PDFs")

# Создаем словарь для группировки файлов по имени
file_groups = defaultdict(list)

# Перемещаемся по всем PDF-файлам в директории
for file in single_file_dir.glob("*.pdf"):
    group = file.name[0]  # Берем первую букву для группировки
    file_groups[group].append(file)

# Создаем объединенные PDF-файлы для каждой группы
for group, files in file_groups.items():
    merger = PdfMerger()  # Создаем новый объект Merge для каждого уникального имени

    # Сортируем файлы перед объединением, чтобы они были в правильном порядке
    for file in sorted(files):
        merger.append(file)

    # Записываем объединенный PDF файл
    with open(binder_file_dir / f"{group}.pdf", "wb") as binder:
        merger.write(binder)

print("Объединение завершено.")

Объяснение кода:

  1. Импорт необходимых библиотек: Мы импортируем defaultdict из collections для группировки файлов, Path из pathlib для работы с путями, и PdfMerger из PyPDF2 для слияния PDF.

  2. Указание директорий: Мы задаем пути к директориям, где находятся исходные и объединенные PDF-файлы.

  3. Группировка файлов: Используя defaultdict, мы группируем файлы по первой букве их имени. Таким образом, все файлы с именами, начинающимися с "A", будет объединены в один PDF, и аналогично для "B".

  4. Объединение PDF-файлов: Мы перебираем каждую группу, создаем новый объект PdfMerger, добавляем отсортированные файлы в него и записываем результат в новый файл.

  5. Вывод сообщения о завершении: После завершения процесса выводим сообщение.

Заключение

Этот скрипт создаст отдельные объединенные PDF-файлы для каждой группы, как вам и нужно. Убедитесь, что у вас установлена библиотека PyPDF2, а также необходимый доступ к директориям. Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...