Mates,
I apologize to the cannibalizing distributions, but in having problems
with pdf-gen or, as otherwise known, print-pdf, I thought I would share a
little on just how easy it actually is to get working on any system. The
cannibalizing involved taking the mdk print-pdf script and dumping it into
SuSE -- nothing less than blasphemy. Anyway it works.
BACKGROUND
I had pdf-gen working on mdk 2005LE as a new box to replace the 7.2 box
at work. After transition, (and all the pain that goes with moving dhcp,
dyn-dns (bind8-bind9, TSIG updates, named.keys), samba (different share
scheme), pptp, postfix (shoot me again), imap, httpd (1.3-2.x .. damn new
deny unless explicitly allowed rules), ssh (keygen issues), ftp, cups,
etc.....) pdf-gen was reporting "out of memory" errors on XP clients. Made
no sense, since (no pun intended) it was working fine on the new box before
adding additional shares. So I dug into print-pdf to try and get it working.
TEST -SETTING IT UP ON SUSE
To troubleshoot, I thought I would start from scratch and try and get it
working on my SuSE 9.0 server at home which had no such capability. I
figured I could learn how it worked in the process and then fix the 2005LE
box at work.
The basic process was:
(1) to copy the mdk print-pdf script to the SuSE box. That is the:
[david@bonza scripts]$ ll /usr/share/samba/scripts/
total 12
-rwxr-xr-x 1 root root 3555 Apr 4 09:03 print-pdf*
(note file permissions)
The actual script is:
******************************
#!/bin/bash
# samba-print-pdf
# This is a script which allows you to set up a virtual printer on samba
# which will take the file (generated by a postscript filter on windows)
# and turn it into a PDF, informing the user of where it is when it
# is done
#
# (c) Buchan Milne 2002
# License: GPLv2
# Changelog
# v0.0.6 20030428
# - Allow options passed as env. variables from print command
# - Inline and simplify sed (use tr) clean script
# - Ensure file arrives in PREFIX even if TEMP is used without provided
name
# - Changes from Joshua M. Schmidlkofer 20030425
# - Debugging, adjustments, and corrections.
# - Stupid sed sanitizing script. [probably horribly inefficient also].
# - Temp file usage cleanup.
# v0.0.5 20020723
# - Add support for preset settings
# - Allow passing of filename provided by client as final filename
#
# Arguments:
# $1 = file (usually passed with %s from samba)
# $2 = unix prefix to where to place the file (~%u should work)
# $3 = windows prefix to the same location (//%L/%u should work)
# $4 = user/computer to send a notification to (%u or %m)
# $5 = IP address of client (%I)
# $6 = Name of destination file without extension (%J)
# $7 = PDF setting (prepress,print,screen etc)
#
# If you want to customise any of the following configuration defaults,
# you can place them in the file /etc/samba/print-pdf.conf.
# If you need to modify anything in this script, please provide me with your
# changes, preferably in such a way that the changes are configurable.
PS2PDF=ps2pdf13
OPTIONS="-dAutoFilterColorImages=false -sColorImageFilter=FlateEncode"
#Values taken from arguments:
INPUT=$1
PREFIX="$2"
WINBASE=$(echo "$3"|sed -e 's,/,\\\\,g')
#NAME=`echo "$6"|sed -e 's/[&/:{}\\\[<>$#@*^!?=|]/-/g;s/\]/-/g'`
NAME=`echo "$6"|tr '[:punct:]' '[-*]'`
# Source config file if it exists:
CONFFILE=/etc/samba/print-pdf.conf
[ -e $CONFFILE ] && . $CONFFILE
#Values not taken as arguments, could be set via env. vars (?) or config
file
KEEP_PS=${KEEP_PS=0}
PERMS=${PERMS=640}
BASEFILE=${BASEFILE=pdf-service}
TEMP="${TEMP=$2}"
UMASK=${UMASK=006}
#Make sure that destination directory exists
mkdir -p "$PREFIX"
INFILE=$(basename $INPUT)
umask $UMASK
[ -n "$NAME" ] && TEMP="$PREFIX"
#make a temp file to use for the output of the PDF
OUTPUT=`mktemp -q $TEMP/$BASEFILE-XXXXXX`
if [ $? -ne 0 ]; then
echo "$0: Can't create temp file $TEMP/$OUTPUT, exiting..."
exit 1
fi
if [ -n "$NAME" ]; then
FINALOUTPUT="$PREFIX/$NAME"
else
FINALOUTPUT="$OUTPUT"
fi
if [ -n "$7" ]; then
OPTIONS="$OPTIONS -dPDFSETTINGS=/${7#pdf-}"
else
OPTIONS="$OPTIONS -dPDFSETTINGS=/default"
fi
WIN_OUTPUT="$WINBASE\\"`basename "$FINALOUTPUT"`
#mv "$INPUT" "$INPUT.ps";INPUT="$INPUT.ps"
# create the pdf
$PS2PDF $OPTIONS "$INPUT" "$OUTPUT.pdf" >/dev/null 2>&1
mv -f "${OUTPUT}.pdf" "${FINALOUTPUT}".pdf
# Generate a message to send to the user, and deal with the original file:
MESSAGE=$(echo "Your PDF file has been created as $WIN_OUTPUT.pdf\n")
# Cleanup
if [ $KEEP_PS != 0 ];then
mv -f $INPUT "${FINALOUTPUT}".ps
MESSAGE=$(echo "$MESSAGE and your postscript file as $WIN_OUTPUT.ps")
# Fix permissions on the generated files
chmod $PERMS "${FINALOUTPUT}".ps "${FINALOUTPUT}".pdf
else
rm -f $INPUT
# Fix permissions on the generated files
chmod $PERMS "${FINALOUTPUT}".pdf
fi
#Remove empty file from mktemp:
rm -f $OUTPUT
# Send notification to user
echo -e $MESSAGE|smbclient -M $4 -I $5 -U "PDF Generator" >/dev/null 2>&1
******************************
literally .... copy and paste it into ... /usr/share/samba/scripts/print-pdf
on whatever box you are using
The permissions are:
[david@bonza scripts]$ ls -al /usr/share/samba/scripts/
total 20
drwxr-xr-x 2 root root 4096 Jul 16 10:24 ./
drwxr-xr-x 3 root root 4096 Apr 4 09:03 ../
-rwxr-xr-x 1 root root 3555 Apr 4 09:03 print-pdf*
-rwxr-x--- 1 root adm 5757 Apr 4 09:03 smb-migrate*
(2) Confirm you have ps2pdf13 installed or edit the script to work with what
you do have. You will at least have one of the following if you have
ghostscript installed:
skyline:/home/david # ls /usr/bin/ps2*
/usr/bin/ps2ascii /usr/bin/ps2frag /usr/bin/ps2pdf12 /usr/bin/ps2pdf14
/usr/bin/ps2pk
/usr/bin/ps2epsi /usr/bin/ps2pdf /usr/bin/ps2pdf13 /usr/bin/ps2pdfwr
/usr/bin/ps2ps
(3) Then, just edit /etc/samba/smb.conf and add the following share:
[pdf-gen]
path = /var/tmp
guest ok = No
printable = Yes
comment = PDF Generator (only valid users)
printing = bsd
printcap name = cups
#print command = /usr/share/samba/scripts/print-pdf file path win_path
recipient IP &
print command = /usr/share/samba/scripts/print-pdf "%s" "%H" "//%L/%u"
"%m" "%I" "%J" &
lpq command = /bin/true
(4) Then (run testparm -- always; and (5) restart Samba):
On SuSE (as root): rcsmb restart
On mdk (as root): /etc/rc.d/init.d/smb restart
(6) Then from M$ clients, browse to the pdf-gen share and double-click it or
control panel - printers - add printer - network and select it. Choose OK to
'manually select' the driver. Choose one of the latest HP Laserjet
postscript (PS) drivers; (eg. Laserjet 8150 color PS, or Laserjet 6P/6.. PS,
or Laserjet 5, etc..
That's it, that's all it takes! Open Word, (choose your most used app),
select pdf-gen as your printer and BINGO your pdf is created in the users
home directory -- no questions asked. Damn slick! (but it still hasn't
solved my original problem, but -- learning has occurred)
But FWIIW, I thought I would post it. YMMV. But from simply having to dump a
mdk script onto suse, confirm that ps2pdf13 was there, set the permissions,
add a share to smb.conf, add a printer to the weak clients and presto --
your done, your printing to pdf from anywhere. Anyway, I thought it was
cool.
For you industrious souls (Anne -- 1st name that comes to mind), feel free
to dump this into a wiki. (typos and all)
--
David C. Rankin, J.D., P.E.
RANKIN LAW FIRM, PLLC
510 Ochiltree Street
Nacogdoches, Texas 75961
(936) 715-9333
(936) 715-9339 fax
www.rankinlawfirm.com
--