如何使用 PHP 基于上传的 PDF 模板动态生成新 PDF 文档

云辰酱_4600

云辰酱_4600

2026-02-02

729人浏览

原创

如何使用 PHP 基于上传的 PDF 模板动态生成新 PDF 文档

本文介绍如何在 php 中利用 fpdi 库,以用户上传的 pdf 文件为模板,动态填充或叠加内容并生成新的 pdf 文档,适用于合同、发票、证书等场景。

在 PHP 开发中,若需基于用户上传的 PDF 模板(如已设计好的合同、报表或证书)生成个性化 PDF,核心需求是:保留原模板的版式、字体、矢量图形和页面布局,仅在指定位置插入动态文本、图像或签名。此时,直接使用 FPDF 或 TCPDF 等纯生成类库并不适用——它们无法读取/复用现有 PDF 页面。正确方案是采用支持“导入 + 覆盖”能力的库,其中 FPDI(Free PDF Importer) 是最成熟、稳定且广泛使用的开源选择。

FPDI 并非独立 PDF 生成器,而是 FPDF/TCPDF 的扩展插件,它允许你:

  • 加载任意 PDF 文件作为源模板;
  • 读取其页面数量与尺寸;
  • 将指定页面作为背景导入到新文档中;
  • 在其上使用 FPDF/TCPDF 的绘图与文字方法进行精准叠加。

✅ 推荐技术栈组合:FPDI + FPDF(轻量级)或 FPDI + TCPDF(功能更全,支持 Unicode/中文)。

以下是一个完整、可运行的示例(基于 FPDI v2 + FPDF):

password-manager
password-manager

本地密码管理技能,可添加、编辑、删除、搜索密码,支持分类和备注,数据本地存储,支持导入导出和备份。用户提及密码、账号、密码管理、保存密码或查找密码时使用。

下载
<?php use setasign\Fpdi\Fpdi;
use setasign\Fpdi\PdfReader;

// 引入依赖(请通过 Composer 安装:composer require setasign/fpdi)
require_once 'vendor/autoload.php';

// 实例化 FPDI(自动兼容 FPDF)
$pdf = new Fpdi();

// 加载用户上传的模板 PDF(注意:路径需校验并确保安全)
$templatePath = $_FILES['template']['tmp_name'] ?? 'templates/invoice-template.pdf';
if (!file_exists($templatePath) || pathinfo($templatePath, PATHINFO_EXTENSION) !== 'pdf') {
    die('Invalid or missing PDF template.');
}

// 导入模板第 1 页(支持多页循环处理)
$pageCount = $pdf->setSourceFile($templatePath);
$pageId = $pdf->importPage(1, PdfReader\PageBoundaries::MEDIA_BOX);

// 添加新页面(尺寸与模板页一致)
$pdf->addPage();

// 将模板页作为背景绘制(x=10, y=10, width=90mm;单位默认为 mm)
$pdf->useImportedPage($pageId, 10, 10, 90);

// ✅ 在模板上方叠加动态内容(例如填写客户姓名、金额)
$pdf->SetFont('Helvetica', '', 12);
$pdf->SetTextColor(0, 0, 0);
$pdf->SetXY(100, 65); // 精确坐标需根据模板实际位置调试
$pdf->Cell(0, 0, '张三先生', 0, 1);

$pdf->SetXY(100, 80);
$pdf->Cell(0, 0, '¥12,800.00', 0, 1);

// 输出 PDF(I=浏览器预览,D=强制下载,F=保存到服务器)
$pdf->Output('D', 'invoice_2024_' . date('YmdHis') . '.pdf');

⚠️ 关键注意事项:

  • 安全第一:务必校验上传文件类型(mime_content_type() + 文件头检测)、重命名临时文件、禁止执行权限,并限制上传目录不可被 Web 直接访问;
  • 中文支持:FPDF 默认不支持 UTF-8 中文。如需显示中文,请改用 TCPDF 作为底层引擎,并加载支持 GBK/UTF-8 的 TrueType 字体(如 simhei.ttf);
  • 坐标调试:SetXY() 坐标需结合模板实际尺寸反复测试,建议先用 PDF 查看器测量关键字段的左上角坐标(单位:mm);
  • 性能提示:FPDI 导入复杂模板(含大量矢量图/透明层)可能较慢,生产环境建议缓存模板解析结果(如预解析后存为序列化对象);
  • 替代方案参考:若需同时支持 Word(.docx)模板,可考虑 PHPWord + TemplateProcessor;但 PDF 场景下 FPDI 仍是事实标准。

总结:从零开始实现模板 PDF 动态生成,应首选 FPDI 生态。它学习成本低、社区完善、无外部服务依赖,适合绝大多数企业级 PDF 填充需求。只需三步:安装 → 导入模板 → 叠加内容 → 输出,即可交付专业级结果。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

极轻PDF
极轻PDF

专业的在线PDF工具,支持PDF编辑、转换、合并、压缩等多种功能,操作简单,处理高效,满足日常办公与学习中的PDF处理需求。

下载

相关标签:

php word composer 浏览器

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

6467

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2688

6

word背景色怎么改成白色
word背景色怎么改成白色

Word是微软公司的一个文字处理器软件。word为用户提供了专业而优雅的文档工具,帮助用户节省时间并得到优雅美观的结果。word提供了许多易于使用的文档创建工具,同时也提供了丰富的功能供创建复杂的文档使用。怎么word背景色怎么该呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.21

4571

3

word最后一页空白页怎么删除
word最后一页空白页怎么删除

word最后一页空白页删除方法有:通过删除回车符、调整页边距、删除分节符或调整分页符位置,您可以轻松去除最后一页的空白页。根据您实际的文档情况,选择适合您的方法进行操作,使您的文档更加美观和整洁。本专题为大家提供word最后一页空白页怎么删除不了相关的各种文章、以及下载和课程。

2023.07.24

1120

5

word最后一页空白页怎么删除不了
word最后一页空白页怎么删除不了

word删除最后一页空白页,可以尝试使用Backspace键删除空白页,如果无效,查找和删除分页符,或者调整页面边距和行距。还可以尝试将文档保存为其他格式并重新打开和保存。本专题为大家提供word最后一页空白页为啥删除不了的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.25

3222

5

word单页改变纸张方向
word单页改变纸张方向

word单页改变纸张方向:1、在界面上选择文档纸张方向;2、自定义页面设置;3、分节功能。本专题为大家提供word单页改变纸张方向的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

1380

4

word转ppt
word转ppt

Word是一款常用的文字处理软件,而PowerPoint则是一款专门用于制作演示文稿的软件。在某些情况下,我们可能需要将Word文档转换为PowerPoint演示文稿,以便更好地展示我们的内容。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.03

1277

4

word页码从第三页开始为1教程
word页码从第三页开始为1教程

如何将word页码从第三页开始为1,本专题为大家提供相关的文章,希望可以帮助大家解决问题。

2023.08.04

8372

6

多个word合并成一个word教程
多个word合并成一个word教程

在工作中将多个word合并成一个word是一个很常见的操作,本专题为大家提供相关问题的解决文章,大家可以免费阅读。

2023.08.04

2646

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习