Words drawn with empty outlines
The font maps the codes a run actually draws to glyphs that have no outline, so the word takes up space on the page and paints nothing while /ToUnicode still spells it out.
How the text is hidden
A PDF's text operators name character codes; the embedded font decides what each code draws, and /ToUnicode separately decides what each code extracts as. Point the codes at glyphs whose outlines are empty and the two answers come apart: the advance width is consumed, the line lays out normally, and no ink is put down. Colour, size and position are all ordinary, so nothing about the run looks unusual to a check that reads styling.
Why a model still reads it
Extraction reads /ToUnicode, not the glyph program. The characters are present and correct in the bytes; only the drawing is empty.
What we do about it
For each show operation the parser counts the codes that were drawn and decodable, and how many of those map to a glyph in the font's blankGlyphs set; when every drawn code is blank and the run's text contains a letter or digit it sets blankGlyphRun. blankGlyphs comes from emptyGlyphIds, which walks the embedded TrueType head/maxp/loca tables and collects every glyph id whose outline is zero-length. The rule pdf-blank-glyph fires at high, action flag — flagged, never stripped, on the same reasoning as the invisible render mode, and the parser already declines a run that claims only spaces or punctuation.
How often it fires
0% of CUAD — 510 real commercial contracts (EDGAR EX-10 exhibits), bulk-converted from HTML by Aspose/EVO, measured 2026-08-17.
This is an alert-volume number and nothing else. It says how often the alarm sounds on documents as found — not how often it is right, and not whether what it found was harmless. Documents as found may themselves carry concealment. Read it against the population named above rather than as a property of documents in general.
Check your own file
Three commands: a key, credit, a verdict.
Start with the API