Skip to main content

GroupDocs.Watermark for Python via .NET - Add, search and remove watermarks in documents

Project description

banner

PyPI PyPI - Python Version

Product Page | Docs | Demos | API Reference | Blog | Free Support | Temporary License

GroupDocs.Watermark for Python via .NET is a document-watermarking API for adding, searching, and removing text and image watermarks. Stamp configurable text or image watermarks — with control over position, size, opacity, rotation, alignment, and tiling — then save the result back to the original format; search for and remove existing watermarks (including ones added by other tools) across PDF, Word, Excel, PowerPoint, Visio, email, and image formats through one unified API, with no MS Office or other external software required.

Get Started

pip install groupdocs-watermark-net
from groupdocs.watermark import Watermarker
from groupdocs.watermark.watermarks import TextWatermark, Font

with Watermarker("document.pdf") as watermarker:
    watermark = TextWatermark("CONFIDENTIAL", Font("Arial", 36.0))
    watermark.opacity = 0.5
    watermarker.add(watermark)
    watermarker.save("watermarked.pdf")

How It Works

The package is a self-contained Python wheel that bundles the embedded .NET runtime and every native dependency (SkiaSharp, Aspose.Drawing) needed to load, watermark, render, and save documents. No external software installation is required — just pip install and start watermarking. The wheel works across Python 3.5 – 3.14 on Windows, Linux, and macOS (Intel + Apple Silicon).

Features

  • Text watermarks — configurable font, foreground/background color, opacity, rotation, and alignment.
  • Image watermarks — from a file or an in-memory stream, with scaling, opacity, and positioning.
  • Positioning & sizing — absolute coordinates, horizontal/vertical alignment, margins, scale-to-parent sizing, and rotation.
  • Tiling — repeat a watermark across the page with configurable tile lines and spacing.
  • Search — find existing watermarks by text, image, color, size, or rotation, combined with AND/OR/NOT criteria.
  • Remove — delete found watermarks individually or in batches and save the cleaned document.
  • Document introspection — read format, page count, and per-page dimensions before processing.
  • Previews — render pages to PNG/JPEG/BMP images via a page-stream callback.
  • Cross-Platform — Windows x64/x86, Linux x64, macOS x64/ARM64.

Common Tasks

  • Stamp a "CONFIDENTIAL" text watermark across every page of a PDF and save it back
  • Add a semi-transparent logo image watermark to a Word or PowerPoint document
  • Tile a watermark diagonally across a page
  • Search a document for an existing watermark by its text and remove it
  • Read a document's format and page count before processing
  • Render watermarked pages to images for a preview UI

Supported File Formats

For a complete list, see supported formats.

Category Formats
Word Processing DOC, DOCX, DOCM, DOT, DOTX, RTF, ODT, OTT
Spreadsheets XLS, XLSX, XLSM, XLSB, ODS
Presentations PPT, PPTX, PPTM, PPS, PPSX, ODP
Fixed-Layout PDF
Diagrams VSD, VSDX, VSS, VST, VDX
Email MSG, EML, EMLX
Images BMP, JPG, JPEG, PNG, GIF, TIFF, WEBP

Examples

Add a text watermark

from groupdocs.watermark import Watermarker
from groupdocs.watermark.watermarks import TextWatermark, Font, Color

with Watermarker("document.pdf") as watermarker:
    watermark = TextWatermark("CONFIDENTIAL", Font("Arial", 48))
    watermark.foreground_color = Color.red
    watermark.opacity = 0.5
    watermark.rotate_angle = -45
    watermarker.add(watermark)
    watermarker.save("watermarked.pdf")

Add an image watermark

from groupdocs.watermark import Watermarker
from groupdocs.watermark.watermarks import ImageWatermark, SizingType

with Watermarker("document.docx") as watermarker:
    watermark = ImageWatermark("logo.png")
    watermark.sizing_type = SizingType.SCALE_TO_PARENT_DIMENSIONS
    watermark.scale_factor = 0.5
    watermark.opacity = 0.7
    watermarker.add(watermark)
    watermarker.save("watermarked.docx")

Tile a watermark across the page

from groupdocs.watermark import Watermarker
from groupdocs.watermark.watermarks import TextWatermark, Font, TileOptions, TileType

with Watermarker("document.pdf") as watermarker:
    watermark = TextWatermark("DRAFT", Font("Arial", 19))
    tile = TileOptions()
    tile.tile_type = TileType.STRAIGHT           # repeat across the page
    watermark.tile_options = tile
    watermark.opacity = 0.3
    watermarker.add(watermark)
    watermarker.save("tiled.pdf")

Search for and remove a watermark

from groupdocs.watermark import Watermarker
from groupdocs.watermark.search.search_criteria import TextSearchCriteria

with Watermarker("watermarked.pdf") as watermarker:
    criteria = TextSearchCriteria("CONFIDENTIAL")     # also: ImageSearchCriteria(...)
    possible = watermarker.search(criteria)
    print("found:", len(possible))
    for wm in possible:
        print(wm.text, wm.x, wm.y)
    watermarker.remove(possible)                       # remove the whole collection
    watermarker.save("clean.pdf")

