Laravel生成订单PDF:跨页表头丢了,怎样拆页再合并?

AI摘要
该内容为技术教程,介绍使用Laravel与ComPDF接口实现订单明细跨页表头重复、分页生成及PDF合并的流程,包含代码示例、运行环境、验收检查与版本归档建议,属于知识分享,无违规风险。

订单明细跨页后,第二页没有表头,读者就很难对照商品和金额。反复调整分页CSS仍不稳定时,可以把明细先拆成多份完整HTML,逐页生成PDF,再按顺序合并。

下面用Laravel的Blade和HTTP Client,配合ComPDF生成与合并接口完成这个流程。应用决定每页放哪些明细,ComPDF负责渲染中文HTML和合并PDF。

Laravel订单跨页表头:先拆页再合并

先运行教学工程

下载示例代码、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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
36
粉丝
2
喜欢
7
收藏
9
排名:1416
访问:2675
私信
所有博文
社区赞助商