====== CUPS Printing Setup on Debian Etch ======
===== Prerequisites =====
Apache2 should first be installed to use the CUPS web interface at %%https://cupsserver.domain.com:631%%
===== Adding a Printer =====
Use
lpadmin -p "Printername" -v backend-driver -D "Printer description" -P ppdfile.ppd
If no -P option is given, a raw printer is assumed. Issuing the -P option copies the specified file to the ''/etc/cups/ppd'' directory, and renames it to ''Printername.ppd''. A printer can be switched between text and raw by removing the corresponding ppd file from the ''/etc/cups/ppd'' directory and reloading CUPS. Note that Printername must not have any embedded spaces.
Enable the printer with
cupsenable Printername
cupsaccept Printername
Printers can also be added via the web interface.
==== Parallel Printers ====
In Debian Etch, the lp module is not installed by default. Add the line
lp
to /etc/modules
==== Serial Printers ====
First copy the serial backend to the backend directory:
cp /usr/lib/cups/backend-available/serial /usr/lib/cups/backend
Ensure that the serial port is accessible by the lp group:
chown root.lp /dev/ttyS0
Add the printer with serial parameters. e.g.
lpadmin -p DEC-LA100 -v serial:/dev/ttyS0?baud=9600+size=8+parity=none+flow=hard
==== CUPS Backends ====
Additional CUPS backends can be written and placed in the /usr/lib/cups/backend directory. See ''man backend''.
==== ASCII Printers and CUPS Filters ====
Simple ASCII printers can be set up as raw printers, but a better way is to set up as a "Generic text only" printer. The difference is that the generic text only printer allows a CUPS filter to be specified, which is useful for doing such things as page counting, LF -> CR/LF expansion, or Form Feed stripping. The Ubuntu cupsys package includes the two files necessary for this: ''textonly'' (shell script) and ''textonly.ppd''. The ''textonly'' script should be placed in ''/usr/lib/cups/filter'' (755, root.root), and ''textonly.ppd'' copied into ''/etc/cups/ppd'' (and renamed to Printername.ppd accordingly).
The key line in ''textonly.ppd'' is:
''%%*cupsFilter: "text/plain 0 textonly"%%''
where ''textonly'' is the filter to execute.
=== Formfeed Stripping ===
Old problem - Windows Generic Text printer driver printing only dot-matrix labels, using Access, inserts FF after each label. To fix, ensure Windows Printing Preferences is set to either Cut Sheet or Cont Feed - With Break. This ensures Formfeeds are actually sent out (if Cont Feed - No Break is selected, Windows driver sends out LF's instead). Then create a new filter ''textonly-stripff'' with the line:
# Strip FF's and translate LF->CRLF.
sed -e 's/\f//g;s/$/'`echo -ne '\r'`'/g' "$TMPFILE2"
and change PPD line to
''%%*cupsFilter: "text/plain 0 textonly-stripff"%%''
===== Using the CUPS Windows Postscript Driver =====
==== Adding the Driver ====
Using Samba, the CUPS Windows Postscript driver allows for "easy" downloading of a single postscript driver to Windows machines from the Samba CUPS-enabled server, irrespective of the actual printer.
Obtain the tarball from the CUPS website, extract and build. ''libcupsys2-dev'' is needed for the make install, smbclient is needed by cupsaddsmb, so:
aptitude install libcupsys2-dev smbclient
cd /tmp
tar zxf cups-windows-6.0-source.tar.gz
cd cups-windows-6.0
make install
Copy the following files from a Windows system to ''/usr/share/cups/drivers'':
ps5ui.dll
pscript.hlp
pscript.ntf
pscript5.dll
Note, file names must be lower case - see ''man cupsaddsmb'' for more details.
Now run with
cupsaddsmb -H cupsserver -U root -v Printername
If the above gives an NT_STATUS_LOGON_FAILURE, check that the roor password is actually set with
pdbedit -Lw
If not, add with
smbpasswd root
Note that a "correct" PPD file for the printer must be present in ''/etc/cups/ppd'', otherwise ''cupsaddsmb'' will refuse to complete. PPD's can be checked at www.cups.org/testppd.php
==== Samba Configuration ====
Edit /etc/samba/smb.conf to include the following lines:
Under [global]:
load printers = yes
printing = cups
printcap name = cups
print command =
lpq command = %p
lprm command =
[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
public = yes
guest ok = yes
writable = no
printable = yes
printer admin = root
[print$]
comment = Printer Drivers
path = /var/lib/samba/printers
browseable = yes
guest ok = no
read only = no
write list = root
For printers which //do not// require the Postscript drivers (for example if using Windows client drivers, or Generic Text printers), these must be specified - e.g.
# These printers require client drivers (actually just generic ASCII).
# They override the catch-all [printers] for specific entries.
# Note must be browseable (which is the default).
[DEC-LA100]
path = /var/spool/samba
public = yes
guest ok = yes
writable = no
printable = yes
printer admin = root
use client driver = yes
Note comment that such printers need to be browseable, whereas this is specifically switched off in the [printers] section.
===== Putting It All Together =====
==== Sambafax ====
Sambafax uses Hylafax to send a document to a recipient, based on a fax number embedded in a Postscript document. Sambafax was originally written by Ignace Suy. The modified version below works under CUPS, using the CUPS Postscript drivers described above. It also uses pstotext, which does a better job of extracting the fax number from the Postscript file, as well as handling fax numbers which may be split over a number of lines.
#!/bin/sh
#
# Faxing with HylaFax through a faxprinter
# Heavily modified from original version. Supports CUPS and LPR
#
# $Id: sambafax,v 1.9 2009-06-30 08:43:41 tda Exp $
# Printer spool type (LPR or CUPS)
PRINTSYSTEM="CUPS"
# Constants
SENDMAIL="/usr/sbin/sendmail"
# Make up a temporary file using PID
FAXFILE=/tmp/sambafax.$$
# Fax number format
# Match FAX : '01234 567890'
# Deals with newlines in string and 0xad as hyphen
PARSE="
b testfirst
: appendnext
N
y/FAX\n\xad\xa3/fax - /
: testfirst
s/.*fax *: *'\([0-9 ][0-9 ,-]*[0-9 ]\)'.*/\1/
T appendnext
s/[ -]//g
p
q
"
# Retrieve the username and hostname from the parameters
if [ $PRINTSYSTEM = "LPR" ]; then
while :
do
case "$1" in
-n) Username="$2"
shift ; shift
;;
-h) Hostname="$2"
shift ; shift
;;
-*) shift
;;
*) break
esac
done
cat >${FAXFILE}
else
# CUPS
Username="$2"
cat "$6" >${FAXFILE}
fi
# If the samba user is anonymous then send mails to the postmaster
if [ "${Username}" = "nobody" ]; then
MailTo="postmaster@fleet.dcallen.co.uk"
else
MailTo="${Username}@fleet.dcallen.co.uk"
fi
# Retrieve the faxnumber from the printfile
FAXNUM=`pstotext ${FAXFILE} | sed -n "${PARSE}"`
# If faxnumber is found fax the tempfile
# We do not check the validity of the faxnumber, let sendfax do this...
if [ "${FAXNUM}" = "" ]; then
(echo "To: ${MailTo}"
echo "From: The HylaFAX Samba print service "
echo "Subject: Your facsimile request failed"
echo ""
echo -n "The faxnumber is not recognized in your fax of "
echo -n `date`
echo "."
echo "The faxnumber is recognised by this text:"
echo ""
echo " Fax: 'd,ddd-dd ddddd'"
echo ""
echo "Only spaces, ',' or '-' characters are allowed between the digits."
echo ""
echo "Please correct and retry."
) | 2>&1 $SENDMAIL -ffax -oi ${MailTo}
else
sendfax -n -D -m -f ${MailTo} -d ${FAXNUM} ${FAXFILE}
fi
# Remove the temp file
# rm -f ${FAXFILE}
# End of file
First, copy the sambafax script to ''/usr/lib/cups/backend'', then
lpadmin -p "Faxprinter" -v sambafax -D "Fax printer" -P sambafax.ppd
''sambafax.ppd'' is any "correct" PPD file, to allow ''cupsaddsmb'' to complete (the resultant PPD is then deleted, as Faxprinter needs to be a raw printer).
cupsaddsmb -H cupsserver -U root -v Faxprinter
rm /etc/cups/ppd/Faxprinter.ppd
==== DEC Letterprinter LA100 ====
This is an ASCII printer on a serial port; add with:
lpadmin -p DEC-LA100 -v serial:/dev/ttyS0?baud=9600+size=8+parity=none+flow=hard -D "DEC Letterprinter 100" -P textonly.ppd
To /etc/samba/smb.conf, add section:
[DEC-LA100]
path = /var/spool/samba
public = yes
guest ok = yes
writable = no
printable = yes
printer admin = root
use client driver = yes
==== NEC P2 Plus ====
This is an ASCII printer on a parallel port; add with:
lpadmin -p NEC-P2 -v parallel:/dev/lp1 -D "NEC Pinwriter P2 Plus" -P textonly.ppd
Then edit ''/etc/cups/ppd/NEC-P2.ppd'':
''%%*cupsFilter: "text/plain 0 textonly-stripff"%%''
to remove Formfeeds.
To /etc/samba/smb.conf, add section:
[NEC-P2]
path = /var/spool/samba
public = yes
guest ok = yes
writable = no
printable = yes
printer admin = root
use client driver = yes
==== OKI C5450 ====
This is a Postscript network printer; add with:
lpadmin -p OKI-C5450 -v lpd://c5450/lpt1 -D "Colour printer" -P OKI-C5450.ppd
cupsaddsmb -H cupsserver -U root -v OKI-C5450
===== Printing to a Remote Machine =====
Server is machine with printer. Client is machine from which to print.
On server, ensure that ''/etc/cups/cupsd.conf'' included the following lines:
Browsing On
BrowseOrder allow,deny
BrowseAllow @LOCAL
If access is required from a different network, add another BrowseAllow line - e.g.
BrowseAllow 192.168.2.
Under the '''' section, and the '''' section, add similar lines
Allow 192.168.2.
if accessing from a different net.
On the client, ensure a BrowsePoll line is present:
Browsing On
BrowseOrder allow,deny
BrowseAllow @LOCAL
BrowsePoll server.domain.com
===== Printing Text Files =====
Print options can be specified on the ''lpr'' command line. e.g.
lpr -pLaserjet-6P -o cpi=11.5 -o lpi=6 -o page-top=33 [file]
Alternatively, printer options can be set by the ''lpoptions'' command:
lpoptions -pLaserjet-6P -o cpi=11.5 -o lpi=6 -o page-top=33
==== Printer Instances ====
Multiple options set can be set up using printer "instances", where each instance of a single printer can have a different set of options.
To set a printer instance, use:
lpoptions -pLaserjet-6P/instance1 -o cpi=11.5 -o lpi=6 -o page-top=33
To delete an instance:
lpoptions -xLaserjet-6P/instance1
Printer instances set by root are global.
Note that printer instances are not presented on the CUPS web interface.
=== Printing Text Files From Windows Command Line ===
There are a number of obstacles to printing with specific option sets through Samba with CUPS:
- Samba appears to not support printer instances via the CUPS API. They simply do not appear as listed printers. Furthermore, attempts to specifically list a printer instance also do not work.
- Any printer options set with ''lpoptions'' (see above) are ignored.
- It may be possible to define a special printer, printing = sysv, and define a specific ''lp'' print command, but this would need a difference printer defined for each option set. Also, all the other print commands then also need defining in this section of ''smb.conf''.
One solution is to give up on Samba and simply pipe the file to ''lpr'' on the print server using Cygwin ''ssh'' (or any other Windows ''ssh'' client). e.g.
type file | ssh cupsserver lpr -pLaserjet-6P -o cpi=11.5 -o lpi=6 -o page-top=33