Оцифровка чертежей и документов формата А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 г.