工具(brew search xpdf
):
- pdfinfo
- pdfseparate
- pdfunite
- shell
- gsed
- gawk
手里有一些PDF,需要批量合并,文件名有一定的规律比如:
xxxx xxxx xxxx 1-20.pdf
xxxx xxxx xxxx 21-40.pdf
...
xxxx xxxx xxxx 500-525.pdf
先用一条命令把文件全部分到不同的文件夹,文件夹命名为:1-20
文件夹for i in *.pdf; \
do;\
folder=$(echo $i | gawk -F "[ .]" '{print $4}'); \
mkdir $folder; \
mv "$i" $folder ; \
done
命令 | 描述 |
---|---|
for i in *.pdf; do...done | for 循环 |
-F "[ .]" | 定义gawk的分割符 |
mkdir $folder | 创建文件夹 |
mv "$i" $folder | 将对应的pdf移到到文件夹内 |
接着通过pdfinfo
得到PDF的页数,然后用 pdfseparate
把每个文件夹内的pdf全部拆散。
#/bin/bash
# 获取pdf的页数,调用pdfseparate工具分割pdf
# Created by: buddy.qin@gmail.com
# Date: 2020-08-01
# 文件夹类型:1-20/21-40/41-60
for d in */
do
# 进入目标文件夹
pushd "./$d" > /dev/null 2>&1
for f in *.pdf
do
last=$(pdfinfo "$f" | gsed -n "/Pages/{s/Pages:\s\+//gp}")
echo "$f"
pdfseparate -f 1 -l $last "$f" %d.pdf
done
# 退出目标目录,回到根目录
popd > /dev/null 2>&1
done
文件夹结构
├── 1-20
│ ├── xxxx xxxx xxxx 1-20.pdf
│ ├── 1.pdf
│ ├── 2.pdf
│ ├── ...pdf
│ ├── N.pdf
├── 21-40
│ ├── xxxx xxxx xxxx 21-40.pdf
│ ├── 1.pdf
│ ├── 2.pdf
│ ├── ...pdf
│ ├── N.pdf
├── 41-60
│ ├── xxxx xxxx xxxx 41-60.pdf
│ ├──1.pdf
│ ├──2.pdf
│ ├──...pdf
│ ├──N.pdf
├── 61-80
│ ├── xxxx xxxx xxxx 61-80.pdf
得到如下图的拆散后的文件,然后通过肉眼可见的方式,选中拆散的文件,然后使用 pdfunite
工具来合并选中的pdf。
合并pdf的动图:
合并拆散后的pdf添加到MacOS右键(服务)
打开 Mac 上的 automator
,新建一个quick action
,然后保存,就可以得到一个服务, 右键电脑鼠标的时候就可以看到。
代码如下:
#!/bin/bash
# created by: buddy.qin@gmail.com
# date: 2020-08-01
# 在形如:1-20 的文件夹,对序号为1.pdf/2.pdf/3.pdf...n.pdf的文件进行合并
# 以文件夹的第一个数字为起点,比如21-40的文件夹,则以Dealer_Contract_21.pdf合并选中的pdf
# 接着每选中文件进行合并的时候,判断已有的合并得到的pdf,以最大的那个数为基础,递归+1
# 比如目前已有的合并得到的PDF,Dealer_Contract_25.pdf,则选中零散的pdf,合并后得到:Dealer_Contract_26.pdf
pdfunite=/usr/local/bin/pdfunite
for f in "$@"
do
idx=$(dirname "$f"|sed "s/.*\///; s/-.*//")
# echo $idx
folder=$(dirname "$f")
break
done
if [ -e "$folder/Dealer_Contract_$idx.pdf" ]
then
#idx=$((idx+1))
pushd "$folder" 2>1 &> /dev/null
for pdf in `ls -rtc Dealer_*.pdf` # bug: 1.pdf 10.pdf 2.pdf ... 9.pdf
do
#echo "$pdf"
# get last file name num
idx=$(echo $pdf|sed "s/Dealer_Contract_//g; s/.pdf//")
done
echo "Last is: $idx"
idx=$((idx+1))
echo "Now is: $idx"
$pdfunite "$@" \
"$folder/Dealer_Contract_$idx.pdf"
else
echo "Start from: $idx"
$pdfunite "$@" \
"$folder/Dealer_Contract_$idx.pdf"
fi
在形如 61-80 的文件夹内选中拆散的pdf,再根据文件夹的前缀数字命令,
提示 提示已有的文件名 自动递增文件名xpdf工具集
命令 | 描述 |
---|---|
pdfunite | 合并pdf |
pdftotext | pdf转text |
pdftops | pdf转ops |
pdftoppm | pdf转ppm |
pdftohtml | pdf转html |
pdftocairo | pdf转cairo |
pdfsig | pdf签名 |
pdfseparate | 拆分pdf |
pdfinfo | pdf元数据 |
pdfimages | pdf转图片 |
pdffonts | 提取pdf字体 |
pdfdetach | 删除pdf内置附件 |
pdfattach | 给pdf添加附件 |
pdf2ps | pdf转ps |
pdf2dsc | pdf转dsc |
网友评论