ricoh-sp100-sp204/ricoh-sp100/pstoricohddst-gdi
2020-01-10 00:57:12 +01:00

190 lines
4.4 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 <<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=${x[0]}$e
@PJL SET PAPERLENGTH=${x[1]}$e
@PJL SET RESOLUTION=${resolution%x600}$e
@PJL SET IMAGELEN=$jsize$e
EOF
cat $uid/raster.jbig
# Flushing page footer
# TODO: pixelcount for toner estimate
cat <<EOF
@PJL SET DOTCOUNT=$dots$e
@PJL SET PAGESTATUS=END$e
EOF
}
function output_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
}
function output_footer() {
cat <<EOF
@PJL EOJ$e
%-12345X
EOF
}
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"
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 -
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"
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