Laravel生成订单PDF:跨页表头丢了,怎样拆页再合并?
订单明细跨页后,第二页没有表头,读者就很难对照商品和金额。反复调整分页CSS仍不稳定时,可以把明细先拆成多份完整HTML,逐页生成PDF,再按顺序合并。
下面用Laravel的Blade和HTTP Client,配合ComPDF生成与合并接口完成这个流程。应用决定每页放哪些明细,ComPDF负责渲染中文HTML和合并PDF。

先运行教学工程
下载示例代码、HTML输入与实际PDF产物并解压。包内不含API密钥或SDK许可。
本次实际运行环境为PHP 8.4.26、Laravel 12.69.3。示例包含两条计价明细和80条零金额明细,合计84.70元。
在工程目录运行:
composer install
# 在服务端环境中配置 COMPDF_API_KEY,再执行:
php run.php
run.php会顺序渲染4份HTML,调用生成接口,下载每页PDF,再调用合并接口,输出outputs/order.pdf。运行需要网络和可用的ComPDF API额度,不把真实密钥写入源码、浏览器或文章。
本例的应用服务器通过HTTP调用服务,没有在服务器安装浏览器或PDF合并引擎。输入会发送至云端,生产接入前要确认业务文件允许这样处理。
让每一页都有自己的表头
先固定单号、币种、明细、金额和模板版本。金额计算由业务应用完成,Blade只显示结果。以下分组方式来自实际运行代码:
$groups = array_chunk($order['lines'], 24);
foreach ($groups as $index => $lines) {
$pageOrder = array_replace($order, ['lines' => $lines]);
$html = view('orders.pdf', [
'order' => $pageOrder,
'pageNumber' => $index + 1,
'pageCount' => count($groups),
])->render();
// 将当前HTML交给生成接口,保存单页结果。
}
每份HTML都包含完整的单号、页码、表格列名和本页明细。模板使用Blade的默认转义;不要为了显示商品名改为未转义输出。合计只在最后一份HTML中输出。
24条只适用于本例的字号、行高和单行商品名。长名称换行、加入图片或改变纸张尺寸后,需要重新检查一组是否仍只生成1页;不能把固定条数当成通用分页规则。空订单也应在业务校验阶段明确处理。
生成、下载,再合并
每页请求使用generationType=html,提交当前html和独立的outputFileName。字段说明见PDF生成接口。
HTTP成功后,还要检查JSON业务代码和结果状态,再从downloadUrl下载实际PDF。JSON响应不是PDF文件。完整工程包含业务状态、下载状态和PDF文件头检查;任一页请求失败就停止后续流程,保留已保存的文件,不自动覆盖原件或无限重试。
将4份结果按页码提交到pdf/merge时,文件使用重复的file字段,页范围使用同样数量的filePageRanges=all。文件顺序和页范围必须一一对应。下面是教学请求的等价形式:
curl --fail-with-body --request POST \
'https://api-server.compdf.com/server/v2/process/pdf/merge' \
--header "x-api-key: $COMPDF_API_KEY" \
--form 'file=@outputs/page-1.pdf' --form 'filePageRanges=all' \
--form 'file=@outputs/page-2.pdf' --form 'filePageRanges=all' \
--form 'file=@outputs/page-3.pdf' --form 'filePageRanges=all' \
--form 'file=@outputs/page-4.pdf' --form 'filePageRanges=all' \
--output merge-response.json
检查合并请求的业务结果后,再下载最终文件。示例中的PHP HTTP Client已经完成这一段下载逻辑。
对照实际文件验收
示例生成并合并成4页PDF。逐页检查的结果如下:
| 检查项 | 实际结果 |
|---|---|
| 每页开头的列名 | 4页均有“商品”和“金额” |
| 编号明细001至080 | 每个编号仅出现一次,无遗漏 |
| 中文及中英文混排 | 提取与渲染检查通过 |
| 合计位置 | 84.70元仅在末页 |
教学包内的verify.py检查单页数、合并前后的文字一致性、表头、编号和合计位置:
python -m pip install pypdf
python verify.py outputs
Python只用于教学产物检查,不参与ComPDF的生成或合并。文字检查后仍要打开4页PDF,看中文是否缺字、名称是否越界、表格是否被截断。仅有成功状态或正确页数,不能保证内容属于当前订单。

图:教学订单的检查结果。应用按明细拆页,ComPDF负责生成和合并PDF。
保存确认后的版本
保存订单快照、模板版本、各页输入和最终文件。“下载之前确认的订单”应返回已归档的文件;按新资料重新生成时另建版本,不覆盖旧件。文档访问权限由应用控制。
需要持续生成订单、报价单或业务报表时,可从开发者试用入口用自己的授权模板验证。先确认中文、分页和内容完整性,再评估额度、失败处理和部署方式。普通业务订单不等同税务发票。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: