Гид по технологиям

Как добавить водяной знак в PDF с помощью Python

5 min read Python Обновлено 20 Dec 2025
Водяной знак в PDF с Python
Водяной знак в PDF с Python

Документ на электронном ридере с наложенным водяным знаком

Водяные знаки — понятный и ненавязчивый способ пометить владельца файла. Они помогают защитить документы, добавить описательную информацию (например, автор, время генерации, статус) и сохранить исходные данные при распространении.

Ниже показан простой и надёжный пример на Python: сначала генерируем страницу с водяным знаком (ReportLab), затем накладываем её на каждую страницу целевого PDF (PyPDF2).

Для чего нужны ReportLab и PyPDF2

  • ReportLab — библиотека для генерации PDF из кода: текст, графика, диаграммы, точные размеры страниц. Используется для создания страницы с водяным знаком.
  • PyPDF2 — библиотека для чтения и изменения существующих PDF: объединение, разделение, поворот, штампование/водяные знаки.

Важно: установите библиотеки в окружение перед запуском скриптов.

pip install reportlab PyPDF2

Примечание: в разных версиях PyPDF2 названия классов и API могут различаться. Если у вас возникнут ошибки, проверьте документацию своей версии PyPDF2.

Как работает подход — кратко

  1. Создаём одностраничный PDF (например, watermark.pdf) с нужным текстом/ориентацией/непрозрачностью.
  2. Открываем исходный PDF и файл водяного знака.
  3. Для каждой страницы исходного PDF накладываем страницу водяного знака и сохраняем результат в новый файл.

Полный пример кода

Ниже — минимальный рабочий пример, переведённый в аккуратный формат. Сохраните как, например, watermark_script.py и запустите в каталоге с обрабатываемыми PDF.

from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from PyPDF2 import PdfFileReader, PdfFileWriter


def makeWatermark():
    # Запрос текста водяного знака у пользователя
    text = input("Введите текст водяного знака: ")

    # Создаём одностраничный PDF с водяным знаком
    pdf = canvas.Canvas("watermark.pdf", pagesize=A4)

    # Сдвигаем систему координат (в ReportLab (0,0) — нижний левый угол)
    pdf.translate(inch, inch)

    # Цвет и прозрачность (alpha 0–1)
    pdf.setFillColor(colors.grey, alpha=0.6)

    # Шрифт и размер
    pdf.setFont("Helvetica", 50)

    # Поворот текста на 45 градусов против часовой стрелки
    pdf.rotate(45)

    # Рисуем отцентрированную строку на координатах (x, y)
    pdf.drawCentredString(400, 100, text)

    # Сохраняем файл watermark.pdf
    pdf.save()


def makepdf():
    # Имя файла для обработки
    pdf_file = input("PDF файл (включая .pdf): ")
    watermark = 'watermark.pdf'
    merged = "Watermarked.pdf"

    # Открываем исходный PDF и файл водяного знака
    with open(pdf_file, "rb") as input_file, open(watermark, "rb") as watermark_file:
        input_pdf = PdfFileReader(input_file)
        watermark_pdf = PdfFileReader(watermark_file)

        # Берём первую (и единственную) страницу из watermark.pdf
        watermark_page = watermark_pdf.getPage(0)

        output = PdfFileWriter()

        # Накладываем watermark_page на каждую страницу исходного PDF
        for i in range(input_pdf.getNumPages()):
            pdf_page = input_pdf.getPage(i)
            pdf_page.mergePage(watermark_page)
            output.addPage(pdf_page)

        # Записываем результат в файл
        with open(merged, "wb") as merged_file:
            output.write(merged_file)


if __name__ == '__main__':
    makeWatermark()
    makepdf()

Параметры и тонкости

  • Координаты и масштаб: в ReportLab единицы в дюймах (мы использовали from reportlab.lib.units import inch). Если нужна другая локализация размеров — используйте точки (pt) или миллиметры и пересчитайте координаты.
  • Прозрачность: параметр alpha управляет видимостью. Для печати часто используют более высокий коэффициент непрозрачности.
  • Шрифты: в примере используется Helvetica. Если надо встроить кастомные шрифты, загрузите их через reportlab.pdfbase.ttfonts.
  • Ориентация: rotate(45) поворачивает на 45°. Можно менять угол и позиционировать текст по сетке.
  • Многостраничные водяные знаки: генерация watermark.pdf может содержать шаблон для нескольких ориентаций/позиции, но проще — один шаблон и сливать его с каждой страницей.

Образец текстового водяного знака на PDF

Дополнительные возможности и улучшения

  • Добавление метаданных: при генерации страницы водяного знака можно включать дату, имя пользователя, статус (DRAFT/CONFIDENTIAL) и прочее.
  • Имёнование выходного файла: включайте временную метку или суффикс, чтобы не перезаписывать оригинал.
  • Шаблоны с логотипом: вместо текста можно рисовать растровый или векторный логотип поверх страницы — ReportLab поддерживает изображения и PDF-ссылки.
  • Парралельная обработка: для больших наборов документов полезно распараллелить процесс по файлам.

