Ga naar inhoud
getnextpdf.com

stabiliteit: Experimenteel

Ondersteuning voor verticaal CJK-schrift

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.

Terminal window
composer require nextpdf/core:^3

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

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_DEFERRED voor een vertical-lr-run die niet kon worden samengesteld.
  • HTML_WRITING_MODE_RL_DEFERRED voor een vertical-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.

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.
SymboolLocatieRol
CssFeatureFlags::$layoutVerticalComposersrc/Html/CssFeatureFlags.phpOpt-in-vlag voor de verticale lijncomposer (standaard false).
CssFeatureFlags::$layoutVerticalLrsrc/Html/CssFeatureFlags.phpGate voor vertical-lr; beide moeten aan staan om samen te stellen.
Config::withCssFeatureFlags(CssFeatureFlags $flags): selfsrc/Core/Config.phpKoppelt 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.

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

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);
  • Beide vlaggen zijn vereist. De composer heeft layoutVerticalLr en layoutVerticalComposer nodig. Met een van beide uit rendert de run horizontaal.
  • Echte verticale metrieken zijn vereist. Een font zonder vhea/vmtx kan 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_DEFERRED af met een reason. 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.

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.

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.

StatementSpecClause
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 #50Vertical 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.