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

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

7 min read Программирование Обновлено 11 Apr 2026
Водяные знаки в PDF с Python
Водяные знаки в PDF с Python

Водяной знак на документе, показанном на электронном ридере

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

Что вы узнаете в этой статье

  • Как сгенерировать PDF-водяной знак с ReportLab
  • Как наложить этот водяной знак на существующий PDF с помощью PyPDF2
  • Альтернативные подходы и ситуации, в которых метод может не сработать
  • Контрольные списки и тесты для приёмки
  • Рекомендации по безопасности и конфиденциальности

Что такое модуль ReportLab

ReportLab — это популярная библиотека для программной генерации PDF в Python. Она предоставляет низкоуровневый интерфейс (canvas) для рисования текста, фигур и графики на странице, а также утилиты для работы с единицами измерения и цветами.

Короткое определение: canvas — объект, на котором вы «рисуете» элементы страницы (текст, линии, изображения) с координатами в системе ReportLab.

Установка:

pip install reportlab

Что такое модуль PyPDF2

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

Установка:

pip install PyPDF2

Важно: экосистема PDF в Python включает несколько форков и альтернатив (например, pypdf, pdfrw). Перед развёртыванием проверьте совместимость API в используемой версии.

Общая идея метода

  1. Создать одностраничный PDF, содержащий только водяной знак (шаблон). Обычно это прозрачный или полупрозрачный текст, повернутый под углом.
  2. Открыть исходный PDF и шаблон водяного знака; для каждой страницы исходного документа наложить страницу с водяным знаком.
  3. Сохранить результат в новый файл.

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

Ключевые элементы ReportLab, которые используются

  • canvas.Canvas — создаёт область рисования для страницы PDF;
  • units.inch — удобная единица измерения (дюймы);
  • colors — включает стандартные цвета и позволяет задавать прозрачность;
  • pagesize.A4 — размер страницы.

Система координат: точка (0,0) находится в нижнем левом углу страницы; translate() позволяет сместить начало координат.

Пример функций (оригинальные блоки кода сохранены)

Ниже оставлены исходные блоки кода без изменений. Их можно скопировать и запустить в своём окружении.

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

Функция для генерации одностраничного файла watermark.pdf:

def makeWatermark():  
    text = input("Enter the watermark text here:")  
    pdf = canvas.Canvas("watermark.pdf", pagesize=A4)  
    pdf.translate(inch, inch)  
    pdf.setFillColor(colors.grey, alpha=0.6)  
    pdf.setFont("Helvetica", 50)  
    pdf.rotate(45)  
    pdf.drawCentredString(400, 100, text)  
    pdf.save()

Пример вывода — как выглядит сгенерированный шаблон водяного знака:

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

Функция для наложения водяного знака на страницы PDF:

def makepdf():  
    pdf_file = input("PDF file: ")  
    watermark = 'watermark.pdf'  
    merged = "Watermarked.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_page = watermark_pdf.getPage(0)

Наложение по страницам и запись результата:

        output = PdfFileWriter()  
  
        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)

И вызов функций:

makeWatermark()  
makepdf()

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

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

Пояснения и лучшие практики

  • Прозрачность: в ReportLab можно задать alpha от 0 до 1. Если водяной знак слишком бледный, увеличьте alpha; если перекрывает важный текст — уменьшите.
  • Поворот и позиционирование: поворот 45° хорошо работает для диагональных водяных знаков; используйте drawCentredString или drawString с явными координатами.
  • Шрифты: используйте стандартные шрифты (Helvetica) для совместимости. Для нестандартных шрифтов установите и зарегистрируйте TTF-файл.
  • Несколько шаблонов: можно генерировать разные watermark.pdf (например, “DRAFT”, “CONFIDENTIAL”) и выбирать нужный.

Когда метод может не сработать (ограничения)

  • Сканированные PDF, где каждая страница — растровое изображение: наложение векторного шаблона всё равно будет видно, но текст на изображениях нельзя сделать «прозрачным» или распознаваемым без OCR.
  • Зашифрованные или защищённые PDF: если документ защищён паролем или имеет ограничения на модификацию, PyPDF2 не сможет открыть/записать файл без ключа.
  • Сложные слои и аннотации: в некоторых PDF водяные знаки могут оказаться ниже слоя аннотаций или печати; в таких случаях может потребоваться более сложная обработка структуры страницы.
  • Совместимость с печатью: если печать идёт через другие профили CMYK, цвета и прозрачность могут выглядеть иначе.

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

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

  • pypdf (форк PyPDF2): активная экосистема, иногда с иной номенклатурой API; полезно, если PyPDF2 устарел в вашей установке.
  • pdfrw: легковесная библиотека для некоторой манипуляции PDF; лучше интегрируется с ReportLab в некоторых пайплайнах.
  • Ghostscript / qpdf: утилиты командной строки для мощной пакетной обработки PDF (склейка, оптимизация, шифрование).
  • ImageMagick: для водяных знаков, если преобразовать страницы в изображения и обратно (теряет векторную чёткость).
  • Использование платных сервисов/SDK: если нужна защита и управление правами доступа на уровне предприятия.

Выбор зависит от требований: скорость, сохранение векторной графики, поддержка прозрачности и шифрования.

