Probleemoplossing: lettertypen, subsetting en tagging
Reikwijdte
Sectie met titel “Reikwijdte”Deze items behandelen fouten bij het vinden en parsen van lettertypen die via NextPDF\Exception\FontNotFoundException en NextPDF\Exception\FontParsingException worden opgeworpen. Ze behandelen ook diagnostiek voor de dekking van Chinees, Japans en Koreaans (CJK) en problemen met de structuurboom die van invloed zijn op getagde uitvoer. Elk item noemt de exacte exception of test, zodat je de oorzaak kunt verifiëren.
Item: lettertype niet gevonden
Sectie met titel “Item: lettertype niet gevonden”- Symptoom.
FontNotFoundExceptionmet een bericht in de vormFont "<name>" not found. Searched: [<paths>]. - Waarschijnlijke oorzaak. De gevraagde lettertypefamilie of bestandspad bestaat niet, is niet leesbaar of bevindt zich in een lettertypemap die de runtime niet kan benaderen. De lettertypegegevens kunnen geldig zijn, maar de engine kan ze toch niet bereiken.
- Bewijs / diagnose.
getContext()retourneertfont_name,search_pathsenfallback_attempted. Bekijk metsearch_pathselke locatie die de engine heeft geprobeerd. Gebruikfallback_attemptedom te bevestigen of er al fallback is uitgevoerd. - Oplossing.
- Vergelijk de gevraagde
font_namemet het lettertypebestand dat daadwerkelijk aanwezig is. - Voeg de map met het lettertype toe aan de geconfigureerde lettertypemap, of corrigeer het pad dat je hebt doorgegeven.
- Controleer of de runtime-gebruiker het bestand kan lezen.
- Voer de aanroep opnieuw uit.
- Vergelijk de gevraagde
- Gerelateerd. Exception-referentie.
Item: lettertypebestand kan niet worden geparseerd
Sectie met titel “Item: lettertypebestand kan niet worden geparseerd”- Symptoom.
FontParsingExceptionmet een bericht in de vormFailed to parse font file "<file>": <reason>. - Waarschijnlijke oorzaak. De engine heeft het lettertypebestand gevonden, maar kan de inhoud niet gebruiken: door een afgekapte header, een ongeldige tabeldirectory of een ontbrekende verplichte tabel zoals
head,hheaofOS/2. - Bewijs / diagnose.
getContext()retourneertfont_fileenparse_error.parse_errorbenoemt het structurele probleem. - Oplossing.
- Lees
parse_errorom het structurele defect te identificeren. - Vervang het lettertypebestand door een bekende goede kopie van hetzelfde lettertype.
- Voer de aanroep opnieuw uit.
- Lees
- Gerelateerd. Exception-referentie.
Item: subsetting mislukt door een misvormde lettertypetabel
Sectie met titel “Item: subsetting mislukt door een misvormde lettertypetabel”- Symptoom.
FontParsingExceptionmet eenfont_file-waarde vanfont-subseten eenparse_errorzoalsInvalid head table: too short,Invalid hhea table: too short,Invalid maxp table: too shortofFailed to unpack font data. - Waarschijnlijke oorzaak. Het lettertype is initieel geladen, maar een tabel die nodig is voor subsetting, is afgekapt of kan niet worden uitgepakt. De subsetter weigert het lettertype in plaats van een defecte subset te maken.
- Bewijs / diagnose. Wanneer een
head-,hhea- ofmaxp-tabel te kort is of een uitpakbewerking mislukt, werptsrc/Typography/FontSubsetter.phpeenFontParsingExceptionop met het letterlijke tokenfont-subsetals bestandsnaam. Het token vertelt je dat de fout zich tijdens subsetting voordeed, niet tijdens het initiële laden. - Oplossing.
- Vervang het bronlettertype door een volledige, niet-afgekapte kopie van hetzelfde lettertype.
- Als een buildtool het lettertype genereert, genereer het opnieuw en controleer of de tabellen
head,hheaenmaxpvolledig zijn. - Voer de build opnieuw uit.
- Gerelateerd. PDF/A- en PDF/UA-validatie.
Item: CJK-tekst wordt weergegeven met ontbrekende glyphs
Sectie met titel “Item: CJK-tekst wordt weergegeven met ontbrekende glyphs”- Symptoom. Chinese, Japanse of Koreaanse tekst wordt weergegeven als lege vakjes of ontbrekende tekens, en de CJK-dekking van het lettertype is onduidelijk.
- Waarschijnlijke oorzaak. Het geselecteerde lettertype dekt niet de Unicode-blokken die het schrift nodig heeft. Elk CJK-schrift vereist specifieke blokken naast de gedeelde ideograafblokken.
- Bewijs / diagnose.
src/Typography/CjkFontValidator.phpbiedtvalidateCoverage(FontInfo $font, CjkScript $script). Het retourneert eenCjkCoverageResultmet het dekkingspercentage en eventuele blokken die onder de rapportagedrempel van 50% blijven. De validator neemt steekproeven van codepunten. Dit is diagnostiek en wijzigt het laden van lettertypen niet. - Oplossing.
- Voer
CjkFontValidator::validateCoverage()uit voor het lettertype en het doelschrift. - Lees de
missingRangesom te zien welke blokken niet worden gedekt, bijvoorbeeld Bopomofo voor Traditioneel Chinees, Hiragana en Katakana voor Japans, en Hangul Syllables voor Koreaans. - Selecteer een lettertype dat die blokken dekt, of voeg een fallback-lettertype toe dat die blokken wel dekt.
- Voer de weergave opnieuw uit en controleer de dekking opnieuw.
- Voer
- Gerelateerd. Exception-referentie.
Item: vooraf gedefinieerde CMap komt niet overeen met het CJK-schrift
Sectie met titel “Item: vooraf gedefinieerde CMap komt niet overeen met het CJK-schrift”- Symptoom. CJK-tekst wordt toegewezen aan de verkeerde glyphs, of het document gebruikt een vooraf gedefinieerde CMap die niet overeenkomt met de taal ervan.
- Waarschijnlijke oorzaak. Het gedetecteerde schrift bepaalt de naam van de vooraf gedefinieerde Adobe-CMap. Een lettertype dat alleen het gedeelde ideograafblok dekt en geen schriftspecifiek blok heeft, wordt opzettelijk gedetecteerd als Vereenvoudigd Chinees.
- Bewijs / diagnose.
CjkFontValidator::detectScript()retourneert het gedetecteerde schrift, enresolvePredefinedCMapName()koppelt het daaraan: Vereenvoudigd Chinees aanUniGB-UTF16-H, Traditioneel Chinees aanUniCNS-UTF16-H, Japans aanUniJIS-UTF16-Hen Koreaans aanUniKS-UTF16-H. Als er geen schriftspecifiek blok aanwezig is, valt de detectie terug op Vereenvoudigd Chinees. - Oplossing.
- Bevestig dat het lettertype het schriftspecifieke blok bevat: Bopomofo voor Traditioneel Chinees, Hiragana of Katakana voor Japans, en Hangul voor Koreaans.
- Als het document Traditioneel Chinees is, maar het lettertype geen Bopomofo-blok heeft, selecteer dan een lettertype dat dat blok wel bevat, zodat de detectie tot het bedoelde schrift leidt.
- Voer de weergave opnieuw uit.
- Gerelateerd. Exception-referentie.
Item: getagde inhoud levert geen bruikbare structuurboom op
Sectie met titel “Item: getagde inhoud levert geen bruikbare structuurboom op”- Symptoom. Een getagde build produceert geen structuur, of een downstream toegankelijkheidscontrole rapporteert een lege of ontbrekende structuurboom.
- Waarschijnlijke oorzaak. De build heeft inhoud uitgevoerd buiten het taggingpad, waardoor er geen structuurelementen zijn gemaakt. De structuurboom blijft leeg.
- Bewijs / diagnose.
src/Accessibility/StructureTree.phpensrc/Accessibility/TaggedContentEmitter.phpbouwen de structuurboom op uit getagde inhoud. De testtests/Integration/Accessibility/EmptyTaggedPdfDoesNotAdvertisePdfUa2Test.phpbevestigt dat een lege structuurboom geen PDF/UA-2 adverteert. - Oplossing.
- Bevestig dat inhoud via het taggingpad wordt uitgevoerd, zodat er structuurelementen worden gemaakt.
- Controleer of elke marked-content-reeks aan een structuurelement wordt toegewezen.
- Voer de build opnieuw uit en inspecteer de structuurboom.
- Gerelateerd. PDF/A- en PDF/UA-validatie.
Item: taaltag van structuurelement wordt geweigerd
Sectie met titel “Item: taaltag van structuurelement wordt geweigerd”- Symptoom. Een build mislukt omdat een taalwaarde op een structuurelement of op het document geen geldige tag is.
- Waarschijnlijke oorzaak. De opgegeven taal is geen geldige BCP 47-tag. De validator weigert misvormde tags in plaats van ze naar de uitvoer te schrijven.
- Bewijs / diagnose.
src/Accessibility/Bcp47Validator.phpvalideert de tag. Bij een ongeldige tag wordtsrc/Accessibility/InvalidBcp47TagException.phpopgeworpen.tests/Unit/Conformance/PdfUa2Section844LangStrictTest.phptest de strikte PDF/UA-2-taalvereiste. - Oplossing.
- Vervang de taalwaarde door een geldige BCP 47-tag, zoals
en-US,de-DEofzh-Hant-TW. - Stel de taal in op het specifieke structuurelement wanneer een passage afwijkt van de documenttaal.
- Voer de build opnieuw uit.
- Vervang de taalwaarde door een geldige BCP 47-tag, zoals
- Gerelateerd. PDF/A- en PDF/UA-validatie.
Randgevallen en valkuilen
Sectie met titel “Randgevallen en valkuilen”FontNotFoundExceptionenFontParsingExceptionrapporteren verschillende fouten. Niet gevonden betekent dat het bestand niet kon worden bereikt. Parsen betekent dat het bestand wel werd bereikt, maar dat de bytes ervan niet bruikbaar zijn. Lees de exceptionklasse om vast te stellen welke fout zich voordeed.font-subsetinfont_fileis een bewuste markering voor de subsettingfase, geen daadwerkelijk pad. Zoek niet naar een bestand met de naamfont-subset.CjkFontValidatorneemt steekproeven van codepunten in plaats van elk codepunt te controleren, dus het dekkingscijfer is een schatting voor lettertypeselectie, geen byte-exacte audit.- Een lege structuurboom wordt opzettelijk gerapporteerd als niet PDF/UA-2. Dit is het gedocumenteerde gedrag van de engine, geen defect.
Zie ook
Sectie met titel “Zie ook”Woordenlijst: font subsetting · CJK-dekking · structuurboom