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

Водяные знаки — понятный и ненавязчивый способ пометить владельца файла. Они помогают защитить документы, добавить описательную информацию (например, автор, время генерации, статус) и сохранить исходные данные при распространении.
Ниже показан простой и надёжный пример на Python: сначала генерируем страницу с водяным знаком (ReportLab), затем накладываем её на каждую страницу целевого PDF (PyPDF2).
Для чего нужны ReportLab и PyPDF2
- ReportLab — библиотека для генерации PDF из кода: текст, графика, диаграммы, точные размеры страниц. Используется для создания страницы с водяным знаком.
- PyPDF2 — библиотека для чтения и изменения существующих PDF: объединение, разделение, поворот, штампование/водяные знаки.
Важно: установите библиотеки в окружение перед запуском скриптов.
pip install reportlab PyPDF2Примечание: в разных версиях PyPDF2 названия классов и API могут различаться. Если у вас возникнут ошибки, проверьте документацию своей версии PyPDF2.
Как работает подход — кратко
- Создаём одностраничный PDF (например, watermark.pdf) с нужным текстом/ориентацией/непрозрачностью.
- Открываем исходный PDF и файл водяного знака.
- Для каждой страницы исходного 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 может содержать шаблон для нескольких ориентаций/позиции, но проще — один шаблон и сливать его с каждой страницей.
Дополнительные возможности и улучшения
- Добавление метаданных: при генерации страницы водяного знака можно включать дату, имя пользователя, статус (DRAFT/CONFIDENTIAL) и прочее.
- Имёнование выходного файла: включайте временную метку или суффикс, чтобы не перезаписывать оригинал.
- Шаблоны с логотипом: вместо текста можно рисовать растровый или векторный логотип поверх страницы — ReportLab поддерживает изображения и PDF-ссылки.
- Парралельная обработка: для больших наборов документов полезно распараллелить процесс по файлам.
Совместимость и обновления
Важно: API PyPDF2 эволюционировал. В некоторых новых версиях используются альтернативные имена (например, PdfReader/PdfWriter). Если вы получаете ImportError или атрибутные ошибки, проверьте версию библиотеки и адаптируйте импорт соответствующим образом.
Когда этот способ не подойдёт
- Если PDF защищён паролем — сначала нужно снять или корректно передать права (если у вас есть разрешение).
- Если в документе сложная прозрачность/слои, mergePage может вести себя иначе; в этом случае рассмотрите инструменты, которые работают с отдельными слоями (OCG) или преобразование страниц в изображения и повторная сборка.
- Для массовых операций в корпоративной среде лучше использовать специализированные серверные инструменты с очередями задач и мониторингом.
Альтернативные подходы
- Командная строка Ghostscript — мощный инструмент для пакетной обработки PDF (требует знаний команд и опций).
- pdfrw + reportlab — комбинация для тех, кто требует тонкой интеграции с ReportLab, но pdfrw проще в некоторых задачах.
- Конвертация страниц в изображения и наложение водяного знака через Pillow, затем сборка в PDF — подходит, если требуется точный контроль над растровой обработкой.
Мини-процесс (5 шагов)
- Проверить права на исходные файлы.
- Сгенерировать watermark.pdf с нужной разметкой.
- Протестировать наложение на 1–3 страницы с разными размерами.
- Запустить пакетную обработку и проверить результаты.
- Сделать резервную копию оригиналов и вести журнал операций.
Чек-лист по ролям
Автор документа:
- Не содержит конфиденциальных данных в тексте водяного знака
- Выбрана подходящая непрозрачность
Ревьюер / Менеджер:
- Проверил видимость водяного знака на основных устройствах и при печати
- Подтвердил корректность форматирования
Системный администратор:
- Настроил окружение и зависимости
- Обеспечил бэкап исходников
Критерии приёмки
- Водяной знак виден на 100% страниц выбранного PDF.
- Оригинальные страницы не потеряли содержимое и форматирование.
- Результирующий PDF открывается штатными средствами (Adobe Reader, браузер).
Тесты и сценарии приёмки
Тест 1: Одностраничный документ — водяной знак в центре, сохранённый файл открывается и содержит водяной знак.
Тест 2: Многостраничный документ — водяной знак присутствует на всех страницах, метаинформация сохранена.
Тест 3: Документ с защитой — скрипт должен корректно сообщить об ошибке и не модифицировать файл.
Безопасность и конфиденциальность
- Обрабатывайте конфиденциальные документы локально, если это необходимо. Не отправляйте файлы в онлайн-сервисы без согласия владельца.
- Не включайте в водяной знак персональные данные, если документ будет публичным.
Инструменты для удаления водяных знаков и предупреждение
Если водяной знак был наложен по ошибке и у вас есть право на удаление, можно воспользоваться онлайн- или локальными инструментами. Примеры: Soda PDF, Microsoft Word (при конвертации), Google Docs, PDF Zorro для PDF; для изображений — Wondershare PixCut, Inpaint, Aiseesoft; для видео — Apowersoft, 123apps, BeeCut.
Внимание: не удаляйте чужие водяные знаки без разрешения владельца — это может нарушить авторские права.
Частые ошибки и как их избежать
- Ошибка: “PdfFileReader has no attribute getPage” — проверьте версию PyPDF2 и используйте корректные классы PdfReader/PdfWriter, если это требуется.
- Ошибка: водяной знак слишком большой/маленький — скорректируйте координаты и размер шрифта.
- Ошибка: потеря качества изображений — избегайте превращения страниц в растровые, если важна векторная четкость.
Шаблон журнала операций
| Время | Файл исходный | Файл выходной | Текст водяного знака | Оператор | Примечания |
|---|---|---|---|---|---|
| 2025-01-10 09:12 | contract.pdf | contract_watermarked.pdf | Confidential — ACME | ivan | Успешно |
Краткое резюме
Водяной знак — простой и эффективный способ маркировать PDF. Комбинация ReportLab + PyPDF2 даёт гибкость для создания кастомных водяных знаков и массовой обработки документов. Следуйте чек-листам, тестируйте на примерах и уважайте права владельцев контента.
Важно: адаптируйте код под используемые версии библиотек и требования вашей организации.
Похожие материалы
Автоматическая отправка писем в Gmail
Отслеживание трафика в Windows 10
Как организовать библиотеку Kindle — пошагово
Как увеличить громкость на Chromebook
Делиться местоположением в Google Maps