Matterhorn 31-003 · PDF/UA-1 UA1:7.21.3.1-1
CID font Supplement older than its CMap: lost characters
The font's character collection supplement must be at least as new as the CMap's, or the CMap may reference CIDs the font does not define.
The condition, as the protocol states it. “A Type 0 font dictionary with encoding other than Identity-H and Identity-V has a value for Supplement in the CIDSystemInfo dictionary of the CID font that is less than the value for Supplement in the CIDSystemInfo dictionary of the CMap.”
Matterhorn Protocol 1.1, checkpoint 31, index 31-003, section UA1:7.21.3.1-1. Software can decide this one on its own.
What a screen reader actually does
Some characters resolve to .notdef and are lost.
Supplements only ever add
A character collection such as Adobe-Japan1 is a numbered list of characters, and a CID is a position in it. Adobe extends a collection in Supplements: each one appends CIDs to the end and leaves every earlier CID exactly as it was. The full name of a collection includes the Supplement — Adobe-Japan1-6, Adobe-Japan1-7 — and both the CMap and the CIDFont of a composite font declare one in /CIDSystemInfo.
PDF/UA requires the font’s Supplement to be greater than or equal to the CMap’s (outside Identity-H and Identity-V, which name no collection). The CMap’s Supplement says how far down the list its codes can reach. The font’s says how far down the list it has glyphs for. If the CMap reaches further than the font, some codes lead to CIDs the font has never heard of.
A concrete case: Supplement 7
Adobe-Japan1-7 is the smallest Supplement Adobe-Japan1 has. Published in April 2019, it added exactly two CIDs: 23058 and 23059, the horizontal and vertical forms of ㋿ (U+32FF, SQUARE ERA NAME REIWA), the two-kanji ligature for the Japanese era that began on 1 May 2019. Supplement 6 ends at CID 23057.
So consider:
13 0 obj % the CIDFont
<< /Type /Font /Subtype /CIDFontType0
/BaseFont /ABCDEF+JPMincho-Regular
/CIDSystemInfo << /Registry (Adobe) /Ordering (Japan1) /Supplement 6 >>
/FontDescriptor 16 0 R >>
14 0 obj % the embedded CMap
<< /Type /CMap /CMapName /Custom-UTF16-H
/CIDSystemInfo << /Registry (Adobe) /Ordering (Japan1) /Supplement 7 >>
/WMode 0 /Length 3410 >>
Every character the CMap maps to CID 23057 or below is fine. The moment the text contains ㋿ — in a date, on a form — the CMap maps it to CID 23058, and the font has no CID 23058.
What happens, on screen and in speech
A CID the font does not define is drawn with the font’s .notdef glyph: a blank, or an empty box, depending on the font. A sighted reader sees a gap in a date. A low-vision reader magnifying the page sees the same gap, larger.
What a screen reader says depends on where the viewer gets Unicode from. If the file has a ToUnicode CMap that maps the code to U+32FF, the reader may well hear the era name while everyone looking at the page sees a box — the document now says different things to different people. If the ToUnicode map was generated from the font’s own glyphs, a .notdef glyph has no Unicode value and the character is dropped from the speech too. Either way the file has stopped meaning one thing.
Japan1-7 is a two-glyph example. Earlier Supplements were not: Supplement 4 alone added 6,090 CIDs (9354 to 15443), and a CMap from after it over a font from before it can lose whole runs of characters.
Where it comes from
The CMap and the font come from different places and different years. A producer encodes text through a current CMap — Adobe updates its Unicode CMaps when a Supplement is published — and embeds a font that was made against an older one. Or a CIDFont is labelled /Supplement 0, which is lower than any CMap that uses a later Supplement; when that label is Adobe-Identity-0 it fails 31-002 as well.
How to check it free
qpdf. qpdf file.pdf --show-object=12 prints the Type 0 font; follow /DescendantFonts and /Encoding and compare the two /Supplement integers. The font’s must not be the smaller.
veraPDF with its PDF/UA-1 profile tests it under clause 7.21.3.1.
pdffonts (Poppler) shows the encoding of each font: Identity-H and Identity-V are exempt, anything else is where to look.
Acrobat Pro. All tools → Use print production → Preflight, then Options → Browse Internal PDF Structure, and open the font from the page’s Resources to read both dictionaries. The window is for inspection only; Adobe’s documentation says you cannot edit the structure or the fonts there.
How to fix it
Acrobat cannot edit CIDSystemInfo, and Adobe’s guidance for character-encoding failures is to re-create the PDF. Here that means one of three things in the source:
- Use a font at the CMap’s Supplement or newer. For Japanese, a font that declares Adobe-Japan1-7 covers every CID any Japan1 CMap can produce.
- Export with
Identity-Hand a ToUnicode CMap. The collection drops out of the question. - Keep the older font and avoid the newer characters — writing the era name as two ordinary kanji rather than the ligature, for instance. The file will still fail the condition if its CMap’s Supplement stays higher, so this fixes the page, not the PDF/UA result.
Editing the CIDFont’s /Supplement upwards to make the numbers agree is not a repair unless the font genuinely contains the newer glyphs. Raising the number does not add them; it removes the only signal that they are missing.
What Taggart does
For each Type 0 font that text is set in, with a CMap other than Identity-H or Identity-V, Taggart compares the two Supplements and reports a blocker when the font’s is lower:
/ABCDEF+JPMincho-Regular: the CID font’s CIDSystemInfo /Supplement (6) is lower than the CMap’s (7), so the CMap may reference CIDs the font does not define.
A font at the same Supplement as its CMap, or a newer one, is not reported.
The comparison only runs when the CMap is embedded. A font that names a predefined CMap from ISO 32000-1 Table 118 — /UniJIS-UTF16-H over a font declaring Supplement 0, say — is not compared, because that CMap’s own Supplement is defined outside the file and Taggart does not look it up. Check those by hand.
There is no fix in Taggart. The finding stays a blocker until the file is re-made, and Taggart will not write the PDF/UA identifier while it stands.
How Taggart handles it
Taggart checks for the common form of this condition automatically and reports it as a blocker. The check does not cover every form of it; what it misses is described above.
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
What is a Supplement?
A numbered addition to a character collection. Adobe-Japan1 has gone from Supplement 0 to 7, each one appending CIDs to the end of the list without changing the ones before. A font or CMap that says Supplement 6 covers everything up to the end of Supplement 6.
Is a font with a higher Supplement than its CMap a problem?
No. The rule only runs one way. A font that defines more CIDs than the CMap can ever produce simply has glyphs nobody asks for. The failure is the reverse: a CMap that can produce CIDs past the end of the font.
Does every code in the text fail?
No — only codes that map to CIDs added after the font's Supplement. A document can fail this condition and render every character correctly, because it never uses the newer ones. The condition is about what the file permits, not what this page happens to contain.
Why does a font labelled Adobe-Identity-0 fail this as well as 31-002?
Because 0 is lower than whatever Supplement the CMap declares. The label is wrong as a whole — wrong Ordering and wrong Supplement — so both conditions fire for the one mistake.
Where this sits in the standards
| Standard | Reference |
|---|---|
| Matterhorn Protocol 1.1 | Checkpoint 31 (Fonts), index 31-003 |
| PDF/UA-1 (ISO 14289-1) | Clause 7.21.3.1-1 |
| WCAG 2.1 | 1.3.1 Info and Relationships — Level A |
| EN 301 549 / Section 508 / ADA Title II | All 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. |
Related conditions
- 31-002 CIDSystemInfo Ordering values are not identicalThe CMap and the descendant CID font must agree on the character collection ordering.
- 31-001 CIDSystemInfo Registry values are not identicalThe CMap and the descendant CID font must agree on the character collection registry.
- 31-011 The embedded font program does not contain glyphs for all referenced glyphsThe subset embedded in the file is missing glyphs the content stream asks for — very common when a document is edited after subsetting.
- 31-006 A CMap is neither listed in ISO 32000-1 Table 118 nor embeddedA predefined CMap must be one of the standard names; anything else must be embedded in the file.
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.
- 31-001 CIDSystemInfo Registry values are not identicalThe CMap and the descendant CID font must agree on the character collection registry.
- 31-002 CIDSystemInfo Ordering values are not identicalThe CMap and the descendant CID font must agree on the character collection ordering.
- 31-004 A Type 2 CID font contains neither a stream nor the name Identity as CIDToGIDMapCIDToGIDMap must be either the name /Identity or a stream mapping CIDs to glyph indices.
- 31-005 A Type 2 CID font does not contain a CIDToGIDMap entryThe entry is absent entirely.
- 31-006 A CMap is neither listed in ISO 32000-1 Table 118 nor embeddedA predefined CMap must be one of the standard names; anything else must be embedded in the file.
- 31-007 The WMode entry in a CMap dictionary is not identical to the WMode value in the CMap streamWriting mode (horizontal or vertical) must be declared consistently in the dictionary and the stream.
- 31-008 A CMap references another CMap which is not listed in ISO 32000-1 Table 118A UseCMap chain must terminate at a predefined CMap.
- 31-009 For a font used by text intended to be rendered the font program is not embeddedPDF/UA-1 requires every font used for visible text to be embedded, so the document renders and extracts identically everywhere. A glyph counts as rendered if the text render mode is not 3.
- 31-010 A font program is embedded that is not legally embeddable for unlimited, universal renderingThe font's embedding permission bits forbid the kind of embedding used. Machines can read the flags but the flags may not reflect the actual licence.
- 31-011 The embedded font program does not contain glyphs for all referenced glyphsThe subset embedded in the file is missing glyphs the content stream asks for — very common when a document is edited after subsetting.
- 31-012 A glyph present in an embedded Type 1 font program is not listed in CharSetCharSet must accurately list the glyphs in the embedded subset.
- 31-013 A glyph listed in CharSet is not present in the Type 1 font programCharSet promises glyphs the font does not contain.
- 31-014 A glyph present in an embedded CID font program is not listed in CIDSetCIDSet must accurately list the CIDs in the embedded subset.
- 31-015 A glyph listed in CIDSet is not present in the CID font programCIDSet promises CIDs the font does not contain.
- 31-016 Glyph widths in the font dictionary and the font program differThe /Widths array must agree with the embedded font program.
- 31-017 A non-symbolic TrueType font has no non-symbolic cmapA font declared non-symbolic must actually carry a (3,1) or (1,0) cmap subtable.
- 31-018 A glyph cannot be looked up by any non-symbolic cmap entrySome rendered glyph is unreachable through the declared cmap tables.
- 31-019 The font dictionary for a non-symbolic TrueType font does not contain an Encoding entryNon-symbolic TrueType fonts must declare an /Encoding.
- 31-020 The Encoding dictionary for a non-symbolic TrueType font does not contain BaseEncodingIf /Encoding is a dictionary it must name a /BaseEncoding.
- 31-021 BaseEncoding is neither MacRomanEncoding nor WinAnsiEncodingOnly MacRomanEncoding and WinAnsiEncoding are permitted for non-symbolic TrueType fonts.
- 31-022 Differences contains glyph names not listed in the Adobe Glyph ListGlyph names in /Differences must be resolvable through the Adobe Glyph List so a processor can derive Unicode.
- 31-023 Differences present but the font has no (3,1) Microsoft Unicode cmapThe Differences array is resolved through the (3,1) cmap; without it the mapping is undefined.
- 31-024 The Encoding entry is present in the font dictionary for a symbolic TrueType fontSymbolic TrueType fonts must not carry an /Encoding; the font's own cmap governs.
- 31-025 The embedded font program for a symbolic TrueType font contains no cmapA symbolic TrueType font must contain at least one cmap subtable.
- 31-026 A symbolic TrueType font has multiple cmaps but none is a (3,0) Microsoft Symbol cmapWith multiple cmaps present, a (3,0) symbol cmap is required to disambiguate.
- 31-027 A font dictionary does not contain the ToUnicode entry and no exemption appliesA ToUnicode CMap is required unless the font uses MacRoman/MacExpert/WinAnsi encoding, or is a Type 1/Type 3 whose glyph names are all in the Adobe Glyph List or the Symbol set, or is a Type 0 whose descendant uses a standard Adobe character collection, or is a non-symbolic TrueType.
- 31-028 Unicode values in the ToUnicode CMap are zeroU+0000 is not a valid mapping target; it usually means the producer could not determine the character and wrote a placeholder.
- 31-029 Unicode values in the ToUnicode CMap are U+FEFF or U+FFFEByte-order marks are not characters and must not appear as mapping targets.
- 31-030 Characters used in text showing operators reference the .notdef glyphThe content stream paints glyph index 0, which is by definition "no glyph" — typically a hollow box or nothing at all.
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.
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 .