使用PDFtk Pro按文件名唯一标识批量合并PDF的批处理脚本求助
批量合并PDF批处理调整方案
原脚本问题说明
原来的脚本存在三个核心问题:
- 固定截取文件名后30位的逻辑不通用,无法适配不同长度的第三段标识
- 没有按第三段标识分组的逻辑,仅支持两两合并,无法处理3份及以上同标识文件的合并需求
- 输出路径的写入逻辑存在覆盖问题,运行时容易出现读写冲突报错
实现逻辑
- 先遍历所有符合命名规则的PDF文件,按下划线拆分文件名提取第三段作为分组标识,将同标识的文件归入同一分组
- 遍历所有分组:单文件分组直接复制到输出目录,多文件分组调用pdftk按序号顺序合并后输出
完整可运行脚本
@echo off setlocal enabledelayedexpansion :: 配置输出目录,请确保目录已提前创建 set "OUTPUT_DIR=C:\IN\_fileNames\Merge\Files\" :: 清空历史分组变量 for /f "delims==" %%a in ('set group_ 2^>nul') do set "%%a=" for /f "delims==" %%a in ('set count_ 2^>nul') do set "%%a=" :: 第一步:遍历所有待合并PDF,按第三段标识分组 for %%f in (115_*.pdf) do ( set "file_name=%%~nf" :: 按下划线拆分取第三段作为分组ID for /f "tokens=3 delims=_" %%k in ("!file_name!") do set "group_id=%%k" :: 分组计数+1,存入当前分组的文件列表 set /a count_!group_id! += 1 set "group_!group_id!_!count_!group_id!"=%%f ) :: 第二步:按分组处理合并/复制 for /f "tokens=2 delims=_" %%g in ('set count_ 2^>nul') do ( set "current_group=%%g" set "file_num=!count_%%g!" if !file_num! equ 1 ( :: 单文件直接复制到输出目录 call set "source_file=%%group_!current_group!_1%%" copy "!source_file!" "!OUTPUT_DIR!!current_group!.pdf" >nul ) else ( :: 拼接多文件合并参数 set "merge_param=" for /l %%i in (1,1,!file_num!) do ( call set "current_file=%%group_!current_group!_%%i%%" set "merge_param=!merge_param! "!current_file!"" ) :: 调用pdftk合并,输出文件用分组ID命名 pdftk !merge_param! cat output "!OUTPUT_DIR!!current_group!.pdf" ) ) echo 所有PDF处理完成 endlocal pause
使用注意事项
- 如果系统没有将pdftk加入环境变量,请将脚本中的
pdftk替换为你本地pdftk的完整安装路径,例如"C:\Program Files (x86)\PDFtk\bin\pdftk.exe" - 文件名必须严格遵循
115_xxx_第三段标识_xxx_序号.PDF的下划线分隔规则,否则会出现分组识别错误 - 同组文件会按序号从小到大的顺序合并,如需调整合并顺序可以修改遍历文件的排序逻辑
- 请提前创建脚本中配置的输出目录,避免出现路径不存在的报错
内容的提问来源于stack exchange,提问作者Ethan Namkung
相关产品推荐
相关产品推荐

