stabiliteit: Experimenteel
Ondersteuning voor verticaal CJK-schrift
In een oogopslag
Sectie met titel “In een oogopslag”Opt-in preview. De verticale composer staat standaard uit. Wanneer hij uit is, rendert de engine horizontaal precies zoals voorheen — byte-identiek. Zet hem alleen aan voor de documenten die echte verticale lijnen nodig hebben, en valideer het resultaat.
De HTML-renderer voegt een echte verticale lijncomposer toe voor de CSS-writing
modes writing-mode: vertical-lr en writing-mode: vertical-rl. Wanneer de
composer aan staat, stapelen glyphs van boven naar beneden met plaatsing per glyph
genomen uit de echte verticale metrieken van het font (de vhea- en
vmtx-tabellen), zoals het PDF-verticaalschrijfmodel in ISO 32000-2 §9.7.5
beschrijft. Beide verticale blokflowrichtingen worden ondersteund.
Installeren
Sectie met titel “Installeren”composer require nextpdf/core:^3De composer wordt meegeleverd in het core-pakket. De
CssFeatureFlags::$layoutVerticalComposer-opt-in is @since 6.1.0. De engineversie
is onveranderd; de functie is additief en standaard uit.
Conceptueel overzicht
Sectie met titel “Conceptueel overzicht”Verticale compositie schakelt alleen in wanneer zowel layoutVerticalLr als
layoutVerticalComposer zijn ingesteld. Met die aan stelt een vertical-lr- of
vertical-rl-run zich samen als een echte verticale lijn: elke glyph wordt
geplaatst op basis van zijn verticale advance uit de vhea/vmtx-metrieken van het
font, en glyphs die UAX #50 als rechtop markeert blijven rechtop. vertical-lr legt
kolommen van links naar rechts; vertical-rl legt kolommen van rechts naar links.
Dit verschilt van de cmap-bewuste encodingfaçade die wordt gedocumenteerd in CJK-tekst instellen met cmap-bewuste encoding, die het encodingpad bewijst maar zelf geen verticale writing mode aandrijft. Deze pagina documenteert de lay-outzijdecomposer die de writing-mode-opt-in inschakelt.
Fail-closed-grens — wanneer het samenstelt, en wat het anders doet
Sectie met titel “Fail-closed-grens — wanneer het samenstelt, en wat het anders doet”De composer is opzettelijk conservatief. Hij stelt een run alleen verticaal samen wanneer elke glyph in de run UAX #50 rechtop is met echte verticale metrieken, er geen open link binnen de run is, en de run een enkele kolom is. Wanneer een van die zaken niet geldt — de vlag staat uit, of een run kan niet getrouw worden samengesteld — valt de engine terug op horizontale lay-out en geeft een modusbijpassende uitgestelde diagnostiek af:
HTML_WRITING_MODE_LR_DEFERREDvoor eenvertical-lr-run die niet kon worden samengesteld.HTML_WRITING_MODE_RL_DEFERREDvoor eenvertical-rl-run die niet kon worden samengesteld.
Elke diagnostiek draagt een reason, zodat een uitstel observeerbaar en
verklaarbaar is, nooit een stille horizontale render van tekst die de auteur
verticaal wilde zetten.
Gedocumenteerde grenzen (latere delen)
Sectie met titel “Gedocumenteerde grenzen (latere delen)”Deze gevallen vallen buiten het bereik van het huidige deel en worden bijgehouden voor later werk:
- Geroteerde (niet-rechtopstaande) glyphs binnen een verticale run.
- Verticale wrapping over meerdere kolommen.
- Verticale linkrechthoeken (een link binnen een verticale run stelt de run uit).
- Er is geen meegeleverd CJK-fontfixture met verticale metrieken in het testcorpus, dus de visuele kruiscontrole wordt bijgehouden in plaats van bevestigd door een meegeleverde golden.
API-oppervlak
Sectie met titel “API-oppervlak”| Symbool | Locatie | Rol |
|---|---|---|
CssFeatureFlags::$layoutVerticalComposer | src/Html/CssFeatureFlags.php | Opt-in-vlag voor de verticale lijncomposer (standaard false). |
CssFeatureFlags::$layoutVerticalLr | src/Html/CssFeatureFlags.php | Gate voor vertical-lr; beide moeten aan staan om samen te stellen. |
Config::withCssFeatureFlags(CssFeatureFlags $flags): self | src/Core/Config.php | Koppelt de vlaggenset aan een documentconfiguratie. |
De uitgestelde-diagnostiekcodes HTML_WRITING_MODE_LR_DEFERRED en
HTML_WRITING_MODE_RL_DEFERRED verschijnen via het adviseringskanaal van het
renderresultaat.
Codevoorbeeld — Snelle start
Sectie met titel “Codevoorbeeld — Snelle start”<?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');Een run die niet getrouw kan worden samengesteld, rendert horizontaal en voegt een
HTML_WRITING_MODE_RL_DEFERRED-advisering met een reason toe. Inspecteer het
adviseringskanaal voordat je verticale uitvoer als definitief beschouwt.
Codevoorbeeld — Productie
Sectie met titel “Codevoorbeeld — Productie”Registreer een font dat echte verticale metrieken draagt via DocumentFactory,
zodat de composer vhea/vmtx kan lezen, en schakel het document dan in voor de
composer.
<?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);Randgevallen en valkuilen
Sectie met titel “Randgevallen en valkuilen”- Beide vlaggen zijn vereist. De composer heeft
layoutVerticalLrenlayoutVerticalComposernodig. Met een van beide uit rendert de run horizontaal. - Echte verticale metrieken zijn vereist. Een font zonder
vhea/vmtxkan de composer niet aandrijven; de run valt uit naar horizontale lay-out. - Uitstel is observeerbaar. Een run die niet kan worden samengesteld, geeft
HTML_WRITING_MODE_LR_DEFERRED/HTML_WRITING_MODE_RL_DEFERREDaf met eenreason. Hij rendert nooit stilletjes zijwaarts. - Geen conformiteitsclaim uit dit pad. Verticale compositie is een lay-outvermogen; het is geen PDF/UA-2- of PDF/A-4-conformiteitsverklaring voor het geproduceerde bestand. Een checker beslist over conformiteit.
Prestaties
Sectie met titel “Prestaties”Compositie voegt een verticale-advance-opzoeking per glyph over de run toe, lineair
in het aantal glyphs. Het budget (wall_ms: 2000, peak_mb: 128) volgt het
CJK-profiel, omdat fonts met verticale metrieken groot zijn en de dominante kosten
fontverwerking zijn, niet de compositiepass.
Beveiligingsnotities
Sectie met titel “Beveiligingsnotities”De composer leest verticale metrieken uit reeds geregistreerde, reeds gevalideerde fonts. Hij opent geen nieuw invoerkanaal. Fontbestanden blijven niet-vertrouwde binaire invoer die door de bestaande validatie van de typografielaag wordt afgehandeld. Samengestelde tekst wordt gerenderd, niet geïnterpreteerd.
Conformiteit
Sectie met titel “Conformiteit”| Statement | Spec | Clause |
|---|---|---|
| Verticaal schrijven gebruikt verticale CIDFont-glyphmetrieken voor plaatsing. | ISO 32000-2 | §9.7.5 |
writing-mode: vertical-lr / vertical-rl stellen de blokflowrichting in. | W3C CSS Writing Modes Level 3 | §3 |
| Rechtopstaande oriëntatie per glyph volgt de Unicode-verticale-oriëntatie-eigenschap. | Unicode UAX #50 | Vertical Orientation |
Dit is een previewimplementatie van een enkelkoloms rechtopstaande verticale subset met de hierboven gedocumenteerde fail-closed-grenzen. NextPDF beweert niet dat uitvoer uit dit pad voldoet aan enig profiel; een checker maakt die bepaling. Er wordt geen standaardtekst gereproduceerd.