Matterhorn 31-001 · PDF/UA-1 UA1:7.21.3-1
CIDSystemInfo Registry mismatch between CMap and font
The CMap and the descendant CID font must agree on the character collection registry.
The condition, as the protocol states it. “A Type 0 font dictionary with encoding other than Identity-H and Identity-V has values for Registry in both CIDSystemInfo dictionaries that are not identical.”
Matterhorn Protocol 1.1, checkpoint 31, index 31-001, section UA1:7.21.3-1. Software can decide this one on its own.
What a screen reader actually does
Character codes resolve to the wrong glyphs or fail to resolve, so extracted text is wrong.
One font, several objects
A composite font in PDF — /Subtype /Type0, the kind used for Chinese, Japanese and Korean text and for many other embedded fonts — is not one dictionary. Two objects work in sequence to draw it:
- The CMap, named in the font’s
/Encoding, reads the bytes in the content stream and turns them into CIDs — character identifiers. - The CIDFont, in
/DescendantFonts, turns each CID into a glyph to draw.
Alongside them, a ToUnicode CMap, if there is one, turns the same codes into Unicode for extraction.
A CID is just a number. It only means a particular character inside a character collection, which is named by three values in a /CIDSystemInfo dictionary: /Registry, /Ordering and /Supplement. Both the CMap and the CIDFont carry one:
12 0 obj % the Type 0 font
<< /Type /Font /Subtype /Type0
/BaseFont /ABCDEF+JPMincho-Regular
/Encoding 14 0 R % an embedded CMap
/DescendantFonts [ 13 0 R ]
/ToUnicode 15 0 R >>
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 CMap stream's dictionary
<< /Type /CMap /CMapName /Custom-H
/CIDSystemInfo << /Registry (Adobe) /Ordering (Japan1) /Supplement 6 >>
/WMode 0 /Length 2210 >>
The CMap produces CIDs in its collection; the font interprets them in its collection. PDF/UA requires the two Registry strings to be identical, because if they are not, the numbers coming out of one are being read against a different list by the other. Under Identity-H and Identity-V the rule is waived: those CMaps pass codes through unchanged and do not claim any collection.
What Registry is, in practice
Registry names who defined the collection. Every predefined CMap in ISO 32000-1 Table 118 — the GB, CNS, JIS and KSC families, the Uni… Unicode CMaps and Identity — is in the Adobe registry. So when the two Registry strings disagree, it is typically because one side says (Adobe) and the other says something else: a vendor’s own name, a producer’s name, an empty string.
The comparison is exact. (adobe) is not (Adobe), and a trailing space is a different string.
What breaks, and what the reader hears
A screen reader does not read glyphs. It reads whatever Unicode the viewer can derive for each code, and for a CID-keyed font there are three routes to it:
- The ToUnicode CMap. Code straight to Unicode. A Registry mismatch does not touch this route, and if the map is correct the reader hears the right text.
- A Unicode CMap. If the encoding is one of the
Uni…-UTF16orUCS2CMaps, the code is the Unicode value and a viewer can read it off directly. - The collection’s own table. Adobe publishes a CID-to-Unicode mapping for each of its collections, and PDF/UA lets a font in one of those collections leave ToUnicode out (that exemption is 31-027’s). This route needs the viewer to know the collection — and the two dictionaries disagree about which one it is.
So the honest answer is: with a correct ToUnicode the reader probably hears the right words, and the file still fails, because it contradicts itself. Without one, a viewer that trusts the CMap and a viewer that trusts the font come to different conclusions, and one of them has no table to look the CIDs up in. That is a font that draws and does not read — silence, or characters that are not the ones on the page.
Where it comes from
Not from authors. A Registry mismatch is made by tooling that builds the CIDFont dictionary and the CMap separately: a converter that rewrites the font’s /CIDSystemInfo with its own values and keeps the original CMap, or an editing step that replaces a font and leaves the old CMap pointing at it. The page can look entirely right, because the glyphs were chosen correctly by whatever produced them and only the label is wrong.
How to check it free
pdffonts (Poppler). It does not print CIDSystemInfo, but it tells you which fonts are worth looking at. A Type 0 font whose encoding column says Identity-H is exempt. One that says Custom has an embedded CMap — that is the case to inspect:
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
ABCDEF+JPMincho-Regular CID Type 0C Custom yes yes yes 12 0
qpdf (free). Read the three objects and compare the strings by eye: qpdf file.pdf --show-object=12 for the font, then the object numbers it points to for /DescendantFonts and /Encoding.
veraPDF with its PDF/UA-1 profile checks CIDSystemInfo compatibility under clause 7.21.3.
Acrobat Pro can show you the same dictionaries but not change them. All tools → Use print production → Preflight, then Options → Browse Internal PDF Structure, and walk down from the page’s Resources to the font. Adobe’s documentation for that window is explicit that you can navigate the structure but not edit it.
How to fix it
Acrobat has no tool that edits a font’s CIDSystemInfo. For the character-encoding failures its own Accessibility Checker reports, Adobe’s guidance is to re-create the PDF — with the fonts installed, with a different font in the source, or with a newer Distiller — and that is the answer here too.
Re-export from the source. An export that writes the font with an Identity-H encoding and a ToUnicode CMap is exempt from this condition entirely, and is what current exporters commonly produce for embedded fonts.
Correct the label, if you know it is the label. With qpdf --json-output and --update-from-json you can rewrite a single string in a single object. That is a real repair only when the font genuinely is the collection the CMap names and something mislabelled it. If the font’s CIDs are its own numbering, the CMap is what is wrong, and changing the Registry to match makes a file that passes a validator and lies to every reader.
What Taggart does
For every Type 0 font that text is actually set in, Taggart compares the two /CIDSystemInfo dictionaries and reports a mismatch as a blocker, with the first page the font appears on, its object number and both values:
/ABCDEF+JPMincho-Regular: the CIDSystemInfo /Registry differs between the CMap (‘Adobe’) and the descendant CID font (‘Vendor’).
It skips Identity-H and Identity-V, as the rule does.
It has a gap that matters. Taggart compares against the CMap’s CIDSystemInfo only when the CMap is embedded in the file. When the font names a predefined CMap from Table 118 — /UniJIS-UTF16-H, say — that CMap’s collection is defined outside the file, Taggart does not look it up, and a descendant font in another registry is not reported. A clean Taggart report says nothing about that case, so read the CIDFont’s /CIDSystemInfo yourself and compare it with the collection the CMap belongs to — UniJIS… CMaps are Adobe-Japan1, UniGB… Adobe-GB1, UniCNS… Adobe-CNS1, UniKS… Adobe-Korea1.
There is no fix. 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 Registry, in a PDF font?
The first part of a character collection's name. A collection is written Registry-Ordering-Supplement — Adobe-Japan1-6, say — and the Registry is the organisation that defined it. Every CMap in ISO 32000-1 Table 118 belongs to the Adobe registry, so in practice a mismatch means one side is not describing an Adobe collection at all.
Does this apply to fonts with an Identity-H encoding?
No. Identity-H and Identity-V pass each code straight through as a CID and claim no collection, so the CID font may carry any CIDSystemInfo it likes. The condition only applies when the CMap is something else — a named CMap such as UniJIS-UTF16-H, or one embedded in the file.
If the text extracts correctly, can I ignore it?
You can understand it, but not ignore it. If the font has a correct ToUnicode CMap, extraction does not depend on the collection and the reader is probably unaffected. The file still fails PDF/UA, and it still says two contradictory things about what its CIDs mean, which is exactly what a different viewer may resolve differently.
Can I just change the string so they match?
Only if you know which side is right. If the font really is an Adobe collection and something wrote the wrong Registry into it, correcting the label is a true repair. If the font's CIDs are its own private numbering, relabelling it Adobe makes the file pass and tells every reader a falsehood.
Where this sits in the standards
| Standard | Reference |
|---|---|
| Matterhorn Protocol 1.1 | Checkpoint 31 (Fonts), index 31-001 |
| PDF/UA-1 (ISO 14289-1) | Clause 7.21.3-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-003 CIDSystemInfo Supplement of the CID font is lower than that of the CMapThe 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.
- 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-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.
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-002 CIDSystemInfo Ordering values are not identicalThe CMap and the descendant CID font must agree on the character collection ordering.
- 31-003 CIDSystemInfo Supplement of the CID font is lower than that of the CMapThe 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.
- 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 .