콘텐츠로 이동
getnextpdf.com

안정성: 실험적

CJK 세로 쓰기 지원

옵트인 프리뷰. 세로 조판기는 기본적으로 꺼져 있습니다. 꺼져 있으면 엔진은 이전과 똑같이 가로로 렌더링합니다 — 바이트 단위로 동일합니다. 실제 세로 줄이 필요한 문서에 대해서만 켜고, 결과를 검증하세요.

HTML 렌더러는 CSS 쓰기 모드 writing-mode: vertical-lrwriting-mode: vertical-rl을 위한 실제 세로 줄 조판기를 추가합니다. 조판기가 켜져 있으면, 글리프는 폰트의 실제 세로 메트릭(vheavmtx 테이블)에서 가져온 글리프별 배치로 위에서 아래로 쌓입니다. 이는 ISO 32000-2 §9.7.5의 PDF 세로 쓰기 모델이 설명하는 바와 같습니다. 두 세로 블록 흐름 방향이 모두 지원됩니다.

Terminal window
composer require nextpdf/core:^3

조판기는 코어 패키지에 포함되어 제공됩니다. CssFeatureFlags::$layoutVerticalComposer 옵트인은 @since 6.1.0입니다. 엔진 버전은 변경되지 않습니다. 이 기능은 추가적이며 기본적으로 꺼져 있습니다.

세로 조판은 layoutVerticalLrlayoutVerticalComposer가 모두 설정되었을 때만 켜집니다. 두 가지가 켜져 있으면, vertical-lr 또는 vertical-rl 런은 실제 세로 줄로 조판됩니다. 각 글리프는 폰트의 vhea/vmtx 메트릭에서 가져온 세로 어드밴스로 배치되고, UAX #50이 정립(upright)으로 표시한 글리프는 정립으로 유지됩니다. vertical-lr은 열을 왼쪽에서 오른쪽으로 배치하고, vertical-rl은 열을 오른쪽에서 왼쪽으로 배치합니다.

이것은 cmap 인식 인코딩으로 CJK 텍스트 설정하기에 문서화된 cmap 인식 인코딩 파사드와 다릅니다. 그쪽은 인코딩 경로를 입증하지만, 그 자체로 세로 쓰기 모드를 구동하지는 않습니다. 이 페이지는 쓰기 모드 옵트인이 활성화하는 레이아웃 측 조판기를 문서화합니다.

Fail-closed 경계 — 언제 조판하고, 그렇지 않으면 무엇을 하는가

섹션 제목: “Fail-closed 경계 — 언제 조판하고, 그렇지 않으면 무엇을 하는가”

조판기는 설계상 보수적입니다. 런 안의 모든 글리프가 실제 세로 메트릭을 갖춘 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 어드바이저리를 추가합니다. 세로 출력을 최종으로 취급하기 전에 어드바이저리 채널을 확인하세요.

조판기가 vhea/vmtx를 읽을 수 있도록 DocumentFactory를 통해 실제 세로 메트릭을 지닌 폰트를 등록한 다음, 문서를 조판기로 옵트인합니다.

<?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: 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 UAX #50Vertical Orientation

이는 위에 문서화된 fail-closed 경계를 갖춘 단일 열 정립 세로 부분집합의 프리뷰 구현입니다. NextPDF는 이 경로의 출력이 어떤 프로파일에든 적합하다고 단언하지 않습니다. 그 판정은 검사기가 내립니다. 표준 텍스트는 재현되지 않습니다.