ข้ามไปยังเนื้อหา
getnextpdf.com

สร้าง PDF ที่แท็กไว้เพื่อการเข้าถึงจาก HTML

ใช้สูตรนี้เพื่อสร้าง PDF ที่แท็กไว้จาก HTML เชิงความหมาย NextPDF จะเขียนทรีโครงสร้างเชิงตรรกะ ภาษาในแคตาล็อก และตัวบ่งชี้ PDF/UA-2 ส่วนเครื่องมือตรวจสอบจะเป็นผู้ตัดสินความสอดคล้องตามมาตรฐาน สูตรนี้อ้างอิงจาก examples/31-pdfua2-tagged.php

  • ติดตั้ง Core: composer require nextpdf/core:^3
  • ใช้เครื่องมือตรวจสอบ PDF/UA สำหรับการตรวจสอบยืนยันความถูกต้อง ตัวอย่างนี้ใช้ veraPDF
  1. สร้างเอกสาร
  2. เรียก enableTaggedPdf() พร้อมแท็กภาษาแบบ Best Current Practice (BCP) 47 ก่อน writeHtml() ไปป์ไลน์ HTML จะตรวจพบโหมดที่มีการแท็กขณะสร้าง parser แล้วเชื่อมต่อตัวปล่อยเนื้อหาที่มีการแท็ก
  3. ตั้งค่าเมตาดาตาของเอกสาร (ชื่อเรื่อง ภาษา) สามารถเรียก setLanguage() ร่วมกับ enableTaggedPdf() ได้อย่างปลอดภัย เพราะเป็น idempotent
  4. เขียน HTML เชิงความหมาย โดย parser จะแมปอิลิเมนต์บล็อกแต่ละรายการไปยังอิลิเมนต์โครงสร้าง: h1 ไปยัง H1, p ไปยัง P, ul/li ไปยัง L/LI, และ table ไปยัง Table/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 ในแคตาล็อก และตัวบ่งชี้ XMP pdfuaid:part ให้เรียกใช้เครื่องมือตรวจสอบเพื่อยืนยันว่ารายการเหล่านี้มีอยู่และสอดคล้องกันภายในไฟล์

  • ลำดับการเรียก การเรียก enableTaggedPdf() หลังจาก writeHtml() จะไม่ย้อนกลับไปแท็กเนื้อหาที่เขียนไปแล้ว ให้เปิดใช้งานโหมดที่มีการแท็กก่อน
  • แท็กภาษา ส่ง ConformancePolicy::strictUa2() เป็นอาร์กิวเมนต์ตัวที่สองเพื่อปฏิเสธแท็ก BCP-47 ที่มีรูปแบบไม่ถูกต้องตั้งแต่ขอบเขต API แทนที่จะละทิ้งโดยไม่แจ้งเตือนขณะเขียน
  • การเปิดใช้งานซ้ำแบบ idempotent หากเรียก enableTaggedPdf() สองครั้ง NextPDF จะอัปเดตภาษาโดยไม่สร้างทรีโครงสร้างที่เติมข้อมูลไว้แล้วขึ้นมาใหม่
  • การแท็กด้วยตนเอง สำหรับเนื้อหาที่ไม่ใช่ HTML ให้ครอบรายการด้วย beginTag() / endTag() ประเภทคอนเทนเนอร์ (Table, THead, TBody, TFoot, TR, L, LI และอิลิเมนต์การจัดกลุ่ม Sect/Div/Art/Aside/BlockQuote) จะกลายเป็นอิลิเมนต์การจัดกลุ่มที่ไม่มีเนื้อหาที่ทำเครื่องหมายไว้ เนื้อหาแบบ inline ที่วางอยู่ภายในอิลิเมนต์การจัดกลุ่มโดยตรงจะถูกห่อไว้ใน P ที่สังเคราะห์ขึ้น ประเภทใบ (P, H1H6, TD, TH) จะได้รับ MCID
  • การรองรับไม่เท่ากับความสอดคล้องตามมาตรฐาน NextPDF สร้างเมตาดาตาเชิงโครงสร้างที่ PDF/UA-2 ต้องการ และจะแสดงคำเตือน degraded-parity ด้วย: สำหรับการอนุมัติใช้งานจริง การตรวจสอบความถูกต้องด้วย oracle ภายนอกเป็นความรับผิดชอบของผู้เรียก ให้เรียกใช้เครื่องมือตรวจสอบก่อนระบุว่าไฟล์สอดคล้องตามมาตรฐาน
  • ตาราง HTML ที่ถูกแท็กและอิลิเมนต์การจัดกลุ่มผ่าน veraPDF ua2 <table> ที่ถูกแท็ก — ไม่ว่าจะเป็นแบบ flat, แบบมี colspan/rowspan, แบบแบ่งหน้าข้ามหลายหน้า หรือแบบซ้อนอยู่ในเซลล์ — จะปล่อยโครงสร้าง Table/TR/TH/TD (ISO 32000-2 §14.8 เซลล์ที่ spanning จะพก /ColSpan และ /RowSpan แอตทริบิวต์ของ Table 384) และอิลิเมนต์การจัดกลุ่ม <section>/<div>/<article>/<aside>/<blockquote> จะปล่อยโครงสร้างการจัดกลุ่มโดยเนื้อหาแบบ inline ที่หลวมจะถูกห่อไว้ใน P ที่สังเคราะห์ขึ้น veraPDF --flavour ua2 รายงานความล้มเหลวเป็นศูนย์สำหรับกรณีเหล่านี้ ยังมีกรณีหนึ่งที่ล้มเหลว: อิลิเมนต์แบบบล็อกที่ซ้อนอยู่ภายในอิลิเมนต์แบบ inline — หัวข้อภายในลิงก์ <a><h2>…</h2></a> — จะทำให้เกิด Link shall not contain Hn ดังนั้นให้วางเนื้อหาแบบบล็อกไว้นอกตัวห่อแบบ inline ให้เรียกใช้เครื่องมือตรวจสอบก่อนระบุว่าไฟล์สอดคล้อง
ข้อความระบุข้อกำหนดข้อ
เนื้อหาจริงต้องมีโครงสร้างเชิงตรรกะISO 14289-2§8.2.2
อิลิเมนต์โครงสร้างเป็นไปตามการซ้อนและลำดับการอ่านที่กำหนดไว้ISO 14289-2§8.2.3

สูตรนี้แสดงวิธีสร้างโครงสร้างที่มีการแท็กเพื่อรองรับการสร้างเนื้อหาที่เข้าถึงได้ สูตรนี้ไม่ได้ยืนยันความสอดคล้องตามมาตรฐาน PDF/UA-2 เครื่องมือตรวจสอบจะเป็นผู้ตัดสินเรื่องนั้น