thinkphp中批量重命名并合并pdf需分四步:先校验pdf数量≥2;再依excel映射表重命名,跳过已存在文件;然后重新扫描获取新文件列表;最后用pdftk或pdfmerger合并为merged_final.pdf,可选删除源文件。

你需要在ThinkPHP项目中一次性处理几十个PDF文件,既要按业务规则重命名,又要合并成最终交付包,手动操作根本来不及,而且容易出错漏。
用ThinkPHP控制器批量重命名PDF文件
这一步适合已有明确映射关系(如Excel对照表)或固定格式(如“订单号_时间.pdf”)的场景。
1. 在app/controller/Tool.php中新建batchRenamePdf方法,先确保目录可写:【$pdfDir = public_path('uploads/pdfs') 必须存在且PHP进程有写权限]。
2. 读取Excel映射表(假设A列为原名、B列为新名,不含扩展名):$map = \think\facade\Db::name('pdf_rename_map')->select(); 或用PhpOffice\PhpSpreadsheet\Reader\Xlsx解析本地xlsx文件。
3. 遍历目录下所有PDF:$files = glob($pdfDir . '/*.pdf');,对每个文件提取基础名(不含路径和后缀),查表匹配,构造新路径:$newPath = $pdfDir . '/' . $newName . '.pdf';
4. 执行重命名前务必检查目标文件是否已存在:if (!file_exists($newPath)) { rename($oldPath, $newPath); },否则跳过并记录日志——【跳过不覆盖是默认安全策略,不可关闭】。
用ThinkPHP调用外部工具合并PDF
ThinkPHP本身不内置PDF合并能力,但可通过exec()或shell_exec()调用稳定可靠的命令行工具,避免引入高风险第三方PHP库。
方法一:调用系统已安装的pdftk(Windows/Linux/macOS均支持)
确保服务器已安装pdftk,然后在控制器中执行:$cmd = "pdftk " . escapeshellarg($pdfDir . "/*.pdf") . " cat output " . escapeshellarg($pdfDir . "/merged_output.pdf"); exec($cmd, $output, $returnCode);。返回码非0即失败,需捕获$output排查具体错误。
方法二:调用PHP封装好的轻量工具(推荐)
使用composer require setasign/fpdi:2.6.2 tomsgu/pdf-merger:2.0.0,在方法内实例化:$merger = new \Tomsgu\PdfMerger\PdfCollection(); foreach ($pdfFiles as $f) { $merger->addFile($f); } $merger->merge($pdfDir . '/merged.pdf');。注意:该库不支持加密PDF,遇到会直接抛异常中断。
一键触发重命名+合并的整合流程
把两个动作串成原子操作,防止重命名完成但合并失败导致状态不一致。
第一步:校验输入
检查uploads/pdfs/下是否存在至少2个PDF文件,少于2个则直接返回提示,不执行后续。
第二步:执行重命名
调用前述batchRenamePdf()逻辑,记录成功/失败数量到Log::info("Renamed {$successCount}/{$total} PDFs")。
第三步:收集新文件列表
重命名完成后,**必须重新glob一次**:$renamedFiles = array_values(array_filter(glob($pdfDir . '/*.pdf'), function($f) { return is_file($f) && pathinfo($f, PATHINFO_EXTENSION)==='pdf'; }));,避免使用旧缓存路径。
第四步:合并并清理临时文件
调用pdftk或PdfMerger生成merged_final.pdf;合并成功后,可选执行array_map('unlink', $renamedFiles)删除源文件——【此操作不可逆,仅当业务允许源文件废弃时启用】。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











