You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PDFLib生成符合无障碍要求的键值对PDF输出?

解决PDFlib动态键值对自动对齐的无障碍实现方案

针对动态长度的键值对,无需手动设置leftindent的最优方案是利用Textflow的制表位(tab stops)功能,步骤如下:

  • 预先计算所有键的宽度,找到最大值
  • 基于最大键宽设置统一的制表位位置(可额外添加间距)
  • 每个键值对通过制表符分隔,自动对齐到预设制表位

同时需开启PDF标签(tagging)以满足无障碍要求,以下是修改后的完整PHP代码:

<?php
$upperX = 525;
$upperY = 780;
$lowerX = 70;
$lowerY = 50;

$y = $upperY;
$x = 70;

$pdf = new \PDFlib();
// 开启文档标签以支持无障碍
if ($pdf->begin_document('', 'tagged=true') == 0) {
    die("Error: " . $pdf->get_errmsg());
}
$pdf->begin_page_ext(0, 0, 'width=a4.width height=a4.height');

// 写入标题
$optlist = "fontname={Helvetica} fontsize=8 encoding=utf8 alignment=center fakebold=true tag=H3";
$tf = $pdf->add_textflow(0, "Name-Value pairs:", $optlist);
$pdf->fit_textflow($tf, $x, $lowerY, $upperX, $y, '');
$pdf->delete_textflow($tf);

$y -= 10;

// 定义动态键值对
$keyValuePairs = [
    "Name:" => "John",
    "Surname:" => "Doe",
    "Date of birth:" => "2022/11/08",
    "A key that has a long value:" => "A very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long value"
];

// 计算所有键的最大宽度
$fontName = "Helvetica";
$fontSize = 7;
$encoding = "utf8";
$maxKeyWidth = 0;
foreach ($keyValuePairs as $key => $_) {
    $width = $pdf->stringwidth($key, $fontName, $fontSize, $encoding);
    if ($width > $maxKeyWidth) {
        $maxKeyWidth = $width;
    }
}

// 设置制表位位置(最大键宽 + 5pt间距)
$tabPosition = $x + $maxKeyWidth + 5;

// 批量生成键值对
$labelStyle = "fontname={$fontName} fontsize={$fontSize} encoding={$encoding} fakebold=true";
$valueStyle = "fontname={$fontName} fontsize={$fontSize} encoding={$encoding} fakebold=false";
$tabStyle = "tabstops={$tabPosition left}";

foreach ($keyValuePairs as $key => $value) {
    $tf = 0;
    $tf = $pdf->add_textflow($tf, $key, $labelStyle);
    $tf = $pdf->add_textflow($tf, "\t", $tabStyle); // 使用制表符跳转到预设位置
    $tf = $pdf->add_textflow($tf, $value, $valueStyle);
    // 添加标签确保无障碍读取
    $pdf->fit_textflow($tf, $x, $lowerY, $upperX, $y, "tag=Div");
    $y = $pdf->get_option('texty', ''); // 更新当前Y坐标
    $pdf->delete_textflow($tf);
}

$pdf->end_page_ext('');
$pdf->end_document('');
return $pdf->get_buffer();

核心优势

  • 动态适配:自动根据最长键调整对齐位置,无需手动计算缩进
  • 无障碍合规:通过tagged=true和文本标签(tag=Div/tag=H3)确保屏幕阅读器可正确解析结构
  • 代码简洁:批量处理键值对,减少重复代码

内容的提问来源于stack exchange,提问作者stefano_it

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:30:49