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

如何通过PHP的mikehaertl/pdftk库获取PDF的Choice类型表单下拉选项

问题原因

你用到的mikehaertl\pdftk封装的getDataFields()方法默认调用pdftk的基础字段导出命令,旧版本pdftk的该命令不会返回Choice类型字段的可选值,所以拿到的结果里没有对应列表。

解决方法

第一步:升级pdftk版本

先确认本地安装的pdftk服务端版本≥2.02,旧版本不支持导出Choice字段的选项属性。

第二步:使用带选项导出的命令

你可以直接调用pdftk原生的dump_data_fields_utf8命令获取完整字段数据,自己解析输出即可拿到所有选项,参考代码如下:

$pdfPath = './files/forms/uploads/imported.pdf';
// 调用pdftk命令导出带选项的字段数据,escapeshellarg规避路径注入风险
exec("pdftk ".escapeshellarg($pdfPath)." dump_data_fields_utf8", $output, $returnCode);

if ($returnCode !== 0) {
    die('pdftk命令执行失败,请检查pdftk安装和文件路径是否正确');
}

$fields = [];
$currentField = [];
foreach ($output as $line) {
    // 字段分隔符
    if (str_starts_with($line, '---')) {
        if (!empty($currentField)) {
            $fields[] = $currentField;
            $currentField = [];
        }
        continue;
    }
    if (str_contains($line, ':')) {
        list($key, $value) = explode(':', $line, 2);
        $key = trim($key);
        $value = trim($value);
        // 多选/下拉选项统一存到options数组里
        if ($key === 'FieldStateOption') {
            $currentField['options'][] = $value;
        } else {
            $currentField[$key] = $value;
        }
    }
}
// 补充最后一个字段
if (!empty($currentField)) {
    $fields[] = $currentField;
}

// 过滤出所有Choice类型的字段,options属性就是下拉可选值
$choiceFields = array_filter($fields, function($item) {
    return isset($item['FieldType']) && $item['FieldType'] === 'Choice';
});

print_r($choiceFields);

可选方案

如果你不想自己解析命令输出,可以升级mikehaertl\pdftk到最新版本,新版本已经支持导出选项配置,调用前开启utf8导出参数即可:

$pdf = new mikehaertl\pdftk\Pdf('./files/forms/uploads/imported.pdf');
$pdf->setDataFieldsDumpUtf8(true);
$results = $pdf->getDataFields();
// Choice类型字段的fieldStateOption属性就是可选值数组
print_r($results);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:36:03