estabilidad: Experimental
Compatibilidad con la escritura vertical CJK
De un vistazo
Sección titulada «De un vistazo»Vista previa opcional. El compositor vertical está desactivado por defecto. Cuando está desactivado, el motor representa horizontalmente exactamente como antes —idéntico byte a byte—. Actívelo solo para los documentos que necesitan líneas verticales reales y valide el resultado.
El renderizador de HTML añade un compositor de líneas verticales real para los
modos de escritura CSS writing-mode: vertical-lr y writing-mode: vertical-rl.
Cuando el compositor está activado, los glifos se apilan de arriba abajo con la
colocación por glifo tomada de las métricas verticales reales de la fuente (las
tablas vhea y vmtx), tal como describe el modelo de escritura vertical de PDF
en ISO 32000-2 §9.7.5. Se admiten ambas direcciones de flujo de bloque vertical.
Instalación
Sección titulada «Instalación»composer require nextpdf/core:^3El compositor se incluye en el paquete core. La opción
CssFeatureFlags::$layoutVerticalComposer es @since 6.1.0. La versión del
motor no cambia; la característica es aditiva y está desactivada por defecto.
Panorama conceptual
Sección titulada «Panorama conceptual»La composición vertical se activa solo cuando layoutVerticalLr y
layoutVerticalComposer están ambos establecidos. Con ambos activados, una
secuencia vertical-lr o vertical-rl se compone como una línea vertical real:
cada glifo se coloca por su avance vertical a partir de las métricas
vhea/vmtx de la fuente, y los glifos que UAX #50 marca como verticales se
mantienen verticales. vertical-lr dispone las columnas de izquierda a derecha;
vertical-rl dispone las columnas de derecha a izquierda.
Esto difiere de la fachada de codificación basada en cmap documentada en Componer texto CJK con codificación basada en cmap, que demuestra la ruta de codificación pero no impulsa por sí misma un modo de escritura vertical. Esta página documenta el compositor del lado de la maquetación que habilita la opción de modo de escritura.
Límite de cierre seguro — cuándo compone y qué hace en caso contrario
Sección titulada «Límite de cierre seguro — cuándo compone y qué hace en caso contrario»El compositor es conservador por diseño. Compone una secuencia verticalmente solo cuando todos los glifos de la secuencia son verticales según UAX #50 con métricas verticales reales, no hay ningún enlace abierto dentro de la secuencia y la secuencia es una sola columna. Cuando alguna de esas condiciones no se cumple —el indicador está desactivado, o una secuencia no puede componerse con fidelidad—, el motor repliega a maquetación horizontal y emite un diagnóstico de diferimiento que coincide con el modo:
HTML_WRITING_MODE_LR_DEFERREDpara una secuenciavertical-lrque no pudo componerse.HTML_WRITING_MODE_RL_DEFERREDpara una secuenciavertical-rlque no pudo componerse.
Cada diagnóstico lleva un reason, de modo que un diferimiento es observable y
explicable, nunca una representación horizontal silenciosa de un texto que el
autor pidió disponer verticalmente.
Límites documentados (porciones posteriores)
Sección titulada «Límites documentados (porciones posteriores)»Estos casos quedan fuera del alcance de la porción actual y se siguen para trabajo posterior:
- Glifos rotados (no verticales) dentro de una secuencia vertical.
- Ajuste de línea vertical multicolumna.
- Rectángulos de enlace verticales (un enlace dentro de una secuencia vertical difiere la secuencia).
- No hay ninguna fixture de fuente CJK con métricas verticales incluida en el corpus de pruebas, por lo que la verificación visual cruzada se sigue en lugar de afirmarse mediante un golden incluido.
Superficie de la API
Sección titulada «Superficie de la API»| Símbolo | Ubicación | Función |
|---|---|---|
CssFeatureFlags::$layoutVerticalComposer | src/Html/CssFeatureFlags.php | Indicador opcional para el compositor de líneas verticales (false por defecto). |
CssFeatureFlags::$layoutVerticalLr | src/Html/CssFeatureFlags.php | Compuerta para vertical-lr; ambos deben estar activados para componer. |
Config::withCssFeatureFlags(CssFeatureFlags $flags): self | src/Core/Config.php | Adjunta el conjunto de indicadores a la configuración de un documento. |
Los códigos de diagnóstico de diferimiento HTML_WRITING_MODE_LR_DEFERRED y
HTML_WRITING_MODE_RL_DEFERRED afloran a través del canal de avisos del
resultado de la representación.
Ejemplo de código — Inicio rápido
Sección titulada «Ejemplo de código — Inicio rápido»<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Config;use NextPDF\Core\Document;use NextPDF\Html\Css\CssFeatureFlags;
$config = (new Config())->withCssFeatureFlags(new CssFeatureFlags( layoutVerticalLr: true, layoutVerticalComposer: true,));
$doc = Document::createStandalone($config);$doc->addPage();$doc->writeHtml( '<div style="writing-mode: vertical-rl; font-family: NotoSerifJP;">' . '日本語の縦書き' . '</div>',);$doc->save(__DIR__ . '/vertical.pdf');Una secuencia que no puede componerse con fidelidad se representa horizontalmente
y añade un aviso HTML_WRITING_MODE_RL_DEFERRED con un reason. Inspeccione el
canal de avisos antes de tratar la salida vertical como definitiva.
Ejemplo de código — Producción
Sección titulada «Ejemplo de código — Producción»Registre una fuente que lleve métricas verticales reales a través de
DocumentFactory, para que el compositor pueda leer vhea/vmtx, y luego opte
el documento por el compositor.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Config;use NextPDF\Core\DocumentFactory;use NextPDF\Graphics\ImageRegistry;use NextPDF\Html\Css\CssFeatureFlags;use NextPDF\Typography\FontRegistry;
$fontRegistry = new FontRegistry();$fontRegistry->register('/path/to/NotoSerifJP-Regular.otf', alias: 'NotoSerifJP');
$config = (new Config())->withCssFeatureFlags(new CssFeatureFlags( layoutVerticalLr: true, layoutVerticalComposer: true,));
$factory = new DocumentFactory($fontRegistry, new ImageRegistry(maxCacheBytes: 0));$doc = $factory->create($config);$doc->setLanguage('ja');$doc->addPage();$doc->writeHtml( '<div style="writing-mode: vertical-rl; font-family: NotoSerifJP;">' . '縦書きの本文。' . '</div>',);$doc->save($out);Casos límite y trampas
Sección titulada «Casos límite y trampas»- Ambos indicadores son obligatorios. El compositor necesita
layoutVerticalLrylayoutVerticalComposer. Con cualquiera de ellos desactivado, la secuencia se representa horizontalmente. - Las métricas verticales reales son obligatorias. Una fuente sin
vhea/vmtxno puede impulsar el compositor; la secuencia difiere a maquetación horizontal. - El diferimiento es observable. Una secuencia que no puede componerse emite
HTML_WRITING_MODE_LR_DEFERRED/HTML_WRITING_MODE_RL_DEFERREDcon unreason. Nunca se representa de costado en silencio. - Ninguna reclamación de conformidad desde esta ruta. La composición vertical es una capacidad de maquetación; no es una declaración de conformidad PDF/UA-2 o PDF/A-4 para el archivo producido. Un verificador decide la conformidad.
Rendimiento
Sección titulada «Rendimiento»La composición añade una búsqueda de avance vertical por glifo sobre la
secuencia, lineal en el recuento de glifos. El presupuesto (wall_ms: 2000,
peak_mb: 128) sigue el perfil CJK, porque las fuentes con métricas verticales
son grandes y el coste dominante es el manejo de fuentes, no la pasada de
composición.
Notas de seguridad
Sección titulada «Notas de seguridad»El compositor lee las métricas verticales de fuentes ya registradas y ya validadas. No abre un nuevo canal de entrada. Los archivos de fuente siguen siendo entrada binaria no confiable manejada por la validación existente de la capa de tipografía. El texto compuesto se representa, no se interpreta.
Conformidad
Sección titulada «Conformidad»| Afirmación | Especificación | Cláusula |
|---|---|---|
| La escritura vertical usa las métricas verticales de glifo de CIDFont para la colocación. | ISO 32000-2 | §9.7.5 |
writing-mode: vertical-lr / vertical-rl establecen la dirección de flujo de bloque. | W3C CSS Writing Modes Level 3 | §3 |
| La orientación vertical por glifo sigue la propiedad de orientación vertical de Unicode. | Unicode UAX #50 | Vertical Orientation |
Esta es una implementación de vista previa de un subconjunto vertical de una sola columna con glifos verticales, con los límites de cierre seguro documentados arriba. NextPDF no afirma que la salida de esta ruta se ajuste a ningún perfil; un verificador hace esa determinación. No se reproduce ningún texto de las normas.