PDF trợ năng
Tạo PDF trợ năng hoạt động với trình đọc màn hình và công nghệ hỗ trợ bằng cách dùng cấu trúc tagged, alternative text và language tagging.
Điều gì làm PDF trợ năng?
| Yêu cầu | Tại sao quan trọng |
|---|---|
| Structure tag | Trình đọc màn hình dùng tag heading/paragraph/list để điều hướng |
| Alt text | Mô tả hình ảnh cho người dùng không thể nhìn thấy |
| Language tag | Cho trình đọc biết cách phát âm văn bản |
| Thứ tự đọc | Thứ tự logic độc lập với layout trực quan |
| Table header | Liên kết ô dữ liệu với ngữ cảnh cột/hàng |
| Bookmark | Điều hướng bàn phím cho document dài |
Tiêu chuẩn
| Tiêu chuẩn | Phạm vi |
|---|---|
| PDF/UA-2 (ISO 14289-2) | Trợ năng phổ quát PDF |
| WCAG 2.1 | Hướng dẫn trợ năng nội dung web |
| Section 508 | Trợ năng liên bang Mỹ |
| EN 301 549 | Yêu cầu trợ năng EU |
Ví dụ code đầy đủ
php
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use TcpdfNext\Document;
use TcpdfNext\Enums\Alignment;
use TcpdfNext\Accessibility\TagManager;
// ── 1. Bật tagged PDF ───────────────────────────────────────────────
$pdf = Document::create()
->setTitle('Accessibility Report 2026')
->setAuthor('Acme Corp')
->setLanguage('en-US')
->setTagged(true)
->setDisplayDocTitle(true)
->addPage();
$tag = $pdf->getTagManager();
// ── 2. Heading (H1) ───────────────────────────────────────────────
$tag->beginTag('H1');
$pdf->setFont('helvetica', style: 'B', size: 24)
->cell(0, 14, 'Accessibility Report 2026', newLine: true);
$tag->endTag();
// ── 3. Đoạn văn ──────────────────────────────────────────────────
$tag->beginTag('P');
$pdf->setFont('times', size: 12)
->multiCell(0, 7, 'Acme Corp is committed to producing documents that '
. 'meet PDF/UA and WCAG 2.1 AA standards, ensuring equal access '
. 'for all users regardless of ability.');
$tag->endTag();
// ── 4. Tiêu đề phụ (H2) ──────────────────────────────────────────
$tag->beginTag('H2');
$pdf->setFont('helvetica', style: 'B', size: 18)
->cell(0, 12, 'Key Metrics', newLine: true);
$tag->endTag();
// ── 5. Danh sách tagged ────────────────────────────────────────────
$items = [
'Documents audited: 1,240',
'Compliance rate: 98.7%',
'Issues resolved: 412',
];
$tag->beginTag('L');
foreach ($items as $item) {
$tag->beginTag('LI');
$tag->beginTag('Lbl');
$pdf->setFont('helvetica', size: 11)
->cell(8, 7, "\u{2022}");
$tag->endTag(); // Lbl
$tag->beginTag('LBody');
$pdf->cell(0, 7, $item, newLine: true);
$tag->endTag(); // LBody
$tag->endTag(); // LI
}
$tag->endTag(); // L
// ── 6. Hình ảnh với alt text ────────────────────────────────────────
$tag->beginTag('Figure');
$pdf->image(
file: __DIR__ . '/assets/compliance-chart.png',
x: null,
y: null,
width: 120,
height: null,
altText: 'Bar chart showing compliance rate rising from 91% in 2023 '
. 'to 98.7% in 2026 across four consecutive years.',
);
$tag->beginTag('Caption');
$pdf->setFont('helvetica', style: 'I', size: 9)
->cell(0, 6, 'Figure 1: Compliance trend 2023-2026', newLine: true);
$tag->endTag(); // Caption
$tag->endTag(); // Figure
// ── 7. Phần tử trang trí dạng artifact (trình đọc màn hình bỏ qua) ─────
$tag->beginArtifact('Layout');
$pdf->setDrawColor(200, 200, 200)
->line(15, $pdf->getY(), 195, $pdf->getY());
$tag->endArtifact();
// ── 8. Bảng tagged ───────────────────────────────────────────────
$tag->beginTag('H2');
$pdf->setFont('helvetica', style: 'B', size: 18)
->cell(0, 12, 'Quarterly Results', newLine: true);
$tag->endTag();
$tag->beginTag('Table');
// Hàng header
$tag->beginTag('TR');
foreach (['Quarter', 'Audited', 'Passed', 'Rate'] as $header) {
$tag->beginTag('TH', attributes: ['scope' => 'col']);
$pdf->setFont('helvetica', style: 'B', size: 10)
->cell(45, 8, $header, border: 1);
$tag->endTag();
}
$tag->endTag(); // TR
// Hàng dữ liệu
$rows = [
['Q1', '310', '305', '98.4%'],
['Q2', '320', '316', '98.8%'],
['Q3', '305', '302', '99.0%'],
['Q4', '305', '301', '98.7%'],
];
foreach ($rows as $row) {
$tag->beginTag('TR');
foreach ($row as $i => $cell) {
$tagName = $i === 0 ? 'TH' : 'TD';
$attrs = $i === 0 ? ['scope' => 'row'] : [];
$tag->beginTag($tagName, attributes: $attrs);
$pdf->setFont('times', size: 10)
->cell(45, 8, $cell, border: 1);
$tag->endTag();
}
$tag->endTag(); // TR
}
$tag->endTag(); // Table
// ── 9. Language tagging cho văn bản ngoại ngữ ──────────────────────
$tag->beginTag('P', attributes: ['lang' => 'de-DE']);
$pdf->setFont('times', size: 11)
->multiCell(0, 7, 'Barrierefreiheit ist ein grundlegendes Recht.');
$tag->endTag();
// ── 10. Lưu ──────────────────────────────────────────────────────
$pdf->save(__DIR__ . '/accessible-report.pdf');
echo 'Accessible PDF created.' . PHP_EOL;Auto-Tagging từ HTML
TCPDF-Next có thể tạo structure tag tự động từ HTML ngữ nghĩa:
php
$pdf = Document::create()
->setTagged(true)
->setLanguage('en-US')
->addPage();
$pdf->setAutoTagging(true)
->writeHtml(<<<'HTML'
<h1>Report</h1>
<p>Summary paragraph.</p>
<img src="chart.png" alt="Revenue chart showing 15% growth" />
<table>
<tr><th>Q</th><th>Revenue</th></tr>
<tr><td>Q1</td><td>$548M</td></tr>
</table>
HTML);| Phần tử HTML | PDF Tag |
|---|---|
<h1>--<h6> | H1--H6 |
<p> | P |
<img alt="..."> | Figure |
<table> | Table |
<th> | TH |
<td> | TD |
<ul>, <ol> | L |
<li> | LI |
<a> | Link |
Checklist trợ năng
- [ ]
setTitle()-- tiêu đề document được thiết lập - [ ]
setDisplayDocTitle(true)-- trình xem hiển thị tiêu đề, không phải tên file - [ ]
setLanguage('en-US')-- ngôn ngữ document được khai báo - [ ] Mọi nội dung được bọc trong structure tag
- [ ] Heading theo thứ tự tuần tự (H1, H2, H3 -- không bỏ qua)
- [ ] Mọi hình ảnh có ý nghĩa có
altText - [ ] Hình ảnh trang trí được đánh dấu artifact
- [ ] Bảng có ô
THvới attributescope - [ ] Thứ tự đọc khớp thứ tự logic
- [ ] Tỷ lệ tương phản màu ít nhất 4.5:1
Validation
bash
# Dùng PAC (PDF Accessibility Checker) cho validation PDF/UA
# https://pdfua.foundation/en/pac-download/Đọc thêm
- PDF/A-4 lưu trữ -- Kết hợp trợ năng với lưu trữ