Remova páginas em branco do PDF da linha de comando

2

Eu tenho um PDF que tem algumas páginas em branco inseridas. Essas páginas são a cor de fundo (cinza, neste caso). Eu gostaria de remover essas páginas usando um script bash.

Foi sugerido que podemos digitalizar texto usando, por exemplo, pdftotext , mas no meu caso isso não encontra texto nem nas páginas que não estão em branco.

    
por gmatht 08.09.2017 / 11:59

2 respostas

2

Parece não haver um utilitário para remover páginas em branco de PDFs, mas podemos criar um histograma de cores usando o comando convert do imagemagick. Os slides em branco terão apenas uma entrada que pode ser detectada com wc . Quando tivermos uma lista de páginas não em branco, poderemos inserir isso em pdftk .

Note que imagemagick contém páginas a partir de 0, então precisamos nos ajustar para isso. Podemos usar um valor baixo no sinalizador -density para melhorar o desempenho (embora muito baixo pareça resultar em segmentação de imagem do imagemagick).

Se chamarmos o script a seguir pdf_rm_blank.sh , a execução de pdf_rm_blank.sh A criará A.rm.pdf de 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
    
por 08.09.2017 / 11:59
1

Obrigado pelo código, gmatht. Eu o modifiquei para verificar a cobertura da página usando o GhostScript e excluir páginas com cobertura inferior a um limite (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"
    
por 26.03.2018 / 05:50

Tags