Aller au contenu
getnextpdf.com

stabilité: Expérimental

Prise en charge de l’écriture verticale CJK

Prévisualisation opt-in. Le compositeur vertical est désactivé par défaut. Lorsqu’il est désactivé, le moteur effectue le rendu horizontalement exactement comme avant — octet pour octet identique. Ne l’activez que pour les documents qui ont besoin de véritables lignes verticales, et validez le résultat.

Le moteur de rendu HTML ajoute un véritable compositeur de ligne vertical pour les modes d’écriture CSS writing-mode: vertical-lr et writing-mode: vertical-rl. Lorsque le compositeur est activé, les glyphes s’empilent de haut en bas avec un placement par glyphe pris dans les métriques verticales réelles de la police (les tables vhea et vmtx), comme le décrit le modèle d’écriture verticale PDF d’ISO 32000-2 §9.7.5. Les deux directions de flux de bloc verticales sont prises en charge.

Fenêtre de terminal
composer require nextpdf/core:^3

Le compositeur est livré dans le paquet core. L’opt-in CssFeatureFlags::$layoutVerticalComposer est @since 6.1.0. La version du moteur est inchangée ; la fonctionnalité est additive et désactivée par défaut.

La composition verticale ne s’active que lorsque layoutVerticalLr et layoutVerticalComposer sont tous deux activés. Avec eux activés, une séquence vertical-lr ou vertical-rl se compose comme une véritable ligne verticale : chaque glyphe est placé selon son avance verticale issue des métriques vhea/vmtx de la police, et les glyphes qu’UAX #50 marque comme droits sont conservés droits. vertical-lr dispose les colonnes de gauche à droite ; vertical-rl dispose les colonnes de droite à gauche.

Cela diffère de la façade d’encodage tenant compte du cmap documentée dans Composer du texte CJK avec un encodage tenant compte du cmap, qui éprouve le chemin d’encodage mais ne pilote pas elle-même un mode d’écriture vertical. Cette page documente le compositeur côté mise en page que l’opt-in du mode d’écriture active.

Frontière fail-closed — quand il compose, et ce qu’il fait sinon

Section intitulée « Frontière fail-closed — quand il compose, et ce qu’il fait sinon »

Le compositeur est conservateur par conception. Il ne compose une séquence verticalement que lorsque chaque glyphe de la séquence est droit selon UAX #50 avec de véritables métriques verticales, qu’il n’y a aucun lien ouvert à l’intérieur de la séquence, et que la séquence forme une seule colonne. Lorsque l’une de ces conditions n’est pas remplie — l’indicateur est désactivé, ou une séquence ne peut pas être composée fidèlement — le moteur se replie sur une mise en page horizontale et émet un diagnostic de report correspondant au mode :

  • HTML_WRITING_MODE_LR_DEFERRED pour une séquence vertical-lr qui n’a pas pu être composée.
  • HTML_WRITING_MODE_RL_DEFERRED pour une séquence vertical-rl qui n’a pas pu être composée.

Chaque diagnostic porte une reason, de sorte qu’un report est observable et explicable, jamais un rendu horizontal silencieux d’un texte que l’auteur a demandé de composer verticalement.

Ces cas sortent du cadre de la tranche actuelle et sont suivis pour un travail ultérieur :

  • Glyphes pivotés (non droits) à l’intérieur d’une séquence verticale.
  • Renvoi à la ligne vertical multi-colonnes.
  • Rectangles de lien verticaux (un lien à l’intérieur d’une séquence verticale reporte la séquence).
  • Il n’existe pas de fixture de police CJK à métriques verticales fournie dans le corpus de tests, de sorte que la vérification visuelle croisée est suivie plutôt qu’attestée par un golden fourni.
SymboleEmplacementRôle
CssFeatureFlags::$layoutVerticalComposersrc/Html/CssFeatureFlags.phpIndicateur opt-in pour le compositeur de ligne vertical (par défaut false).
CssFeatureFlags::$layoutVerticalLrsrc/Html/CssFeatureFlags.phpVerrou pour vertical-lr ; les deux doivent être activés pour composer.
Config::withCssFeatureFlags(CssFeatureFlags $flags): selfsrc/Core/Config.phpAttache l’ensemble d’indicateurs à une configuration de document.

Les codes de diagnostic de report HTML_WRITING_MODE_LR_DEFERRED et HTML_WRITING_MODE_RL_DEFERRED remontent par le canal consultatif du résultat de rendu.

<?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');

Une séquence qui ne peut pas être composée fidèlement est rendue horizontalement et ajoute un avis HTML_WRITING_MODE_RL_DEFERRED avec une reason. Inspectez le canal consultatif avant de considérer la sortie verticale comme finale.

Enregistrez une police qui porte de véritables métriques verticales via DocumentFactory, afin que le compositeur puisse lire vhea/vmtx, puis faites entrer le document dans le compositeur.

<?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);
  • Les deux indicateurs sont requis. Le compositeur a besoin de layoutVerticalLr et layoutVerticalComposer. Avec l’un ou l’autre désactivé, la séquence est rendue horizontalement.
  • De véritables métriques verticales sont requises. Une police sans vhea/vmtx ne peut pas piloter le compositeur ; la séquence est reportée vers une mise en page horizontale.
  • Le report est observable. Une séquence qui ne peut pas être composée émet HTML_WRITING_MODE_LR_DEFERRED / HTML_WRITING_MODE_RL_DEFERRED avec une reason. Elle n’est jamais silencieusement rendue de côté.
  • Aucune revendication de conformité depuis ce chemin. La composition verticale est une capacité de mise en page ; ce n’est pas un énoncé de conformité PDF/UA-2 ou PDF/A-4 pour le fichier produit. C’est un vérificateur qui décide de la conformité.

La composition ajoute une recherche d’avance verticale par glyphe sur la séquence, linéaire en nombre de glyphes. Le budget (wall_ms: 2000, peak_mb: 128) suit le profil CJK, car les polices à métriques verticales sont volumineuses et le coût dominant est le traitement de police, pas la passe de composition.

Le compositeur lit les métriques verticales depuis des polices déjà enregistrées et déjà validées. Il n’ouvre pas de nouveau canal d’entrée. Les fichiers de police restent une entrée binaire non fiable traitée par la validation existante de la couche typographique. Le texte composé est rendu, pas interprété.

ÉnoncéSpécificationClause
L’écriture verticale utilise les métriques de glyphe verticales de CIDFont pour le placement.ISO 32000-2§9.7.5
writing-mode: vertical-lr / vertical-rl définissent la direction du flux de bloc.W3C CSS Writing Modes Level 3§3
L’orientation droite par glyphe suit la propriété d’orientation verticale Unicode.Unicode UAX #50Vertical Orientation

Il s’agit d’une implémentation de prévisualisation d’un sous-ensemble vertical droit à une seule colonne avec les frontières fail-closed documentées ci-dessus. NextPDF n’affirme pas que la sortie de ce chemin se conforme à un quelconque profil ; c’est un vérificateur qui en décide. Aucun texte de norme n’est reproduit.