批量按文件名/序号合并PDF/JPEG文件的解决方案求助
批量按文件名/序号合并PDF/JPEG文件的解决方案求助
嗨,这个批量合并文件的需求我刚好处理过类似的,给你分享两个实用的方案,不用找复杂的付费工具,应该能解决你的问题:
方案一:Python脚本灵活处理(适合有一点点编程基础的朋友)
首先你需要装两个Python小工具库,打开命令行跑这行命令就行:
pip install pillow PyPDF2
然后用下面这个脚本,思路就是先按文件名前缀分组,再给每组文件排好顺序,把图片转成PDF后合并成最终文件:
import os from PIL import Image from PyPDF2 import PdfMerger # 这里改成你存放文件的实际文件夹路径 folder_path = "./your_file_folder" # 用字典给文件按前缀分组 file_groups = {} # 遍历文件夹里的所有图片和PDF for filename in os.listdir(folder_path): if filename.lower().endswith(('.jpg', '.jpeg', '.pdf')): # 提取前缀:带_Page的取前面部分,不带的直接取文件名(去掉后缀) if '_Page_' in filename: prefix = filename.split('_Page_')[0] else: prefix = os.path.splitext(filename)[0] # 把文件加到对应分组里 if prefix not in file_groups: file_groups[prefix] = [] file_groups[prefix].append(filename) # 逐个处理每个分组 for prefix, files in file_groups.items(): # 定义排序规则:主文件排最前,然后按Page后面的数字从小到大排 def sort_file(file): if '_Page_' not in file: # 主文件用0当排序键,确保排第一 return (0, 0) else: # 提取页码数字 page_num = int(file.split('_Page_')[1].split('.')[0]) return (1, page_num) # 给当前组的文件排序 sorted_files = sorted(files, key=sort_file) merger = PdfMerger() temp_pdfs = [] for file in sorted_files: full_path = os.path.join(folder_path, file) if file.lower().endswith(('.jpg', '.jpeg')): # 把图片转成临时PDF img = Image.open(full_path) temp_pdf = os.path.join(folder_path, f"temp_{prefix}_{os.path.splitext(file)[0]}.pdf") img.convert('RGB').save(temp_pdf) temp_pdfs.append(temp_pdf) merger.append(temp_pdf) elif file.lower().endswith('.pdf'): # 直接添加原PDF文件 merger.append(full_path) # 保存最终的合并PDF output_file = os.path.join(folder_path, f"{prefix}.pdf") merger.write(output_file) merger.close() # 清理临时PDF for temp in temp_pdfs: os.remove(temp) print(f"搞定啦!已生成合并文件:{output_file}")
使用的时候,把脚本里的folder_path改成你自己的文件夹路径,运行脚本就可以自动处理所有文件了。
方案二:命令行工具组合(适合不想碰代码的朋友)
如果你不想写Python脚本,可以用两个免费的命令行工具配合:ImageMagick(负责把图片转成PDF)和pdftk(负责合并PDF)。
步骤说明:
- 先安装这两个工具:
- Windows:去官网下载安装包就行,注意安装时要选“添加到系统PATH”
- Linux(比如Ubuntu):跑
sudo apt install imagemagick pdftk - macOS:用Homebrew的话跑
brew install imagemagick pdftk-java
- 然后写个批处理/Shell脚本自动处理:
比如macOS/Linux的Shell脚本:
#!/bin/bash # 遍历所有主文件的前缀(比如0001、0002) for prefix in $(ls | grep -E '^[0-9]+(\.jpg|\.jpeg|\.pdf)$' | sed 's/\.[^.]*$//' | sort -u); do # 收集当前前缀的所有文件,按顺序排列 file_list=() # 先加主文件 main_file=$(ls | grep -E "^${prefix}\.(jpg|jpeg|pdf)$") if [ -n "$main_file" ]; then file_list+=("$main_file") fi # 再加带Page的文件,按页码数字排序 page_files=$(ls | grep -E "^${prefix}_Page_[0-9]+\.(jpg|jpeg|pdf)$" | sort -t '_' -k3n) for f in $page_files; do file_list+=("$f") done # 把图片转成临时PDF temp_files=() for f in "${file_list[@]}"; do if [[ $f =~ \.(jpg|jpeg)$ ]]; then temp_pdf="${f%.*}_temp.pdf" convert "$f" "$temp_pdf" temp_files+=("$temp_pdf") else temp_files+=("$f") fi done # 合并所有临时PDF成最终文件 pdftk "${temp_files[@]}" cat output "${prefix}.pdf" # 删除临时文件 for temp in "${temp_files[@]}"; do if [[ $temp =~ _temp\.pdf$ ]]; then rm "$temp" fi done echo "已生成合并文件:${prefix}.pdf" done
Windows的批处理脚本逻辑类似,如果你需要的话可以再调整细节。
这两个方案都能完美匹配你的需求,你可以根据自己的情况选一个试试~如果遇到具体的问题,比如工具安装、脚本报错,可以再补充细节问大家!
备注:内容来源于stack exchange,提问作者QualityCare
相关产品推荐
相关产品推荐