Мини‑методология: шаг за шагом

  1. Определите требования к водяному знаку: текст, шрифт, уровень прозрачности, угол, страницы (все/только первые/только последние).
  2. Сгенерируйте шаблон водяного знака (одна страница). Проверьте визуально на тестовом PDF.
  3. Напишите или обновите скрипт, который применяет шаблон ко всем страницам.
  4. Запустите тесты: на 1-, 2-, 10-, 100‑страничных документах; на зашифрованных и сканированных примерах.
  5. Зафиксируйте критерии приёмки и интегрируйте в CI/скрипты развертывания.

Контрольные списки по ролям

Для автора/разработчика:

  • Генерируется watermark.pdf с корректной прозрачностью и положением текста
  • Скрипт корректно обрабатывает все страницы исходного PDF
  • Результат сохраняется под ожидаемым именем

Для редактора/контент-менеджера:

  • Водяной знак соответствует корпоративным требованиям (текст, логотип)
  • Водяной знак не скрывает важный контент

Для системного администратора:

  • Установлены нужные библиотеки в виртуальном окружении
  • Скрипт запускается в пакетном режиме (cron/CI)
  • Сделаны резервные копии исходных файлов

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

  • Водяной знак отображается на каждой странице целевого PDF.
  • Водяной знак читаем, но не мешает основному содержимому (проверено на выборке документов).
  • Скрипт не повреждает структуру PDF (шрифты, изображения остаются рабочими).
  • Скорость применения адекватна объёму (например, обработка 100 страниц за приемлемое время).

Тестовые случаи и приёмочные сценарии

  • Небольшой документ (1 страница) — ожидаемый результат: водяной знак присутствует и хорошо виден.
  • Многостраничный документ (50+ страниц) — проверить стабильность и корректность позиционирования.
  • Сканированный PDF — убедиться, что водяной знак корректно отображается поверх растрового слоя.
  • Зашифрованный PDF — проверка на отказ и корректная обработка ошибок.

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

  • Не включайте в водяной знак чувствительные персональные данные (имена, номера, идентификаторы) без правовой оценки. Водяной знак может распространяться вместе с документом.
  • Водяной знак не является DRM: его можно удалить. Если вам нужна защита от копирования, рассматривайте шифрование, управление правами доступа и подписывание документов.
  • При хранении и обработке PDF с персональными данными соблюдайте требования GDPR/локального законодательства.

Совместимость и миграция

  • Перед обновлением библиотек проверьте тестовый прогон на выборке документов. API у форков PyPDF2/pypdf может отличаться в деталях.
  • Если используете нестандартные шрифты, убедитесь, что они доступны в окружении, где выполняется скрипт.

Что делать, если нужно удалить водяной знак

Удаление водяного знака — технически возможно и делается инструментами редактирования PDF (онлайн-сервисы, редакторы). Не удаляйте чужие водяные знаки без разрешения — это может нарушать авторские права и договоры.

Инструменты для удаления (общий список): Soda PDF, Microsoft Word, Google Docs, PDF Zorro для PDF; Inpaint, Wondershare PixCut и пр. для изображений; различные онлайн‑сервисы для видео. Используйте их ответственно и только для собственных файлов или с разрешения правообладателя.

Шаблон чек-листа для внедрения скрипта (таблица)

  • Подготовка окружения: pip install reportlab PyPDF2
  • Тестовая генерация watermark.pdf — пройдена
  • Применение к тестовому PDF — пройдено
  • Автоматизация (cron/CI) — настроена
  • Резервное копирование — выполнено

Короткая памятка (cheat sheet)

  • Генерируйте один шаблон водяного знака и применяйте к множеству файлов
  • Используйте полупрозрачные цвета (alpha 0.3–0.7)
  • Тестируйте на сканированных и защищённых файлах
  • Документируйте выбранные стандарты водяных знаков в проекте

Пример объявлений и социальных превью

OG title: Водяные знаки для PDF с Python OG description: Простая инструкция: создайте шаблон водяного знака с ReportLab и наложите его на PDF через PyPDF2.

Короткая версия для анонса (100–200 слов):

Добавление водяных знаков к PDF помогает пометить статус документа и отследить его происхождение. В статье показано, как сгенерировать одностраничный шаблон водяного знака с ReportLab и применить его к любому PDF с помощью PyPDF2. Приведены готовые функции, примеры, альтернативные подходы, чек-листы для разработчиков и рекомендации по безопасности.

Итог — что важно запомнить

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

Ключевые действия: подготовьте шаблон, автоматизируйте применение, протестируйте и зафиксируйте критерии приёмки.

1‑строчная глоссарная заметка:

  • Водяной знак — видимый или полупрозрачный текст/графика, нанесённый поверх страницы для маркировки и идентификации документа.

Спасибо — теперь вы готовы добавить простой и эффективный водяной знак к своим PDF при помощи Python.

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

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

Обновление драйверов NVIDIA — быстро и безопасно
Драйверы

Обновление драйверов NVIDIA — быстро и безопасно

Drummer в GarageBand — полный практический гид
Музыка

Drummer в GarageBand — полный практический гид

Копирование, перемещение и удаление файлов в PowerShell
PowerShell

Копирование, перемещение и удаление файлов в PowerShell

Настройка чувствительности тачпада в Windows 11
Windows

Настройка чувствительности тачпада в Windows 11

EmuDeck на Steam Deck: установка и настройка
Эмуляция

EmuDeck на Steam Deck: установка и настройка

Лучшие приложения для открытия таблиц на мобильном
Продуктивность

Лучшие приложения для открытия таблиц на мобильном