[Samba] PDF printing with printing = CUPS

Eugenio Ruivo eugenio.ruivo at spel-parques.pt
Wed Aug 25 14:46:56 GMT 2004


Hi everyone.
 
I've been looking into the subject of "printing" to PDF with Samba in the
last couple of days.
Sorry to say that I wasted some time trying to figure out why the [print-pdf
generator] in smb.conf didn't work.
 
As always reading every comment carefully will pay off in terms of time
wasted!
After I realized that with printing = cups in smb.conf samba ignores any
print command directive in a share I started looking for a solution.~
 
Some web searching tossed up a reference to setting printing = bsd on the
specific share to make print command relevant. The only problemwas that it
also mentioned Samba 3.03...
I'm using 3.02a but decided to give it a try, no luck.
 
So I decided to look to CUPS for an answer. I found that CUPS has the
ability to use diferent backend processes to printing, one of them included
is a backend called ... pdf.
After checking the script of this backend I found it worked, but was not
what I would like after looking at the possibilities in print-pdf.
It always puts the output file in the same location and there is no
notification to the user that it has finished and where the file is.
 
So I started making some changes and I've got a working version that puts
the output file in the user's home directory and notifies him like print-pdf
does.
 
You can find the script below, I've put all changes I made between comment
lines like #EMR.
If anyone would like to use these changes feel free to do so, if you enhance
them please return me a copy of the improved version.
 
Regards,
Eugenio Ruivo
 
#!/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 wether 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 at imec.be) 2001

#

# 2004-08-25, Eugenio Ruivo

# Made changes to try and identify user's home directory and place output

# file there instead of default location.

# Also send notification to user that file has "printed", to where and what
name.

# Since my users are in LDAP backend try to lookup Windows homedrive letter
to use in 

# notification message else notifies with full server path to home
directory.

#

LOGFILE=/tmp/pdf.log

PDFBIN=`which ps2pdf`

FILENAME= 

# this is borrowed from printpdf script for the filename

PRINTTIME=`date +%b%d-%H%M%S`

echo "Executable: $PDFBIN" > $LOGFILE

echo "Arguments: |$1|$2|$3|$4|$5|$6|" >> $LOGFILE 

echo $# $PRINTTIME >> $LOGFILE

#EMR

USER_ER=$2

JOB_ER=$1

ORIGIN_ER=`smbstatus -b -u $2|grep $2`

HOMEDIR_ER=`eval "echo ~$2"`

echo "" >> $LOGFILE

echo "Script Run by: $USER" >> $LOGFILE

echo "User is: $USER_ER" >> $LOGFILE

echo "Job Id is: $JOB_ER" >> $LOGFILE

echo "Origin is from: $ORIGIN_ER" >> $LOGFILE

echo "User's HomeDir is: $HOMEDIR_ER" >> $LOGFILE

echo "" >> $LOGFILE

PID_ER=`echo $ORIGIN_ER | cut -f1 -d ' '`

USERID_ER=`echo $ORIGIN_ER | cut -f2 -d ' '`

GROUPID_ER=`echo $ORIGIN_ER | cut -f3 -d ' '`

COMPUTER_ER=`echo $ORIGIN_ER | cut -f4 -d ' '`

IP_ER=`echo $ORIGIN_ER | cut -f5 -d ' ' | sed 's/(//' | sed 's/)//'`

echo "PID is: $PID_ER" >> $LOGFILE

echo "UserID is: $USERID_ER" >> $LOGFILE

echo "Group ID is: $GROUPID_ER" >> $LOGFILE

echo "Computer is: $COMPUTER_ER" >> $LOGFILE

echo "IP Address is: $IP_ER" >> $LOGFILE

#EMR

# 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 

#EMR

if [ "$HOMEDIR_ER" = ""]; then

#EMR

# get PDF directory from device URI, and check write status

PDFDIR=${DEVICE_URI#pdf:}

#EMR

else

PDFDIR=$HOMEDIR_ER

fi

#EMR

if [ ! -d "$PDFDIR" -o ! -w "$PDFDIR" ]; then

echo "ERROR: directory $PDFDIR not writable"

exit 1

fi 

 

echo "PDF directory: $PDFDIR" >> $LOGFILE 

# generate output filename

OUTPUTFILENAME=

if [ "$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

#EMR Change to title-printtime.pdf since we will write to user's home dir

OUTPUTFILENAME="$PDFDIR/$3-$PRINTTIME.pdf"

#EMR

# OUTPUTFILENAME="$PDFDIR/$2-$PRINTTIME.pdf"

echo "PDF file: $OUTPUTFILENAME placed in: $PDFDIR" >> $LOGFILE

fi 

echo "Output file name: $OUTPUTFILENAME" >> $LOGFILE 

# run ghostscript

if [ $# -eq 6 ]; then

$PDFBIN $6 "$OUTPUTFILENAME"

#>& /dev/null

else

$PDFBIN - "$OUTPUTFILENAME" >& /dev/null

fi

# modify ownership and permissions on the file

# - world readable

# - owns to user specified in argument

#EMR Change to only readable by user since it's in his homedir

chmod 600 "$OUTPUTFILENAME"

#EMR

#chmod a+r "$OUTPUTFILENAME"

if [ "$2" != "" ]; then

#EMR Change owner and group also

chown $USERID_ER.$GROUPID_ER "$OUTPUTFILENAME"

#EMR

# chown $2 "$OUTPUTFILENAME"

fi 

#EMR Borrow idea from samba's print-pdf to notify user

# Lookup home drive letter

HOMEDRIVE_ER=`ldapsearch -x -LLL -b
"ou=Users,ou=Samba,dc=spel-parques,dc=pt" "(uid=emruivo)" sambaHomeDrive |
grep sambaHomeDrive: | cut -f2 -d ' '`

# Check if we found our home drive in LDAP

if [ $HOMEDRIVE_ER = ""]; then

# Yes, give Windows style location of output file

MESSAGE="Your PDF file has been created as:\n$OUTPUTFILENAME"

else

# Just give path to file

MESSAGE="Your PDF file has been created as:\n$HOMEDRIVE_ER\\$3.pdf"

fi

echo -e $MESSAGE|smbclient -M $COMPUTER_ER -I $IP_ER -U "Print PDF Service"
>/dev/null 2>&1

#EMR

exit 0

 


More information about the samba mailing list