Matthew Western
2003-May-16 05:03 UTC
[Samba] Modified Cups Backed pdf writer to keep the original document name.
Hi All, I've got a samba/cups pdf writer going thanks to PeteFwee and Wolfram Q and a few others... the cups pdf backed i used has a default of username-date.pdf which I didn't like and wanted the name of the job that got send in the printer q on the winslows client. The only way I could see in my very limited experience was to grab the %%Title out of the postscript file and make sure that it didn't have any bad characters. I also did a few extra lines to send the .pdf to the person that sent it (thankfully that was already passed though). Here it is. I didn't use awk when i probably should of because i'm crap at regular expressions. Real programmers might have a laugh and my error checking is non-existant, but it worked for me and may be useful to some newbie out there somewhere.... thanks goes to Michael Goffioul for writing the orginal script which i got from http://printing.kde.org/downloads/pdfdistiller and the how to posted originally to samba by Tom. i'd be interested in any feedback about how i should have used awk so i can learn. :) Regards Matthew #!/bin/sh # # This script is intended to be used as a CUPS backend, to create # PDF file on-the-fly. Just create a printer using the device uri # pdf:/path/to/dir/. When printing to this printer, a PDF file # will be generated in the directory specified. The file name will # be either "<jobname>.pdf" or "unknown.pdf", depending whether the # jobname is empty or not. # # To use it, simply copy this script to your backend directory, and # create a printer with the correct URI. That's it. # # Copyright (C) Michael Goffioul (goffioul@imec.be) 2001 LOGFILE=/var/log/cups/pdf.log PDFBIN=`which ps2pdf` FILENAME# this is borrowed from printpdf script for the filename PRINTTIME=`date +%b%d-%H%M%S` DOMAIN="@yourdomain.com.au" WEBSERVER="http://yourwebserver/pdf/" #mail stuff DATE=`date +%d%b%Y-%H:%M:%S` MAILFILE=/tmp/mailtemp HEADER=/tmp/header # case of no argument, prints available URIs if [ $# -eq 0 ]; then if [ ! -x "$PDFBIN" ]; then exit 0 fi echo "direct pdf \"Unknown\" \"PDF Writing\"" exit 0 fi # case of wrong number of arguments if [ $# -ne 5 -a $# -ne 6 ]; then echo "Usage: pdf job-id user title copies options [file]" exit 1 fi # get PDF directory from device URI, and check write status PDFDIR=${DEVICE_URI#pdf:} if [ ! -d "$PDFDIR" -o ! -w "$PDFDIR" ]; then echo "ERROR: directory $PDFDIR not writable" exit 1 fi echo "PDF directory: $PDFDIR" >> $LOGFILE # Start of Matthew's modified stuff. echo " " >> $LOGFILE echo "Executable: $PDFBIN" >> $LOGFILE echo "Arguments: |$1|$2|$3|$4|$5|$6|" >> $LOGFILE echo $# $PRINTTIME >> $LOGFILE echo "PS File: $6" >> $LOGFILE FULLTITLE=`grep Title $6` TITLE=${FULLTITLE:9} #replace all not allowed characters with a _ - could do it with a regular expression but too hard_ # \ / : * ? " < > | TITLE=${TITLE//:/_} TITLE=${TITLE//\//_} TITLE=${TITLE//</_} TITLE=${TITLE//>/_} TITLE=${TITLE//|/_} echo "fulltitle: "$FULLTITLE >> $LOGFILE echo "chopped: "$TITLE >> $LOGFILE # generate output filename OUTPUTFILENAMEif [ "$3" = "" ]; then OUTPUTFILENAME="$PDFDIR/unknown.pdf" else # OUTPUTFILENAME="$PDFDIR/${3//[^[:alnum:]]/_}.pdf" # I changed this to user name, and the printtime to track down who # printed the PDF and when, samba printing just uses nobody # default is username and date. Matt modified to read the postscript title. # OUTPUTFILENAME="$PDFDIR/$2-$PRINTTIME.pdf" OUTPUTFILENAME="$PDFDIR/$TITLE.pdf" echo "PDF file: $OUTPUTFILENAME placed in: $PDFDIR" >> $LOGFILE fi echo "Output file name: $OUTPUTFILENAME" >> $LOGFILE # run ghostscript if [ $# -eq 6 ]; then $PDFBIN -sPAPERSIZE=a4 $6 "$OUTPUTFILENAME" # $PDFBIN $6 "$OUTPUTFILENAME" #>& /dev/null else $PDFBIN -sPAPERSIZE=a4 - "$OUTPUTFILENAME" >& /dev/null fi # modify ownership and permissions on the file # - world readable # - owns to user specified in argument chmod a+r "$OUTPUTFILENAME" if [ "$2" != "" ]; then chown $2 "$OUTPUTFILENAME" fi #Sendmail to the owner. echo "Sending mail: "$2$DOMAIN >> $LOGFILE TO=$2$DOMAIN SUBJECT='PDF Printer Job' BODY='PDF Created :'$DATE #echo PDF Created: $DATE >> BODY echo From: PDFPrinter$DOMAIN >> $HEADER echo To: $TO >> $HEADER #echo Cc: $CC >> $HEADER #echo Bcc: $BCC >> $HEADER echo Subject: $SUBJECT >> $HEADER echo "" >> $HEADER echo $BODY >> $HEADER echo "" >> $HEADER echo "" >> $HEADER echo "If your PDF job is not attached to this email please forward this message \ to the help desk for assistance." >> $HEADER echo "------------------" >> $HEADER echo Filename: $OUTPUTFILENAME >> $HEADER cat $HEADER > $MAILFILE #uuencode "$OUTPUTFILENAME" $2-$PRINTTIME.pdf >> $MAILFILE uuencode "$OUTPUTFILENAME" "$TITLE.pdf" >> $MAILFILE cat $MAILFILE | /usr/lib/sendmail -t rm $MAILFILE rm $HEADER exit 0
Kurt Pfeifle
2003-May-16 10:37 UTC
[Samba] Modified Cups Backed pdf writer to keep the original document name.
Matthew Western mwestern at affairs.net.au wrote on Samba-Digest> Fri May 16 14:33:29 GMT 2003 > > > Hi All, > I've got a samba/cups pdf writer going thanks to PeteFwee and Wolfram Q and > a few others... the cups pdf backed i used has a default of > username-date.pdf which I didn't like and wanted the name of the job that > got send in the printer q on the winslows client. > > The only way I could see in my very limited experience was to grab the > %%Title out of the postscript file and make sure that it didn't have any bad > characters.Hi Matthew, the job title is passed to all filters and backends as $3 by CUPS. It is my experience that it is more reliable to use this, because the %%Title is more often not present than $3. The complete list of parameters provided by CUPS to all filters and backends is this: $0 -- printername $1 -- job-ID $2 -- username $3 -- job-title $4 -- printjob-options $5 -- requested copies $6 -- <filename>; empty if taken from 'stdin' They may be picked up by self-rolled custom backends and filters to use for their purposes.x> I also did a few extra lines to send the .pdf to the person that sent it > (thankfully that was already passed though). > > Here it is. I didn't use awk when i probably should of because i'm crap at > regular expressions. Real programmers might have a laugh and my error > checking is non-existant, but it worked for me and may be useful to some > newbie out there somewhere.... > > thanks goes to Michael Goffioul for writing the orginal script which i got > from > http://printing.kde.org/downloads/pdfdistiller and the how to posted > originally to samba by Tom. i'd be interested in any feedback about how i > should have used awk so i can learn. :)Sorry for giving feedback on a not-asked question... ;-)> Regards > Matthew >Cheers, Kurt