Read document info

from groupdocs.watermark import Watermarker

with Watermarker("document.pdf") as watermarker:
    info = watermarker.get_document_info()
    print("format:", info.file_type)
    print("pages:", info.page_count)

Watermark from / to a binary stream

import io
from groupdocs.watermark import Watermarker
from groupdocs.watermark.watermarks import TextWatermark, Font

with open("document.pdf", "rb") as src:
    with Watermarker(src) as watermarker:
        watermarker.add(TextWatermark("CONFIDENTIAL", Font("Arial", 36)))
        buffer = io.BytesIO()
        watermarker.save(buffer)          # BytesIO is updated after save
        data = buffer.getvalue()

AI Agent & LLM Friendly

This package is designed for seamless integration with AI agents, LLMs, and automated code generation tools.

  • AGENTS.md in the package — AI coding assistants (Claude Code, Cursor, GitHub Copilot) auto-discover the API surface, usage patterns, and troubleshooting tips from the installed package
  • MCP server — connect your AI tool to GroupDocs documentation for on-demand API lookups:
    { "mcpServers": { "groupdocs-docs": { "url": "https://docs.groupdocs.com/mcp" } } }
    
  • Machine-readable docs — full documentation available as plain text for RAG and LLM context:
    • Single file: https://docs.groupdocs.com/watermark/python-net/llms-full.txt
    • Per page: append .md to any docs URL

Evaluation Mode

The API works without a license in evaluation mode, with these limitations:

  • Output is restricted: PDF output carries an evaluation watermark and other formats show an equivalent evaluation mark.
  • A page/document-count cap applies to processed documents.

To remove these limitations, apply a license or request a temporary license:

from groupdocs.watermark import License
License().set_license("path/to/license.lic")

Or set the environment variable (auto-applied at import):

export GROUPDOCS_LIC_PATH="path/to/license.lic"

Troubleshooting

Issue Platform Fix
Evaluation watermark on output All Apply a license — License().set_license(...) or set GROUPDOCS_LIC_PATH
System.Drawing.Common is not supported Linux/macOS apt-get install libgdiplus (Linux) or brew install mono-libgdiplus (macOS)
The type initializer for 'Gdip' threw an exception macOS brew install mono-libgdiplus
Garbled text / missing fonts in output Linux apt-get install ttf-mscorefonts-installer fontconfig && fc-cache -f
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT errors Linux Do NOT set this variable. ICU must be available.

System Requirements

  • Python 3.5 - 3.14
  • Windows x64/x86, Linux x64, macOS x64/ARM64
  • No additional software required

More Resources

Also available for other platforms: .NET | Java | Node.js


Product Page | Docs | Demos | API Reference | Blog | Free Support | Temporary License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

groupdocs_watermark_net-26.6.0-py3-none-win_amd64.whl (134.4 MB view details)

Uploaded Python 3Windows x86-64

groupdocs_watermark_net-26.6.0-py3-none-macosx_11_0_arm64.whl (133.5 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

groupdocs_watermark_net-26.6.0-py3-none-macosx_10_14_x86_64.whl (135.7 MB view details)

Uploaded Python 3macOS 10.14+ x86-64

File details

Details for the file groupdocs_watermark_net-26.6.0-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for groupdocs_watermark_net-26.6.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 f6bc02e8ca7c7ddc268ad9b84131f3f580ed19625fd2b609c1bba38fc0630b60
MD5 85c7badf8c32634a9bf0f15ecb7c799f
BLAKE2b-256 9d02dc7ccf8bd7b056e4bc6db29ac95c57c64b5cb9fa4a9fcf54600749dba177

See more details on using hashes here.

File details

Details for the file groupdocs_watermark_net-26.6.0-py3-none-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for groupdocs_watermark_net-26.6.0-py3-none-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0384e897c3f9992dc174e8dc6254ec8ffedc35861fc7fb1b70bb9caae0d0a5fc
MD5 cb4e53c036cadc27627fac530a3e9ab6
BLAKE2b-256 f5435320ea6ddf60b5615f1dccbd3d9d8bd9a17713a3943d28142b2285ba4f38

See more details on using hashes here.

File details

Details for the file groupdocs_watermark_net-26.6.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for groupdocs_watermark_net-26.6.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cf0eb88e6562b155e6427a42fdd8ef845f63ef68e2b92cd950f35549cd75f773
MD5 2e502ea4b159e24e841d80555c8030ef
BLAKE2b-256 94538988ec06b8b7b2654543cf7f6a3a69fcd487ee42c68537cc5bd3b842b8ce

See more details on using hashes here.

File details

Details for the file groupdocs_watermark_net-26.6.0-py3-none-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for groupdocs_watermark_net-26.6.0-py3-none-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 ad0bc7ca00cbf22c85a33e614b6fc8a5cac7798fadeb5a61ef0aea21331aced0
MD5 09e3b92ebb5fc34d8979f179bcf3544c
BLAKE2b-256 09ff6f95bf238367c47b54fa2c40eba1a2fc500f65994e237f1800f2eefa5d81

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page