Tạo PDF gắn thẻ hỗ trợ khả năng tiếp cận từ HTML
Tổng quan nhanh
Phần tiêu đề “Tổng quan nhanh”Dùng công thức này để tạo PDF gắn thẻ từ HTML ngữ nghĩa. NextPDF ghi cây cấu trúc logic, mục ngôn ngữ trong catalog và các điểm đánh dấu PDF/UA-2. Việc có tuân thủ hay không do công cụ kiểm tra quyết định. Công thức này dựa trên examples/31-pdfua2-tagged.php.
Điều kiện cần
Phần tiêu đề “Điều kiện cần”- Cài đặt Core:
composer require nextpdf/core:^3. - Dùng một công cụ kiểm tra PDF/UA để xác thực. Ví dụ này dùng veraPDF.
Công thức
Phần tiêu đề “Công thức”- Tạo tài liệu.
- Gọi
enableTaggedPdf()với một thẻ ngôn ngữ Best Current Practice (BCP) 47 trước khi gọiwriteHtml(). Pipeline HTML phát hiện chế độ gắn thẻ trong lúc dựng bộ phân tích cú pháp, rồi nối vào bộ phát nội dung gắn thẻ. - Đặt metadata của tài liệu (tiêu đề, ngôn ngữ). Bạn có thể gọi
setLanguage()cùng vớienableTaggedPdf()một cách an toàn, vì hàm này có tính idempotent. - Ghi HTML ngữ nghĩa. Bộ phân tích cú pháp ánh xạ mỗi phần tử khối thành một phần tử cấu trúc:
h1thànhH1,pthànhP,ul/lithànhL/LI, vàtablethànhTable/TR/TD. - Lưu tệp, sau đó xác thực bằng một công cụ kiểm tra PDF/UA.
Ví dụ đầy đủ
Phần tiêu đề “Ví dụ đầy đủ”<?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";Kết quả mong đợi
Phần tiêu đề “Kết quả mong đợi”Wrote accessible.pdf — validate with: verapdf --flavour ua2 accessible.pdfTệp đầu ra bao gồm một cây cấu trúc, /MarkInfo << /Marked true >>, mục /Lang trong catalog và điểm đánh dấu XMP pdfuaid:part. Chạy công cụ kiểm tra để xác nhận các mục này hiện diện và nhất quán trong tệp.
Trường hợp đặc biệt
Phần tiêu đề “Trường hợp đặc biệt”- Thứ tự gọi. Việc gọi
enableTaggedPdf()sauwriteHtml()không gắn thẻ hồi tố cho nội dung đã ghi trước đó. Bật chế độ gắn thẻ trước. - Thẻ ngôn ngữ. Truyền
ConformancePolicy::strictUa2()làm đối số thứ hai để từ chối ngay tại ranh giới API một thẻ BCP-47 sai định dạng, thay vì âm thầm loại bỏ nó khi ghi. - Bật lại có tính idempotent. Nếu bạn gọi
enableTaggedPdf()hai lần, NextPDF cập nhật ngôn ngữ mà không dựng lại cây cấu trúc đã tạo trước đó. - Gắn thẻ thủ công. Với nội dung không phải HTML, hãy bao bọc các mục bằng
beginTag()/endTag(). Các kiểu vùng chứa (Table,TR,L,LI) trở thành phần tử nhóm không có nội dung được đánh dấu. Các kiểu lá (P,H1–H6,TD) nhận MCID. - Hỗ trợ không phải là tuân thủ. NextPDF phát ra metadata cấu trúc mà PDF/UA-2 cần. Hệ thống cũng hiển thị cảnh báo về mức tương đương bị suy giảm: để phê duyệt cho môi trường production, trách nhiệm của bên gọi là xác thực bằng oracle bên ngoài. Chạy một công cụ kiểm tra trước khi bạn khẳng định rằng một tệp đã tuân thủ.
Tuân thủ
Phần tiêu đề “Tuân thủ”| Tuyên bố | Đặc tả | Điều khoản | reference_id |
|---|---|---|---|
| Nội dung thực cần một cấu trúc logic. | ISO 14289-2 | §8.2.2 | |
| Các phần tử cấu trúc tuân theo trật tự lồng nhau và thứ tự đọc đã được xác định. | ISO 14289-2 | §8.2.3 |
Công thức này minh họa cách tạo cấu trúc gắn thẻ để hỗ trợ việc soạn thảo có khả năng tiếp cận. Nó không khẳng định sự tuân thủ PDF/UA-2; điều đó do một công cụ kiểm tra quyết định.