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
|
#! /bin/bash
##
## pdfjoin: A shell program to concatenate PDF pages into one file
##
## Author David Firth (http://www.warwick.ac.uk/go/dfirth)
##
version=1.20
echo "This is pdfjoin 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 most unix systems
#tempfileDir="C:/tmp" ## use something like this under Windows
##
## Now specify the default settings for pdfjoin:
##
paper=a4paper ## alternatives are other LaTeX paper sizes
orient=portrait
fitpaper=true ## output page size matches input
turn=true ## landscape pages are landscape-oriented
noautoscale=false ## scale logical pages to fit
offset="0 0" ## output centred on physical page
trim="0 0 0 0" ## don't trim the logical pages
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 "pdfjoin --help"
##
helptext="
Usage: pdfjoin args
where args must include source pdf filenames and optionally also
* a LaTeX papersize, for example --paper a4paper
--paper letterpaper
* the output page orientation, one of --orient landscape
--orient portrait
* one of --fitpaper true
--fitpaper false
to specify whether output page sizes and orientations should match
those of the input pages. Use of --fitpaper true overrides --orient.
* 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)
* 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)
* a specific name for the output file, e.g. --outfile mybigfile.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
--paper $paper --trim \"$trim\" --offset \"$offset\" --turn $turn --noautoscale $noautoscale --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 "pdfjoin: pdfpages.sty not installed"; exit 1;;
esac
case `kpsewhich eso-pic.sty` in
"") echo \
"pdfjoin: eso-pic.sty not installed (see the pdfpages manual)"
exit 1;;
esac
case `kpsewhich everyshi.sty` in
"") echo \
"pdfjoin: 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;;
--outfile) outFile="${2}"
case "$outFile" in
*".pdf");;
*) echo "pdfjoin: outfile name must end in .pdf";
exit 1;;
esac
shift;;
--paper) paper="${2}"
shift;;
--orient) orient="${2}"
shift;;
--fitpaper) fitpaper="${2}"
shift;;
--trim) trim="${2}"
shift;;
--offset) offset="${2}"
shift;;
--turn) turn="${2}"
shift;;
--noautoscale) noautoscale="${2}"
shift;;
--tidy) tidy="${2}"
shift;;
*) echo "pdfjoin: unrecognised argument ${1}"; exit 1;;
esac
shift
done
case "$sourcePath" in
"") echo "pdfjoin: no pdf source file specified
For information on usage try \"pdfjoin --help\""; exit 1;;
esac
OIFS=IFS
IFS="$newline"
for k in $sourcePath
do
if test -f "$k"; then :;
else echo "pdfjoin: ""$k"" does not exist, no files were processed";
exit 1;
fi
done
##
## That's the arguments done.
##
##
## Now work on the input files
##
pwd=`pwd | sed 's/ /\\ /'`
sourceFullPath=""
for inFile in $sourcePath
do
pdfName=`basename "$inFile"`
sourceDir=`dirname "$inFile"` ; cd "$sourceDir" ; sourceDir=`pwd`
sourceFullPath=$sourceFullPath$newline"$sourceDir"/"$pdfName"
cd "$pwd"
done
case "$outFile" in
"") ## no --outfile argument supplied
outfileNameRoot=`echo "$pdfName" | sed 's/\.pdf$//i'`-joined;
outfileDir="$sourceDir";
outFile="$outfileNameRoot"".pdf";;
*) ## --outfile argument was supplied
outfileNameRoot=`basename "$outFile" | sed 's/\.pdf$//i';`
outfileDir=`dirname "$outFile"` ;
cd "$outfileDir" ;
outfileDir=`pwd` ;;
esac
##
## Now set up the temporary LaTeX input file
##
uniqueName="$RANDOM$RANDOM$RANDOM"
i=0
linkedSources=""
for k in $sourceFullPath
do
i=`expr $i + 1`
ln -s "$k" "$tempfileDir"/"$uniqueName"source$i.pdf
linkedSources=$linkedSources$newline"$tempfileDir"/"$uniqueName"source$i.pdf
done
texFile="$tempfileDir"/"$uniqueName".tex
msgFile="$tempfileDir"/"$uniqueName".msgs
mytemp=`cat <<EndTemplate
\documentclass[papersize,orientation]{article}
\usepackage{pdfpages}
\begin{document}
EndTemplate
`
IFS=OIFS
mytemp2=`echo $linkedSources | grep 'pdf' \
| sed 's/^/\\\\includepdf[pages=-,fitpaper=,trim=,offset=,turn=,noautoscale=]{/' | sed 's/$/}/'`
echo $mytemp$newline$mytemp2$newline\\end{document} \
| sed 's/^[^b]egin/\\begin/' \
| sed s/orientation/"$orient"/ \
| sed s/fitpaper=/fitpaper="$fitpaper"/ \
| sed s/trim=/trim="$trim"/ \
| sed s/turn=/turn="$turn"/ \
| sed s/offset=/offset="$offset"/ \
| sed s/noautoscale=/noautoscale="$noautoscale"/ \
| sed s/papersize/"$paper"/ > $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
else echo " Failed: output file not written"
fi
|