基于Bash批量提取多PDF指定页面生成新PDF的最优方案咨询
基于Bash批量提取多PDF指定页面生成新PDF的最优方案咨询
嘿,这个需求我太熟了——常年批量处理PDF页面的话,用pdftk或者qpdf都是非常靠谱的选择,尤其是qpdf现在更新更活跃,推荐优先考虑。下面给你详细拆解两种方案,还有适合长期复用的脚本写法:
方案一:用qpdf(推荐,现代且灵活)
qpdf是一款轻量且功能强大的PDF处理工具,支持页面提取、合并、加密等多种操作,在大多数Linux发行版里都能轻松安装:
- Debian/Ubuntu系:
sudo apt install qpdf - CentOS/RHEL系:
sudo dnf install qpdf
针对你的需求,直接执行这条命令就能生成目标PDF:
qpdf --empty --pages a.pdf 2,5 b.pdf 3,4 c.pdf 7-9 -- output.pdf
参数解释:
--empty:先创建一个空的基础PDF作为容器--pages:后面依次跟上源PDF文件+要提取的页面范围,多个文件用空格分隔- 页面范围支持:用逗号分隔单个页面(如
2,5),用横杠表示连续页面(如7-9) --:用来分隔参数和输出文件名,避免文件名和参数混淆output.pdf:最终生成的新PDF文件名
方案二:用pdftk(经典工具,兼容性好)
pdftk是老牌的PDF工具,很多人习惯用它,现在主流是Java版本:
- Debian/Ubuntu系:
sudo apt install pdftk-java
对应你的需求,命令写法是:
pdftk a.pdf cat 2 5 b.pdf cat 3 4 c.pdf cat 7-9 output output.pdf
参数解释:
cat:表示要提取(拼接)指定页面的指令- 每个源PDF后面跟上
cat+页面列表,最后用output指定输出文件
长期复用的脚本方案(适合批量重复操作)
既然你未来要处理很多不同的PDF和页面组合,写一个可复用的脚本会更高效。比如创建一个merge_pdf_pages.sh脚本:
#!/bin/bash # 配置区域:修改这里的内容即可适配不同任务 # 格式:"PDF文件名 页面范围",每行一个任务 pdf_jobs=( "a.pdf 2,5" "b.pdf 3,4" "c.pdf 7-9" ) # 指定输出文件名 output_file="merged_result.pdf" # 使用qpdf执行合并(推荐) qpdf --empty --pages "${pdf_jobs[@]}" -- "$output_file" # 如果习惯用pdftk,注释上面的qpdf命令,取消下面的注释 # pdftk $(printf "%s cat %s " "${pdf_jobs[@]}") output "$output_file"
使用方法:
- 保存脚本后,赋予执行权限:
chmod +x merge_pdf_pages.sh - 每次处理新任务时,只需要修改
pdf_jobs数组里的PDF文件名和页面范围 - 运行脚本:
./merge_pdf_pages.sh
小提示
- 确保所有源PDF文件都在脚本运行的目录下,或者写完整的文件路径(如
/home/user/docs/a.pdf) - 页面范围不要超过PDF的总页数(你提到所有输入都是10页,这点没问题)
- 测试时可以先输出到临时文件(如
temp_output.pdf),避免误覆盖重要文件
备注:内容来源于stack exchange,提问作者lmat - Reinstate Monica
相关产品推荐
相关产品推荐

