コンテンツにスキップ

HTML からアクセシブルなタグ付き PDF を作成する

このレシピでは、セマンティックな HTML からタグ付き PDF を作成します。NextPDF は、論理構造ツリー、カタログの言語情報、PDF/UA-2 マーカーを出力します。適合性の判定はチェッカーに委ねます。このレシピは examples/31-pdfua2-tagged.php の手順に沿っています。

  • Core がインストール済みであること:composer require nextpdf/core:^3
  • 検証ステップ用の PDF/UA バリデーター。この例では veraPDF を使用します。
  1. ドキュメントを作成します。
  2. まず enableTaggedPdf() に BCP-47 言語タグを指定し、必ず writeHtml() より前に呼び出します。HTML パイプラインは、パーサーの構築時にタグ付きモードを検出し、タグ付きコンテンツ用のエミッターを接続します。
  3. ドキュメントのメタデータ(タイトル、言語)を設定します。setLanguage()enableTaggedPdf() との関係でべき等に動作します。
  4. セマンティックな HTML を記述します。パーサーは、各ブロック要素を構造要素にマッピングします。h1H1 に、pP に、ul/liL/LI に、tableTable/TR/TD にマッピングされます。
  5. 保存し、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 expose
a 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() で囲みます。コンテナー型(TableTRLLI)は、マーク付きコンテンツを持たないグループ化要素になります。リーフ型(PH1H6TD)には MCID が付与されます。
  • サポートは適合性ではありません。 NextPDF は、PDF/UA-2 が必要とする構造メタデータを出力します。また、品質低下を示す警告も提示します。本番環境での最終承認において、外部オラクルで検証する責任は呼び出し側にあります。ファイルが適合していると述べる前に、チェッカーを実行してください。
記述仕様箇条リファレンス ID
実際のコンテンツに必要な論理構造ISO 14289-2§8.2.2
定義されたネストと読み上げ順序に従う構造要素ISO 14289-2§8.2.3

このレシピでは、アクセシブルなオーサリングをサポートするタグ付き構造を生成する方法を示します。これは PDF/UA-2 への適合性を主張するものではありません。適合性を判定するのはチェッカーです。