MacOS PDF分割和合并

2020-08-10  本文已影响0人  千羽之城88

工具(brew search xpdf):

  1. pdfinfo
  2. pdfseparate
  3. pdfunite
  4. shell
  5. gsed
  6. 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,然后保存,就可以得到一个服务, 右键电脑鼠标的时候就可以看到。

automator automator界面

代码如下:

#!/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
上一篇下一篇

猜你喜欢

热点阅读