Перейти к содержимому
getnextpdf.com

стабильность: Экспериментальная

Поддержка вертикального письма CJK

Подключаемое превью. Вертикальный компоновщик по умолчанию выключен. Когда он выключен, движок рендерит горизонтально точно как раньше — побайтово идентично. Включайте его только для документов, которым нужны настоящие вертикальные строки, и проверяйте результат.

Рендерер HTML добавляет настоящий вертикальный компоновщик строк для режимов письма CSS writing-mode: vertical-lr и writing-mode: vertical-rl. Когда компоновщик включён, глифы складываются сверху вниз с поглифным размещением, взятым из настоящих вертикальных метрик шрифта (таблиц vhea и vmtx), как описывает модель вертикального письма PDF в ISO 32000-2 §9.7.5. Поддерживаются оба направления вертикального блочного потока.

Окно терминала
composer require nextpdf/core:^3

Компоновщик поставляется в пакете core. Подключаемая опция CssFeatureFlags::$layoutVerticalComposer помечена @since 6.1.0. Версия движка не меняется; функция аддитивна и по умолчанию выключена.

Вертикальная компоновка включается только тогда, когда установлены и layoutVerticalLr, и layoutVerticalComposer. С ними включёнными прогон vertical-lr или vertical-rl компонуется как настоящая вертикальная строка: каждый глиф размещается по своему вертикальному продвижению из метрик vhea/vmtx шрифта, а глифы, которые UAX #50 помечает как прямостоящие, сохраняются прямостоящими. vertical-lr укладывает колонки слева направо; vertical-rl укладывает колонки справа налево.

Это отличается от фасада кодирования с учётом cmap, описанного в Установка текста CJK с кодированием с учётом cmap, который доказывает путь кодирования, но сам по себе не управляет режимом вертикального письма. Эта страница описывает компоновщик на стороне вёрстки, который включается подключаемой опцией writing-mode.

Граница с отказом закрытием — когда он компонует и что делает в противном случае

Заголовок раздела «Граница с отказом закрытием — когда он компонует и что делает в противном случае»

Компоновщик консервативен по замыслу. Он компонует прогон вертикально только тогда, когда каждый глиф в прогоне прямостоящий по UAX #50 с настоящими вертикальными метриками, внутри прогона нет открытой ссылки и прогон — это одна колонка. Когда что-либо из этого не выполняется — флаг выключен или прогон нельзя скомпоновать точно — движок откатывается к горизонтальной вёрстке и выдаёт отложенную диагностику, соответствующую режиму:

  • HTML_WRITING_MODE_LR_DEFERRED для прогона vertical-lr, который не удалось скомпоновать.
  • HTML_WRITING_MODE_RL_DEFERRED для прогона vertical-rl, который не удалось скомпоновать.

Каждая диагностика несёт reason, поэтому отложенность наблюдаема и объяснима, а не молчаливый горизонтальный рендеринг текста, который автор просил набрать вертикально.

Задокументированные границы (последующие слои)

Заголовок раздела «Задокументированные границы (последующие слои)»

Эти случаи вне области текущего слоя и отслеживаются для дальнейшей работы:

  • Повёрнутые (непрямостоящие) глифы внутри вертикального прогона.
  • Многоколоночный вертикальный перенос.
  • Вертикальные прямоугольники ссылок (ссылка внутри вертикального прогона откладывает прогон).
  • В тестовом корпусе нет встроенного фикстура-шрифта CJK с вертикальными метриками, поэтому визуальная сверка отслеживается, а не утверждается встроенным эталоном.
СимволРасположениеРоль
CssFeatureFlags::$layoutVerticalComposersrc/Html/CssFeatureFlags.phpПодключаемый флаг для вертикального компоновщика строк (по умолчанию false).
CssFeatureFlags::$layoutVerticalLrsrc/Html/CssFeatureFlags.phpЗатвор для vertical-lr; оба должны быть включены, чтобы компоновать.
Config::withCssFeatureFlags(CssFeatureFlags $flags): selfsrc/Core/Config.phpПрисоединяет набор флагов к конфигурации документа.

Коды отложенной диагностики HTML_WRITING_MODE_LR_DEFERRED и HTML_WRITING_MODE_RL_DEFERRED проявляются через консультативный канал результата рендеринга.

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

Прогон, который нельзя скомпоновать точно, рендерится горизонтально и добавляет консультативное сообщение HTML_WRITING_MODE_RL_DEFERRED с reason. Проверяйте консультативный канал, прежде чем считать вертикальный вывод окончательным.

Зарегистрируйте шрифт, несущий настоящие вертикальные метрики, через DocumentFactory, чтобы компоновщик мог считать vhea/vmtx, затем подключите документ к компоновщику.

<?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);
  • Нужны оба флага. Компоновщику требуются layoutVerticalLr и layoutVerticalComposer. С любым выключенным прогон рендерится горизонтально.
  • Нужны настоящие вертикальные метрики. Шрифт без vhea/vmtx не может управлять компоновщиком; прогон откладывается к горизонтальной вёрстке.
  • Отложенность наблюдаема. Прогон, который нельзя скомпоновать, выдаёт HTML_WRITING_MODE_LR_DEFERRED / HTML_WRITING_MODE_RL_DEFERRED с reason. Он никогда не рендерится боком молча.
  • Этот путь не даёт заявления о соответствии. Вертикальная компоновка — это возможность вёрстки; это не утверждение о соответствии PDF/UA-2 или PDF/A-4 для созданного файла. Соответствие определяет проверяющая программа.

Компоновка добавляет поглифный поиск вертикального продвижения по прогону, линейный по числу глифов. Бюджет (wall_ms: 2000, peak_mb: 128) следует профилю CJK, потому что шрифты с вертикальными метриками велики, и основная стоимость — обработка шрифта, а не проход компоновки.

Компоновщик считывает вертикальные метрики из уже зарегистрированных, уже проверенных шрифтов. Он не открывает новый канал ввода. Файлы шрифтов остаются недоверенным бинарным вводом, обрабатываемым существующей валидацией слоя типографики. Скомпонованный текст рендерится, а не интерпретируется.

УтверждениеСпецификацияРаздел
Вертикальное письмо использует вертикальные метрики глифов CIDFont для размещения.ISO 32000-2§9.7.5
writing-mode: vertical-lr / vertical-rl задают направление блочного потока.W3C CSS Writing Modes Level 3§3
Поглифная прямостоящая ориентация следует свойству вертикальной ориентации Unicode.Unicode UAX #50Vertical Orientation

Это превью-реализация одноколоночного прямостоящего вертикального подмножества с задокументированными выше границами с отказом закрытием. NextPDF не утверждает, что вывод из этого пути соответствует какому-либо профилю; это определяет проверяющая программа. Текст стандартов не воспроизводится.