Как сканировать документы А3 формата, если под рукой только сканер А4 формата

от автора

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

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

Ручная склейка занимает много времени, особенно если документов много. А если тратить время на ручную склейку не хочется? Автоматизация такого процесса избавляет от рутинной работы. Актуально для чертежей и схем.

Что понадобится для выполнения задачи

Для автоматизации склейки PDF-файлов потребуется всего несколько инструментов.

Первым делом понадобится Python — это простой в использовании язык программирования, идеально подходящий для подобных задач.

Для работы с PDF-файлами нам понадобится библиотека PyPDF2. Она позволяет извлекать страницы из PDF, объединять их, изменять порядок и выполнять другие операции.

Источник красивой картинки: dev.to

Источник красивой картинки: dev.to

Чтобы склеить изображения из двух половинок, потребуется библиотека Pillow. С её помощью можно выполнять базовую обработку изображений: изменять размеры, соединять их и сохранять в нужном формате. Эта библиотека будет полезна, если ваши сканы нужно предварительно подогнать по размерам или качеству.

Установка Python

Если Python ещё не установлен на вашем компьютере, скачайте его с официального сайта. Выберите последнюю стабильную версию для вашей операционной системы и установите её, следуя инструкциям. Во время установки не забудьте отметить пункт «Добавить Python в PATH», чтобы команды работали из терминала.

Установка библиотек

После установки Python, нужно добавить необходимые библиотеки. Сделать это просто: откройте терминал (или командную строку) и выполните следующие команды:

pip install PyPDF2 Pillow  

Эти команды загрузят и установят всё необходимое. Теперь вы полностью готовы к написанию и запуску скрипта для автоматической склейки ваших PDF-документов.

Подготовка исходного файла

Перед началом автоматической склейки важно правильно подготовить исходный PDF-файл. Он должен содержать сканы двух половинок листа формата А4 каждая, расположенные в виде отдельных страниц. Это нужно для того, чтобы программа смогла корректно объединить их в одну страницу.

Важно, чтобы страницы PDF-файла следовали в правильном порядке:

  1. Первая страница — это левая половина листа А3.

  2. Вторая страница — правая половина.

Каждый лист А3 будет представлен двумя страницами. Если в вашем документе несколько листов, их половинки должны чередоваться так же: сначала левая часть первого листа, потом правая, затем левая часть второго листа, и так далее.

Эта структура поможет программе автоматически склеить половинки в правильном порядке.

Как работает процесс склейки

Автоматизация склейки документов А3 формата включает извлечение страниц, обработку изображений и преобразование в PDF. Вот как это работает:

  1. Извлечение страниц из PDF

Каждая страница PDF, представляющая половину листа А3, сначала извлекается. Этот процесс позволяет получить изображения страниц, которые затем можно обработать.

  1. Преобразование страниц в изображения

С помощью библиотеки Pillow страницы преобразуются в изображения. Это необходимо для удобной манипуляции — например, склеивания или вращения.

  1. Объединение изображений

Изображения, соответствующие левой и правой половинам листа, склеиваются по горизонтали. Этот этап объединяет две части в единый файл, точно воспроизводящий лист А3.

  1. Конвертация обратно в 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 г.


ссылка на оригинал статьи https://habr.com/ru/articles/875846/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *