Visible watermarks can be implemented in two fundamentally different ways in PDF, with different durability and accessibility characteristics.
Content stream overlays — Adding watermark text or graphics directly to the page content stream (as a Form XObject stamped onto each page). This is the most durable approach: the watermark becomes part of the page content just like any other text or graphic. It cannot be removed without modifying the page content stream, which requires a PDF editor or library. Implementation in PyMuPDF:
page.insert_text() or
page.show_pdf_page() with a watermark PDF as overlay. In iText: stamp a PdfFormXObject onto each page.
Annotation-based watermarks — Adding the watermark as a Watermark annotation (
/Subtype /Watermark). PDF's Watermark annotation type is specifically designed for this purpose: it allows the watermark to be positioned relative to the page with a fixed appearance but stored separately from the content stream. Annotation-based watermarks can be hidden or deleted in PDF viewers with annotation management tools (e.g., Acrobat's annotation panels). They are easier to add and remove than content stream watermarks but less durable.
PDF/A compatibility — Watermarks in PDF/A documents must meet PDF/A requirements: any text in the watermark must use embedded fonts. Annotation-based watermarks using
/Subtype /Watermark are permitted in PDF/A-2 and later. However, if the watermark is added post-archiving, the resulting document needs re-validation.
Print vs. screen watermarks — Using
Optional Content Groups (layers), a watermark can be configured to show on screen but not print, or to print but not show on screen. This is useful for "DRAFT" watermarks that should be visible during review but suppressed for the final print. Implement by placing the watermark in an OCG with a
/Usage /Print /PrintState /OFF entry.