File bundsteg-v1.2 of Package bundsteg

#!/bin/bash
#
# bundsteg v1.2 - print pdfs with gutter/gap/inner margin
# (c) copyright by Elmar Stellnberger, the original author: May 2009, April 2015
#
#  further information: www.elstel.org/com; look here for an actual contact address
#  current email: estellnb@elstel.org; additional email estellnb@gmail.com
#
# v.1.2: important bugfix, new features, license (19.04.2015)
#  * important bugfix: the margin now becomes exactly as large as specified, formerly the page was scaled after adding margins which makes things buggy
#    now previous margins get fully cropped, all even and odd pages are scaled to the maximum while adding printer margins for both sets of pages
#  * pdfnup is integrated: no separate invocation of pdfnup is necessary any more to add margins + get multiple slides onto one
#  * page rotation possible: before any other step pages from the source document may be rotated (ranges,modulo,individually) if necessary
#
# v.1.1: OSS based version (14.04.2015)
#  * now the program relies on OSS-tools only
#    the changes were inspired by a comment from Alessandro Cuttin 
#    who has sent me a version using podofocountpages rather than pdftools
#
# v.1.0: intial version (05.08.2009)
#  * adds margins to pdf-files
#

license() {
  cat <<EOQ
This program may be used under the terms of GPLv3; see: https://www.gnu.org/licenses/gpl-3.0.en.html.
If you apply changes please sign our contributor license agreement at https://www.elstel.org/license/CLA-elstel.pdf
so that your changes can be included into the main trunk at www.elstel.org/bundsteg/
(c) copyright by Elmar Stellnberger 2015

EOQ
  exit 0;
}

rot=$'\e[1;31m'; blau=$'\e[1;34m'; nv=$'\e[0m'; ul=$'\e[4m';
err() { echo -e "${rot}$@${nv}" >&2; }
warn() { echo -e "${rot}$@${nv}" >&2; }
msg() { echo -e "${blau}$@${nv}" >&2; }

rotate=('' 'R' 'D' 'L'); modulos=""; let should_rotate=0;

pize() { local tvar tok base T mo m rem op
  if [[ should_rotate -eq 0 ]]; then
    while read tok; do echo "P$tok"; done;
  else
    while read tok; do 
      tvar=t$tok; let base=${!tvar:-0};
      for mo in $modulos; do read m rem op <<<"${mo//:/ }"; [[ tok%m -eq rem ]] && let base+=op; done
      T=${rotate[base%4]}
      echo "P$tok$T"; 
    done;
  fi 
}

