Skip to content

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ầuTại sao quan trọng
Structure tagTrình đọc màn hình dùng tag heading/paragraph/list để điều hướng
Alt textMô tả hình ảnh cho người dùng không thể nhìn thấy
Language tagCho trình đọc biết cách phát âm văn bản
Thứ tự đọcThứ tự logic độc lập với layout trực quan
Table headerLiê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ẩnPhạm vi
PDF/UA-2 (ISO 14289-2)Trợ năng phổ quát PDF
WCAG 2.1Hướng dẫn trợ năng nội dung web
Section 508Trợ năng liên bang Mỹ
EN 301 549Yê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ử HTMLPDF 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ó ô TH với attribute scope
  • [ ] 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

Phân phối theo giấy phép LGPL-3.0-or-later.