Matterhorn 31-024 · PDF/UA-1 UA1:7.21.6-8

Symbolic TrueType font that also has an Encoding

BlockerCheckpoint 31: FontsWCAG 1.3.1 (A)

Symbolic TrueType fonts must not carry an /Encoding; the font's own cmap governs.

The condition, as the protocol states it. “The Encoding entry is present in the font dictionary for a symbolic TrueType font.”

Matterhorn Protocol 1.1, checkpoint 31, index 31-024, section UA1:7.21.6-8. Software can decide this one on its own.

What a screen reader actually does

The conflicting encoding produces wrong characters on extraction.

Two instructions for one byte

A simple TrueType font’s font descriptor carries a /Flags integer, and two of its bits say what kind of font it is: Symbolic (bit 3, value 4) and Nonsymbolic (bit 6, value 32). The difference decides how a byte in the content stream finds its glyph.

For a non-symbolic font, the byte goes through a named encoding to a glyph name, and the name to a glyph. For a symbolic font, the byte goes straight to the font program’s own cmap table — the (3,0) Microsoft Symbol subtable if there is one, otherwise the (1,0) Macintosh one — and no encoding is involved.

12 0 obj
<< /Type /Font
   /Subtype /TrueType
   /BaseFont /ABCDEF+Wingdings-Regular
   /Encoding /WinAnsiEncoding          % ← says: go through WinAnsi
   /FontDescriptor 13 0 R              % /Flags 4: says: go straight to the cmap
>>

That font gives two instructions for the same byte. ISO 32000-1 does not settle it cleanly — read one way it tells the viewer to build a table from a WinAnsi or MacRoman /Encoding, read another it says a symbolic font’s /Encoding is ignored — so viewers settle it themselves. PDF/UA-1 clause 7.21.6 removes the conflict by forbidding the /Encoding entry on a symbolic TrueType font altogether. Condition 31-024 is a font that has one.

What the user hears

The drawing problem is that different viewers can pick different glyphs. The reading problem is quieter and usually worse.

A font with /WinAnsiEncoding is exempt from needing a ToUnicode CMap, because WinAnsi says what every byte is. For a text font that is true. For a dingbat font it is not: the bytes are positions in a picture font, and WinAnsi’s names for them are letters. If the font carries no ToUnicode CMap, a reader that takes the encoding at its word turns pictures into letters. Wingdings draws a filled bullet at 0x6C and a check mark at 0xFC; WinAnsi calls those l and ü. A list whose bullets are set in such a font can be read as items each beginning with the letter l, and a ticked checklist as a column of ü.

That is also why this condition can stand alone in a report. Taggart does not report a missing ToUnicode CMap (31-027) for a font with /WinAnsiEncoding, because the exemption applies; 31-024 is the finding that tells you the exemption is resting on a contradiction.

Where it comes from

Producers that write /WinAnsiEncoding on every simple font by default, and set the flags from what the font contains. The two disagree whenever the font has any glyph outside the Adobe standard Latin set — which is the flag’s definition of symbolic — and that covers every dingbat font and many text fonts with a few extra characters.

The opposite combination is the one PDF/UA wants. ReportLab, for example, marks every TrueType subset it embeds as symbolic and writes no /Encoding for it; its fonts pass this condition.

How to check it free

Not with pdffonts. Its encoding column reports what Poppler uses, and on our test files it printed WinAnsi both for a symbolic TrueType font with /Encoding /WinAnsiEncoding and for one with no /Encoding at all.

Read the two objects. pdffonts gives the font’s object number; qpdf --show-object=12 file.pdf prints the font dictionary, and the same command on its /FontDescriptor gives /Flags. Bit 3 is set if the value, written in binary, has a 1 in the 4s place: 4, 5, 68 and 262148 all qualify. Bit 6 is the 32s place, and a value with both, such as 36, is not symbolic to Taggart.

In Acrobat Pro, both dictionaries are visible, read-only, through All tools → Use print production → Preflight, then Options → Browse Internal PDF Structure, as Adobe describes in advanced preflight inspections.

veraPDF’s PDF/UA-1 profile has a rule for exactly this: a symbolic TrueType font with an /Encoding in its dictionary.

How to fix it free

Decide what the font really is, because the two repairs are different.