addop() { local op i left right
  case "$1" in
    r|R) let op=1;; l|L) let op=3;; d|D) let op=2;; *) err "unknown operation $1.";exit 5;;
  esac
  let should_rotate=1;
  for i in ${2//,/ }; do
    left="${i%%-*}" right="${i#*-}"; let modulo=0 remainder=0;
    if [[ "$right" =~ \~ ]]; then modulo=${right#*~}; right=${right%%~*}; fi
    if [[ "$modulo" =~ : ]]; then remainder=${modulo#*:}; modulo=${modulo%%:*}; fi
    if [[ -z "$right" && modulo -ge 1 && ( -z "$left" || "$left" = "~$modulo" || "$left" = "~$modulo:$remainder" ) ]]; then
      modulos="$modulos $modulo:$remainder:$op";
    elif [[ left -eq 0 || right -eq 0 ]]; then
      err "not a page number: $left, $right."; exit 2;
    elif [[ left -eq right &&  modulo -le 1 ]]; then
      let t${left}+=op; 
    else
      [[ modulo -le 1 ]] && let modulo=1; let remainder=remainder%modulo;
      for((i=left;i<=right;i++)); do [[ i%modulo -eq remainder ]] && let t${i}+=op; done
    fi
  done
}

calc() { 
  while [ -n "$1" ]; do
    var="${1%%=*}"; term="${1#*=}"
    term="$(sed 's#[A-Za-z][A-Za-z0-9]*#$&#g;s#(#\\(#g;s#)#\\)#g' <<<"$term")"
    eval "term=$term"
    export $var=$(bc <<<"scale=8;$term");
    shift
  done
}

round() { 
  while [ -n "$1" ]; do
    var="${1%%=*}"; term="${1#*=}"
    term="$(sed 's#[A-Za-z][A-Za-z0-9]*#$&#g;s#(#\\(#g;s#)#\\)#g' <<<"$term")"
    eval "term=$term";
    export $var=$(awk "BEGIN { printf(\"%.0f\",$term); }");
    shift
  done
}

interleave() {
  both=$((pages/2)); rem=$((pages-2*both))
  for((i=1; i<=both; i++)); do
    echo "O$i"; echo "E$i"; done
  [[ rem -gt 0 ]] && echo "O$((both+1))"
}

pdf_first_page_size() {
  pdfinfo "$1" | sed -n 's#Page size:[ \t]*\([0-9]*\)[ \t]*x\?[ \t]*\([0-9]*\).*#\2 \1 #p' 
}

let num_slurp=3;

pdf_page_size_awk() { local i
  let count=100; # [[ -z "$count" ]] && { err "\$count not set;"; exit 1; }
  { for((i=1;i<=num_slurp;i++)); do 
    [[ i -gt count ]] && break; pdfinfo -f $i -box "$1"; 
  done; echo; } | awk 'BEGIN { maxx=0; maxy=0; } /^MediaBox:/{ maxx=max(maxx,$5-$3); maxy=max(maxy,$4-$2); } END { print maxx, maxy; } function max(a,b) { if(a>=b) return a; return b; }'
  #pdfinfo -box "$1"  | sed -n 's#MediaBox:[ \t]*[0-9]*[ \t]*[0-9]*[ \t]*\([0-9]*\)[ \t]*\([0-9]*\).*#\1 \2 #p' - or better right-left?
}

pdf_page_size() {
  gs -dNODISPLAY -dQUIET -SFile="$1" - <<EOQ
File (r) file runpdfbegin

% considers MediaBox of all pages

0 0 1 1 pdfpagecount
{
  pdfgetpage /MediaBox pget {
    %oforce_array ==only
    % (\n) print
    aload pop					% left bottom right top 
    exch 3 1 roll sub neg 3 1 roll sub neg	% top-bottom left-right (maxy, maxx, Δy, Δx)
    %=print ( ) print =print (\n) print
    3 2 roll max				% max, Δy, new_maxx
    3 1 roll max				% new_maxx, new_maxy
    exch
  } if
} for

=print ( ) print =print (\n) print
% duplicate value of last page once more 

runpdfend
quit
EOQ
}

pdf_every_height() {
  gs -dNODISPLAY -dQUIET -SFile="$1" - <<EOQ
File (r) file runpdfbegin

1 1 pdfpagecount
{
  pdfgetpage /MediaBox pget {
    aload pop =print pop pop pop
    ( ) print
  } if
} for

% duplicate value of last page once more 
pdfpagecount pdfgetpage /MediaBox pget { aload pop =print pop pop pop } if

runpdfend
quit
EOQ
}

do_pdfcrop() { {
  pdfcrop "$@" 2>&1 1>&3 | sed -n "s#.*Error: Cannot move \`\([^']*\)['] to \`\([^']*\)['].*#move\n\1\n\2#p" | {
    read command; if [ "$command" = "move" ]; then
      read movefrom; read moveto; mv "$movefrom" "$moveto";
      echo mv "$movefrom" "$moveto";
    else 
      [[ -n "$command" ]] && echo "$command" >&2; 
    fi
  }
} 3>&1 | {
  if [[ verbosity -le 1 ]]; then egrep -v "PDFCROP.*Copyright| pages written on |^[ \t]*$"
  elif [[ verbosity -le 3 ]]; then grep -v "PDFCROP.*Copyright"
  else cat;
  fi
}; }

help() {
  cat <<EOQ
$(basename $0) [opts] --horiz bs[,bs2] input.pdf [output.pdf]
$(basename $0) [opts] --vert bs[,bs2] input.pdf [output.pdf]
  bs: size of gutter in mm (or the unit specified by --mm/--inch/--zoll); use f.i. 10 or 15
  you may specify a different gutter size for even pages (bs2) separated by a colon from the one for odd pages
  default output file: input.bundsteg.pdf
[opts]: -v/--verbose/-vv: be more verbose, -q/--quiet: be quiet
        --a4 (default) / --a4+ / --letter / --legal
	--mm (default) / --inch = --zoll 
	--rl/rr/rd ~1 / 2,3-4 ... rotate all pages / pages 2,3-4 left, right or double (twice)
	--rr 7-18~3:1 ... rotate pages between 7 and 18 with modulo 3 = 1
	--nup 2x1 ..... fold 2x1 input pages onto one output page
	--frame ..... draw a frame around each page, --align-bottom / --align-top
	--margin 4.2[,4.2[,4.2[,4.2]]] ... specify minimum margins (left,top,right,bottom)
	--[no-]nup-crop ... crop margins before nup; default is currently off because of an 
	                    incompatibilty between pdfnup and pdfcrop.

see also: $(basename $0) --license / --help, 
          you may visit http[s]://www.elstel.org/bundsteg to look for a demo, docs or a new upstream version

EOQ
  # for compatibility from older versions: --slurp 7 .... consider first seven pages for margin calculation (default: only three)
}

checkfound() {
  [ -f "$1" ] && return 0
  echo "executable required: $1 ${2+-package} $2"; echo
  notfound=true;
}

checkfound_gs() {
  while [[ $# -ge 1 ]]; do
    gs="$(which "$1")"; [[ -n "$gs" ]] && [ -x "$gs" ] && return
    shift
  done
  echo "could not find the ghostscript."
  notfound=true
}

setmargins() {
  set -- ${1//,/ } $2 $3 $4
  if [[ -z "$1" ]]; then calc 'li=4.2*72/25.4'; else calc "li=$1*unit"; fi
  shift;
  if [[ -z "$1" ]]; then ob=$li; else calc "ob=$1*unit"; fi
  shift;
  if [[ -z "$1" ]]; then re=$li; else calc "re=$1*unit"; fi
  shift;
  if [[ -z "$1" ]]; then un=$ob; else calc "un=$1*unit"; fi
}

if [[ "$1" = "--license" ]]; then license; fi

let verbosity=1; nup=""; frame=false; align='top'; 
calc 'unit=72/25.4'; let nupcrop=-1;
calc 'li=4.2*72/25.4' 're=li' 'ob=li' 'un=ob'
calc 'breite=210*72/25.4' 'laenge=297*72/25.4'
#calc 'li=0' 're=li' 'ob=0' 'un=ob'

while [[ "${1:0:1}" = "-" ]]; do
  if [[ "${1:0:2}" != "--" ]]; then
    for((i=1;i<${#1};i++)); do
      case "${1:i:1}" in
	v) let verbosity++;; q) let verbosity--;;
	*) err "unknown short option -${1:i:1}."; exit 2;
      esac;
    done
  else
    case "$1" in
      --license) license;; --help) help; exit 0;;
      --verbose) let verbosity++;; --quiet) let verbosity--;;
      --mm) calc 'unit=72/25.4';; --inch|--zoll) unit="72";;
      --a4) calc 'breite=210*72/25.4' 'laenge=297*72/25.4';; --a4+) calc 'breite=215.9*72/25.4' 'laenge=330.2*72/25.4';;
      --letter) calc 'breite=8.5*72' 'laenge=11*72';; --legal) calc 'breite=8.5*72' 'laenge=14*72';;
      --rr) addop R "$2"; shift;; --rl) addop L "$2"; shift;; --rd) addop D "$2"; shift;;
      --nup) nup="$2"; shift;; --slurp) let num_slurp=$2; shift;; --frame) frame=true;;
      --bottom-align|--align-bottom) align='bottom';; --top-align|--align-top) align='top';;
      --margin) setmargins "$2"; shift;; --nupcrop) let nupcrop=1;; --no-nupcrop) let nupcrop=0;;
      --horiz|--vert|--landscape|--no-landscape) break;;
      *) err "unknown long option $1."; exit 2;;
    esac;
  fi
  shift;
done

if [[ verbosity -le 1 ]]; then dofork=1; else dofork=0; fi
[[ nupcrop -lt 0 ]] && [[ -n "$nup" ]] && let nupcrop=0; # if [[ "$frame" = "true" ]]; then let nupcrop=1; else let nupcrop=0; fi

if [[ $# -ne 3 && $# -ne 4 ]]; then help; else
  input="$3"
  if [[ $# -eq 4 ]]; then output="$4"; else output="${input%.pdf}.bundsteg.pdf"; fi

  notfound=false;
  #pdftools="wine /usr/local/advanced_pdf_tools_cmd_v3.0/pdftools.exe"
  #checkfound ${pdftools#* } http://www.verypdf.com/pdfinfoeditor/
  checkfound $(which pdfcrop) texlive-extra-utils
  checkfound $(which pdfinfo) poppler-utils
  checkfound $(which pdftk) pdftk
  [[ -n "$nup" ]] && checkfound $(which pdfjam) texlive-extra-utils
  checkfound_gs gs gsos2 gswin64c gswin64 gswin32c gswin32
  $notfound && exit 1
  
  bs1=${2%%,*}; bs2=${2#*,}; # [[ bs1 -ge 0 && bs2 -ge 0 ]] || { echo "no valid value for bs (use 10 or 15 at 2nd param)";echo; exit 2; }
  calc 'bs1=bs1*unit' 'bs2=bs2*unit'

  if [[ "$1" = "--horiz" || "$1" = "--landscape" ]]; then
    calc 'li1=li' 'ob1=ob+bs1'   're2=re' 'un2=un+bs2'
    xext=$laenge; yext=$breite; # papersize="0 0 ${laenge%.*} ${breite%.*}"
    orientation="--landscape";
    calc 'xextodd=xext-(li+re)' 'yextodd=yext-(ob1+un)'
    calc 'xexteven=xext-(li+re)' 'yexteven=yext-(ob+un2)'
  elif [[ "$1" = "--vert" || "$1" = "--no-landscape" ]]; then
    calc 'li1=li+bs1' 'ob1=ob'   're2=re+bs2' 'un2=un'
    xext=$breite; yext=$laenge; # papersize="0 0 ${breite%.*} ${laenge%.*}"
    orientation="--no-landscape";
    calc 'xextodd=xext-(li1+re)' 'yextodd=yext-(ob+un)'
    calc 'xexteven=xext-(li+re2)' 'yexteven=yext-(ob+un)'
  else
    echo "final option param needs to be either --horiz or --vert."; exit 3;
  fi
  [[ "$frame" = "true" && -z "$nup" ]] && nup="1x1"

  #calc 'xextodd=xext-(li1+re)' 'yextodd=yext-(ob1+un)'
  #calc 'xexteven=xext-(li+re2)' 'yexteven=yext-(ob+un2)'

  [[ verbosity -ge 3 ]] && echo
  [[ verbosity -ge 3 ]] && echo "xext=$xext yext=$yext"
  [[ verbosity -ge 3 ]] && echo "xextodd=$xextodd ($li1 $ob1 $re $un) yextodd=$yextodd"
  [[ verbosity -ge 3 ]] && echo "xexteven=$xexteven ($li $ob $re2 $un2) yexteven=$yexteven"

  #echo "$xextodd $yextodd $li1 $ob1 $re $un"; exit 1;

  #pages=$(pdftools --countpages "$input")
  #pages=$(pdftools --info "$input" | sed -n 's#.*<pages>\([0-9]*\)</pages>*#\1#p')
  pages=$(pdftk "$input" dump_data | sed -n 's#^NumberOfPages:[ \t]*\([0-9]*\)#\1#p')
  unset pdf2rot crop4nup pdf2nup; trap 'rm -f $pdf2rot $crop4nup pdf2nup' EXIT; 
  if [[ -n "$nup" ]]; then
    if [[ should_rotate -ne 0 ]]; then
      pdf2rot="$(mktemp --suffix _rotate.pdf;)";
      if [[ verbosity -ge 2 ]]; then echo $'\n'"rotating pages: pdftk P='$input' cat $(seq 1 1 $pages | pize | tr '\n' ' ';) output $pdf2rot";
      elif [[ verbosity -ge 1 ]]; then echo "rotating pages with pdftk.";
      fi
      pdftk P="$input" cat $(seq 1 1 $pages | pize;) output $pdf2rot
      input=$pdf2rot; let should_rotate=0;
      [[ verbosity -ge 2 ]] && echo
    fi
    if [[ nupcrop -ne 0 ]]; then
      crop4nup="$(mktemp --suffix _crop4nup.pdf;)";
      [[ verbosity -ge 1 ]] && echo "pdfcrop before nup.";
      do_pdfcrop --margins "0 0 0 0" $input $crop4nup;
      input=$crop4nup;
      [[ verbosity -ge 2 ]] && echo
    fi
    pdf2nup="$(mktemp --suffix _nup.pdf;)";
    [[ verbosity -ge 1 ]] && echo "pdfjam/pdfnup --nup $nup $orientation --frame $frame --outfile $pdf2nup '$input'";
    if [[ verbosity -ge 3 ]]; then bequiet=""; else bequiet="--quiet"; fi
    pdfjam $bequiet --nup "$nup" $orientation --frame $frame --outfile $pdf2nup "$input"
    input=$pdf2nup
    [[ -n "$pdf2rot" ]] && { rm -f $pdf2rot; unset pdf2rot; }
    [[ -n "$crop4nup" ]] && { rm -f $crop4nup; unset crop4nup; }
    pages=$(pdftk "$input" dump_data | sed -n 's#^NumberOfPages:[ \t]*\([0-9]*\)#\1#p')
    [[ verbosity -ge 2 ]] && echo
  fi
  unset pdf4even pdf4odd mg4even mg4odd sc4even sc4odd bs4even bs4odd
  trap 'rm -f $pdf2nup $pdf4even $pdf4odd $mg4even $mg4odd $sc4even $sc4odd $bs4even $bs4odd' EXIT;

  [[ verbosity -ge 2 ]] && echo 'splitting odd and even pages.';
  pdf4even=$(mktemp --suffix _even.pdf); pdf4odd=$(mktemp --suffix _odd.pdf)
  [[ verbosity -ge 2 ]] && { echo "odd: $(seq 1 2 $pages | pize | tr '\n' ' ';)"; echo "even: $(seq 2 2 $pages | pize | tr '\n' ' ';)"; }
  pdftk P="$input" cat $(seq 1 2 $pages | pize;) output $pdf4odd
  pdftk P="$input" cat $(seq 2 2 $pages | pize;) output $pdf4even
  [[ -n "$pdf2nup" ]] && { rm -f $pdf2nup; unset pdf2nup; }
  
  mg4odd=$(mktemp --suffix _odd-mg.pdf); mg4even=$(mktemp --suffix _even-mg.pdf)
  bs4odd=$(mktemp --suffix _odd-bs.pdf); bs4even=$(mktemp --suffix _even-bs.pdf); 

oddpages() {
  [[ verbosity -ge 3 ]] && echo $'---------------------------------------------------------------------------\n'
  [[ verbosity -ge 3 ]] && pdfinfo $pdf4odd

  [[ verbosity -ge 2 ]] && echo
  [[ verbosity -ge 1 ]] && echo " odd pages: removing margins <$pdf4odd >$mg4odd"
  do_pdfcrop --margins "0 0 0 0" $pdf4odd $mg4odd; rm -f $pdf4odd
  read xcropodd ycropodd < <( pdf_page_size $mg4odd; );
  [[ verbosity -ge 3 ]] && echo "$xcropodd x $ycropodd"
  [[ verbosity -ge 3 ]] && pdfinfo $mg4odd

  read -d '\n' scaleodd addxodd addyodd liodd unodd obodd < <( bc <<EOQ
scale=8;
define min(x,y) { if(x<=y) return x; return y; }
  s = min( $xextodd / $xcropodd, $yextodd / $ycropodd );
  s
  addx = 0.5 * ( $xextodd - $xcropodd * s ) + 0.5
  addx
  addy = 0.5 * ( $yextodd - $ycropodd * s ) + 0.5
  addy
  $li1 + addx
  $un + addy
  $ob1 + addy

EOQ
);
  [[ verbosity -ge 3 ]] && echo "scalodd=$scaleodd addxodd=$addxodd addyodd=$addyodd liodd=$liodd unodd=$unodd obodd=$obodd";

  [[ verbosity -ge 2 ]] && echo
  [[ verbosity -ge 1 ]] && echo " odd pages: re-adding margins <$mg4odd >$bs4odd"
  # unused option: -dFitPage may not allow the exact devwidth & devheight given but rather preserve the aspect ratio
  if [[ "$align" = "top" ]]; then
    pageheightsodd="$(pdf_every_height $mg4odd)";
    [[ verbosity -ge 3 ]] && { echo "page heights (+dup last): $pageheightsodd"; } 
    $gs -sDEVICE=pdfwrite -dFIXEDMEDIA -dDEVICEWIDTHPOINTS=${xext} -dDEVICEHEIGHTPOINTS=${yext} -dBATCH -dQUIET -dNOPAUSE -sOutputFile=$bs4odd -c "<< /Install { $liodd currentpagedevice /PageSize get aload pop exch pop [$pageheightsodd] currentpagedevice /PageCount get get $scaleodd mul sub $obodd sub translate $scaleodd $scaleodd scale } bind >> setpagedevice" -f $mg4odd
  else
    $gs -sDEVICE=pdfwrite -dFIXEDMEDIA -dDEVICEWIDTHPOINTS=${xext} -dDEVICEHEIGHTPOINTS=${yext} -dBATCH -dQUIET -dNOPAUSE -sOutputFile=$bs4odd -c "<< /Install { $liodd $unodd translate $scaleodd $scaleodd scale } bind >> setpagedevice" -f $mg4odd
  fi 
  rm -f $mg4odd
  #do_pdfcrop --bbox "0 0 $xextodd $yextodd" --margins "$li1 $ob1 $re $un" $sc4odd $bs4odd; rm -f $sc4odd
  [[ verbosity -ge 3 ]] && pdfinfo $bs4odd
}

evenpages() {
  [[ verbosity -ge 3 ]] && echo $'\n---------------------------------------------------------------------------\n'
  [[ verbosity -ge 3 ]] && pdfinfo $pdf4even

  [[ verbosity -ge 2 ]] && echo
  [[ verbosity -ge 1 ]] && echo " even pages: removing margins <$pdf4even >$mg4even"
  do_pdfcrop --margins "0 0 0 0" $pdf4even $mg4even; rm -f $pdf4even
  read xcropeven ycropeven < <( pdf_page_size $mg4even; );
  [[ verbosity -ge 3 ]] && echo "$xcropeven x $ycropeven"
  [[ verbosity -ge 3 ]] && pdfinfo $mg4even

  read -d '\n' scaleeven addxeven addyeven lieven uneven obeven < <( bc <<EOQ
scale=8;
define min(x,y) { if(x<=y) return x; return y; }
  s = min( $xexteven / $xcropeven, $yexteven / $ycropeven );
  s
  addx = 0.5 * ( $xexteven - $xcropeven * s ) + 0.5
  addx
  addy = 0.5 * ( $yexteven - $ycropeven * s ) + 0.5
  addy
  $li + addx
  $un2 + addy
  $ob + addy

EOQ
);
  [[ verbosity -ge 3 ]] && echo "scaleven=$scaleeven addxeven=$addxeven addyeven=$addyeven lieven=$lieven uneven=$uneven obeven=$obeven";

  [[ verbosity -ge 2 ]] && echo
  [[ verbosity -ge 1 ]] && echo " even pages: re-adding margins <$mg4even >$bs4even"
  if [[ "$align" = "top" ]]; then
    pageheightseven="$(pdf_every_height $mg4even)";
    [[ verbosity -ge 3 ]] && { echo "page heights (+dup last): $pageheightseven"; } 
    $gs -sDEVICE=pdfwrite -dFIXEDMEDIA -dDEVICEWIDTHPOINTS=${xext} -dDEVICEHEIGHTPOINTS=${yext} -dBATCH -dQUIET -dNOPAUSE -sOutputFile=$bs4even -c "<< /Install { $lieven currentpagedevice /PageSize get aload pop exch pop [$pageheightseven] currentpagedevice /PageCount get get $scaleeven mul sub $obeven sub translate $scaleeven $scaleeven scale } bind >> setpagedevice" -f $mg4even
  else
    $gs -sDEVICE=pdfwrite -dFIXEDMEDIA -dDEVICEWIDTHPOINTS=${xext} -dDEVICEHEIGHTPOINTS=${yext} -dBATCH -dQUIET -dNOPAUSE -sOutputFile=$bs4even -c "<< /Install { $lieven $uneven translate $scaleeven $scaleeven scale } bind >> setpagedevice" -f $mg4even
  fi
  rm -f $mg4even
  #do_pdfcrop --bbox "0 0 $xexteven $yexteven" --margins "$li $ob $re2 $un2" $sc4even $bs4even; rm -f $sc4even
  [[ verbosity -ge 3 ]] && pdfinfo $bs4even
  #okular $bs4even
}
 
  if [[ dofork -eq 0 ]]; then
    oddpages
    evenpages

  else
    set +m
    oddpages & pid4odd=$!
    evenpages
    wait $pid4odd
    set -m
  fi

  [[ verbosity -ge 3 ]] && echo $'\n---------------------------------------------------------------------------\n'

  if [[ verbosity -ge 3 ]]; then echo $'\n'" pdftk E=$bs4even O=$bs4odd cat $(interleave | tr '\n' ' ') output \"$output\""
  elif [[ verbosity -ge 2 ]]; then echo $'\n'"combining odd and even pages.";
  elif [[ verbosity -ge 1 ]]; then echo "combining odd and even pages.";
  fi
  [[ verbosity -gt 3 ]] && pdftkverbose=verbose
  pdftk E=$bs4even O=$bs4odd cat $(interleave) output "$output" $pdftkverbose

  rm -f $bs4even $bs4odd
  trap '' EXIT;
  if [[ verbostiy -ge 2 ]]; then echo $'\n'; else echo; fi
fi


openSUSE Build Service is sponsored by