====== 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