Fix a typo or update a line of text in a PDF: click the text, type the correction, save. The tool tells you when the replacement font is not an exact match.
Visual text replacement: pdf.js text runs become a clickable hit layer; a commit whites out the original run and draws the new text at the same baseline in a matched standard font (Helvetica, Times, Courier). Substitution is always disclosed.
getTextContent() items provide baseline transforms, run widths, and style hints; the hit layer maps them to CSS space (y-flip). Commit path: pdf-lib drawRectangle (white, sized to max(original, replacement) advance width) plus drawText at the original baseline. Font selection (lib/pdf/fontpack.ts): Standard-14 Helvetica/Times/Courier for Arial/Times/Courier text that is WinAnsi-encodable; bundled self-hosted metric-compatible TTFs embedded via @pdf-lib/fontkit for Calibri (Carlito) and Cambria (Caladea); the bundled TTF as a Unicode fallback when the text has characters Standard-14 cannot encode. You can also upload a .ttf/.otf or pull an installed font via the Local Font Access API (Chromium). Bundled fonts lazy-load from /fonts/pdf-edit/; uploads and local fonts never leave the browser. The original glyph operators remain under the white patch (visual correction, not redaction).
Original:
Uploaded and installed fonts are read in your browser and embedded directly; they are never uploaded to a server. Use these for letterhead or brand fonts that must match exactly.
The fingerprint is a SHA-256 hash of the saved file, written as a separate .txt next to the PDF. Useful for chain-of-custody records.