Вопрос или проблема
У меня есть каталог с отдельными 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("Объединение завершено.")
Объяснение кода:
-
Импорт необходимых библиотек: Мы импортируем
defaultdict
изcollections
для группировки файлов,Path
изpathlib
для работы с путями, иPdfMerger
изPyPDF2
для слияния PDF. -
Указание директорий: Мы задаем пути к директориям, где находятся исходные и объединенные PDF-файлы.
-
Группировка файлов: Используя
defaultdict
, мы группируем файлы по первой букве их имени. Таким образом, все файлы с именами, начинающимися с "A", будет объединены в один PDF, и аналогично для "B". -
Объединение PDF-файлов: Мы перебираем каждую группу, создаем новый объект
PdfMerger
, добавляем отсортированные файлы в него и записываем результат в новый файл. -
Вывод сообщения о завершении: После завершения процесса выводим сообщение.
Заключение
Этот скрипт создаст отдельные объединенные PDF-файлы для каждой группы, как вам и нужно. Убедитесь, что у вас установлена библиотека PyPDF2
, а также необходимый доступ к директориям. Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться!