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

如何用PHP/Laravel获取可编辑PDF的输入字段名?

获取可编辑PDF字段名并填充数据的可行方案

一、正确使用mikehaertl/php-pdftk(推荐)

这个包是pdftk的PHP封装,核心依赖服务器端安装pdftk工具,是处理可编辑PDF表单最可靠的方案之一。

1. 前置准备

确保服务器安装pdftk:

  • Ubuntu/Debian:sudo apt-get install pdftk-java
  • CentOS/RHEL:需从第三方源安装或编译(可参考pdftk官方文档)

2. 读取PDF表单字段

use mikehaertl\pdftk\Pdf;

$pdf = new Pdf(storage_path('app/forms/your-form.pdf'));
$fields = $pdf->getDataFields();

// 遍历输出所有字段名
foreach ($fields as $field) {
    echo $field['name'] . PHP_EOL;
}

返回的$fields数组包含字段的完整标识(比如topmostSubform[0].Page1[0].username[0]),直接用这个标识作为填充时的键即可。

3. 填充表单数据

$pdf = new Pdf(storage_path('app/forms/your-form.pdf'));
$fillResult = $pdf->fillForm([
    'topmostSubform[0].Page1[0].username[0]' => '张三',
    'topmostSubform[0].Page1[0].email[0]' => 'zhangsan@example.com'
])->saveAs(storage_path('app/forms/filled-form.pdf'));

if (!$fillResult) {
    // 处理错误
    echo $pdf->getError();
}

二、备选:用smalot/pdfparser读取字段

如果服务器无法安装pdftk,可尝试这个纯PHP的PDF解析包,对大部分标准可编辑PDF有效:

use Smalot\PdfParser\Parser;

$parser = new Parser();
$pdf = $parser->parseFile(storage_path('app/forms/your-form.pdf'));
$formFields = $pdf->getFields();

foreach ($formFields as $fieldName => $field) {
    echo "字段名:{$fieldName},类型:{$field->getType()}" . PHP_EOL;
}

注:该包对复杂嵌套字段的识别可能存在局限性。

三、直接调用pdftk命令行(绕过封装问题)

如果包的封装出现兼容性问题,可直接执行pdftk命令:

1. 读取字段

// 执行命令并捕获输出
exec('pdftk ' . storage_path('app/forms/your-form.pdf') . ' dump_data_fields', $output);

$fieldNames = [];
foreach ($output as $line) {
    if (str_starts_with(trim($line), 'FieldName:')) {
        $fieldNames[] = trim(str_replace('FieldName:', '', $line));
    }
}

// $fieldNames即为所有字段名数组

2. 填充表单

先生成临时FDF文件,再执行填充命令:

$fillData = [
    'username' => '张三',
    'email' => 'zhangsan@example.com'
];

// 构建FDF内容
$fdfContent = "%FDF-1.2\n1 0 obj<<</FDF<<</Fields[";
foreach ($fillData as $key => $value) {
    // 转义特殊字符(如括号、反斜杠)
    $escapedKey = str_replace(['(', ')', '\\'], ['\\(', '\\)', '\\\\'], $key);
    $escapedValue = str_replace(['(', ')', '\\'], ['\\(', '\\)', '\\\\'], $value);
    $fdfContent .= "<<</T($escapedKey)/V($escapedValue)>>";
}
$fdfContent .= "]>>>>endobj\ntrailer\n<<</Root 1 0 R>>\n%%EOF";

$tempFdf = storage_path('app/temp/temp.fdf');
file_put_contents($tempFdf, $fdfContent);

// 执行填充命令,flatten参数可选(填充后转为不可编辑)
exec(
    'pdftk ' . storage_path('app/forms/your-form.pdf') . ' fill_form ' . $tempFdf . ' output ' . storage_path('app/forms/filled-form.pdf') . ' flatten',
    $output,
    $returnCode
);

// 清理临时文件
unlink($tempFdf);

if ($returnCode !== 0) {
    // 处理错误
    var_dump($output);
}

注意事项

  • 确保PHP的exec/shell_exec函数未被禁用,且服务器进程有文件读写权限
  • 加密的可编辑PDF需先解锁,可在pdftk命令后添加input_pw 你的密码参数
  • 部分PDF的字段名可能包含特殊格式,需严格使用读取到的完整字段标识进行填充

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:41:33