从命令行删除 PDF 中的空白页

gma*_*tht 6 pdf shell

我有一个插入了一些空白页的 PDF。这些页面是背景颜色(在这种情况下为灰色)。我想使用 bash 脚本删除这些页面。

有人建议我们可以使用 eg 扫描文本pdftotext,但在我的情况下,即使在非空白页面上也找不到文本。

小智 6

谢谢你的代码,gmatht。我已经修改它以使用 GhostScript 检查页面覆盖率并删除覆盖率小于阈值 (0.1%) 的页面。

#!/bin/sh
IN="$1"
filename=$(basename "${IN}")
filename="${filename%.*}"
PAGES=$(pdfinfo "$IN" | grep ^Pages: | tr -dc '0-9')

non_blank() {
    for i in $(seq 1 $PAGES)
    do
        PERCENT=$(gs -o -  -dFirstPage=${i} -dLastPage=${i} -sDEVICE=inkcov "$IN" | grep CMYK | nawk 'BEGIN { sum=0; } {sum += $1 + $2 + $3 + $4;} END { printf "%.5f\n", sum } ')
        if [ $(echo "$PERCENT > 0.001" | bc) -eq 1 ]
        then
            echo $i
            #echo $i 1>&2
        fi
        echo -n . 1>&2
    done | tee "$filename.tmp"
    echo 1>&2
}

set +x
pdftk "${IN}" cat $(non_blank) output "${filename}.pdf"
Run Code Online (Sandbox Code Playgroud)


gma*_*tht 4

似乎没有一个实用程序可以从 PDF 中删除空白页面,但我们可以使用convertimagemagick 的命令创建颜色直方图。空白幻灯片只有一个可以用 检测到的条目wc。一旦我们有了非空白页的列表,我们就可以将其输入到pdftk.

请注意,imagemagick 从 0 开始编号页面,因此我们需要对此进行调整。我们可以在标志中使用较低的值-density来提高性能(尽管太低似乎会导致 imagemagick 段错误)。

如果我们调用以下脚本pdf_rm_blank.sh,运行pdf_rm_blank.sh AA.rm.pdf创建A.pdf

#!/bin/sh
IN="$1"
PAGES=$(pdfinfo $IN.pdf | grep ^Pages: | tr -dc '0-9')

non_blank() {
    for i in $(seq 1 $PAGES)
    do
        if [ $(convert -density 35 "$IN.pdf[$((i-1))]" -define histogram:unique-colors=true -format %c histogram:info:- | wc -l) -ne 1 ]
        then
            echo $i
            #echo $i 1>&2
        fi
        echo -n . 1>&2
    done | tee out.tmp
    echo 1>&2
}

set +x
pdftk $IN.pdf cat $(non_blank) output $IN.rm.pdf
Run Code Online (Sandbox Code Playgroud)