Why do some PDFs store text one letter at a time?

Per-glyph text is PDF content where each character is drawn by its own positioned operator instead of being grouped into word- or line-level text runs.

  • Reference
  • Verified against the code
  • Updated 17 July 2026
Quick answer

Some generators — including Chrome’s print-to-PDF and Canva — position every character individually rather than writing a word as one instruction. The page looks normal, but there is no "word" in the file to find: a single line can be dozens of separate one-character operators, each with its own coordinates.

Why this happens

A generator that cares about precise spacing has a choice: write "Northwind Studio" as one instruction and let the font’s metrics space it, or position each glyph exactly where it wants. Several take the second route, because it guarantees the output matches their layout engine to the pixel.

The result is indistinguishable on screen and hostile underneath. Search for a phrase and there is no phrase — there are sixteen single-character operators that happen to sit next to each other. Anything that expects to locate "Due 13 August 2026" as a unit finds nothing at all, because the file contains "Due 13 " and "August 2026" as separate runs, or worse, seventeen individual letters.

This is not exotic. It is what you get from a browser’s own print-to-PDF, which means it is what a huge share of real-world business documents look like inside.

How Online PDF Edits handles it

We target edits by position as well as by text. When you click a line in the editor, we resolve which glyph runs cover that region and rewrite the ones you actually selected, so per-glyph documents edit exactly like any other.

When a request gives us text to match but no position, and that text is split across per-glyph runs, we refuse the edit and say so. That sounds unhelpful until you see the alternative: without a position to anchor to, the nearest thing to a match is whatever run happens to be first on the page — so a "best effort" writes your new text over the letterhead and leaves the real target untouched. We would rather return an error than a corrupted page.

The specifics

Runs on a one-page Chromium-rendered invoice we tested111
Runs used to draw "Northwind Studio"16 — one per character
How "Due 13 August 2026" is stored in that fileTwo runs: "Due 13 " and "August 2026"
Our behaviour when text matches nothing and no position is givenRaises an error; never edits a guessed run

Limitations

  • Text matching alone cannot target per-glyph content. An edit needs the position of the run — which the editor always has from your click, but an API call using text alone does not.
  • Because glyphs are independently positioned, a longer replacement extends along the line rather than re-spacing its neighbours.
Check it yourself

Don’t take our word for any of this. Edit the sample invoice, export it, then select the line you changed and copy it — you should get your new wording, not the old. Compare the export against the original and see what moved.

Every claim in this reference is written from the code that implements it, and every number is measured rather than estimated. The parts you can verify without trusting us are the ones we put in front of you.

Frequently asked questions

  • Because the word is not in the file as a word. It is a series of individually positioned characters that your reader is reassembling visually. Selection and copy are best-effort reconstructions of something the document never stored.

  • Chrome’s print-to-PDF is the one most people meet daily; design tools such as Canva do it too. It is a legitimate choice — it pins the layout exactly — and it is why so many editors misbehave on ordinary business documents.

  • No. Once the run is targeted correctly, the edit is drawn with the same font at the same position as any other. Per-glyph storage affects finding the text, not replacing it.