Fehlerbehebung: Schriftarten, Subsetting und Tagging
Geltungsbereich
Abschnitt betitelt „Geltungsbereich“Diese Einträge behandeln Fehler bei der Schriftauflösung und beim Parsing, die die Engine über NextPDF\Exception\FontNotFoundException und NextPDF\Exception\FontParsingException auslöst. Außerdem behandeln sie die CJK-Abdeckungsdiagnose und Probleme mit dem Strukturbaum, die getaggte Ausgaben betreffen. Jeder Eintrag nennt die genaue Exception oder den genauen Test, damit Sie die Ursache bestätigen können.
Eintrag: Schriftart nicht gefunden
Abschnitt betitelt „Eintrag: Schriftart nicht gefunden“- Symptom.
FontNotFoundExceptionmit einer Meldung der FormFont "<name>" not found. Searched: [<paths>]. - Wahrscheinliche Ursache. Die angeforderte Schriftfamilie oder der angegebene Dateipfad ist nicht vorhanden oder nicht lesbar, oder das konfigurierte Schriftenverzeichnis ist nicht erreichbar. Die Schriftdaten können gültig sein; die Engine kann jedoch nicht darauf zugreifen.
- Belege / Diagnose.
getContext()liefertfont_name,search_pathsundfallback_attempted. Prüfen Siesearch_paths, um jeden Ort zu sehen, den die Engine geprüft hat. Prüfen Siefallback_attempted, um festzustellen, ob bereits ein Fallback versucht wurde. - Lösung.
- Vergleichen Sie den angeforderten
font_namemit der tatsächlich vorhandenen Datei. - Fügen Sie das Verzeichnis, das die Schriftart enthält, dem konfigurierten Schriftenverzeichnis hinzu, oder korrigieren Sie den übergebenen Pfad.
- Stellen Sie sicher, dass die Datei für den ausführenden Benutzer lesbar ist.
- Führen Sie den Aufruf erneut aus.
- Vergleichen Sie den angeforderten
- Verwandt. Exception-Referenz.
Eintrag: Schriftdatei lässt sich nicht parsen
Abschnitt betitelt „Eintrag: Schriftdatei lässt sich nicht parsen“- Symptom.
FontParsingExceptionmit einer Meldung der FormFailed to parse font file "<file>": <reason>. - Wahrscheinliche Ursache. Die Schriftdatei wurde gefunden, ihr Inhalt ist jedoch nicht nutzbar: etwa wegen eines abgeschnittenen Headers, eines ungültigen Tabellenverzeichnisses oder einer fehlenden Pflichttabelle wie
head,hheaoderOS/2. - Belege / Diagnose.
getContext()liefertfont_fileundparse_error. Das Feldparse_errornennt das strukturelle Problem. - Lösung.
- Lesen Sie
parse_error, um den strukturellen Defekt zu identifizieren. - Ersetzen Sie die Schriftdatei durch eine als funktionierend bekannte Kopie desselben Schriftschnitts.
- Führen Sie den Aufruf erneut aus.
- Lesen Sie
- Verwandt. Exception-Referenz.
Eintrag: Subsetting scheitert an einer fehlerhaften Schrifttabelle
Abschnitt betitelt „Eintrag: Subsetting scheitert an einer fehlerhaften Schrifttabelle“- Symptom.
FontParsingExceptionmit einemfont_file-Wert vonfont-subsetund einemparse_errorwieInvalid head table: too short,Invalid hhea table: too short,Invalid maxp table: too shortoderFailed to unpack font data. - Wahrscheinliche Ursache. Die Schriftart hat das erste Laden bestanden, aber eine für das Subsetting erforderliche Tabelle ist abgeschnitten oder kann nicht entpackt werden. Der Subsetter weist die Schriftart zurück, anstatt ein defektes Subset auszugeben.
- Belege / Diagnose. Wenn eine
head-,hhea- odermaxp-Tabelle zu kurz ist oder das Entpacken fehlschlägt, löstsrc/Typography/FontSubsetter.phpFontParsingExceptionmit dem literalen Tokenfont-subsetals Dateiname aus. Das Token zeigt Ihnen, dass der Fehler aus der Subsetting-Stufe stammt und nicht aus dem ersten Laden. - Lösung.
- Ersetzen Sie die Quellschrift durch eine nicht abgeschnittene Kopie desselben Schriftschnitts.
- Wenn die Schriftart von einem Build-Tool erzeugt wird, erzeugen Sie sie neu und prüfen Sie, ob die Tabellen
head,hheaundmaxpvollständig sind. - Führen Sie den Build erneut aus.
- Verwandt. PDF/A- und PDF/UA-Validierung.
Eintrag: CJK-Text wird mit fehlenden Glyphen gerendert
Abschnitt betitelt „Eintrag: CJK-Text wird mit fehlenden Glyphen gerendert“- Symptom. Chinesischer, japanischer oder koreanischer Text wird mit leeren Kästchen oder fehlenden Zeichen gerendert; außerdem ist die CJK-Abdeckung der Schriftart fraglich.
- Wahrscheinliche Ursache. Die ausgewählte Schriftart deckt die Unicode-Blöcke nicht ab, die das Schriftsystem benötigt. Jedes CJK-Schriftsystem braucht neben den gemeinsamen Ideogramm-Blöcken bestimmte spezifische Blöcke.
- Belege / Diagnose.
src/Typography/CjkFontValidator.phpstelltvalidateCoverage(FontInfo $font, CjkScript $script)bereit. Die Methode liefert einCjkCoverageResultmit dem Abdeckungsprozentsatz und den Blöcken unterhalb der 50-%-Berichtsschwelle. Der Validator tastet Codepoints ab; er dient der Diagnose und verändert das Laden der Schriftart nicht. - Lösung.
- Führen Sie
CjkFontValidator::validateCoverage()für die Schriftart und das Zielschriftsystem aus. - Lesen Sie
missingRanges, um zu sehen, welche Blöcke nicht abgedeckt sind: zum Beispiel Bopomofo für traditionelles Chinesisch, Hiragana und Katakana für Japanisch sowie Hangul-Silben für Koreanisch. - Wählen Sie eine Schriftart, die diese Blöcke abdeckt, oder fügen Sie eine Fallback-Schriftart hinzu, die das tut.
- Rendern Sie erneut und prüfen Sie die Abdeckung erneut.
- Führen Sie
- Verwandt. Exception-Referenz.
Eintrag: vordefinierte CMap passt nicht zum CJK-Schriftsystem
Abschnitt betitelt „Eintrag: vordefinierte CMap passt nicht zum CJK-Schriftsystem“- Symptom. CJK-Text wird falschen Glyphen zugeordnet, oder es wird eine vordefinierte CMap ausgewählt, die nicht zur Dokumentsprache passt.
- Wahrscheinliche Ursache. Das erkannte Schriftsystem bestimmt den Namen der vordefinierten Adobe-CMap. Eine Schriftart, die nur den gemeinsamen Ideogramm-Block ohne schriftsystemspezifischen Block abdeckt, wird per Design als vereinfachtes Chinesisch erkannt.
- Belege / Diagnose.
CjkFontValidator::detectScript()gibt das erkannte Schriftsystem zurück, undresolvePredefinedCMapName()bildet es ab: vereinfachtes Chinesisch aufUniGB-UTF16-H, traditionelles Chinesisch aufUniCNS-UTF16-H, Japanisch aufUniJIS-UTF16-H, Koreanisch aufUniKS-UTF16-H. Wenn kein schriftsystemspezifischer Block vorhanden ist, fällt die Erkennung auf vereinfachtes Chinesisch zurück. - Lösung.
- Bestätigen Sie, dass die Schriftart den schriftsystemspezifischen Block enthält: Bopomofo für traditionelles Chinesisch, Hiragana oder Katakana für Japanisch, Hangul für Koreanisch.
- Wenn das Dokument traditionelles Chinesisch verwendet, die Schriftart aber keinen Bopomofo-Block enthält, wählen Sie eine Schriftart, die diesen Block enthält, damit die Erkennung das beabsichtigte Schriftsystem bestimmt.
- Rendern Sie erneut.
- Verwandt. Exception-Referenz.
Eintrag: getaggter Inhalt erzeugt keinen nutzbaren Strukturbaum
Abschnitt betitelt „Eintrag: getaggter Inhalt erzeugt keinen nutzbaren Strukturbaum“- Symptom. Ein Build mit Tagging erzeugt keine Struktur, oder eine nachgelagerte Prüfung der Barrierefreiheit meldet einen leeren oder fehlenden Strukturbaum.
- Wahrscheinliche Ursache. Inhalt wurde ausgegeben, ohne den Tagging-Pfad zu durchlaufen; dadurch wurden keine Strukturelemente erstellt. Der Strukturbaum bleibt leer.
- Belege / Diagnose.
src/Accessibility/StructureTree.phpundsrc/Accessibility/TaggedContentEmitter.phpbauen den Strukturbaum aus getaggten Inhalten auf. Der Testtests/Integration/Accessibility/EmptyTaggedPdfDoesNotAdvertisePdfUa2Test.phpbestätigt, dass ein leerer Strukturbaum nicht als PDF/UA-2 ausgewiesen wird. - Lösung.
- Bestätigen Sie, dass Inhalte über den Tagging-Pfad ausgegeben werden, damit Strukturelemente erstellt werden.
- Prüfen Sie, ob jede Marked-Content-Sequenz auf ein Strukturelement abgebildet wird.
- Führen Sie den Build erneut aus und inspizieren Sie den Strukturbaum.
- Verwandt. PDF/A- und PDF/UA-Validierung.
Eintrag: Sprach-Tag eines Strukturelements wird abgelehnt
Abschnitt betitelt „Eintrag: Sprach-Tag eines Strukturelements wird abgelehnt“- Symptom. Ein Build scheitert, weil ein Sprachwert an einem Strukturelement oder am Dokument kein gültiges Tag ist.
- Wahrscheinliche Ursache. Die angegebene Sprache ist kein gültiges BCP-47-Tag. Der Validator lehnt fehlerhafte Tags ab, anstatt sie auszugeben.
- Belege / Diagnose.
src/Accessibility/Bcp47Validator.phpvalidiert das Tag. Ein ungültiges Tag führt zur Exception insrc/Accessibility/InvalidBcp47TagException.php. Die strikte Sprachanforderung von PDF/UA-2 wird vontests/Unit/Conformance/PdfUa2Section844LangStrictTest.phpgeprüft. - Lösung.
- Ersetzen Sie den Sprachwert durch ein gültiges BCP-47-Tag, zum Beispiel
en-US,de-DEoderzh-Hant-TW. - Setzen Sie die Sprache am konkreten Strukturelement, wenn sich eine Passage von der Dokumentsprache unterscheidet.
- Führen Sie den Build erneut aus.
- Ersetzen Sie den Sprachwert durch ein gültiges BCP-47-Tag, zum Beispiel
- Verwandt. PDF/A- und PDF/UA-Validierung.
Grenzfälle & Fallstricke
Abschnitt betitelt „Grenzfälle & Fallstricke“FontNotFoundExceptionundFontParsingExceptionsind verschieden. Nicht gefunden bedeutet, dass die Datei nicht erreicht werden konnte. Parsing bedeutet, dass die Datei erreicht wurde, ihre Bytes aber nicht nutzbar sind. Prüfen Sie die Klasse, um zu unterscheiden, welcher Fall vorliegt.- Der Wert
font-subsetinfont_fileist ein bewusster Marker für die Subsetting-Stufe, kein tatsächlicher Pfad. Suchen Sie nicht nach einer Datei mit dem Namenfont-subset. CjkFontValidatortastet Codepoints ab, statt jeden einzelnen zu prüfen. Deshalb ist seine Abdeckungszahl eine Schätzung, die für die Schriftauswahl genügt, aber kein bytegenaues Audit.- Ein leerer Strukturbaum wird per Design als nicht PDF/UA-2-konform gemeldet. Das ist das dokumentierte Verhalten der Engine, kein Defekt.
Siehe auch
Abschnitt betitelt „Siehe auch“Glossar: Font-Subsetting · CJK-Abdeckung · Strukturbaum