A genuine symbol font — dingbats, icons, a pictogram font. Delete the /Encoding entry, and give the font a ToUnicode CMap that says what each symbol is, U+2022 for a bullet, U+2713 for a check mark. Without the CMap, the font no longer qualifies for the WinAnsi exemption and fails 31-027 instead. If the program has a (3,0) subtable, removing the encoding should not change what is drawn; compare in more than one viewer before trusting it. Both edits can be made with qpdf in QDF mode (qpdf --qdf --object-streams=disable, edit, fix-qdf), but writing a ToUnicode CMap by hand is slow work, and a re-export is usually faster.

A text font marked symbolic — the letters are ordinary letters. Here the encoding is right and the flag is wrong: change /Flags to clear bit 3 and set bit 6. The font is then held to the non-symbolic rules, which want a non-symbolic cmap subtable in the program (31-017) and, if the encoding has Differences, a (3,1) one (31-023), so check the program before you change the flag.

Or re-export. For the Accessibility Checker’s Character encoding rule, Adobe’s guidance in Create and verify PDF accessibility is to use a different font, preferably OpenType, in the source and re-create the PDF; Adobe documents no way to edit a font dictionary inside Acrobat.

What Taggart reports

One finding per symbolic TrueType font, saying which kind of /Encoding it found — the name, or dictionary if it is an encoding dictionary:

/ABCDEF+Wingdings-Regular is a symbolic TrueType font but its font dictionary contains an /Encoding entry, which PDF/UA-1 forbids.

A font is symbolic to Taggart when the Symbolic bit is set and the Nonsymbolic bit is not. A descriptor with both set is checked as non-symbolic, and an encoding problem on it is reported as 31-021 or its neighbours rather than this.

There is no repair. Deleting the entry, or changing the flag, is a decision about what the font is, and either one can change the glyphs some viewers draw.

How Taggart handles it

Taggart checks for this condition automatically and reports it as a blocker, with where in the file it found it.

Whatever Taggart changes, the page still looks identical. Fixes edit the PDF object model, not the content streams, and every remediation is re-rendered and compared against the original at structural similarity ≥ 0.999 before you get the file back. A tool that quietly reflows your document is worse than no tool.

Frequently asked questions

Which flag makes a font symbolic?

Bit 3 of /Flags in the font descriptor, value 4, is Symbolic; bit 6, value 32, is Nonsymbolic. Taggart treats a font as symbolic only when bit 3 is set and bit 6 is not, so a descriptor with both set is held to the non-symbolic rules instead.

Can I just delete the /Encoding entry?

For a genuine symbol font, that is the fix, and if the program has a (3,0) cmap the drawing should not change. But a WinAnsi or MacRoman entry is also what exempted the font from needing a ToUnicode CMap, so once it goes the font needs one, or it fails 31-027 instead.

pdffonts says WinAnsi either way. Why?

pdffonts shows the encoding Poppler uses, and it shows WinAnsi for a symbolic TrueType font with no /Encoding at all as well as for one with /WinAnsiEncoding. Read the font dictionary itself with qpdf --show-object.

Why would a text font be marked symbolic?

Because of how the flag is defined: a font is symbolic if it has any glyph outside the Adobe standard Latin set. Some producers set it on every font they embed, which is defensible for the flag and wrong as soon as they also write an encoding.

Where this sits in the standards

Standards this condition maps to
StandardReference
Matterhorn Protocol 1.1Checkpoint 31 (Fonts), index 31-024
PDF/UA-1 (ISO 14289-1)Clause 7.21.6-8
WCAG 2.11.3.1 Info and Relationships — Level A
EN 301 549 / Section 508 / ADA Title IIAll three point at WCAG 2.1 Level AA for non-web documents, so a Level A or AA criterion here is in scope for each of them.

Other conditions in checkpoint 31

Checkpoint 31 covers fonts. These are its other failure conditions; the ones without a link are in the rule set but do not have a written page yet.

Check your own file. Taggart’s validator is free and unlimited — 75 of the 87 Matterhorn conditions software can decide, with the other 12 listed for you to confirm; no watermark, no expiry, and no account needed up to 60 pages.

Check a PDF free

Checked with Taggart on a generated file that fails this condition on . The Acrobat steps follow Adobe’s documentation and were not walked through by hand. Last updated .