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.
Installation
Section intitulée « Installation »composer require nextpdf/core:^3Le 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.
Aperçu conceptuel
Section intitulée « Aperçu conceptuel »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_DEFERREDpour une séquencevertical-lrqui n’a pas pu être composée.HTML_WRITING_MODE_RL_DEFERREDpour une séquencevertical-rlqui 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.
Frontières documentées (tranches ultérieures)
Section intitulée « Frontières documentées (tranches ultérieures) »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.
Surface d’API
Section intitulée « Surface d’API »| Symbole | Emplacement | Rôle |
|---|---|---|
CssFeatureFlags::$layoutVerticalComposer | src/Html/CssFeatureFlags.php | Indicateur opt-in pour le compositeur de ligne vertical (par défaut false). |
CssFeatureFlags::$layoutVerticalLr | src/Html/CssFeatureFlags.php | Verrou pour vertical-lr ; les deux doivent être activés pour composer. |
Config::withCssFeatureFlags(CssFeatureFlags $flags): self | src/Core/Config.php | Attache 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.
Exemple de code — Démarrage rapide
Section intitulée « Exemple de code — Démarrage rapide »<?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.
Exemple de code — Production
Section intitulée « Exemple de code — Production »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);Cas limites et pièges
Section intitulée « Cas limites et pièges »- Les deux indicateurs sont requis. Le compositeur a besoin de
layoutVerticalLretlayoutVerticalComposer. 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/vmtxne 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_DEFERREDavec unereason. 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é.
Performance
Section intitulée « Performance »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.
Notes de sécurité
Section intitulée « Notes de sécurité »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é.
Conformité
Section intitulée « Conformité »| Énoncé | Spécification | Clause |
|---|---|---|
| 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 #50 | Vertical 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.