| #!/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" |
| resolution="600" |
| mediasource="TRAY1" |
| for opt in $options; do |
| case "$opt" in |
| PageSize=*) |
| pagesize="$(echo "${opt#PageSize=}" | tr a-z A-Z)" |
| ;; |
| Resolution=*) |
| resolution=${opt#Resolution=} |
| resolution=${resolution%dpi} |
| ;; |
| InputSlot=*) |
| mediasource=${opt#InputSlot=} |
| ;; |
| 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=$mediasource$e |
| @PJL SET MEDIATYPE=PLAINRECYCLE$e |
| @PJL SET PAPER=$pagesize$e |
| @PJL SET PAPERWIDTH=$xs$e |
| @PJL SET PAPERLENGTH=$ys$e |
| @PJL SET RESOLUTION=${resolution%x600}$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=- -r$resolution -dQUIET -dBATCH -dNOPAUSE - | |
| gs -sDEVICE=pbmraw -sOutputFile=${uid}/%03d-page.pbm -r$resolution -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=- -r$resolution -dQUIET -dBATCH -dNOPAUSE - | gs -sDEVICE=pbmraw -sOutputFile=${uid}/%03d-page.pbm -r$resolution -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=$mediasource$e |
| @PJL SET MEDIATYPE=PLAINRECYCLE$e |
| @PJL SET PAPER=$pagesize$e |
| @PJL SET PAPERWIDTH=$xs$e |
| @PJL SET PAPERLENGTH=$ys$e |
| @PJL SET RESOLUTION=${resolution%x600}$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 |
| |
| } |
| |
| #rm -rf $uid; |
| |
| exit 0 |