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

如何在Laravel项目中集成XPDF渲染带高级表单的PDF?

Laravel项目中处理高级AcroForm PDF的实现方案

一、环境准备

1. 安装XPDF工具

根据服务器系统完成XPDF安装:

  • Ubuntu/Debian:sudo apt-get update && sudo apt-get install xpdf
  • CentOS/RHEL:sudo yum install xpdf
  • Windows:下载官方XPDF包,解压后将工具路径添加到系统环境变量。

2. Laravel依赖配置

安装Spatie封装的PDF处理包简化XPDF调用:

composer require spatie/pdf-to-text

若XPDF工具路径未加入系统环境变量,创建config/pdf.php配置文件指定路径:

return [
    'xpdf_path' => '/usr/bin/pdftotext', // 替换为实际工具路径
];

二、PDF展示方案(解决Chrome/iframe无法显示问题)

目标PDF依赖Adobe Acrobat高级表单特性,Web端原生渲染不支持,可选择以下两种方案:

方案1:引导用户通过Acrobat Reader处理

  • 在Laravel视图中提供PDF下载按钮,用户下载后用Acrobat填写,再上传回系统。
  • 实现上传接口接收并存储填写后的PDF:
// 控制器示例代码
public function uploadFilledPDF(Request $request)
{
    $request->validate([
        'pdf' => 'required|mimes:pdf',
    ]);

    $storagePath = $request->file('pdf')->store('filled_pdfs');
    // 将存储路径写入数据库等后续操作

    return back()->with('success', 'PDF已保存');
}

方案2:嵌入支持AcroForms的JavaScript库展示

采用支持AcroForms的PDF.js增强版本(本地部署资源,避免外链),在视图中集成渲染:

<div>
    <canvas id="pdfCanvas"></canvas>
</div>

<script>
    const pdfUrl = "{{ asset('storage/imm0008enu_2d.pdf') }}";
    pdfjsLib.getDocument(pdfUrl).promise.then(pdf => {
        // 渲染第一页示例
        pdf.getPage(1).then(page => {
            const canvas = document.getElementById('pdfCanvas');
            const ctx = canvas.getContext('2d');
            const viewport = page.getViewport({ scale: 1.5 });
            canvas.height = viewport.height;
            canvas.width = viewport.width;
            page.render({ canvasContext: ctx, viewport: viewport });
        });
    });
</script>

注意:需使用支持AcroForms编辑的PDF.js版本,可自行编译或下载适配包。

三、填写后PDF的保存处理

1. 客户端提交表单数据

若采用方案2,通过AJAX收集用户输入的表单数据,提交至Laravel后端。

2. 服务器端生成填充后的PDF

搭配PDFtk Server(支持AcroForms填充)完成操作:

  • 安装PDFtk:sudo apt-get install pdftk(Ubuntu)
  • 后端接收数据生成FDF格式文件,再用PDFtk填充原PDF:
public function generateFilledPDF(Request $request)
{
    $formData = $request->all();
    $originalPdf = storage_path('app/imm0008enu_2d.pdf');
    $tempFdf = storage_path('tmp/form_data.fdf');
    $outputPdf = storage_path('app/filled_imm0008.pdf');

    // 生成FDF文件(需按PDF实际字段名映射数据)
    $fdfContent = "%FDF-1.2\n1 0 obj<</FDF<</Fields[";
    foreach ($formData as $field => $value) {
        $fdfContent .= "<</T($field)/V($value)>>";
    }
    $fdfContent .= "]>>>>endobj\ntrailer<</Root 1 0 R>>\n%%EOF";
    file_put_contents($tempFdf, $fdfContent);

    // 执行PDFtk填充命令
    exec("pdftk $originalPdf fill_form $tempFdf output $outputPdf");

    // 删除临时FDF文件
    unlink($tempFdf);

    return response()->download($outputPdf);
}

四、关键注意事项

  • 确认服务器上XPDF、PDFtk版本适配目标PDF的AcroForms特性。
  • 提前提取PDF表单字段名(可使用XPDF的pdfinfo/pdffonts命令,或通过Acrobat导出字段列表),确保数据映射准确。
  • 处理大文件时,调整Laravel对应php.ini参数(upload_max_filesize、post_max_size等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:05:28