Совместимость и обновления

Важно: API PyPDF2 эволюционировал. В некоторых новых версиях используются альтернативные имена (например, PdfReader/PdfWriter). Если вы получаете ImportError или атрибутные ошибки, проверьте версию библиотеки и адаптируйте импорт соответствующим образом.

Когда этот способ не подойдёт

  • Если PDF защищён паролем — сначала нужно снять или корректно передать права (если у вас есть разрешение).
  • Если в документе сложная прозрачность/слои, mergePage может вести себя иначе; в этом случае рассмотрите инструменты, которые работают с отдельными слоями (OCG) или преобразование страниц в изображения и повторная сборка.
  • Для массовых операций в корпоративной среде лучше использовать специализированные серверные инструменты с очередями задач и мониторингом.

Альтернативные подходы

  1. Командная строка Ghostscript — мощный инструмент для пакетной обработки PDF (требует знаний команд и опций).
  2. pdfrw + reportlab — комбинация для тех, кто требует тонкой интеграции с ReportLab, но pdfrw проще в некоторых задачах.
  3. Конвертация страниц в изображения и наложение водяного знака через Pillow, затем сборка в PDF — подходит, если требуется точный контроль над растровой обработкой.

Мини-процесс (5 шагов)

  1. Проверить права на исходные файлы.
  2. Сгенерировать watermark.pdf с нужной разметкой.
  3. Протестировать наложение на 1–3 страницы с разными размерами.
  4. Запустить пакетную обработку и проверить результаты.
  5. Сделать резервную копию оригиналов и вести журнал операций.

Чек-лист по ролям

Автор документа:

  • Не содержит конфиденциальных данных в тексте водяного знака
  • Выбрана подходящая непрозрачность

Ревьюер / Менеджер:

  • Проверил видимость водяного знака на основных устройствах и при печати
  • Подтвердил корректность форматирования

Системный администратор:

  • Настроил окружение и зависимости
  • Обеспечил бэкап исходников

Критерии приёмки

  • Водяной знак виден на 100% страниц выбранного PDF.
  • Оригинальные страницы не потеряли содержимое и форматирование.
  • Результирующий PDF открывается штатными средствами (Adobe Reader, браузер).

Тесты и сценарии приёмки

Тест 1: Одностраничный документ — водяной знак в центре, сохранённый файл открывается и содержит водяной знак.

Тест 2: Многостраничный документ — водяной знак присутствует на всех страницах, метаинформация сохранена.

Тест 3: Документ с защитой — скрипт должен корректно сообщить об ошибке и не модифицировать файл.

Безопасность и конфиденциальность

  • Обрабатывайте конфиденциальные документы локально, если это необходимо. Не отправляйте файлы в онлайн-сервисы без согласия владельца.
  • Не включайте в водяной знак персональные данные, если документ будет публичным.

Инструменты для удаления водяных знаков и предупреждение

Если водяной знак был наложен по ошибке и у вас есть право на удаление, можно воспользоваться онлайн- или локальными инструментами. Примеры: Soda PDF, Microsoft Word (при конвертации), Google Docs, PDF Zorro для PDF; для изображений — Wondershare PixCut, Inpaint, Aiseesoft; для видео — Apowersoft, 123apps, BeeCut.

Внимание: не удаляйте чужие водяные знаки без разрешения владельца — это может нарушить авторские права.

Пример PDF с текстовым водяным знаком

Частые ошибки и как их избежать

  • Ошибка: “PdfFileReader has no attribute getPage” — проверьте версию PyPDF2 и используйте корректные классы PdfReader/PdfWriter, если это требуется.
  • Ошибка: водяной знак слишком большой/маленький — скорректируйте координаты и размер шрифта.
  • Ошибка: потеря качества изображений — избегайте превращения страниц в растровые, если важна векторная четкость.

Шаблон журнала операций

ВремяФайл исходныйФайл выходнойТекст водяного знакаОператорПримечания
2025-01-10 09:12contract.pdfcontract_watermarked.pdfConfidential — ACMEivanУспешно

Краткое резюме

Водяной знак — простой и эффективный способ маркировать PDF. Комбинация ReportLab + PyPDF2 даёт гибкость для создания кастомных водяных знаков и массовой обработки документов. Следуйте чек-листам, тестируйте на примерах и уважайте права владельцев контента.

Важно: адаптируйте код под используемые версии библиотек и требования вашей организации.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Автоматическая отправка писем в Gmail
Электронная почта

Автоматическая отправка писем в Gmail

Отслеживание трафика в Windows 10
Windows 10

Отслеживание трафика в Windows 10

Как организовать библиотеку Kindle — пошагово
Гайды

Как организовать библиотеку Kindle — пошагово

Как увеличить громкость на Chromebook
Руководство

Как увеличить громкость на Chromebook

Делиться местоположением в Google Maps
Руководства

Делиться местоположением в Google Maps

Как приглушить подсветку DualShock 4
PlayStation

Как приглушить подсветку DualShock 4