Solución de problemas: fuentes, creación de subconjuntos y etiquetado
Alcance
Sección titulada «Alcance»Estas entradas cubren los fallos de resolución y análisis de fuentes que el motor lanza mediante NextPDF\Exception\FontNotFoundException y NextPDF\Exception\FontParsingException. También cubren el diagnóstico de cobertura CJK y los problemas del árbol de estructura que afectan a la salida etiquetada. Cada entrada indica la excepción o la prueba exacta para poder confirmar la causa.
Entrada: fuente no encontrada
Sección titulada «Entrada: fuente no encontrada»- Síntoma.
FontNotFoundExceptioncon un mensaje de la formaFont "<name>" not found. Searched: [<paths>]. - Causa probable. La familia de fuentes o la ruta de archivo solicitada no existen o no se pueden leer, o el directorio de fuentes configurado no es accesible. Los datos de la fuente pueden ser válidos, pero el motor no puede acceder a ellos.
- Evidencia y diagnóstico.
getContext()devuelvefont_name,search_pathsyfallback_attempted. Consultarsearch_pathspermite ver todas las ubicaciones que el motor intentó. Consultarfallback_attemptedpermite saber si ya se intentó un respaldo. - Resolución.
- Comparar el
font_namesolicitado con el archivo que existe realmente. - Agregar el directorio que contiene la fuente al directorio de fuentes configurado o corregir la ruta indicada.
- Verificar que el usuario del entorno de ejecución pueda leer el archivo.
- Volver a ejecutar la llamada.
- Comparar el
- Relacionado. Referencia de excepciones.
Entrada: el archivo de fuente no se puede analizar
Sección titulada «Entrada: el archivo de fuente no se puede analizar»- Síntoma.
FontParsingExceptioncon un mensaje de la formaFailed to parse font file "<file>": <reason>. - Causa probable. El archivo de fuente se encontró, pero su contenido no es utilizable: puede tener un encabezado truncado, un directorio de tablas no válido o faltar una tabla obligatoria como
head,hheauOS/2. - Evidencia y diagnóstico.
getContext()devuelvefont_fileyparse_error. El campoparse_errorindica el problema estructural. - Resolución.
- Leer
parse_errorpara identificar el defecto estructural. - Reemplazar el archivo de fuente por una copia en buen estado del mismo tipo de letra.
- Volver a ejecutar la llamada.
- Leer
- Relacionado. Referencia de excepciones.
Entrada: la creación de subconjuntos falla por una tabla de fuente malformada
Sección titulada «Entrada: la creación de subconjuntos falla por una tabla de fuente malformada»- Síntoma.
FontParsingExceptioncon un valor defont_filedefont-subsety unparse_errorcomoInvalid head table: too short,Invalid hhea table: too short,Invalid maxp table: too shortoFailed to unpack font data. - Causa probable. La fuente superó la carga inicial, pero alguna tabla necesaria para la creación de subconjuntos está truncada o no se puede desempaquetar. El generador de subconjuntos rechaza la fuente en lugar de emitir un subconjunto dañado.
- Evidencia y diagnóstico. Cuando una tabla
head,hheaomaxpes demasiado corta o falla un desempaquetado,src/Typography/FontSubsetter.phplanzaFontParsingExceptioncon el token literalfont-subsetcomo nombre de archivo. El token indica que el fallo se produjo en la etapa de creación de subconjuntos, no durante la carga inicial. - Resolución.
- Reemplazar la fuente de origen por una copia no truncada del mismo tipo de letra.
- Si la fuente la genera una herramienta de compilación, volver a generarla y verificar que las tablas
head,hheaymaxpestén completas. - Volver a ejecutar la compilación.
- Relacionado. Validación de PDF/A y PDF/UA.
Entrada: el texto CJK se renderiza con glifos faltantes
Sección titulada «Entrada: el texto CJK se renderiza con glifos faltantes»- Síntoma. El texto en chino, japonés o coreano se renderiza con cuadros en blanco o caracteres faltantes, y hay dudas sobre la cobertura CJK de la fuente.
- Causa probable. La fuente seleccionada no cubre los bloques Unicode que requiere la escritura. Cada escritura CJK necesita bloques específicos además de los bloques de ideogramas compartidos.
- Evidencia y diagnóstico.
src/Typography/CjkFontValidator.phpproporcionavalidateCoverage(FontInfo $font, CjkScript $script). Devuelve unCjkCoverageResultcon el porcentaje de cobertura y los bloques que quedan por debajo del umbral de informe del 50%. El validador muestrea puntos de código: sirve como diagnóstico y no modifica la carga de fuentes. - Resolución.
- Ejecutar
CjkFontValidator::validateCoverage()para la fuente y la escritura de destino. - Consultar los
missingRangespara ver qué bloques están sin cubrir; por ejemplo, Bopomofo para chino tradicional, Hiragana y Katakana para japonés, sílabas Hangul para coreano. - Seleccionar una fuente que cubra esos bloques o agregar una fuente de respaldo que lo haga.
- Volver a renderizar y comprobar de nuevo la cobertura.
- Ejecutar
- Relacionado. Referencia de excepciones.
Entrada: el CMap predefinido no coincide con la escritura CJK
Sección titulada «Entrada: el CMap predefinido no coincide con la escritura CJK»- Síntoma. El texto CJK se asigna a los glifos equivocados, o se selecciona un CMap predefinido que no corresponde al idioma del documento.
- Causa probable. La escritura detectada determina el nombre del CMap predefinido de Adobe. Una fuente que solo cubre el bloque de ideogramas compartido, sin ningún bloque específico de la escritura, se detecta como chino simplificado por diseño.
- Evidencia y diagnóstico.
CjkFontValidator::detectScript()devuelve la escritura detectada, yresolvePredefinedCMapName()hace la asignación correspondiente: chino simplificado aUniGB-UTF16-H, chino tradicional aUniCNS-UTF16-H, japonés aUniJIS-UTF16-H, coreano aUniKS-UTF16-H. Si no hay ningún bloque específico de la escritura, la detección recurre al chino simplificado. - Resolución.
- Confirmar que la fuente incluya el bloque específico de la escritura: Bopomofo para chino tradicional, Hiragana o Katakana para japonés, Hangul para coreano.
- Si el documento es chino tradicional pero la fuente no incluye el bloque Bopomofo, seleccionar una que sí lo haga para que la detección resuelva la escritura prevista.
- Volver a renderizar.
- Relacionado. Referencia de excepciones.
Entrada: el contenido etiquetado no produce un árbol de estructura utilizable
Sección titulada «Entrada: el contenido etiquetado no produce un árbol de estructura utilizable»- Síntoma. Una compilación etiquetada no genera ninguna estructura, o una comprobación de accesibilidad posterior indica que el árbol de estructura está vacío o falta.
- Causa probable. El contenido se emitió sin pasar por la ruta de etiquetado; por eso no se crearon elementos de estructura. El árbol de estructura queda vacío.
- Evidencia y diagnóstico.
src/Accessibility/StructureTree.phpysrc/Accessibility/TaggedContentEmitter.phpconstruyen el árbol de estructura a partir del contenido etiquetado. La pruebatests/Integration/Accessibility/EmptyTaggedPdfDoesNotAdvertisePdfUa2Test.phpconfirma que un árbol de estructura vacío no anuncia PDF/UA-2. - Resolución.
- Confirmar que el contenido se emita por la ruta de etiquetado para que se creen los elementos de estructura.
- Verificar que cada secuencia de contenido marcado se asigne a un elemento de estructura.
- Volver a ejecutar la compilación e inspeccionar el árbol de estructura.
- Relacionado. Validación de PDF/A y PDF/UA.
Entrada: se rechaza la etiqueta de idioma de un elemento de estructura
Sección titulada «Entrada: se rechaza la etiqueta de idioma de un elemento de estructura»- Síntoma. Una compilación falla porque el valor de idioma de un elemento de estructura o del documento no es una etiqueta válida.
- Causa probable. El valor de idioma proporcionado no es una etiqueta BCP-47 válida. El validador rechaza las etiquetas malformadas en lugar de emitirlas.
- Evidencia y diagnóstico.
src/Accessibility/Bcp47Validator.phpvalida la etiqueta. Si la etiqueta no es válida, se lanzasrc/Accessibility/InvalidBcp47TagException.php. El requisito estricto de idioma de PDF/UA-2 se prueba mediantetests/Unit/Conformance/PdfUa2Section844LangStrictTest.php. - Resolución.
- Reemplazar el valor de idioma por una etiqueta BCP-47 válida, por ejemplo
en-US,de-DEozh-Hant-TW. - Establecer el idioma en el elemento de estructura específico cuando un pasaje difiere del idioma del documento.
- Volver a ejecutar la compilación.
- Reemplazar el valor de idioma por una etiqueta BCP-47 válida, por ejemplo
- Relacionado. Validación de PDF/A y PDF/UA.
Casos límite y trampas
Sección titulada «Casos límite y trampas»FontNotFoundExceptionyFontParsingExceptionson distintas. Una fuente no encontrada significa que no se pudo acceder al archivo. Un error de análisis significa que se accedió al archivo, pero sus bytes no son utilizables. Consultar la clase permite saber cuál es.- El valor
font-subsetenfont_filees un marcador deliberado para la etapa de creación de subconjuntos, no una ruta real. No buscar un archivo llamadofont-subset. CjkFontValidatormuestrea puntos de código en lugar de comprobarlos todos, por lo que su cifra de cobertura es una estimación adecuada para la selección de fuentes, no una auditoría exacta byte a byte.- Un árbol de estructura vacío se informa como no conforme con PDF/UA-2 por diseño. Este es el comportamiento documentado del motor, no un defecto.
Ver también
Sección titulada «Ver también»Glosario: creación de subconjunto de fuentes · cobertura CJK · árbol de estructura