Как добавить текстовый водяной знак в 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 в используемой версии.
Общая идея метода
- Создать одностраничный PDF, содержащий только водяной знак (шаблон). Обычно это прозрачный или полупрозрачный текст, повернутый под углом.
- Открыть исходный PDF и шаблон водяного знака; для каждой страницы исходного документа наложить страницу с водяным знаком.
- Сохранить результат в новый файл.
Этот подход удобен, потому что шаблон водяного знака можно сгенерировать один раз и затем применить к множеству документов.
Ключевые элементы 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 с текстовым водяным знаком:

Пояснения и лучшие практики
- Прозрачность: в 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: если нужна защита и управление правами доступа на уровне предприятия.
Выбор зависит от требований: скорость, сохранение векторной графики, поддержка прозрачности и шифрования.
Мини‑методология: шаг за шагом
- Определите требования к водяному знаку: текст, шрифт, уровень прозрачности, угол, страницы (все/только первые/только последние).
- Сгенерируйте шаблон водяного знака (одна страница). Проверьте визуально на тестовом PDF.
- Напишите или обновите скрипт, который применяет шаблон ко всем страницам.
- Запустите тесты: на 1-, 2-, 10-, 100‑страничных документах; на зашифрованных и сканированных примерах.
- Зафиксируйте критерии приёмки и интегрируйте в 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.
Похожие материалы
Обновление драйверов NVIDIA — быстро и безопасно
Drummer в GarageBand — полный практический гид
Копирование, перемещение и удаление файлов в PowerShell
Настройка чувствительности тачпада в Windows 11
EmuDeck на Steam Deck: установка и настройка