Как обрезать многостраничный (изображение / отсканированный) PDF-файл (который не обрезается с помощью pdfcrop)?

Обычно я очень счастлив, используя pdfcrop , хотя обрезанный вывод обычно занимает значительно больше дискового пространства. Обратите внимание, что сопоставимый код существует , что решает и решает эту проблему. Однако, если я хочу обрезать отсканированный (графический) файл PDF, у меня сложилось впечатление, что pdfcrop просто не получается. Я полагаю, что ImageMagick способен сделать трюк, возможно, (также) сделав нас из pdftk .

.

Я ищу эффективный однострочный код (многострочный скрипт тоже подойдет ...), чтобы обрезать такой pdf-файл сверху вниз, слева и справа по x см каждый ( или, что еще лучше, с помощью abcd cm, по отдельности), пройдя весь путь от input.pdf до output.pdf.

PS: решение не должно включать ImageMagick; Я счастлив, пока это работает (чисто, надежно и эффективно) ...;)

5
задан 13 April 2017 в 15:36

3 ответа

Полный кредит происходит из-за AlexG, который случайно en passant отправил решение этой проблемы здесь, которую, для пользы полноты и таким образом, это не теряется (!), я заключаю в кавычки ниже.

Относящийся к вышеупомянутому вопросу опция обрезки, описанная в man:

Примеры использования:

#default operation
pdfcrop.sh orig.pdf cropped.pdf
pdfcrop.sh -m 10 orig.pdf cropped.pdf
pdfcrop.sh -hires orig.pdf cropped.pdf

#trimming pages
pdfcrop.sh -t "10 20 30 40" orig.pdf trimmed.pdf

Содержание pdfcrop.sh:

#!/bin/bash

function usage () {
  echo "Usage: `basename $0` [Options] <input.pdf> [<output.pdf>]"
  echo
  echo " * Removes white margins from each page in the file. (Default operation)"
  echo " * Trims page edges by given amounts. (Alternative operation)"
  echo
  echo "If only <input.pdf> is given, it is overwritten with the cropped output."
  echo
  echo "Options:"
  echo
  echo " -m \"<left> [<top> [<right> <bottom>]]\""
  echo "    adds extra margins in default operation mode. Unit is bp. A single number"
  echo "    is used for all margins, two numbers \"<left> <top>\" are applied to the"
  echo "    right and bottom margins alike."
  echo
  echo " -t \"<left> [<top> [<right> <bottom>]]\""
  echo "    trims outer page edges by the given amounts. Unit is bp. A single number"
  echo "    is used for all trims, two numbers \"<left> <top>\" are applied to the"
  echo "    right and bottom trims alike."
  echo
  echo " -hires"
  echo "    %%HiResBoundingBox is used in default operation mode."
  echo
  echo " -help"
  echo "    prints this message."
}

c=0
mar=(0 0 0 0); tri=(0 0 0 0)
bbtype=BoundingBox

while getopts m:t:h: opt
do
  case $opt
  in
    m)
    eval mar=($OPTARG)
    [[ -z "${mar[1]}" ]] && mar[1]=${mar[0]}
    [[ -z "${mar[2]}" || -z "${mar[3]}" ]] && mar[2]=${mar[0]} && mar[3]=${mar[1]}
    c=0
    ;;
    t)
    eval tri=($OPTARG)
    [[ -z "${tri[1]}" ]] && tri[1]=${tri[0]}
    [[ -z "${tri[2]}" || -z "${tri[3]}" ]] && tri[2]=${tri[0]} && tri[3]=${tri[1]}
    c=1
    ;;
    h)
    if [[ "$OPTARG" == "ires" ]]
    then
      bbtype=HiResBoundingBox
    else
      usage 1>&2; exit 0
    fi
    ;;
    \?)
    usage 1>&2; exit 1
    ;;
  esac
done
shift $((OPTIND-1))

[[ -z "$1" ]] && echo "`basename $0`: missing filename" 1>&2 && usage 1>&2 && exit 1
input=$1;output=$1;shift;
[[ -n "$1" ]] && output=$1 && shift;

(
    [[ "$c" -eq 0 ]] && gs -dNOPAUSE -q -dBATCH -sDEVICE=bbox "$input" 2>&1 | grep "%%$bbtype"
    pdftk "$input" output - uncompress
) | perl -w -n -s -e '
  BEGIN {@m=split /\s+/, $mar; @t=split /\s+/, $tri;}
  if (/BoundingBox:\s+([\d\.\s]+\d)/) { push @bbox, $1; next;}
  elsif (/\/MediaBox\s+\[([\d\.\s]+\d)\]/) { @mb=split /\s+/, $1; next; }
  elsif (/pdftk_PageNum\s+(\d+)/) {
    $p=$1-1;
    if($c){
      $mb[0]+=$t[0];$mb[1]+=$t[1];$mb[2]-=$t[2];$mb[3]-=$t[3];
      print "/MediaBox [", join(" ", @mb), "]\n";
    } else {
      @bb=split /\s+/, $bbox[$p];
      $bb[0]+=$mb[0];$bb[1]+=$mb[1];$bb[2]+=$mb[0];$bb[3]+=$mb[1];
      $bb[0]-=$m[0];$bb[1]-=$m[1];$bb[2]+=$m[2];$bb[3]+=$m[3];
      print "/MediaBox [", join(" ", @bb), "]\n";
    }
  }
  print;
' -- -mar="${mar[*]}" -tri="${tri[*]}" -c=$c | pdftk - output "$output" compress
4
ответ дан 13 April 2017 в 15:36

Это здесь самый лучший и простой и имеет замечательный графический интерфейс: Krop

Скачать deb от автора: http://arminstraub.com/computer/krop

[ 114] Обзор: http://www.hecticgeek.com/2013/08/crop-pdf-ubuntu-13-04-krop/

Редактировать: я использую кроп с 13.10 и я заметил, что последние версии Krop начали поддерживать открытие PDF с Krop правой кнопкой мыши. Я могу подтвердить это по крайней мере для 16.04 и 16.10.

0
ответ дан 13 April 2017 в 15:36

Вы можете попробовать briss . Это довольно просто, но делает работу. Это приложение с графическим интерфейсом.

Загрузите zip-файл и распакуйте его в папку по вашему выбору и запустите его:

java -jar briss-0.9.jar

Чтобы установить его постоянно и в масштабе всей системы и иметь возможность запускать его из любого места всего с briss, Вы распаковали бы загрузку в /usr/local/lib/, а затем создали исполняемый файл /usr/local/bin/briss, который содержит:

#!/bin/sh
java -jar /usr/local/lib/briss-0.9/briss-0.9.jar
0
ответ дан 13 April 2017 в 15:36

Другие вопросы по тегам:

Похожие вопросы: