#!/bin/bash # Debug mode: change to 'yes' to enable DEBUG=${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 } function output_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 x=($(identify -format "%w %h %[fx:mean] " $page)) ## # The %[fx:mean] gives the average colour in the image which for # monochrome is the number of white pixels divided by the size # # So the formula gives the number of black pixels. The final # /1 causes bc to round to the nearest integer because scale=0 ## dots=$(echo "(${x[0]}*${x[1]}*(1-${x[2]}))/1"|bc) ## # FIX: toner cartridge runs out way too fast with this dots # calculation above and once it decides it's empty, you # can't force it to print. So set dots to an artificially # low number dots=$(echo "$dots/10"|bc) # Flushing page header cat <$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" output_header stage="printing" } [ "$page" = "999999999-page.pbm" ] && { log "Last stage. Flushing PJL footer" output_footer pid=`ps ax | grep $uid | grep -v grep | awk ' { print $1 } '` [ ! "x$pid" = "x" ] && kill $pid break } [ "$stage" = "printing" ] && { page=$uid/$page output_page } 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 -dNOSAFER - 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 -dNOSAFER - log "Conversion complete" output_header for page in ${uid}/*-page.pbm; do output_page done # Flushing PJL footer output_footer } # only remove the output dir if not debugging [ ! "${DEBUG}" = "yes" ] && rm -rf $uid; exit 0