ambevar-dotfiles/.local/bin/pdfctl

172 lines
3.4 KiB
Bash
Executable File

#!/bin/sh
usage () {
cat <<EOF>&2
Usage: ${0##*/} COMMAND [-i] [-o OUTPUT] [OPTIONS] FILES...
Wrapper around various PDF operations.
OUTPUT is ignored when processing in-place (-i) or when more than one input
files is given.
Otherwise, or if OUTPUT is unspecified, a file with a random suffix is produced.
List of commands and their options:
compress [OPTIONS]
Compress PDFs.
-c: Compress raster graphics at the expense of a quality loss.
-n: Do not compress raster graphics at all. Output may be bigger.
extract [-f FIRST-PAGE] [-l LAST-PAGE]
Extract a range of pages to a single PDF.
resize
Resize to A4.
size
Same as pdfinfo, but append size in milimeters.
xerox
Convert a PDF to a blurred, black & white raster image.
For more details on compression:
$ gs -sDEVICE=pdfwrite -o /dev/null \\
-c "currentpagedevice { exch ==only ( ) print == } forall"
http://partners.adobe.com/public/developer/en/acrobat/sdk/pdf/pdf_creation_apis_and_specs/DistillerParameters.pdf
EOF
}
[ $# -eq 0 ] && usage && exit
cmd="$1"
shift 1
NO_OUTPUT=false
INPLACE=false
COMPRESS_OPT="-dColorConversionStrategy=/LeaveColorUnchanged -dDownsampleMonoImages=false -dDownsampleGrayImages=false -dDownsampleColorImages=false -dAutoFilterColorImages=false -dAutoFilterGrayImages=false -dColorImageFilter=/FlateEncode -dGrayImageFilter=/FlateEncode"
EXTRACT_FIRST=1
EXTRACT_LAST=1
case $cmd in
compress)
while getopts ":cino:" opt; do
case $opt in
c)
COMPRESS_OPT="" ;;
i)
INPLACE=true ;;
n)
COMPRESS_OPT="-dColorConversionStrategy=/LeaveColorUnchanged -dEncodeColorImages=false -dEncodeGrayImages=false -dEncodeMonoImages=false" ;;
o)
output="$OPTARG" ;;
\?)
usage
exit 1 ;;
esac
done
;;
extract)
while getopts ":f:il:o:" opt; do
case $opt in
f)
EXTRACT_FIRST="$OPTARG" ;;
i)
INPLACE=true ;;
l)
EXTRACT_LAST="$OPTARG" ;;
o)
output="$OPTARG" ;;
\?)
usage
exit 1 ;;
esac
done
;;
resize|xerox)
while getopts ":io:" opt; do
case $opt in
i)
INPLACE=true ;;
o)
output="$OPTARG" ;;
\?)
usage
exit 1 ;;
esac
done
;;
size)
NO_OUTPUT=true ;;
*)
usage
exit 1 ;;
esac
shift $((OPTIND - 1))
if [ $# -eq 0 ]; then
usage
exit 1
fi
[ $# -gt 1 ] && unset output
mkoutput () {
if [ -z "$output" ] || [ -e "$output" ]; then
case "$input" in
*/*) ;;
*) input="./$input" ;;
esac
dirname="${input%/*}"
basename="${input##*/}"
output=$(mktemp "$dirname/${basename%.*}-$cmd"-XXXXXX.pdf)
fi
echo "$output"
}
## Some JPEG options
# -sDEVICE=jpeg
# -dUseCIEColor
# -dJPEGQ=100
# -r300
# -dTextAlphaBits=4
# -dGraphicsAlphaBits=4
# -dMaxStripSize=8192
compress () {
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite $COMPRESS_OPT -sOutputFile="$output" "$input"
}
extract () {
gs -sDEVICE=pdfwrite -dNOPAUSE -dSAFER -dBATCH -dFirstPage="$EXTRACT_FIRST" -dLastPage="$EXTRACT_LAST" -sOutputFile="$output" "$input"
}
resize () {
gs -q -o "$output" -sDEVICE=pdfwrite -sPAPERSIZE=a4 -dFIXEDMEDIA -dPDFFitPage -dCompatibilityLevel=1.4 "$input"
}
size () {
pdfinfo "$input" | awk '/^Page size:/ {printf $0; print ", " $3*0.35278 " x " $5*0.35278 " mm"; next } 1'
}
xerox () {
convert -threshold 90% -blur 1x1 -quality 100 -flatten -density 400 "$input" "$output"
}
for input; do
echo "==> '$input'"
$NO_OUTPUT || output=$(mkoutput)
$cmd
if $INPLACE; then
rm -f "$input"
mv "$output" "$input"
fi
echo
done