Оцифровка чертежей и документов формата А3 не представляет сложности, если у вас есть сканер соответствующего размера. Однако что делать, если под рукой лишь стандартное МФУ формата А4?
Формат А3 в два раза больше А4: это два стандартных листа, соединенных по длинной стороне. В результате, чтобы оцифровать А3, приходится сканировать его по частям - левую и правую половинки, а затем как-то их объединять.

Ручная склейка занимает много времени, особенно если документов много. А если тратить время на ручную склейку не хочется? Автоматизация такого процесса избавляет от рутинной работы. Актуально для чертежей и схем.
Что понадобится для выполнения задачи
Для автоматизации склейки PDF-файлов потребуется всего несколько инструментов.
Первым делом понадобится Python — это простой в использовании язык программирования, идеально подходящий для подобных задач.
Для работы с PDF-файлами нам понадобится библиотека PyPDF2. Она позволяет извлекать страницы из PDF, объединять их, изменять порядок и выполнять другие операции.

Чтобы склеить изображения из двух половинок, потребуется библиотека Pillow. С её помощью можно выполнять базовую обработку изображений: изменять размеры, соединять их и сохранять в нужном формате. Эта библиотека будет полезна, если ваши сканы нужно предварительно подогнать по размерам или качеству.
Установка Python
Если Python ещё не установлен на вашем компьютере, скачайте его с официального сайта. Выберите последнюю стабильную версию для вашей операционной системы и установите её, следуя инструкциям. Во время установки не забудьте отметить пункт "Добавить Python в PATH", чтобы команды работали из терминала.
Установка библиотек
После установки Python, нужно добавить необходимые библиотеки. Сделать это просто: откройте терминал (или командную строку) и выполните следующие команды:
pip install PyPDF2 Pillow
Эти команды загрузят и установят всё необходимое. Теперь вы полностью готовы к написанию и запуску скрипта для автоматической склейки ваших PDF-документов.
Подготовка исходного файла
Перед началом автоматической склейки важно правильно подготовить исходный PDF-файл. Он должен содержать сканы двух половинок листа формата А4 каждая, расположенные в виде отдельных страниц. Это нужно для того, чтобы программа смогла корректно объединить их в одну страницу.
Важно, чтобы страницы PDF-файла следовали в правильном порядке:
Первая страница — это левая половина листа А3.
Вторая страница — правая половина.

Каждый лист А3 будет представлен двумя страницами. Если в вашем документе несколько листов, их половинки должны чередоваться так же: сначала левая часть первого листа, потом правая, затем левая часть второго листа, и так далее.
Эта структура поможет программе автоматически склеить половинки в правильном порядке.
Как работает процесс склейки
Автоматизация склейки документов А3 формата включает извлечение страниц, обработку изображений и преобразование в PDF. Вот как это работает:
Извлечение страниц из PDF
Каждая страница PDF, представляющая половину листа А3, сначала извлекается. Этот процесс позволяет получить изображения страниц, которые затем можно обработать.
Преобразование страниц в изображения
С помощью библиотеки Pillow страницы преобразуются в изображения. Это необходимо для удобной манипуляции — например, склеивания или вращения.
Объединение изображений
Изображения, соответствующие левой и правой половинам листа, склеиваются по горизонтали. Этот этап объединяет две части в единый файл, точно воспроизводящий лист А3.
Конвертация обратно в PDF
Склеенные изображения снова преобразуются в PDF с помощью PyPDF2. Это позволяет сохранить формат документа и сделать его удобным для дальнейшего использования.

Сам скрипт
Вот и сам скрипт: он автоматически склеивает половинки страниц формата A4 в один файл формата A3. Может использоваться на Windows, macOS и Linux:
# pip install PyPDF2 pillow # Подробное описание: https://habr.com/ru/articles/875846/ import sys sys.stdout.reconfigure(encoding='utf-8') import os from PyPDF2 import PdfReader, PdfWriter from PIL import Image # Выводим общую информацию о начале обработки PDF print("[INFO] Начало обработки PDF...\n") # Имя входного PDF-файла input_pdf_file = "input.pdf" # Имя выходного PDF-файла output_pdf_file = "output.pdf" # Углы поворота для левой и правой частей (в градусах) # Укажите поворот для каждой части, например, 0, 90, 180 или 270 left_rotation = 0 right_rotation = 180 # Создадим временную папку для сохранения изображений output_images_dir = "temp_images" os.makedirs(output_images_dir, exist_ok=True) # Считываем PDF и выгружаем каждую страницу как отдельное изображение reader = PdfReader(input_pdf_file) page_images = [] print(f"[INFO] Извлечение изображений из {input_pdf_file}...") for page_number, page in enumerate(reader.pages): # Получаем раскодированные данные изображений x_object = page.get("/Resources").get("/XObject").get_object() for obj in x_object: if x_object[obj].get("/Subtype") == "/Image": data = x_object[obj].get_data() image_path = os.path.join(output_images_dir, f"page_{page_number + 1}.png") with open(image_path, "wb") as image_file: image_file.write(data) page_images.append(image_path) print(f"[INFO] Изображение страницы {page_number + 1} сохранено: {image_path}") # Обрабатываем и склеиваем по две страницы print("[INFO] Склеивание изображений в формат A3...") glued_images = [] for i in range(0, len(page_images), 2): left_image_path = page_images[i] right_image_path = page_images[i + 1] if i + 1 < len(page_images) else None # Загружаем изображения left_image = Image.open(left_image_path) left_image = left_image.rotate(left_rotation, expand=True) # Применяем поворот левой части if right_image_path: right_image = Image.open(right_image_path) right_image = right_image.rotate(right_rotation, expand=True) # Применяем поворот правой части # Создаем новое изображение для A3 склеенного total_width = left_image.width + right_image.width max_height = max(left_image.height, right_image.height) new_image = Image.new("RGB", (total_width, max_height)) # Вставляем левую и правую части new_image.paste(left_image, (0, 0)) new_image.paste(right_image, (left_image.width, 0)) glued_image_path = os.path.join(output_images_dir, f"glued_page_{i // 2 + 1}.png") new_image.save(glued_image_path) glued_images.append(glued_image_path) print(f"[INFO] Готово: склеенное изображение {glued_image_path}") # Конвертируем склеенные страницы обратно в PDF print("[INFO] Конвертация склеенных изображений обратно в PDF...") writer = PdfWriter() for glued_image_path in glued_images: image = Image.open(glued_image_path) pdf_page_path = glued_image_path.replace(".png", ".pdf") image.save(pdf_page_path, "PDF", resolution=300.0) with open(pdf_page_path, "rb") as pdf_page_file: writer.add_page(PdfReader(pdf_page_file).pages[0]) # Сохраняем итоговый PDF with open(output_pdf_file, "wb") as output_pdf: writer.write(output_pdf) print(f"[INFO] Обработка завершена. Итоговый PDF сохранен как {output_pdf_file}")
Результат:

Заключение
После завершения обработки откройте итоговый PDF и убедитесь, что страницы формата А3 выглядят ровно и соединены.
Скрипт можно доработать для решения более сложных задач. Например:
Склейка нестандартных форматов.
Использование компьютерного зрения для того, чтобы исключить небольшие повороты каждого из листов.
Автоматизация процесса оцифровки больших форматов избавляет от рутины и экономит время, особенно при работе с чертежами, планами и схемами.
Не забывайте сохранять резервные копии исходных файлов — это защитит вас от потери данных.
Автор: Михаил Шардин
🔗 Моя онлайн-визитка
📢 Telegram «Умный Дом Инвестора»
24 февраля 2025 г.
