Table of Contents
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 <fax>" 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 <Location/>
section, and the <Location /admin>
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 ofsmb.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