Created
January 27, 2020 13:54
-
-
Save zelinskiy/0856a5599373c2669a263dcb85a39824 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# +AMDG This document was begun just before Christmas, | |
# 2010, and it is humbly dedicated to St. Wulfric, patron of | |
# bookbinders, and to the Immaculate Heart of Mary for their | |
# prayers, and to the Sacred Heart of Jesus for His mercy. | |
# | |
#**********************************************************# | |
# makebook # | |
# written by Donald P. Goodman III # | |
# Copyright (C) 2011 # | |
# # | |
# Impose pdf pages for binding # | |
#**********************************************************# | |
# | |
# This program is free software: you can redistribute it | |
# and/or modify it under the terms of the GNU General Public | |
# License as published by the Free Software Foundation, | |
# either version 3 of the License, or (at your option) any | |
# later version. | |
# | |
# This program is distributed in the hope that it will be | |
# useful, but WITHOUT ANY WARRANTY; without even the implied | |
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
# PURPOSE. See the GNU General Public License for more | |
# details. | |
# | |
# For a full copy of the GNU General Public License, see | |
# <http://www.gnu.org/licenses/>. | |
# | |
#**********************************************************# | |
# begin the code # | |
#**********************************************************# | |
# make script more portable and secure | |
PATH=/bin:/usr/bin:/usr/local/bin ; export PATH | |
umask 033 | |
# define our revision number variable for rcs | |
REVISION="2.1" | |
# define error codes | |
E_WRONG_ARGS=64 # too many or few args | |
E_BAD_SIG_TYPE=65 # invalid type of signature | |
E_BAD_UNIT=66 # unrecognized dimension unit used | |
E_BAD_FILENAME=67 # filename contains insecure chars, | |
# or doesn't exist | |
E_BAD_OPT=68 # bad command-line flag requested | |
E_NO_PROG=69 # missing a required program | |
# define usage variables | |
VERBOSE=0 # 0 if not verbose, 1 if -v | |
SIG_TYPE="folio" # type of section desired | |
PAGES_PER_SIG=4 # number of pages per signature | |
SECT_TYPE=1 # number of signatures per section | |
NUP="2x1" # default format of signatures | |
FRONT_FAVOR=0 # favor front for blanks; off by default | |
# define various variables to be zero by default | |
TGT_PAGE_WIDTH=0 | |
TGT_PAGE_HEIGHT=0 | |
HORIZ_DELTA=0 | |
VERT_DELTA=0 | |
HORIZ_OFFSET=0 | |
VERT_OFFSET=0 | |
SCALE=1 | |
# make sure user has the right programs installed, and die | |
# horribly if not | |
command -v od >/dev/null 2>&1 || | |
{ echo >&2 "makebook: error: requires od, but it's not installed"; | |
exit $E_NO_PROG; | |
} | |
command -v pdflatex >/dev/null 2>&1 || | |
{ echo >&2 "makebook: error: requires pdflatex, but it's not installed"; | |
exit $E_NO_PROG; | |
} | |
command -v pdfinfo >/dev/null 2>&1 || | |
{ echo >&2 "makebook: error: requires pdfinfo, but it's not installed"; | |
exit $E_NO_PROG; | |
} | |
command -v pdftk >/dev/null 2>&1 || | |
{ echo >&2 "makebook: error: requires pdftk, but it's not installed"; | |
exit $E_NO_PROG; | |
} | |
command -v dc >/dev/null 2>&1 || | |
{ echo >&2 "makebook: error: requires dc, but it's not installed"; | |
exit $E_NO_PROG; | |
} | |
command -v bc >/dev/null 2>&1 || | |
{ echo >&2 "makebook: error: requires bc, but it's not installed"; | |
exit $E_NO_PROG; | |
} | |
# print the version information and exit successfully | |
versionfunc () | |
{ | |
echo "makebook v${REVISION}. Copyright (C) 2011, Donald P." | |
echo "Goodman III." | |
echo "This program comes with ABSOLUTELY NO WARRANTY." | |
echo "This is free software, and you are welcome to " | |
echo "redistribute it under certain conditions; see " | |
echo "the GNU GPL v3 for details." | |
exit 0 | |
} | |
# print the online help and exit successfully | |
helpfunc () | |
{ | |
cat <<End-of-help | |
makebook v${REVISION}. Copyright (C) 2011, Donald P. Goodman III. | |
This program comes with ABSOLUTELY NO WARRANTY. | |
This is free software, and you are welcome to | |
redistribute it under certain conditions; see | |
the GNU GPL v3 for details. | |
-V: Prints license and version information, then exits | |
successfully. | |
-h: Prints this help information, then exist successfully. | |
-v: Verbose output | |
-f: Favor front, rather than back, for blanks. | |
-t: Signature type | |
-n: Number of signatures per section. | |
-H: Height of the target page. | |
-w: Width of the target page. | |
-d: Horizontal delta. | |
-D: Vertical delta. | |
-m: Horizontal offset. | |
-M: Vertical offset. | |
-s: Scaling of source pages to target page. | |
-i: Input file. | |
-o: Output file. | |
Please see the man page for complete documentation. | |
End-of-help | |
exit 0; | |
} | |
# define a for dealing with units; convert to bp () | |
unitarg () | |
{ | |
if [ ! `echo "$1" | grep '^[\+\|-]*[0-9\.][0-9\.]*\(in\|cm\|pt\|mm\|bp\|pc\|$\)'` ] | |
then | |
echo "ERROR: dimension \"$1\" not valid." >&2 | |
exit $E_BAD_UNIT | |
fi | |
if [ `expr match "$1" '.*\(in\)'` ] | |
then | |
OPTARG=`echo "scale=0; ${1%in} * 72" | bc` | |
OPTARG=${OPTARG%.*} | |
elif [ `expr match "$1" '.*\(cm\)'` ] | |
then | |
OPTARG=`echo "scale=0; ${1%cm} * 28.3464567" | bc` | |
OPTARG=${OPTARG%.*} | |
elif [ `expr match "$1" '.*\(mm\)'` ] | |
then | |
OPTARG=`echo "scale=0; ${1%mm} * 2.83464567" | bc` | |
OPTARG=${OPTARG%.*} | |
elif [ `expr match "$1" '.*\(pt\)'` ] | |
then | |
OPTARG=`echo "scale=0; ${1%pt} / 1.00375" | bc` | |
OPTARG=${OPTARG%.*} | |
elif [ `expr match "$1" '.*\(pc\)'` ] | |
then | |
OPTARG=`echo "scale=0; (${1%pc} / 1.00375) * 12" | bc` | |
OPTARG=${OPTARG%.*} | |
elif [ `expr match "$1" '.*\(bp\)'` ] | |
then | |
OPTARG=${1%bp} | |
else | |
OPTARG=${1%.*} | |
fi | |
} | |
# define a for dealing with section types; convert () | |
# to words; e.g., "4to" to "quarto" | |
typearg () | |
{ | |
if [ "$1" = "4to" ] || [ "$1" = "quarto" ] | |
then | |
PAGES_PER_SIG=8 | |
NUP="2x2" | |
OPTARG="quarto" | |
elif [ "$1" = "2o" ] || [ "$1" = "folio" ] | |
then | |
PAGES_PER_SIG=4 | |
NUP="2x1" | |
OPTARG="folio" | |
elif [ "$1" = "8vo" ] || [ "$1" = "octavo" ] | |
then | |
PAGES_PER_SIG=16 | |
NUP="4x2" | |
OPTARG="octavo" | |
elif [ "$1" = "6to" ] || [ "$1" = "sexto" ] | |
then | |
PAGES_PER_SIG=12 | |
NUP="2x3" | |
OPTARG="sexto" | |
elif [ "$1" = "12mo" ] || [ "$1" = "duodecimo" ] | |
then | |
PAGES_PER_SIG=24 | |
NUP="4x3" | |
OPTARG="duodecimo" | |
else | |
echo "ERROR: signature type \"$1\" not recognized." >&2 | |
exit $E_BAD_SIG_TYPE | |
fi | |
} | |
# clean up filename argument | |
filefunc () | |
{ | |
err_message="ERROR: bad characters in file name." | |
if [ `echo "$1" | grep '\?'` ] | |
then | |
echo "$err_message" >&2 | |
exit $E_BAD_FILENAME | |
elif [ `echo "$1" | grep '\*'` ] | |
then | |
echo "$err_message" >&2 | |
exit $E_BAD_FILENAME | |
elif [ `echo "$1" | grep '"'` ] | |
then | |
echo "$err_message" >&2 | |
exit $E_BAD_FILENAME | |
elif [ `echo "$1" | grep ';'` ] | |
then | |
echo "$err_message" >&2 | |
exit $E_BAD_FILENAME | |
elif [ `echo "$1" | grep '[\\]'` ] | |
then | |
echo "$err_message" >&2 | |
exit $E_BAD_FILENAME | |
elif [ `echo "$1" | grep ' '` ] | |
then | |
echo "$err_message" >&2 | |
exit $E_BAD_FILENAME | |
fi | |
OPTARG=`basename $1` | |
} | |
# now identify and parse the options | |
while getopts "Vhvfn:t:H:w:d:D:m:M:s:i:o:" Option | |
do | |
case $Option in | |
V ) versionfunc;; | |
h ) helpfunc;; | |
v ) VERBOSE=1;; | |
f ) FRONT_FAVOR=1;; | |
n ) SECT_TYPE=$OPTARG;; | |
t ) typearg "$OPTARG"; SIG_TYPE=$OPTARG;; | |
H ) unitarg "$OPTARG"; TGT_PAGE_HEIGHT=$OPTARG;; | |
w ) unitarg "$OPTARG"; TGT_PAGE_WIDTH=$OPTARG;; | |
d ) unitarg "$OPTARG"; HORIZ_DELTA=$OPTARG;; | |
D ) unitarg "$OPTARG"; VERT_DELTA=$OPTARG;; | |
m ) unitarg "$OPTARG"; HORIZ_OFFSET=$OPTARG;; | |
M ) unitarg "$OPTARG"; VERT_OFFSET=$OPTARG;; | |
s ) SCALE=$OPTARG;; | |
i ) filefunc "$OPTARG"; FILE_NAME=$OPTARG;; | |
o ) filefunc "$OPTARG"; OUTFILE_NAME=$OPTARG;; | |
* ) echo "ERROR: unknown flag \ | |
\"$Option\"." >&2; exit $E_BAD_OPT;; | |
esac | |
done | |
# make random file name to use for input | |
NEW_FILE_NAME="tmp_`od -An -N4 -t uL /dev/urandom | tr -d '\ '`.pdf" | |
# if input file specified, use file; if not, read stdin | |
if [ "$FILE_NAME" ] | |
then | |
cp "$FILE_NAME" "$NEW_FILE_NAME" | |
else | |
FILE_NAME="book.pdf" | |
cat /dev/stdin > "$NEW_FILE_NAME" | |
fi | |
# declare holder variable for pdftk | |
tmp_name="tmp_`od -An -N4 -t uL /dev/urandom | tr -d '\ '`.pdf" | |
# if output file specified, use that; if not, name it; if | |
# "-", use stdout | |
[ "$OUTFILE_NAME" ] || OUTFILE_NAME="sigs_$FILE_NAME" | |
if [ "$OUTFILE_NAME" = "stdout" ] | |
then | |
VERBOSE=0 | |
fi | |
# print our introduction message | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "makebook. Copyright (C) 2011, Donald P. Goodman III." | |
echo "This program comes with ABSOLUTELY NO WARRANTY." | |
echo "This is free software, and you are welcome to " | |
echo "redistribute it under certain conditions; see " | |
echo "the GNU GPL v3 for details." | |
echo "IMPOSING pdf pages onto \"$OUTFILE_NAME\"..." | |
fi | |
# get some information about our source document | |
NUM_PAGES=`pdfinfo "$NEW_FILE_NAME" | awk '/Pages:/ {print $2}'`; | |
SRC_PAGE_WIDTH=`pdfinfo "$NEW_FILE_NAME" | awk '/Page\ size:/ {print $3}'`; | |
SRC_PAGE_HEIGHT=`pdfinfo "$NEW_FILE_NAME" | awk '/Page\ size:/ {print $5}'`; | |
# find the number of pages we'll have per signature | |
PAGES_PER_SIG=$(dc -e "$PAGES_PER_SIG $SECT_TYPE * p") | |
# determine if extra pages will be necessary | |
NUM_BLANKS=`expr $NUM_PAGES % $PAGES_PER_SIG` | |
if [ $NUM_BLANKS -ne 0 ] | |
then | |
NUM_BLANKS=`expr $PAGES_PER_SIG - $NUM_BLANKS` | |
fi | |
tmp=`expr $NUM_PAGES + $NUM_BLANKS` | |
NUM_SIGS=`expr $tmp / $PAGES_PER_SIG` | |
# if extra pages are needed, generate blank page | |
if [ $NUM_BLANKS -gt 0 ] && [ ! -e "./blank.pdf" ] | |
then | |
echo "\documentclass{article}" > blank.tex | |
echo '\\thispagestyle{empty}' >> blank.tex | |
echo "\usepackage[paperwidth=${SRC_PAGE_WIDTH}bp,paperheight="${SRC_PAGE_HEIGHT}bp"]{geometry}" >> blank.tex | |
echo '\\begin{document}' >> blank.tex | |
echo "\quad \\\\end{document}" >> blank.tex | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "CREATING blank page to fill sections..."; | |
fi | |
pdflatex blank.tex > /dev/null 2&>1 | |
fi | |
# now insert blank pages as needed, preferring the back for | |
# odd numbers by default, front if stated | |
if [ $NUM_BLANKS -eq 1 ] | |
then | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "INSERTING one blank page..." | |
fi | |
if [ $FRONT_FAVOR -eq 0 ] | |
then | |
pdftk A="$NEW_FILE_NAME" B=blank.pdf cat A1-end \ | |
B1 output "$tmp_name" | |
else | |
pdftk A="$NEW_FILE_NAME" B=blank.pdf cat B1 \ | |
A1-end output "$tmp_name" | |
fi | |
mv "$tmp_name" "$NEW_FILE_NAME" | |
else | |
# tmp=`expr $NUM_BLANKS / 2` | |
# START_BLANKS=${tmp/.*} | |
START_BLANKS=`expr $NUM_BLANKS / 2` | |
END_BLANKS=`expr $NUM_BLANKS - $START_BLANKS` | |
if [ `expr $START_BLANKS % 2` -ne 0 ]; then : else | |
START_BLANKS=`expr $START_BLANKS - 1` | |
END_BLANKS=`expr $END_BLANKS + 1 ` | |
fi | |
if [ $FRONT_FAVOR -eq 1 ] | |
then | |
tmp=$START_BLANKS | |
START_BLANKS=$END_BLANKS | |
END_BLANKS=$tmp | |
if [ `expr $START_BLANKS % 2` -ne 0 ]; then : else | |
START_BLANKS=`expr $START_BLANKS - 1` | |
END_BLANKS=`expr $END_BLANKS + 1 ` | |
fi | |
fi | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "INSERTING $START_BLANKS blank pages at start..." | |
echo "INSERTING $END_BLANKS blank pages at end..."; | |
fi | |
i=0 | |
while [ $i -lt $START_BLANKS ] | |
do | |
pdftk A="$NEW_FILE_NAME" B=blank.pdf cat B1 A1-end output "$tmp_name" | |
mv "$tmp_name" "$NEW_FILE_NAME" | |
i=`expr $i + 1` | |
done | |
i=0 | |
while [ $i -lt $END_BLANKS ] | |
do | |
pdftk A="$NEW_FILE_NAME" B=blank.pdf cat A1-end B1 output "$tmp_name" | |
mv "$tmp_name" "$NEW_FILE_NAME" | |
i=`expr $i + 1` | |
done | |
fi | |
# begin the imposing, announcing if appropriate | |
tmp=`expr $NUM_PAGES + $NUM_BLANKS` | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "IMPOSING $NUM_PAGES pages ($tmp with blanks) on | |
$(dc -e "$NUM_SIGS $SECT_TYPE * p") signature(s) gathered in | |
sections of $SECT_TYPE signature(s) each..."; | |
fi | |
# arrange the pages for impression on signatures | |
i=1 | |
j=1 | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "REARRANGING pages..."; | |
fi | |
while [ $j -le $NUM_SIGS ] | |
do | |
if [ "$SIG_TYPE" = "quarto" ] | |
then | |
# determine size of target page | |
if [ $TGT_PAGE_HEIGHT -eq 0 ] | |
then | |
TGT_PAGE_HEIGHT=$(dc -e "$SRC_PAGE_HEIGHT 2 * p") | |
fi | |
if [ $TGT_PAGE_WIDTH -eq 0 ] | |
then | |
TGT_PAGE_WIDTH=$(dc -e "$SRC_PAGE_WIDTH 2 * p") | |
fi | |
# do the rearranging | |
k=$i; n=1; total=$(dc -e "$SECT_TYPE 8 * p"); m=$total | |
while [ $n -le $SECT_TYPE ] | |
do | |
pdftk "$NEW_FILE_NAME" cat `expr $k + $m - 1` $k \ | |
`expr $k + $m - 4`south `expr $k + 3`south \ | |
`expr $k + 1` `expr $k + $m - 2` `expr $k + 2`south \ | |
`expr $k + $m - 3`south output ${tmp_name%.pdf}_$n; | |
k=`expr $k + 4`; n=`expr $n + 1`; m=`expr $m - 8` | |
done | |
n=1 | |
while [ `expr $n + 0` -le $SECT_TYPE ] | |
do | |
if [ ! -e "$tmp_name" ] | |
then | |
pdftk A=${tmp_name%.pdf}_$n cat A1-end \ | |
output "$tmp_name" | |
else | |
pdftk A=$tmp_name B=${tmp_name%.pdf}_`expr $n` \ | |
cat A1-end B1-end output ${tmp_name}_tmp | |
mv ${tmp_name}_tmp "$tmp_name" | |
fi | |
n=`expr $n + 1` | |
done | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "REARRANGING section number $j..." | |
fi | |
j=`expr $j + 1`; | |
i=`expr $i + $total`; | |
elif [ "$SIG_TYPE" = "folio" ] | |
then | |
# determine size of target page | |
if [ 1 -eq "$(echo "${TGT_PAGE_HEIGHT} == 0" | bc)" ] | |
then | |
TGT_PAGE_HEIGHT=$(dc -e "$SRC_PAGE_HEIGHT 1 * p") | |
fi | |
if [ 1 -eq "$(echo "${TGT_PAGE_WIDTH} == 0" | bc)" ] | |
then | |
TGT_PAGE_WIDTH=$(dc -e "$SRC_PAGE_WIDTH 2 * p") | |
fi | |
# do the rearranging | |
k=$i; n=1; total=$(dc -e "$SECT_TYPE 4 * p"); m=$total | |
while [ $n -le $SECT_TYPE ] | |
do | |
pdftk "$NEW_FILE_NAME" cat `expr $k + $m - 1` \ | |
`expr $k` `expr $k + 1` `expr $k + $m - 2` \ | |
output ${tmp_name%.pdf}_$n; | |
k=`expr $k + 2`; n=`expr $n + 1`; m=`expr $m - 4` | |
done | |
n=1 | |
while [ `expr $n + 0` -le $SECT_TYPE ] | |
do | |
if [ ! -e "$tmp_name" ] | |
then | |
pdftk A=${tmp_name%.pdf}_$n cat A1-end \ | |
output "$tmp_name" | |
else | |
pdftk A="$tmp_name" B=${tmp_name%.pdf}_`expr $n` \ | |
cat A1-end B1-end output ${tmp_name}_tmp | |
mv ${tmp_name}_tmp "$tmp_name" | |
fi | |
n=`expr $n + 1` | |
done | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "REARRANGING section number $j..." | |
fi | |
j=`expr $j + 1`; | |
i=`expr $i + $total`; | |
elif [ "$SIG_TYPE" = "octavo" ] | |
then | |
# determine target page dimensions | |
if [ 1 -eq "$(echo "${TGT_PAGE_HEIGHT} == 0" | bc)" ] | |
then | |
TGT_PAGE_HEIGHT=$(dc -e "$SRC_PAGE_HEIGHT 2 * p") | |
fi | |
if [ 1 -eq "$(echo "${TGT_PAGE_WIDTH} == 0" | bc)" ] | |
then | |
TGT_PAGE_WIDTH=$(dc -e "$SRC_PAGE_WIDTH 4 * p") | |
fi | |
# do the rearranging | |
k=$i; n=1; total=$(dc -e "$SECT_TYPE 16 * p"); m=$total | |
while [ $n -le $SECT_TYPE ] | |
do | |
pdftk "$NEW_FILE_NAME" cat `expr $k + 3` \ | |
`expr $k + $m - 4` `expr $k + $m - 1` $k \ | |
`expr $k + 4`south `expr $k + $m - 5`south \ | |
`expr $k + $m - 8`south `expr $k + 7`south \ | |
`expr $k + 1` `expr $k + $m - 2` `expr $k + $m - 3` \ | |
`expr $k + 2` `expr $k + 6`south `expr $k + $m - 7`south \ | |
`expr $k + $m - 6`south `expr $k + 5`south \ | |
output ${tmp_name%.pdf}_$n; | |
k=`expr $k + 8`; n=`expr $n + 1`; m=`expr $m - 16` | |
done | |
n=1 | |
while [ `expr $n + 0` -le $SECT_TYPE ] | |
do | |
if [ ! -e "$tmp_name" ] | |
then | |
pdftk A=${tmp_name%.pdf}_$n cat A1-end \ | |
output "$tmp_name" | |
else | |
pdftk A="$tmp_name" B=${tmp_name%.pdf}_`expr $n` \ | |
cat A1-end B1-end output ${tmp_name}_tmp | |
mv ${tmp_name}_tmp "$tmp_name" | |
fi | |
n=`expr $n + 1` | |
done | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "REARRANGING section number $j..." | |
fi | |
j=`expr $j + 1`; | |
i=`expr $i + $total`; | |
elif [ "$SIG_TYPE" = "sexto" ] | |
then | |
# determine target page dimensions | |
if [ $TGT_PAGE_HEIGHT -eq 0 ] | |
then | |
TGT_PAGE_HEIGHT=$(dc -e "$SRC_PAGE_HEIGHT 3 * p") | |
fi | |
if [ $TGT_PAGE_WIDTH -eq 0 ] | |
then | |
TGT_PAGE_WIDTH=$(dc -e "$SRC_PAGE_WIDTH 2 * p") | |
fi | |
# do the rearranging | |
k=$i; n=1; total=$(dc -e "$SECT_TYPE 12 * p"); m=$total | |
while [ $n -le $SECT_TYPE ] | |
do | |
pdftk "$NEW_FILE_NAME" cat `expr $k + 5` \ | |
`expr $k + 6` `expr $k + $m - 1` $k \ | |
`expr $k + $m - 1 - 3`south `expr $k + 3`south \ | |
`expr $k + 7` `expr $k + 4` \ | |
`expr $k + 1` `expr $k + $m - 1 - 1` \ | |
`expr $k + 2`south `expr $k + $m - 1 - 2`south \ | |
output ${tmp_name%.pdf}_$n; | |
k=`expr $k + 6`; n=`expr $n + 1`; m=`expr $m - 12` | |
done | |
n=1 | |
while [ `expr $n + 0` -le $SECT_TYPE ] | |
do | |
if [ ! -e "$tmp_name" ] | |
then | |
pdftk A=${tmp_name%.pdf}_$n cat A1-end \ | |
output "$tmp_name" | |
else | |
pdftk A=$tmp_name B=${tmp_name%.pdf}_`expr $n` \ | |
cat A1-end B1-end output ${tmp_name}_tmp | |
mv ${tmp_name}_tmp "$tmp_name" | |
fi | |
n=`expr $n + 1` | |
done | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "REARRANGING section number $j..." | |
fi | |
j=`expr $j + 1`; | |
i=`expr $i + $total`; | |
elif [ "$SIG_TYPE" = "duodecimo" ] | |
then | |
# determine target page dimensions | |
if [ $TGT_PAGE_HEIGHT -eq 0 ] | |
then | |
TGT_PAGE_HEIGHT=$(dc -e "$SRC_PAGE_HEIGHT 3 * p") | |
fi | |
if [ $TGT_PAGE_WIDTH -eq 0 ] | |
then | |
TGT_PAGE_WIDTH=$(dc -e "$SRC_PAGE_WIDTH 4 * p") | |
fi | |
# do the rearranging | |
k=$i; n=1; total=$(dc -e "$SECT_TYPE 24 * p"); m=$total | |
while [ $n -le $SECT_TYPE ] | |
do | |
pdftk "$NEW_FILE_NAME" cat `expr $k + 8` \ | |
`expr $k + $m - 1 - 8` `expr $k + 12` \ | |
`expr $k + 11` `expr $k + 4` \ | |
`expr $k + $m - 1 - 3` `expr $k + $m - 1` \ | |
$k `expr $k + 4`south `expr $k + $m - 1 - 4`south \ | |
`expr $k + $m - 1 - 7`south `expr $k + 7`south \ | |
`expr $k + 10` `expr $k + 13` `expr $k + 14` \ | |
`expr $k + 9` `expr $k + 1` `expr $k + $m - 1 - 1` \ | |
`expr $k + $m - 1 - 2` `expr $k + 2` \ | |
`expr $k + 6`south `expr $k + $m - 1 - 6`south \ | |
`expr $k + $m - 1 - 5`south `expr $k + 5`south \ | |
output ${tmp_name%.pdf}_$n; | |
k=`expr $k + 12`; n=`expr $n + 1`; m=`expr $m - 24` | |
done | |
n=1 | |
while [ `expr $n + 0` -le $SECT_TYPE ] | |
do | |
if [ ! -e "$tmp_name" ] | |
then | |
pdftk A=${tmp_name%.pdf}_$n cat A1-end \ | |
output $tmp_name | |
else | |
pdftk A="$tmp_name" B=${tmp_name%.pdf}_`expr $n` \ | |
cat A1-end B1-end output ${tmp_name}_tmp | |
mv ${tmp_name}_tmp "$tmp_name" | |
fi | |
n=`expr $n + 1` | |
done | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "REARRANGING section number $j..." | |
fi | |
j=`expr $j + 1`; | |
i=`expr $i + $total`; | |
fi | |
done | |
mv "$tmp_name" "$NEW_FILE_NAME" | |
rm ${tmp_name%.pdf}* | |
echo "\documentclass{article} | |
\usepackage{pdfpages} | |
\usepackage[paperwidth=${TGT_PAGE_WIDTH}bp,paperheight=${TGT_PAGE_HEIGHT}bp]{geometry} | |
\pagestyle{empty}" > ${OUTFILE_NAME%.pdf}.tex | |
echo '\\begin{document}' >> ${OUTFILE_NAME%.pdf}.tex | |
echo "\includepdf[nup=$NUP,pages=-,turn=false,columnstrict, | |
noautoscale,delta=${HORIZ_DELTA}bp ${VERT_DELTA}bp, | |
offset=${HORIZ_OFFSET}bp ${VERT_OFFSET}bp,scale=${SCALE}] | |
{./"$NEW_FILE_NAME"}" >> ${OUTFILE_NAME%.pdf}.tex | |
echo "\\\\end{document}" >> ${OUTFILE_NAME%.pdf}.tex | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "IMPOSING sections..." | |
fi | |
pdflatex ${OUTFILE_NAME%.pdf}.tex > /dev/null 2>&1 | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "CLEANING up..." | |
fi | |
rm ${OUTFILE_NAME%.pdf}.tex ${OUTFILE_NAME%.pdf}.aux \ | |
${OUTFILE_NAME%.pdf}.log "$NEW_FILE_NAME" | |
if [ -e "./blank.tex" ]; then | |
rm ./blank.tex | |
fi | |
if [ -e "./blank.aux" ]; then | |
rm ./blank.aux | |
fi | |
if [ -e "./blank.log" ]; then | |
rm ./blank.log | |
fi | |
if [ $VERBOSE -eq 1 ] | |
then | |
echo "`expr $NUM_PAGES + $NUM_BLANKS` pages imposed in | |
$(dc -e "$NUM_SIGS $SECT_TYPE * p") $SIG_TYPE signatures gathered | |
in sections of $SECT_TYPE signature(s) each and output to | |
${OUTFILE_NAME%.pdf}.pdf." | |
fi | |
if [ "$OUTFILE_NAME" = "stdout" ] | |
then | |
cat ${OUTFILE_NAME}.pdf | |
rm ${OUTFILE_NAME}.pdf | |
fi | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment