utilime

Small tools that finish the job.

Add a watermark to a PDF

Drag a word across the page, set how faint it should be, and mark every page or a range of them.

Drop a file hereor click to choose · it stays on your device

How it works

A watermark is a claim about a copy. It says that a document is a draft, or that it was issued to one named recipient, or that reuse was not invited. Each of those works by being read, and marking a copy per recipient is the version with teeth: when a document turns up where it should not be, the mark on it names which copy went astray, and someone who knows the mark is there thinks twice.

What it does not do is prevent anything. A mark drawn into a page is a handful of drawing instructions sitting among the page's other drawing instructions, and anybody willing to open the file in an editor can take them out again. Read the result as a label rather than a lock, and do not hand over a document whose contents you cannot afford to lose.

Transparency is a graphics state

Nothing in PDF makes a piece of text 20 per cent opaque. Alpha lives in the graphics state: a graphics state parameter dictionary carries `ca` for non-stroking operations and `CA` for stroking ones, per ISO 32000-1 table 58, and the `gs` operator installs that dictionary before anything is painted. Written out for one mark, the instructions added here read `q`, then a `gs` naming the new state, then a text object setting the colour, the font and the text matrix, then `Q` to put back what was there before. The closing `Q` is what stops the faintness applying to the rest of the page.

Two things follow. The faintness is a property of the paint rather than of the words, so extraction and search cannot see it: a 5 per cent mark and a fully opaque one come back from a text extractor as the same string. At zero opacity the mark is invisible on screen and on paper, and copy-and-paste still finds it, which is a way to label a copy without altering how it looks to the person holding it.

Rotation needs a centre

The text matrix places and orients a run of text in one step, so the turn it expresses happens about the text object's own origin, and that origin is the left end of the baseline. A diagonal mark rotated about the corner of its own first letter swings up and away from where it started, so asking for the middle of the page and actually getting the middle of the page means working the origin backwards from the centre you asked for.

Three lines of arithmetic do that: the string's width is measured in Helvetica Bold, the offset from baseline start to visual centre is rotated by the angle you set, and the result is subtracted from the point you chose. On a 45 degree mark the matrix written into the page begins 0.7071 0.7071 -0.7071 0.7071, followed by the origin those three lines computed. Measured on a 595 by 842 point page with the mark asked for the centre, the mark's own centre came back at 297.6, 420.9, which is the centre to a tenth of a point.

Position is measured against the box a reader sees, which on a print-ready page is smaller than the sheet the page is stored on. The intersection of the MediaBox and the CropBox is used, and a page carrying a quarter-turn flag is marked in the orientation it is displayed in, so a sideways scan gets a diagonal running the way you are looking at it rather than the way the bytes are stored.

Over the content, or under it

Both are offered and over is the default. Under is the tidier idea, and on a page of ordinary text it looks better: the body copy stays crisp and nothing fights it for the same pixels. It also disappears entirely behind anything opaque that covers the whole page, which describes every scan, every slide deck exported with a background, and a fair number of designed reports. A scan is close to the most common thing anybody wants stamped, so a default that vanishes on scans would be the wrong default.

Drawing over the content has a cost worth naming: at high opacity the mark sits on top of the words it was meant to accompany and makes them harder to read. That is the job of the opacity control, and 18 per cent is the starting point because it survives a photocopier while leaving body text legible underneath. Under the content is implemented by moving the new instructions to the front of the page's content array, so the page's own drawing runs last and paints on top.

One mark or a grid

A single centred mark is enough to label a draft. Tiling is for discouraging reuse of a page as a picture, where one diagonal can be cropped away and the rest of the page is still worth taking.

The grid is specified as a count rather than a spacing. The displayed page is divided into the number of columns you ask for, the rows are sized to match the columns so the cells stay roughly square, and one mark is centred in each cell. Three columns on an A4 page in portrait therefore gives four rows and twelve marks, while the same three columns on that page turned sideways give two rows and six. The figure is exact rather than a density to estimate from a picture, and it is reported with the finished file.

