如何用PHP编程生成符合WCAG标准的全可访问PDF?
解决PHP生成带图片alt文本的可访问PDF问题
方案1:使用原生支持WCAG标准的PDF生成库
直接选择对可访问性(包括图片alt文本)支持更好的PHP PDF库,替代DOMPDF,比如TCPDF或mPDF,这类库可以直接为图片设置替代文本,无需依赖外部API。
TCPDF示例代码:
require_once('tcpdf/tcpdf.php'); // 初始化PDF对象,开启UTF-8支持与可访问性选项 $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); $pdf->SetCreator('PHP Accessible PDF Generator'); $pdf->SetTitle('带图片alt文本的可访问PDF'); $pdf->AddPage(); // 插入图片,并设置替代文本 $imagePath = 'path/to/your/image.jpg'; // 插入图片参数:路径、X坐标、Y坐标、宽度、高度、格式、链接、对齐、是否为可访问图片、DPI、alt文本占位(后续用setAltText设置) $pdf->Image($imagePath, 15, 15, 40, 0, 'JPG', '', '', true, 150, '', false, false, 0, false, false, false); // 显式设置图片的替代文本 $pdf->setAltText('这是一张产品展示图,展示了黑色无线蓝牙耳机的外观'); // 添加其他内容 $pdf->Cell(0, 10, '产品介绍', 0, 1, 'C'); $pdf->Output('accessible_product_pdf.pdf', 'I');
mPDF示例代码:
require_once __DIR__ . '/vendor/autoload.php'; $mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => 'A4']); $mpdf->SetTitle('可访问PDF示例'); // 直接在HTML中使用标准img标签的alt属性,mPDF会将其转换为PDF的替代文本 $html = ' <div> <h1>产品展示</h1> <img src="path/to/your/image.jpg" alt="黑色无线蓝牙耳机,带有充电仓"> <p>这款耳机支持主动降噪,续航可达30小时</p> </div> '; $mpdf->WriteHTML($html); $mpdf->Output('accessible_mpdf_example.pdf', 'I');
方案2:优化DOMPDF输出+补全PDF元数据
如果必须保留DOMPDF,需要确保DOMPDF输出的HTML结构正确传递alt属性,再通过PHP库补全PDF的图片替代文本:
确保DOMPDF正确处理img的alt属性:
在生成HTML时,确保所有img标签都包含alt属性(空alt用于装饰性图片),并配置DOMPDF启用可访问性选项:require_once 'dompdf/autoload.inc.php'; use Dompdf\Dompdf; use Dompdf\Options; $options = new Options(); $options->set('isHtml5ParserEnabled', true); $options->set('enable_pdfa', true); // 启用PDF/A标准,增强可访问性 $dompdf = new Dompdf($options); $html = ' <html> <body> <img src="path/to/image.jpg" alt="产品包装的正面视图"> <p>包装内含耳机、充电线与说明书</p> </body> </html> '; $dompdf->loadHtml($html); $dompdf->render(); $dompdf->stream('dompdf_output.pdf', ['Attachment' => false]);用FPDI+TCPDF补全alt文本:
针对DOMPDF生成的PDF,使用FPDI导入页面后,手动为图片添加替代文本:require_once('tcpdf/tcpdf.php'); require_once('fpdi/fpdi.php'); class AccessiblePDF extends FPDI { public function Header() {} public function Footer() {} } $pdf = new AccessiblePDF(); $sourcePdf = 'dompdf_output.pdf'; $pdf->setSourceFile($sourcePdf); $pageId = $pdf->importPage(1); $pdf->AddPage(); $pdf->useTemplate($pageId); // 获取PDF中的图片对象ID(可通过PDF编辑器查看,或用PDF解析工具自动获取) $imageXObjectId = 'Im1'; // 示例ID,实际需根据PDF结构调整 $pdf->setAltText('产品包装的正面视图,印有品牌logo与产品名称', $imageXObjectId); $pdf->Output('dompdf_accessible.pdf', 'I');
方案3:使用无头浏览器生成可访问PDF
通过PHP调用无头Chrome(如Puppeteer)生成PDF,Chrome原生支持将HTML的可访问性属性(包括img的alt)转换为PDF的结构化元数据,完全符合WCAG标准。
使用spatie/browsershot库实现:
require_once __DIR__ . '/vendor/autoload.php'; use Spatie\Browsershot\Browsershot; $html = ' <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>可访问产品手册</title> </head> <body> <img src="path/to/image.jpg" alt="折叠式笔记本电脑,屏幕显示办公界面"> <h2>产品特性</h2> <ul> <li>14英寸高清屏幕</li> <li>续航12小时</li> </ul> </body> </html> '; Browsershot::html($html) ->setOption('enable-accessibility', true) ->setOption('pdf-tagged', true) // 生成带标签的PDF ->save('browser_accessible_pdf.pdf');
方案对比
- 原生PDF库:适合需要高度定制PDF布局的场景,无需依赖外部工具,但需要手动处理内容排版。
- DOMPDF+补全元数据:适合已有DOMPDF代码的项目,需要额外步骤补全alt文本,复杂度中等。
- 无头浏览器:适合已有成熟HTML模板的场景,自动保留所有HTML可访问性属性,生成的PDF兼容性最好,但需要安装Chrome/Chromium环境。
内容的提问来源于stack exchange,提问作者dfgdfg dfgdfgdfgdfg
相关产品推荐
相关产品推荐

