Laravel合并审批附件:让文件、页范围和输出顺序保持一致

AI摘要
该内容为技术知识分享,介绍PDF合并接口的调用方法,包括附件权限校验、输入版本固定、页范围与文件顺序对应关系、multipart字段写法及输出顺序验证。文中强调密钥由服务端配置、不写入浏览器或日志,路径由后端解析,并说明示例超时与节点需按实际账号确认。属于开发接入与测试验证类教程。

ComPDF审批附件合并封面

审批单、证明材料和补充附件要合成一份PDF。系统不仅要合并文件,还要让用户指定的顺序、页范围与实际输出一致。

可下载教学输入、实际产物与示例代码对照检查。包内不含API密钥、SDK许可或SDK安装包。

从附件记录建立输入

后端先确认当前用户能读取各附件,并固定输入版本。清单至少保留附件ID、位置和页范围。下载缺失或文件版本变化时,返回具体问题,不自动跳过后仍标记为完整材料。

下面用两份服务端教学文件演示请求结构。真实路径由后端附件记录解析,不能由浏览器提交任意绝对路径。

先用接口请求做对照

下载教学包并解压,在包含inputs目录的位置运行。服务端环境变量COMPDF_API_KEY应已配置,不把实际密钥写进文章或浏览器:

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=@inputs/appendix-a.pdf' \
  --form 'file=@inputs/appendix-b.pdf' \
  --form 'filePageRanges=all' \
  --form 'filePageRanges=1' \
  --form 'outputFileName=approval.pdf' \
  --output response.json

先检查JSON的业务状态,成功后按结果地址下载,再与教学包中的outputs/merge-repeated.pdf比较。这条接口请求和正反页序已有实际结果;下文Laravel片段是对同一multipart请求的接入写法,此轮没有运行完整Laravel应用。

顺序与页范围一起提交

ComPDF合并接口按文件提交顺序处理,filePageRanges与文件一一对应,页码从1开始。下面使用Laravel HTTP Client发送两份文件;$pathA、$pathB来自已验证的本地输入,$key来自服务端配置。

use Illuminate\Support\Facades\Http;

$a = fopen($pathA, 'rb');
$b = fopen($pathB, 'rb');
if ($a === false || $b === false) {
    if (is_resource($a)) fclose($a);
    if (is_resource($b)) fclose($b);
    throw new RuntimeException('读取教学附件失败');
}
try {
    $response = Http::withHeaders(['x-api-key' => $key])
        ->timeout(120)
        ->attach('file', $a, 'application.pdf')
        ->attach('file', $b, 'proof.pdf')
        ->post('https://api-server.compdf.com/server/v2/process/pdf/merge', [
            ['name' => 'filePageRanges', 'contents' => 'all'],
            ['name' => 'filePageRanges', 'contents' => '1'],
            ['name' => 'outputFileName', 'contents' => 'approval.pdf'],
        ]);
    $response->throw();
    $payload = $response->json();
} finally {
    if (is_resource($a)) fclose($a);
    if (is_resource($b)) fclose($b);
}

这里合并A的全部页和B的第一页。120秒是示例客户端超时,不代表服务处理承诺。示例使用海外节点;实际节点、请求模式和数组编码应按当前账号及接口确认。

throw()只检查HTTP错误。继续核对$payload中的业务状态、错误及结果地址;接口返回结构以当前版本为准。需要密码时,密码列表也必须与文件清单对齐,不记录到日志。

请求字段也要用实际结果验证

本轮直接调用API时,带方括号的filePageRanges[]写法没有通过;改成重复的filePageRanges字段后,输出为3页,顺序是A第1页、A第2页、B第1页。反向提交B第1页、A全部页,输出顺序也相应改变。

因此上面的请求按重复字段组织,不把PHP数组名称原样当成接口字段。不同客户端最终发出的multipart字段仍需核对;本轮API线格式和产物已验证,Laravel运行环境尚需单独检查。

ComPDF教学检查结果

图:本轮教学输入的实际检查结果;适用范围与未通过项见正文。

检查输出顺序

下载结果后,检查总页数以及A结束、B开始的位置。教学文件的首页可分别写上A、B,便于检查;总页数相同不代表顺序正确。

把顺序改成B、A,再执行一次,确认输出也相应改变。最后用缺失文件测试失败提示,确认不会交付少一份附件的结果。

归档时保存有序输入版本清单与最终文件。用户替换附件或调整顺序时,生成新结果。审批系统需要持续执行此操作时,可在开发者平台用授权样本评估接口,先验证页范围与输出,再增加队列和批量能力。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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