How big the mark comes out

A default size cannot be written down, because the right size depends on the string. The word is measured in Helvetica Bold at one point of type, its box is turned by the angle you set, and the size is the one where that turned box fills 86 per cent of the space available. Measured on an A4 page in portrait at 45 degrees: DRAFT comes out at 167 pt, CONFIDENTIAL at 86 pt, a thirty-character line such as a name and a reference at 46 pt. All three fit, where one fixed number fits the shortest word and runs off the page with the rest.

In a grid the space available is one cell rather than the page, and that is the whole of the no-overlap guarantee: three columns on A4 in portrait give cells of 198 by 210 points, and DRAFT is fitted to 55 pt there against 167 pt on the open page. A size you type is used as it stands, including one too big for the space. Sometimes that is the point, so the mark is still drawn, and the result names the cause: an overlapping grid is something you asked for and can read back rather than something that happened quietly.

What the standard fonts can spell

The mark is set in Helvetica Bold through the standard-font mechanism, so no font file is added to the document and no glyph is rasterised. That mechanism encodes text in WinAnsi, whose repertoire is Latin-1 with a few typographic additions, and a character outside it does not fail loudly. Measured here on 2026-08-06: the eight letters of the Russian word for draft encode to eight bytes of 0x3F, so the page would carry eight question marks where the word should be. Characters like that are listed back to you and nothing is written, because a wrong mark on every page is worse than no mark at all.

On a page of text the mark lands beside text that stays exactly as selectable as it was, since nothing is rasterised and no existing object is rewritten. On a scanned page the same instructions land on top of an image, and the mark becomes the only real text in the file: extracting text afterwards returns the watermark and nothing else. That is a fact about the scan rather than about the marking, and it is the quickest way to find out that a document has never been through OCR.

Questions

Is the PDF uploaded anywhere?

No. The document is read into memory by this tab, marked by a PDF library running in a Web Worker on your own machine, and handed back as a download. Open the Network panel in developer tools and run it: what loads is this page's own code, and no request carries your document, because there is no server here that could receive one.

Can somebody remove the watermark?

Yes, if they want to. The mark is a run of operators in a page's content stream, and qpdf will expand a PDF into its QDF form, documented as a version with uncompressed streams meant to be edited in a text editor. From there the operators are plain text and deleting them is a small job. A watermark deters a casual copy and identifies a leaked one; it does not defend a document against somebody determined.

Does the text under the mark stay selectable?

Yes. The mark is appended to the page's existing drawing instructions rather than replacing them, so every character that was selectable before is still selectable, in the same place, and the watermark itself is selectable too. Nothing is flattened into an image at any point, which also means the document keeps its bookmarks, its links and any form fields it arrived with.

Can I mark only some of the pages?

Yes. Leave the page field empty to mark every page, or type a list like 1-3,7 to mark a subset. Numbering follows the document, counting from one, and an open range such as 12- runs to the end. The preview will tell you whether the page you are looking at is one of the pages that will be marked.

Why is this mark a different size from my last one?

Because the size is measured from the text rather than fixed. A longer string has to be set smaller to fit the same space, so CONFIDENTIAL comes out at about half the size of DRAFT on an A4 page, and a recipient's name and reference smaller again. The figure is under the preview and in the note on the finished file. Type a size yourself and that number is used instead, on every page and whatever the text says.

What is a zero per cent watermark for?

Tracing. The text goes into the page and paints nothing, so the document looks untouched to a reader and a text extractor still returns the mark. Set a different recipient name per copy and a document that reappears can be traced back to the copy it came from. It is not hidden from anyone who looks properly, since the string sits in the content stream in plain sight.

Why was my watermark refused for its characters?

Because the fourteen standard PDF fonts are encoded in WinAnsi, which covers Latin-1 and little else. Cyrillic, Greek, Arabic and CJK text has no encoding there, and the encoder substitutes a question mark for every character it cannot represent rather than reporting a problem. Embedding a font would fix it and would add tens of kilobytes to every document; refusing is the honest answer for now.