如何通过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
相关产品推荐
相关产品推荐

