Ir al contenido
getnextpdf.com

estabilidad: Experimental

Compatibilidad con la escritura vertical CJK

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.

Ventana de terminal
composer require nextpdf/core:^3

El 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.

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_DEFERRED para una secuencia vertical-lr que no pudo componerse.
  • HTML_WRITING_MODE_RL_DEFERRED para una secuencia vertical-rl que 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.
SímboloUbicaciónFunción
CssFeatureFlags::$layoutVerticalComposersrc/Html/CssFeatureFlags.phpIndicador opcional para el compositor de líneas verticales (false por defecto).
CssFeatureFlags::$layoutVerticalLrsrc/Html/CssFeatureFlags.phpCompuerta para vertical-lr; ambos deben estar activados para componer.
Config::withCssFeatureFlags(CssFeatureFlags $flags): selfsrc/Core/Config.phpAdjunta 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.

<?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.

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);
  • Ambos indicadores son obligatorios. El compositor necesita layoutVerticalLr y layoutVerticalComposer. Con cualquiera de ellos desactivado, la secuencia se representa horizontalmente.
  • Las métricas verticales reales son obligatorias. Una fuente sin vhea/vmtx no 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_DEFERRED con un reason. 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.

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.

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.

AfirmaciónEspecificaciónClá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 #50Vertical 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.