コンテンツにスキップ
getnextpdf.com

安定性: 実験的

CJK 縦書きのサポート

オプトインのプレビュー。 縦書きコンポーザーはデフォルトでオフです。オフのとき、 エンジンは従来とまったく同じく横書きでレンダリングします — バイト単位で同一です。本物の縦書き行を必要とするドキュメントに限ってオンにし、結果を検証してください。

HTML レンダラーは、CSS の書字方向 writing-mode: vertical-lrwriting-mode: vertical-rl のための本物の縦書き行コンポーザーを追加します。コンポーザーがオンのとき、ISO 32000-2 §9.7.5 が記述する PDF の縦書きモデルに従い、グリフは上から下へ積み重なり、グリフごとの配置はフォントの本物の縦書きメトリクス(vhea テーブルと vmtx テーブル)から取得されます。両方の縦方向のブロックフロー方向がサポートされます。

Terminal window
composer require nextpdf/core:^3

コンポーザーは core パッケージに同梱されています。CssFeatureFlags::$layoutVerticalComposer のオプトインは @since 6.1.0 です。エンジンのバージョンは変更されません。この機能は追加的で、デフォルトでオフです。

縦書きコンポジションは、layoutVerticalLrlayoutVerticalComposer の両方が設定されたときにのみオンになります。これらがオンのとき、vertical-lr または vertical-rl のランは本物の縦書き行としてコンポジションされます。各グリフはフォントの vhea/vmtx メトリクスから得た縦方向のアドバンスによって配置され、UAX #50 が直立とマークするグリフは直立のまま保たれます。vertical-lr は列を左から右へ配置し、vertical-rl は列を右から左へ配置します。

これは、cmap 対応エンコーディングで CJK テキストを設定する で文書化されている cmap 対応エンコーディングファサードとは異なります。ファサードはエンコーディングパスを実証しますが、それ自体は縦書きモードを駆動しません。このページは、書字方向のオプトインが有効にするレイアウト側のコンポーザーを文書化します。

フェイルクローズ境界 — コンポジションする場合と、それ以外で行う処理

「フェイルクローズ境界 — コンポジションする場合と、それ以外で行う処理」という見出しのセクション

コンポーザーは設計上、保守的です。ランをコンポジションするのは、ランの中のすべてのグリフが UAX #50 で直立かつ本物の縦書きメトリクスを持ち、ラン内に開いているリンクがなく、ランが単一列である場合に限られます。これらのいずれかが成立しないとき — フラグがオフであるか、ランが忠実にコンポジションできないとき — エンジンは横書きレイアウトにフォールバックし、モードに対応した延期診断を発行します。

  • コンポジションできなかった vertical-lr ランには HTML_WRITING_MODE_LR_DEFERRED
  • コンポジションできなかった vertical-rl ランには HTML_WRITING_MODE_RL_DEFERRED

各診断は reason を伴うため、延期は観測可能かつ説明可能であり、作者が縦に組むよう求めたテキストを暗黙のうちに横書きでレンダリングすることは決してありません。

これらのケースは現在のスライスの対象外であり、後続作業として追跡されています。

  • 縦書きラン内の回転(非直立)グリフ。
  • 複数列の縦書き折り返し。
  • 縦書きのリンク矩形(縦書きラン内のリンクはそのランを延期させる)。
  • テストコーパスにバンドルされた縦書きメトリクス付き CJK フォントのフィクスチャがないため、視覚的なクロスチェックはバンドルされたゴールデンで表明されるのではなく追跡されています。
シンボル場所役割
CssFeatureFlags::$layoutVerticalComposersrc/Html/CssFeatureFlags.php縦書き行コンポーザーのオプトインフラグ(デフォルト false)。
CssFeatureFlags::$layoutVerticalLrsrc/Html/CssFeatureFlags.phpvertical-lr のゲート。コンポジションには両方がオンである必要がある。
Config::withCssFeatureFlags(CssFeatureFlags $flags): selfsrc/Core/Config.phpフラグ集合をドキュメント設定にアタッチする。

延期診断コード HTML_WRITING_MODE_LR_DEFERREDHTML_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');

忠実にコンポジションできないランは横書きでレンダリングされ、reason 付きの HTML_WRITING_MODE_RL_DEFERRED アドバイザリを追加します。縦書き出力を最終とみなす前にアドバイザリチャンネルを確認してください。

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);
  • 両方のフラグが必須です。 コンポーザーには layoutVerticalLrlayoutVerticalComposer が必要です。いずれかがオフだと、ランは横書きでレンダリングされます。
  • 本物の縦書きメトリクスが必須です。 vhea/vmtx を持たないフォントはコンポーザーを駆動できず、 ランは横書きレイアウトに延期されます。
  • 延期は観測可能です。 コンポジションできないランは reason 付きで HTML_WRITING_MODE_LR_DEFERRED / HTML_WRITING_MODE_RL_DEFERRED を発行します。暗黙のうちに横向きでレンダリングすることは決してありません。
  • このパスからは適合性を主張しません。 縦書きコンポジションはレイアウト機能であり、生成されたファイルに対する PDF/UA-2 や PDF/A-4 の適合性記述ではありません。適合性はチェッカーが判定します。

コンポジションは、ランに対してグリフごとの縦アドバンス参照を追加し、グリフ数に対して線形です。予算 (wall_ms: 2000peak_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 は、このパスからの出力がいかなるプロファイルにも適合するとは主張しません。その判定はチェッカーが行います。規格本文の複製は行っていません。