41abd508e2
Add handling of the PageSize option, so other page sizes can be supported. Currently only tested with Letter, and we already know A4 works.
195 lines
4.3 KiB
Bash
Executable file
195 lines
4.3 KiB
Bash
Executable file
#!/bin/bash
|
||
|
||
# Debug mode: change to 'yes' to enable
|
||
DEBUG=no
|
||
|
||
function log() {
|
||
[ "${DEBUG}" = "yes" ] && echo $* | logger -t "$0[$$]"
|
||
}
|
||
|
||
function logpipe() {
|
||
[ "${DEBUG}" = "yes" ] && echo $* | logger -t "$0[$$]"
|
||
}
|
||
|
||
function trapINT() {
|
||
log "trapINT()"
|
||
[ "x$trp" = "x" ] && trp="yes" || return
|
||
sleep 30 && { [ ! "${DEBUG}" = "yes" ] && rm -rf $uid; log "Cleanup complete"; } &
|
||
exit
|
||
}
|
||
|
||
function stop() {
|
||
log "Stop stop page";
|
||
echo "stop" > $uid/999999999-page.pbm
|
||
}
|
||
|
||
log "Called with cmdline: $0 $*"
|
||
|
||
trap "stop; trapINT" SIGINT SIGTERM SIGQUIT
|
||
#trap 'echo No' SIGINT SIGTERM SIGQUIT EXIT;
|
||
# Username
|
||
user="$2"
|
||
|
||
# Page title (not used at this time, "Document" instead)
|
||
ptitle="$3"
|
||
my="$0"
|
||
options="$5"
|
||
|
||
pagesize="A4"
|
||
for opt in $options; do
|
||
case "$opt" in
|
||
PageSize=*)
|
||
pagesize="$(echo "${opt#PageSize=}" | tr a-z A-Z)"
|
||
;;
|
||
esac
|
||
done
|
||
|
||
# MS-style EOL
|
||
e=$(echo -en "\r")
|
||
|
||
# Printing date
|
||
ddate="`LC_ALL=en_US.UTF-8 date '+%Y/%m/%d %H:%M:%S'`"
|
||
|
||
# Temporary directory
|
||
uid="/tmp/pstoricohddst-gdi-`uuidgen`"
|
||
mkdir -p $uid
|
||
[ "${DEBUG}" = "yes" ] && exec >$uid/output.stream #> >(tee $uid/output.stream)
|
||
|
||
[ -x "$(which inotifywait)" ] && {
|
||
log "Asynchronous variant"
|
||
|
||
(
|
||
stage="empty"
|
||
inotifywait -q -m -r -e close_write --format '%f' $uid | grep --line-buffered 'page.pbm$' | while read page; do
|
||
log "Page submitted"
|
||
[ "$stage" = "empty" ] && {
|
||
log "1st stage. Flushing PJL header"
|
||
cat <<EOF
|
||
%-12345X@PJL$e
|
||
@PJL SET TIMESTAMP=$ddate$e
|
||
@PJL SET FILENAME=Document$e
|
||
@PJL SET COMPRESS=JBIG$e
|
||
@PJL SET USERNAME=$user$e
|
||
@PJL SET COVER=OFF$e
|
||
@PJL SET HOLD=OFF$e
|
||
EOF
|
||
|
||
stage="printing"
|
||
}
|
||
[ "$page" = "999999999-page.pbm" ] && {
|
||
log "Last stage. Flushing PJL footer"
|
||
cat <<EOF
|
||
@PJL EOJ$e
|
||
%-12345X
|
||
EOF
|
||
pid=`ps ax | grep $uid | grep -v grep | awk ' { print $1 } '`
|
||
[ ! "x$pid" = "x" ] && kill $pid
|
||
break
|
||
}
|
||
[ "$stage" = "printing" ] && {
|
||
# Converting page to JBIG format (parameters are very special for this printer!)
|
||
pbmtojbg -p 72 -o 3 -m 0 -q < $uid/$page > $uid/raster.jbig
|
||
|
||
# Taking image size
|
||
jsize=`wc -c < $uid/raster.jbig`
|
||
|
||
# Taking image dimensions
|
||
read fn ft xs ys garb < <(identify $uid/$page | tr "x" " ")
|
||
|
||
# Flushing page header
|
||
cat <<EOF
|
||
@PJL SET PAGESTATUS=START$e
|
||
@PJL SET COPIES=1$e
|
||
@PJL SET MEDIASOURCE=AUTO$e
|
||
@PJL SET MEDIATYPE=PLAINRECYCLE$e
|
||
@PJL SET PAPER=$pagesize$e
|
||
@PJL SET PAPERWIDTH=$xs$e
|
||
@PJL SET PAPERLENGTH=$ys$e
|
||
@PJL SET RESOLUTION=600$e
|
||
@PJL SET IMAGELEN=$jsize$e
|
||
EOF
|
||
|
||
log "Flushing image $page"
|
||
cat $uid/raster.jbig
|
||
|
||
# Flushing page footer
|
||
# TODO: pixelcount for toner estimate
|
||
cat <<EOF
|
||
@PJL SET DOTCOUNT=1132782$e
|
||
@PJL SET PAGESTATUS=END$e
|
||
EOF
|
||
}
|
||
done
|
||
) &
|
||
|
||
# Converting from PostScript to PostScript-monochrome, then to PBM image format (per page)
|
||
#gs -sDEVICE=ps2write -sOutputFile=- -r600 -dQUIET -dBATCH -dNOPAUSE - |
|
||
gs -sDEVICE=pbmraw -sOutputFile=${uid}/%03d-page.pbm -r600 -dQUIET -dBATCH -dNOPAUSE -
|
||
|
||
stop
|
||
wait
|
||
|
||
trapINT
|
||
} || {
|
||
log "Synchronous variant"
|
||
|
||
# Converting from PostScript to PostScript-monochrome, then to PBM image format (per page)
|
||
log "Converting document to pages"
|
||
gs -sDEVICE=ps2write -sOutputFile=- -r600 -dQUIET -dBATCH -dNOPAUSE - | gs -sDEVICE=pbmraw -sOutputFile=${uid}/%03d-page.pbm -r600 -dQUIET -dBATCH -dNOPAUSE -
|
||
log "Conversion complete"
|
||
|
||
cat <<EOF
|
||
%-12345X@PJL$e
|
||
@PJL SET TIMESTAMP=$ddate$e
|
||
@PJL SET FILENAME=Document$e
|
||
@PJL SET COMPRESS=JBIG$e
|
||
@PJL SET USERNAME=$user$e
|
||
@PJL SET COVER=OFF$e
|
||
@PJL SET HOLD=OFF$e
|
||
EOF
|
||
|
||
for page in ${uid}/*-page.pbm; do
|
||
|
||
log "Page $page"
|
||
# Converting page to JBIG format (parameters are very special for this printer!)
|
||
pbmtojbg -p 72 -o 3 -m 0 -q < $page > $uid/raster.jbig
|
||
|
||
# Taking image size
|
||
jsize=`wc -c < $uid/raster.jbig`
|
||
|
||
# Taking image dimensions
|
||
read fn ft xs ys garb < <(identify $page | tr "x" " ")
|
||
log "Identified as ${xs}x${ys}"
|
||
|
||
# Flushing page header
|
||
cat <<EOF
|
||
@PJL SET PAGESTATUS=START$e
|
||
@PJL SET COPIES=1$e
|
||
@PJL SET MEDIASOURCE=AUTO$e
|
||
@PJL SET MEDIATYPE=PLAINRECYCLE$e
|
||
@PJL SET PAPER=pagesize$e
|
||
@PJL SET PAPERWIDTH=$xs$e
|
||
@PJL SET PAPERLENGTH=$ys$e
|
||
@PJL SET RESOLUTION=600$e
|
||
@PJL SET IMAGELEN=$jsize$e
|
||
EOF
|
||
|
||
# Flushing image
|
||
cat $uid/raster.jbig
|
||
|
||
# Flushing page footer
|
||
# TODO: pixelcount for toner estimate
|
||
cat <<EOF
|
||
@PJL SET DOTCOUNT=1132782$e
|
||
@PJL SET PAGESTATUS=END$e
|
||
EOF
|
||
done
|
||
|
||
# Flushing PJL footer
|
||
cat <<EOF
|
||
@PJL EOJ$e
|
||
%-12345X
|
||
EOF
|
||
|
||
}
|
||
|