2

У меня есть PDF, в который вставлены пустые страницы. Эти страницы имеют цвет фона (в данном случае серый). Я хотел бы удалить эти страницы, используя скрипт bash.

Было предложено, чтобы мы могли сканировать текст, используя, например, pdftotext , но в моем случае это не находит текст даже на непустых страницах.

2 ответа2

2

Похоже, не существует утилиты для удаления пустых страниц из PDF-файлов, но мы можем создать гистограмму цветов, используя команду convert из imagemagick. Пустые слайды будут иметь только одну запись, которая может быть обнаружена с помощью wc . Как только у нас есть список непустых страниц, мы можем передать его в pdftk .

Обратите внимание, что imagemagick нумерует страницы, начиная с 0, поэтому нам нужно это настроить. Мы можем использовать низкое значение в флаге -density повышения производительности (хотя слишком низкое значение, похоже, приводит к возникновению ошибки в imagemagick ).

Если мы вызовем следующий скрипт pdf_rm_blank.sh , при запуске pdf_rm_blank.sh A будет создан файл A.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
1

Спасибо за код, 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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .