1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
|
#! /bin/bash
##
## pdfnup: A shell program to generate a "n-up" version of a PDF file
##
## Author David Firth (http://www.warwick.ac.uk/go/dfirth)
##
version=1.20
echo "This is pdfnup version ""$version"
##
## Relies on pdflatex and the 'pdfpages' package (version 0.2e
## or later).
##
#######################################################################
## CONFIGURATION: change this block as necessary
##
## THESE SETTINGS WILL BE OVER-RIDDEN by any found at
## /etc/pdfnup.conf
## /usr/share/etc/pdfnup.conf
## /usr/local/share/pdfnup.conf
## /usr/local/etc/pdfnup.conf
## ~/.pdfnup.conf
## (which are read in that order)
##
## First say where your "pdflatex" program lives:
##
pdflatex="/usr/bin/pdflatex"
#pdflatex="pdflatex.exe" ## this for Windows computers
##
## Next a permitted location for temporary files on your system:
##
tempfileDir="/var/tmp" ## /var/tmp is standard on many unix systems
#tempfileDir="C:/tmp" ## use something like this under Windows
##
## Now specify the default settings for pdfnup:
##
frame=false ## do not print a thin border around pages
nup=2x1 ## two logical pages side by side
paper=a4paper ## alternatives are other LaTeX paper sizes
orient=auto ## alternatives are landscape and portrait
pages=all
turn=true ## landscape pages are landscape-oriented
noautoscale=false ## scale logical pages to fit
column=false ## don't use column-major ordering
columnstrict=false ## (see the pdfpages manual)
delta="0 0" ## no space between logical pages
offset="0 0" ## output centred on physical page
trim="0 0 0 0" ## don't trim the logical pages
scale=1.0 ## don't scale the resultant pages
openright=false ## don't insert blank page at front of document
tidy=true ## delete all temporary files immediately
##
## END OF CONFIGURATION
#######################################################################
##
## Read the configuration file(s) if such exist:
##
for d in /etc /usr/share/etc /usr/local/share /usr/local/etc
do if test -f $d/pdfnup.conf; then
echo "Reading site configuration from $d/pdfnup.conf"
source $d/pdfnup.conf
fi
done
if test -f ~/.pdfnup.conf; then
echo "Reading user defaults from ~/.pdfnup.conf";
source ~/.pdfnup.conf;
fi
#######################################################################
##
## Define the output of "pdfnup --help"
##
helptext="
Usage: pdfnup args
where args must include source pdf filename(s) and optionally also
* a specification, such as --nup 2x1 (two pages side by side)
--nup 1x2 (two pages stacked vertically)
--nup 2x2 etc
(in general mxn, where m and n are single-digit integers)
* a list or range of pages to be included, for example
--pages 3-6
--pages 2,8,4,5
--pages all
* a LaTeX papersize, for example --paper a4paper
--paper letterpaper
* the output page orientation, one of --orient landscape
--orient portrait
--orient auto
(""auto"" guesses orientation; in the case of --nup 2x2,
--nup 3x3, etc., ""auto"" produces output pages the same size
as the logical pages being n-upped.)
* one of --frame true
--frame false
according to whether or not a thin line is required around pages
* a page-trimming specification such as
--trim \"1cm 1cm 1cm 1cm\"
(Note that trimming does not mix well with --frame true.)
* an \"offset\" specification such as
--offset \"1cm 0.5cm\"
to offset the position of output pages (see the pdfpages manual)
* a \"delta\" specification such as
--delta \"1cm 1cm\"
to put space between logical pages (see the pdfpages manual)
* a \"scale\" specification such as
--scale 0.91
to scale the output up or down in size (decrease or increase margins)
* one of --openright true
--openright false
according to whether or not a blank page should be inserted before
the first logical page
* one of --turn true
--turn false
according to whether or not landscape pages should be displayed in
landscape orientation
* one of --noautoscale true
--noautoscale false
for scaling of logical pages to fit (or not)
* one of --column true
--column false
according to whether or not column-major order should be used
* one of --columnstrict true
--columnstrict false
for whether or not the *last* page should be column-major ordered
regardless of how full it is
* a specific name for the output file, e.g. --outfile my2up.pdf
* one of --tidy true
--tidy false
according to whether or not temporary files should be deleted immediately.
If --tidy false is used, such files are left in $tempfileDir.
Default arguments for you at this site are
--frame $frame --nup $nup --paper $paper --orient $orient --pages $pages --trim \"$trim\" --delta \"$delta\" --offset \"$offset\" --scale $scale --turn $turn --noautoscale $noautoscale --openright $openright --column $column --columnstrict $columnstrict --tidy $tidy
For information and version history see http://www.warwick.ac.uk/go/pdfjam
"
##
## Check that necessary LaTeX packages are installed
##
PATH=`dirname "$pdflatex"`:$PATH
export PATH
case `kpsewhich pdfpages.sty` in
"") echo "pdfnup: pdfpages.sty not installed"; exit 1;;
esac
case `kpsewhich eso-pic.sty` in
"") echo \
"pdfnup: eso-pic.sty not installed (see the pdfpages manual)"
exit 1;;
esac
case `kpsewhich everyshi.sty` in
"") echo \
"pdfnup: everyshi.sty not installed (see the pdfpages manual)"
exit 1;;
esac
##
## Now do the argument loop...
##
sourcePath=
outFile=
inFiles=0
newline='
'
while test -n "${1}"; do
case "${1}" in
*.pdf|*.PDF) inFiles=`expr $inFiles + 1`;
sourcePath="$sourcePath$newline${1}";;
--help) echo "$helptext";
exit 0;;
--pages) pages="${2}"
shift;;
--outfile) outFile="${2}"
case "$outFile" in
*".pdf");;
*) echo "pdfnup: outfile name must end in .pdf";
exit 1;;
esac
shift;;
--nup) nup="${2}"
shift;;
--frame) frame="${2}"
shift;;
--paper) paper="${2}"
shift;;
--orient) orient="${2}"
shift;;
--trim) trim="${2}"
shift;;
--delta) delta="${2}"
shift;;
--offset) offset="${2}"
shift;;
--scale) scale="${2}"
shift;;
--turn) turn="${2}"
shift;;
--noautoscale) noautoscale="${2}"
shift;;
--openright) openright="${2}"
shift;;
--column) column="${2}"
shift;;
--columnstrict) column="${2}"
shift;;
--tidy) tidy="${2}"
shift;;
*) echo "pdfnup: unrecognised argument ${1}"; exit 1;;
esac
shift
done
if test $inFiles -gt 1 ; then
if test "$outFile" != "" ; then
echo "pdfnup: --outfile cannot be used with multiple input files";
echo "pdfnup: no files processed"
exit 1;
fi
fi
case "$sourcePath" in
"") echo "pdfnup: no pdf source file specified
For information on usage try \"pdfnup --help\""; exit 1;;
esac
OIFS=IFS
IFS="$newline"
for k in $sourcePath
do
if test -f "$k"; then :;
else echo "pdfnup: ""$k"" does not exist, no files were processed";
exit 1;
fi
done
IFS=OIFS
case $pages in
all) pages=-;;
*) pages={$pages};;
esac
##
## That's the arguments done.
##
## Next sort out paper orientation, if not specified
##
x=`echo $nup | sed 's/..$//'`
y=`echo $nup | sed 's/^..//'`
fitpaper=false ## the normal setting
case $orient in
auto) fitpaper=true ## used only for 2x2, 3x3 etc.
if test "$x" -gt "$y"
then orient=landscape ; fitpaper=false
fi
if test "$y" -gt "$x"
then orient=portrait ; fitpaper=false
fi;;
esac
pwd=`pwd | sed 's/ /\\ /'`
IFS="$newline"
##
## Now work on the input file (or files in turn)
##
counter=0
for inFile in $sourcePath
do
echo "Processing $inFile..."
counter=`expr $counter + 1`
cd "$pwd"
pdfName=`basename "$inFile"`
sourceDir=`dirname "$inFile"` ; cd "$sourceDir" ; sourceDir=`pwd`
sourceFullPath="$sourceDir"/"$pdfName"
cd "$pwd"
case "$outFile" in
"") ## no --outfile argument supplied
outfileNameRoot=`echo "$pdfName" | sed 's/\.pdf$//i'`-$nup;
outfileDir="$sourceDir";
outFile="$outfileNameRoot"".pdf";;
*) ## --outfile argument was supplied
outfileNameRoot=`basename "$outFile" | sed 's/\.pdf$//i';`
outfileDir=`dirname "$outFile"` ;
cd "$outfileDir" ;
outfileDir=`pwd` ;;
esac
case "$outfileDir"/"$outfileNameRoot"".pdf" in
$sourceFullPath) echo "pdfnup: outfile and source cannot be the same";
exit 1;;
//"$outfileNameRoot"".pdf") outfileDir="";; ## in case of output
esac ## to the root directory!
##
## Now edit the temporary LaTeX input file
##
uniqueName="$RANDOM$RANDOM$RANDOM"-"$counter"
ln -s "$sourceFullPath" "$tempfileDir"/"$uniqueName"source.pdf
texFile="$tempfileDir"/"$uniqueName".tex
msgFile="$tempfileDir"/"$uniqueName".msgs
(sed s*pdfname*"$tempfileDir"/"$uniqueName"source.pdf* <<EndTemplate
\documentclass[papersize,orientation]{article}
\usepackage{pdfpages}
\begin{document}
\includepdf[pages=,nup=,frame=,fitpaper=,trim=,delta=,offset=,scale=,turn=,noautoscale=,column=,columnstrict=,openright=]{pdfname}
\end{document}
EndTemplate
) \
| sed 's/^[^b]egin/\\begin/' \
| sed s/pages=/pages="$pages"/ \
| sed s/nup=/nup="$nup"/ \
| sed s/frame=/frame="$frame"/ \
| sed s/fitpaper=/fitpaper="$fitpaper"/ \
| sed s/trim=/trim="$trim"/ \
| sed s/delta=/delta="$delta"/ \
| sed s/offset=/offset="$offset"/ \
| sed s/scale=/scale="$scale"/ \
| sed s/turn=/turn="$turn"/ \
| sed s/noautoscale=/noautoscale="$noautoscale"/ \
| sed s/openright=/openright="$openright"/ \
| sed s/column=/column="$column"/ \
| sed s/columnstrict=/columnstrict="$columnstrict"/ \
| sed s/papersize/"$paper"/ \
| sed s/orientation/"$orient"/ > $texFile
echo " Temporary LaTeX file for this job is ""$texFile"
##
## Now run pdflatex and tidy up
##
echo " Calling pdflatex..."
cd "$tempfileDir"
"$pdflatex" --interaction batchmode "$texFile" > "$msgFile"
if test -f "$tempfileDir"/"$uniqueName"".aux";
## ie if LaTeX didn't choke
then if cp "$tempfileDir"/"$uniqueName".pdf \
"$outfileDir"/"$outfileNameRoot"".pdf"
then echo " Finished: output is"\
"$outfileDir"/"$outfileNameRoot"".pdf"
fi
case "$tidy" in
true) rm "$tempfileDir"/"$uniqueName"* ;;
esac
outFile=""
else echo " Failed: output file not written"
fi
done
IFS=OIFS
|