PDF Watermark
Add a text watermark (DRAFT, CONFIDENTIAL, your name…) to every page of a PDF. Color, size, opacity, rotation, position — all configurable.
PDF Watermark
Position
How to watermark a PDF
Add your PDF
Drag your file onto the dropzone or click to choose. The watermark will be applied to every page.
Type the watermark text
Common choices: CONFIDENTIAL, DRAFT, COPY, SAMPLE, NOT FOR DISTRIBUTION, or your name/company for a personal stamp. Up to 200 characters.
Choose position
The Diagonal preset draws the text at −45°, starting half its width to the left of the page centre and running down and to the right, so long text reaches toward the bottom edge instead of straddling the middle. The 3×3 grid picks a fixed anchor (top-left, bottom-center, etc.) with optional rotation.
Fine-tune colour, size, opacity
Default is a 72pt grey watermark at 25% opacity — visible but doesn't overpower content. Pick any colour with the swatch or hex code. Slide opacity to make it bolder or fainter. Margin controls how far from the page edge fixed-position watermarks sit.
Apply and download
Click Apply watermark and download. The output saves as {original}-watermarked.pdf with the watermark drawn over every page. The original content stays selectable and searchable underneath, and links, bookmarks and form fields survive because the tool edits the document you loaded rather than rebuilding it. The Producer field is rewritten to "RECATOOLS PDF Watermark" and the modification date is set to now.
PDF watermarks — visible stamps, semitransparent intent
A PDF watermark is a layer of text drawn on top of every page with a level of transparency that lets the underlying content remain readable. The watermark text travels with the document — it's part of the PDF, not a viewer overlay — so anyone opening the file in any reader sees the same stamp. The pages aren't re-rendered; the watermark is just additional drawing operations appended after the existing page content stream.
Watermark vs redaction vs encryption
It's worth being precise about what a watermark actually does. A watermark is a visible label intended for human readers — "this is a draft" or "this is confidential." It doesn't prevent anyone from reading the document, screenshotting it, or extracting the text. Redaction is the removal of specific content from the document. Encryption is access control — preventing the document from being opened without a password. Watermarking is the lightest-touch of the three: it signals intent without restricting access.
Watermarks are honour-system markers. They work on people who would respect "draft, do not circulate" anyway. For anything stronger, use access control plus redaction — not a label.
Content stream, not annotation
PDF does define a watermark annotation subtype (ISO 32000-2 §12.5.6.22) — a separate object a reader can hide, flatten or delete along with the comments. This tool does not use it. It appends the text to each page's content stream, which is why the stamp behaves like body text: it prints, it survives a flatten, and no viewer setting turns it off. The trade-off is that it also cannot be removed without editing the content stream, so keep an unstamped copy of anything you watermark.
What this tool does — and what it doesn't
This tool adds a text watermark across every page with control over text, colour, font size, opacity, rotation and position, and it reads each page's own /Rotate value so the stamp lands the right way up on scanned or landscape pages. What it does not do: image or logo watermarks; different watermarks on different pages (split the file with the PDF Splitter, watermark each part, then recombine with the PDF Merger); non-Latin text, because the built-in Helvetica Bold is limited to the WinAnsi character set; encrypted files, which pdf-lib cannot decrypt; or removing an existing watermark, which would mean recovering page bytes a flattened file no longer holds.
Where this stamp is written, what it costs in bytes, and why it breaks PDF/A
The stamp is appended to each page's content stream after the existing drawing operations, so it paints over the page rather than under it. Nothing beneath is altered or removed.
PDF does have a watermark object: annotation subtype /Watermark, ISO 32000-2 §12.5.6.22. This tool deliberately does not use it — an annotation can be hidden or deleted in a reader, and content-stream text cannot.
Transparency comes from a graphics-state dictionary: pdf-lib registers an /ExtGState with ca (fill alpha) set to your opacity and references it before drawing. The default here is 0.25.
The diagonal preset rotates about the text's start point, not its middle. On A4 the 72pt word "CONFIDENTIAL" is 536pt wide, so it begins about 30pt from the left edge, just below mid-height, and runs down to roughly 6pt above the bottom edge — a diagonal band, not a centred one.
Watermarks survive merging: combining two stamped PDFs keeps each page's own stamp. Split, watermark, then merge if you only want the stamp on part of a document.
The watermark text must be encodable in WinAnsi (Latin-1). Feed it 機密 or 기밀 and pdf-lib refuses, naming the character it cannot write; the tool shows that message rather than silently dropping the glyph.
Watermarks are not access control. They deter a reader who was going to cooperate anyway; anyone who isn't can screenshot, extract the text, or strip the drawing operations. Use encryption and redaction for the rest.
This output is not PDF/A. ISO 19005-1 clause 6.3.4 requires every font used for rendering to be embedded, and the standard-14 Helvetica Bold written here carries no font program. A PDF/A input stops conforming once it is stamped.
That non-embedded font is also why the stamp is cheap: the whole font entry is four keys — Type, Subtype, BaseFont, Encoding — and every reader supplies the glyphs itself.
Measured on a 50-page A4 file: 12,263 bytes before, 24,440 after — about 244 bytes per stamped page. A pdf-lib round trip with no watermark at all changed the size by zero bytes.
FAQ
-
No. pdf-lib 1.17.1 runs in your browser and is served from this domain. The PDF is read into memory, stamped in memory, and handed to the browser as a blob download. The tool's code contains no
fetch,XMLHttpRequestor form submission at all — open DevTools → Network and watch when you click Apply. -
Not reliably. Once a watermark is drawn into the content stream, it's just another set of drawing operations alongside the original content. Removing it would require manually editing each page's content stream and you can't recover what was beneath. Keep an un-watermarked copy of every document you watermark.
-
Yes. The watermark is drawn on top of the existing content and the tool edits the document you loaded rather than rebuilding it, so the text, links, bookmarks and form fields all survive and stay searchable and selectable. Two things do change: the Producer string becomes "RECATOOLS PDF Watermark" and the modification date is set to the moment you clicked Apply.
-
In front. The text is appended at the end of each page's content stream, so it is the last thing painted. The default 25% fill alpha, set through an
/ExtGStatedictionary, keeps whatever is underneath readable through it. There is no "behind the content" option — placing the stamp under the page would mean rewriting the whole stream rather than appending to it. -
Not in this tool — every page gets the same stamp. For a subset, use the PDF Splitter to separate the pages you want, watermark that file, and recombine with the PDF Merger. Merging preserves each page's own stamp, so the result is a single document watermarked only where you wanted.
-
No — this tool draws text only. An image stamp is a different operation: the picture has to be embedded as an XObject, scaled against each page's media box and given its own transparency group, and none of that is wired up here.
-
Because the stamp uses Helvetica Bold, one of the fourteen fonts every PDF reader supplies, and its WinAnsi encoding covers Latin-1 only. Ask for 機密 and pdf-lib stops with
WinAnsi cannot encode "機", which the tool shows you verbatim. Vietnamese with full diacritics fails the same way. There is no workaround inside this tool: a CJK stamp needs a real font file embedded in the output, which is what the size and simplicity of this version trades away. -
No. ISO 19005-1 clause 6.3.4 requires the font program of every font used for rendering to be embedded in the file, and the only exemption is for text drawn invisibly in rendering mode 3 — which a watermark, by definition, is not. The Helvetica Bold this tool writes is a reference to a standard font with no embedded program, so a PDF/A input stops validating the moment it is stamped. If the archival copy has to conform, stamp a working copy and keep the conforming original.
-
No. pdf-lib has no decryption support of any kind; its documentation says so and warns that loading an encrypted file anyway "may fail, or have unexpected results". Decrypt the file first in a reader that has the password, then stamp the decrypted copy.
-
Two likely reasons. Some PDFs carry a non-zero /Rotate value (90°, 180°, 270°) in the page dictionary, common in scans; this tool reads that value and maps your chosen anchor back through it so the stamp lands the right way up, but a page with an unusual rotation can still come out off-axis. The other is the diagonal preset, which rotates the text about its starting point rather than its middle — long text therefore trails down and to the right of the page centre instead of straddling it. Shorten the text, drop the font size, or pick a fixed anchor from the grid.
-
No — the stamp is always Helvetica Bold, one of the fourteen standard fonts a PDF reader is required to supply. Referencing it instead of embedding a font file is what keeps the added weight to a couple of hundred bytes per page, and it is also what limits the text to Latin-1 and stops the output conforming to PDF/A. Embedding a font would fix both and cost tens to hundreds of kilobytes; this version takes the other side of that trade.
-
No. Watermarks are visual labels, not security controls. They signal intent ("this is confidential, please treat it that way") but anyone with intent to ignore the watermark can — by screenshotting, extracting the text, or using a different tool to remove the watermark. For actual access control, use PDF encryption (password protection).
-
Yes — pdf-lib is plain JavaScript and runs in mobile Safari and Chrome on Android, and the position grid keeps its 3×3 touch targets on a narrow screen. Speed depends on your device and the size of the file, and because the whole document is held in memory a very large PDF can exhaust a phone's tab before it finishes. If a big file stalls, do it on a desktop.
Method & sources
How it computes
Loads the PDF with pdf-lib 1.17.1 in the browser and appends the watermark to every page's content stream with drawText: Helvetica Bold at the chosen size, opacity carried by an /ExtGState fill-alpha entry, and each page's own /Rotate value folded into the rotation so the stamp lands upright on rotated scans. The stamp is page content, not a /Watermark annotation (ISO 32000-2 §12.5.6.22), so no viewer setting hides it and no flatten removes it. Saved as {name}-watermarked.pdf.
What this tool implements
- The watermark is drawn as content, not as annotation subtype /Watermark — a deliberate choice: an annotation can be hidden, flattened away or deleted in a reader, content-stream text cannot.
- Opacity is a graphics-state parameter: pdf-lib registers an /ExtGState dictionary with ca (fill alpha) and CA (stroke alpha) set to the slider value, 0.25 by default, and references it before the text operator.
- Text is Helvetica Bold from the standard 14, referenced with WinAnsiEncoding and NO embedded font program. Two consequences are stated on the page: the text must be Latin-1 (CJK and full Vietnamese diacritics are rejected by name), and the output cannot conform to PDF/A, because ISO 19005-1 clause 6.3.4 requires the font program of every rendered font to be embedded and exempts only text drawn in rendering mode 3.
- The document is edited in place rather than rebuilt, so links, bookmarks, the AcroForm dictionary and the outline all survive; the Producer string is overwritten with 'RECATOOLS PDF Watermark' and the modification date set to the time of the click.
- Every page gets the same stamp — there is no page range. Selective watermarking is a split, stamp, merge sequence, and merging preserves each page's own stamp.
- Encrypted input is not supported: the file is loaded with encryption ignored, but pdf-lib's own documentation states this does not decrypt the document and that results 'may fail, or have unexpected results'. The page tells the reader to decrypt first.
Sources
- ISO 32000-2:2020. Document management — Portable document format — Part 2: PDF 2.0 — §12.5.6.22 watermark annotations, §11.6.6 and §8.4.5 graphics state / constant alpha (ca, CA), §9.6.2.2 standard 14 fonts. https://www.iso.org/standard/75839.html
- ISO 32000-1:2008 (PDF 1.7), full text as published by Adobe — Table 169 annotation subtypes, §12.5.6.22 Watermark, §9.6.2.2 and Annex D standard fonts, §8.4.5 ExtGState. https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/PDF…
- ISO 19005-1:2005. Document management — Electronic document file format for long-term preservation — Part 1: Use of PDF 1.4 (PDF/A-1) — clause 6.3.4, font programs for all fonts used within a conforming file shall be embedded, except fonts used exclusively with text rendering mode 3. Clause text as encoded in the reference validator's PDF/A-1b profile: https://raw.githubusercontent.com/veraPDF/veraPDF-validation-prof…
- Hopding A. pdf-lib v1.17.1 (6 November 2021) — PDFPage.drawText options, maybeEmbedGraphicsState, StandardFonts, and the README 'Encryption Handling' section. https://github.com/Hopding/pdf-lib/releases/tag/v1.17.1 and https://pdf-lib.js.org/docs/api/classes/pdfdocument
What can make this go out of date
- none at runtime — pdf-lib 1.17.1 is a vendored copy served from this domain; a release that added font embedding or decryption would change what the page can promise about CJK text and PDF/A.
Pick up where you left off
Stored only in this browser — never sent to our servers.