HTML からアクセシブルなタグ付き PDF を作成する
このレシピでは、セマンティックな HTML からタグ付き PDF を作成します。NextPDF は、論理構造ツリー、カタログの言語情報、PDF/UA-2 マーカーを出力します。適合性の判定はチェッカーに委ねます。このレシピは examples/31-pdfua2-tagged.php の手順に沿っています。
- Core がインストール済みであること:
composer require nextpdf/core:^3。 - 検証ステップ用の PDF/UA バリデーター。この例では veraPDF を使用します。
- ドキュメントを作成します。
- まず
enableTaggedPdf()に BCP-47 言語タグを指定し、必ずwriteHtml()より前に呼び出します。HTML パイプラインは、パーサーの構築時にタグ付きモードを検出し、タグ付きコンテンツ用のエミッターを接続します。 - ドキュメントのメタデータ(タイトル、言語)を設定します。
setLanguage()はenableTaggedPdf()との関係でべき等に動作します。 - セマンティックな HTML を記述します。パーサーは、各ブロック要素を構造要素にマッピングします。
h1はH1に、pはPに、ul/liはL/LIに、tableはTable/TR/TDにマッピングされます。 - 保存し、PDF/UA チェッカーで検証します。
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();
// Step 2 — enable tagged mode BEFORE writeHtml(). The lang argument// drives the catalog /Lang entry and the structure tree root language.$doc->enableTaggedPdf(lang: 'en');
// Step 3 — metadata. setLanguage() restates intent; it is idempotent here.$doc->setTitle('Accessible Report');$doc->setLanguage('en');
$doc->addPage();
// Step 4 — semantic HTML. Each block element becomes a StructElem; text// runs are wrapped in BDC/EMC operators with stable MCIDs.$html = <<<'HTML'<h1>Quarterly Accessibility Report</h1><p>This document opts into tagged PDF so assistive technology can exposea meaningful reading order.</p><h2>Findings</h2><ul> <li>Headings carry semantic roles.</li> <li>Lists keep their item structure.</li></ul>HTML;
$doc->writeHtml($html);
$doc->save(__DIR__ . '/accessible.pdf');
echo "Wrote accessible.pdf — validate with: verapdf --flavour ua2 accessible.pdf\n";想定される出力
「想定される出力」という見出しのセクションWrote accessible.pdf — validate with: verapdf --flavour ua2 accessible.pdf出力には、構造ツリー、/MarkInfo << /Marked true >>、カタログの /Lang エントリ、および pdfuaid:part XMP マーカーが含まれます。チェッカーを実行し、これらが存在して内部的に整合していることを確認します。
エッジケース
「エッジケース」という見出しのセクション- 呼び出し順序。
enableTaggedPdf()をwriteHtml()の後に呼び出しても、すでに書き込まれたコンテンツへ遡及的にタグが付与されることはありません。タグ付きモードは先に有効にしてください。 - 言語タグ。 形式が不正な BCP-47 タグを、書き込み時に黙って破棄するのではなく API の境界で拒否したい場合は、第 2 引数として
ConformancePolicy::strictUa2()を渡します。 - べき等な再有効化。
enableTaggedPdf()を 2 回呼び出すと、作成済みの構造ツリーを再構築せずに、言語が更新されます。 - 手動タグ付け。 HTML 以外のコンテンツについては、対象を
beginTag()/endTag()で囲みます。コンテナー型(Table、TR、L、LI)は、マーク付きコンテンツを持たないグループ化要素になります。リーフ型(P、H1–H6、TD)には MCID が付与されます。 - サポートは適合性ではありません。 NextPDF は、PDF/UA-2 が必要とする構造メタデータを出力します。また、品質低下を示す警告も提示します。本番環境での最終承認において、外部オラクルで検証する責任は呼び出し側にあります。ファイルが適合していると述べる前に、チェッカーを実行してください。
| 記述 | 仕様 | 箇条 | リファレンス ID |
|---|---|---|---|
| 実際のコンテンツに必要な論理構造 | ISO 14289-2 | §8.2.2 | |
| 定義されたネストと読み上げ順序に従う構造要素 | ISO 14289-2 | §8.2.3 |
このレシピでは、アクセシブルなオーサリングをサポートするタグ付き構造を生成する方法を示します。これは PDF/UA-2 への適合性を主張するものではありません。適合性を判定するのはチェッカーです。