summaryrefslogtreecommitdiff
path: root/docs/htmldocs/Samba3-HOWTO/CUPS-printing.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/htmldocs/Samba3-HOWTO/CUPS-printing.html')
-rw-r--r--docs/htmldocs/Samba3-HOWTO/CUPS-printing.html3112
1 files changed, 0 insertions, 3112 deletions
diff --git a/docs/htmldocs/Samba3-HOWTO/CUPS-printing.html b/docs/htmldocs/Samba3-HOWTO/CUPS-printing.html
deleted file mode 100644
index ade3dc226a..0000000000
--- a/docs/htmldocs/Samba3-HOWTO/CUPS-printing.html
+++ /dev/null
@@ -1,3112 +0,0 @@
-<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 22. CUPS Printing Support</title><link rel="stylesheet" href="../samba.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.75.2"><link rel="home" href="index.html" title="The Official Samba 3.5.x HOWTO and Reference Guide"><link rel="up" href="optional.html" title="Part III. Advanced Configuration"><link rel="prev" href="classicalprinting.html" title="Chapter 21. Classical Printing Support"><link rel="next" href="VFS.html" title="Chapter 23. Stackable VFS modules"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 22. CUPS Printing Support</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="classicalprinting.html">Prev</a> </td><th width="60%" align="center">Part III. Advanced Configuration</th><td width="20%" align="right"> <a accesskey="n" href="VFS.html">Next</a></td></tr></table><hr></div><div class="chapter" title="Chapter 22. CUPS Printing Support"><div class="titlepage"><div><div><h2 class="title"><a name="CUPS-printing"></a>Chapter 22. CUPS Printing Support</h2></div><div><div class="author"><h3 class="author"><span class="firstname">Kurt</span> <span class="surname">Pfeifle</span></h3><div class="affiliation"><span class="orgname">Danka Deutschland GmbH <br></span><div class="address"><p><code class="email">&lt;<a class="email" href="mailto:kpfeifle@danka.de">kpfeifle@danka.de</a>&gt;</code></p></div></div></div></div><div><div class="author"><h3 class="author"><span class="firstname">Ciprian</span> <span class="surname">Vizitiu</span></h3><span class="contrib">drawings</span> <div class="affiliation"><div class="address"><p><code class="email">&lt;<a class="email" href="mailto:CVizitiu@gbif.org">CVizitiu@gbif.org</a>&gt;</code></p></div></div></div></div><div><div class="author"><h3 class="author"><span class="firstname">Jelmer</span> <span class="othername">R.</span> <span class="surname">Vernooij</span></h3><span class="contrib">drawings</span> <div class="affiliation"><span class="orgname">The Samba Team<br></span><div class="address"><p><code class="email">&lt;<a class="email" href="mailto:jelmer@samba.org">jelmer@samba.org</a>&gt;</code></p></div></div></div></div><div><p class="pubdate"> (27 Jan 2004) </p></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="CUPS-printing.html#id398810">Introduction</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id398815">Features and Benefits</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id398866">Overview</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id398976">Basic CUPS Support Configuration</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id399084">Linking smbd with libcups.so</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id399310">Simple <code class="filename">smb.conf</code> Settings for CUPS</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id399534">More Complex CUPS <code class="filename">smb.conf</code> Settings</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id399894">Advanced Configuration</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id399907">Central Spooling vs. <span class="quote">&#8220;<span class="quote">Peer-to-Peer</span>&#8221;</span> Printing</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id399952">Raw Print Serving: Vendor Drivers on Windows Clients</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id400166">Installation of Windows Client Drivers</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#cups-raw">Explicitly Enable <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span> Printing for <span class="emphasis"><em>application/octet-stream</em></span></a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id400430">Driver Upload Methods</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id400541">Advanced Intelligent Printing with PostScript Driver Download</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#gdipost">GDI on Windows, PostScript on UNIX</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id400715">Windows Drivers, GDI, and EMF</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id400881">UNIX Printfile Conversion and GUI Basics</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#post-and-ghost">PostScript and Ghostscript</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id401205">Ghostscript: The Software RIP for Non-PostScript Printers</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id401346">PostScript Printer Description (PPD) Specification</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id401414">Using Windows-Formatted Vendor PPDs</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id401523">CUPS Also Uses PPDs for Non-PostScript Printers</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id401558">The CUPS Filtering Architecture</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id401774">MIME Types and CUPS Filters</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id402185">MIME Type Conversion Rules</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id402381">Filtering Overview</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id402529">Prefilters</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id402708">pstops</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id402868">pstoraster</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id403119">imagetops and imagetoraster</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id403199">rasterto [printers specific]</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id403411">CUPS Backends</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id403719">The Role of <em class="parameter"><code>cupsomatic/foomatic</code></em></a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id403933">The Complete Picture</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id403945"><code class="filename">mime.convs</code></a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id404006"><span class="quote">&#8220;<span class="quote">Raw</span>&#8221;</span> Printing</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id404106">application/octet-stream Printing</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id404367">PostScript Printer Descriptions for Non-PostScript Printers</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id404631"><span class="emphasis"><em>cupsomatic/foomatic-rip</em></span> Versus <span class="emphasis"><em>Native CUPS</em></span> Printing</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id404945">Examples for Filtering Chains</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id405347">Sources of CUPS Drivers/PPDs</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id405456">Printing with Interface Scripts</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id405534">Network Printing (Purely Windows)</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id405549">From Windows Clients to an NT Print Server</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id405607">Driver Execution on the Client</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id405672">Driver Execution on the Server</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id405771">Network Printing (Windows Clients and UNIX/Samba Print
-Servers)</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id405787">From Windows Clients to a CUPS/Samba Print Server</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id405962">Samba Receiving Job-Files and Passing Them to CUPS</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id406034">Network PostScript RIP</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id406112">PPDs for Non-PS Printers on UNIX</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406149">PPDs for Non-PS Printers on Windows</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id406210">Windows Terminal Servers (WTS) as CUPS Clients</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id406222">Printer Drivers Running in <span class="quote">&#8220;<span class="quote">Kernel Mode</span>&#8221;</span> Cause Many
-Problems</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406253">Workarounds Impose Heavy Limitations</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406267">CUPS: A <span class="quote">&#8220;<span class="quote">Magical Stone</span>&#8221;</span>?</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406303">PostScript Drivers with No Major Problems, Even in Kernel
-Mode</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id406382">Configuring CUPS for Driver Download</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id406400"><span class="emphasis"><em>cupsaddsmb</em></span>: The Unknown Utility</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406488">Prepare Your <code class="filename">smb.conf</code> for <code class="literal">cupsaddsmb</code></a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406765">CUPS <span class="quote">&#8220;<span class="quote">PostScript Driver for Windows NT/200x/XP</span>&#8221;</span></a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406987">Recognizing Different Driver Files</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407098">Acquiring the Adobe Driver Files</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407118">ESP Print Pro PostScript Driver for Windows NT/200x/XP</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407173">Caveats to Be Considered</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407452">Windows CUPS PostScript Driver Versus Adobe Driver</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407647">Run cupsaddsmb (Quiet Mode)</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407782">Run cupsaddsmb with Verbose Output</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407885">Understanding cupsaddsmb</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id408021">How to Recognize If cupsaddsmb Completed Successfully</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id408132">cupsaddsmb with a Samba PDC</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id408209">cupsaddsmb Flowchart</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id408287">Installing the PostScript Driver on a Client</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#cups-avoidps1">Avoiding Critical PostScript Driver Settings on the Client</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id408496">Installing PostScript Driver Files Manually Using rpcclient</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id408662">A Check of the rpcclient man Page</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id408822">Understanding the rpcclient man Page</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id408914">Producing an Example by Querying a Windows Box</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id409034">Requirements for adddriver and setdriver to Succeed</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id409245">Manual Driver Installation in 15 Steps</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id410123">Troubleshooting Revisited</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id410254">The Printing <code class="filename">*.tdb</code> Files</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id410454">Trivial Database Files</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id410516">Binary Format</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id410577">Losing <code class="filename">*.tdb</code> Files</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id410623">Using <code class="literal">tdbbackup</code></a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id410734">CUPS Print Drivers from Linuxprinting.org</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id410895">foomatic-rip and Foomatic Explained</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id411599">foomatic-rip and Foomatic PPD Download and Installation</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id412022">Page Accounting with CUPS</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id412052">Setting Up Quotas</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id412102">Correct and Incorrect Accounting</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id412135">Adobe and CUPS PostScript Drivers for Windows Clients</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id412266">The page_log File Syntax</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id412406">Possible Shortcomings</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id412465">Future Developments</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id412500">Other Accounting Tools</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id412512">Additional Material</a></span></dt><dt><span class="sect1"><a href="CUPS-printing.html#id412700">Autodeletion or Preservation of CUPS Spool Files</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id412773">CUPS Configuration Settings Explained</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id412850">Preconditions</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id412978">Manual Configuration</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id413023">Printing from CUPS to Windows-Attached Printers</a></span></dt><dt><span class="sect1"><a href="CUPS-printing.html#id413279">More CUPS Filtering Chains</a></span></dt><dt><span class="sect1"><a href="CUPS-printing.html#id413388">Common Errors</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id413394">Windows 9x/Me Client Can't Install Driver</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#root-ask-loop"><span class="quote">&#8220;<span class="quote">cupsaddsmb</span>&#8221;</span> Keeps Asking for Root Password in Never-ending Loop</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id413464"><span class="quote">&#8220;<span class="quote">cupsaddsmb</span>&#8221;</span> or <span class="quote">&#8220;<span class="quote">rpcclient addriver</span>&#8221;</span> Emit Error</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id413500"><span class="quote">&#8220;<span class="quote">cupsaddsmb</span>&#8221;</span> Errors</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id413571">Client Can't Connect to Samba Printer</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id413594">New Account Reconnection from Windows 200x/XP Troubles</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id413674">Avoid Being Connected to the Samba Server as the Wrong User</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id413721">Upgrading to CUPS Drivers from Adobe Drivers</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id413755">Can't Use <span class="quote">&#8220;<span class="quote">cupsaddsmb</span>&#8221;</span> on Samba Server, Which Is a PDC</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id413790">Deleted Windows 200x Printer Driver Is Still Shown</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id413821">Windows 200x/XP Local Security Policies</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id413852">Administrator Cannot Install Printers for All Local Users</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id413888">Print Change, Notify Functions on NT Clients</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id413911">Windows XP SP1</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id413953">Print Options for All Users Can't Be Set on Windows 200x/XP</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id414222">Most Common Blunders in Driver Settings on Windows Clients</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id414274"><code class="literal">cupsaddsmb</code> Does Not Work with Newly Installed Printer</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id414320">Permissions on <code class="filename">/var/spool/samba/</code> Get Reset After Each Reboot</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id414413">Print Queue Called <span class="quote">&#8220;<span class="quote">lp</span>&#8221;</span> Mishandles Print Jobs</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id414476">Location of Adobe PostScript Driver Files for <span class="quote">&#8220;<span class="quote">cupsaddsmb</span>&#8221;</span></a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id414527">Overview of the CUPS Printing Processes</a></span></dt></dl></div><div class="sect1" title="Introduction"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id398810"></a>Introduction</h2></div></div></div><div class="sect2" title="Features and Benefits"><div class="titlepage"><div><div><h3 class="title"><a name="id398815"></a>Features and Benefits</h3></div></div></div><p>
-<a class="indexterm" name="id398823"></a>
- The Common UNIX Print System (<a class="ulink" href="http://www.cups.org/" target="_top">CUPS</a>)
- has become quite popular. All major Linux distributions now ship it as their default printing
- system. To many, it is still a mystical tool. Mostly, it just works. People tend to regard
- it as a <span class="quote">&#8220;<span class="quote">black box</span>&#8221;</span> that they do not want to look into as long as it works. But once
- there is a little problem, they have trouble finding out where to start debugging it. Refer to
- <a class="link" href="classicalprinting.html" title="Chapter 21. Classical Printing Support">Classical Printing</a>, which contains much information
- that is also relevant to CUPS.
- </p><p>
-<a class="indexterm" name="id398853"></a>
- CUPS sports quite a few unique and powerful features. While its basic functions may be grasped quite
- easily, they are also new. Because it is different from other, more traditional printing systems, it is best
- not to try to apply any prior knowledge about printing to this new system. Rather, try to understand CUPS from
- the beginning. This documentation will lead you to a complete understanding of CUPS. Let's start with the most
- basic things first.
- </p></div><div class="sect2" title="Overview"><div class="titlepage"><div><div><h3 class="title"><a name="id398866"></a>Overview</h3></div></div></div><p>
-<a class="indexterm" name="id398874"></a>
-<a class="indexterm" name="id398881"></a>
-<a class="indexterm" name="id398888"></a>
-<a class="indexterm" name="id398894"></a>
-<a class="indexterm" name="id398901"></a>
-<a class="indexterm" name="id398911"></a>
-<a class="indexterm" name="id398920"></a>
-<a class="indexterm" name="id398927"></a>
- CUPS is more than just a print spooling system. It is a complete printer management system that
- complies with the new Internet Printing Protocol (IPP). IPP is an industry and Internet Engineering Task Force
- (IETF) standard for network printing. Many of its functions can be managed remotely (or locally) via a Web
- browser (giving you platform-independent access to the CUPS print server). Additionally, it has the
- traditional command line and several more modern GUI interfaces (GUI interfaces developed by third parties,
- like KDE's overwhelming <a class="ulink" href="http://printing.kde.org/" target="_top">KDEPrint</a>).
- </p><p>
-<a class="indexterm" name="id398948"></a>
-<a class="indexterm" name="id398955"></a>
- CUPS allows creation of <span class="emphasis"><em>raw</em></span> printers (i.e., no print file format translation) as
- well as <span class="emphasis"><em>smart</em></span> printers (i.e., CUPS does file format conversion as required for the
- printer). In many ways, this gives CUPS capabilities similar to the MS Windows print monitoring system. Of
- course, if you are a CUPS advocate, you would argue that CUPS is better! In any case, let us now explore how
- to configure CUPS for interfacing with MS Windows print clients via Samba.
- </p></div></div><div class="sect1" title="Basic CUPS Support Configuration"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id398976"></a>Basic CUPS Support Configuration</h2></div></div></div><p>
-<a class="indexterm" name="id398984"></a>
-<a class="indexterm" name="id398990"></a>
-<a class="indexterm" name="id398997"></a>
-<a class="indexterm" name="id399004"></a>
-<a class="indexterm" name="id399011"></a>
-Printing with CUPS in the most basic <code class="filename">smb.conf</code> setup in Samba-3.0 (as was true for 2.2.x) requires just two
-parameters: <a class="link" href="smb.conf.5.html#PRINTING" target="_top">printing = cups</a> and <a class="link" href="smb.conf.5.html#PRINTCAP" target="_top">printcap = cups</a>. CUPS does not need a printcap file. However, the
-<code class="filename">cupsd.conf</code> configuration file knows of two related directives that control how such a
-file will be automatically created and maintained by CUPS for the convenience of third-party applications
-(example: <em class="parameter"><code>Printcap /etc/printcap</code></em> and <em class="parameter"><code>PrintcapFormat BSD</code></em>).
-Legacy programs often require the existence of a printcap file containing printer names or they will refuse to
-print. Make sure CUPS is set to generate and maintain a printcap file. For details, see <code class="literal">man
-cupsd.conf</code> and other CUPS-related documentation, like the wealth of documents regarding the CUPS
-server itself available from the <a class="ulink" href="http://localhost:631/documentation.html" target="_top">CUPS</a> web site.
- </p><div class="sect2" title="Linking smbd with libcups.so"><div class="titlepage"><div><div><h3 class="title"><a name="id399084"></a>Linking smbd with libcups.so</h3></div></div></div><p>
-<a class="indexterm" name="id399092"></a>
- Samba has a special relationship to CUPS. Samba can be compiled with CUPS library support.
- Most recent installations have this support enabled. By default, CUPS linking is compiled
- into smbd and other Samba binaries. Of course, you can use CUPS even
- if Samba is not linked against <code class="filename">libcups.so</code> but
- there are some differences in required or supported configuration.
- </p><p>
-<a class="indexterm" name="id399113"></a>
-<a class="indexterm" name="id399119"></a>
- When Samba is compiled and linked with <code class="filename">libcups</code>, <a class="link" href="smb.conf.5.html#PRINTCAP" target="_top">printcap = cups</a>
- uses the CUPS API to list printers, submit jobs, query queues, and so on. Otherwise it maps to the System V
- commands with an additional <code class="literal">-oraw</code> option for printing. On a Linux
- system, you can use the <code class="literal">ldd</code> utility to find out if smbd has been linked with the
- libcups library (<code class="literal">ldd</code> may not be present on other OS platforms, or its function may be embodied
- by a different command):
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>ldd `which smbd`</code></strong>
-libssl.so.0.9.6 =&gt; /usr/lib/libssl.so.0.9.6 (0x4002d000)
-libcrypto.so.0.9.6 =&gt; /usr/lib/libcrypto.so.0.9.6 (0x4005a000)
-libcups.so.2 =&gt; /usr/lib/libcups.so.2 (0x40123000)
-[....]
-</pre><p>
- </p><p>
-<a class="indexterm" name="id399184"></a>
- The line <code class="computeroutput">libcups.so.2 =&gt; /usr/lib/libcups.so.2 (0x40123000)</code> shows
- there is CUPS support compiled into this version of Samba. If this is the case, and printing = cups
- is set, then <span class="emphasis"><em>any otherwise manually set print command in <code class="filename">smb.conf</code> is ignored</em></span>.
- This is an important point to remember!
- </p><div class="tip" title="Tip" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3><p> Should it be necessary, for any reason, to set your own print commands, you can do this by setting
- <a class="link" href="smb.conf.5.html#PRINTING" target="_top">printing = sysv</a>. However, you will lose all the benefits
- of tight CUPS-Samba integration. When you do this, you must manually configure the printing system commands
- (most important:
- <a class="link" href="smb.conf.5.html#PRINTCOMMAND" target="_top">print command</a>; other commands are
- <a class="link" href="smb.conf.5.html#LPPAUSECOMMAND" target="_top">lppause command</a>,
- <a class="link" href="smb.conf.5.html#LPRESUMECOMMAND" target="_top">lpresume command</a>,
- <a class="link" href="smb.conf.5.html#LPQCOMMAND" target="_top">lpq command</a>,
- <a class="link" href="smb.conf.5.html#LPRMCOMMAND" target="_top">lprm command</a>,
- <a class="link" href="smb.conf.5.html#QUEUEPAUSECOMMAND" target="_top">queuepause command</a> and
- <a class="link" href="smb.conf.5.html#QUEUERESUMECOMMAND" target="_top">queue resume command</a>).
- </p></div></div><div class="sect2" title="Simple smb.conf Settings for CUPS"><div class="titlepage"><div><div><h3 class="title"><a name="id399310"></a>Simple <code class="filename">smb.conf</code> Settings for CUPS</h3></div></div></div><p>
- To summarize, <a class="link" href="CUPS-printing.html#cups-exam-simple" title="Example 22.1. Simplest Printing-Related smb.conf">the Simplest Printing-Related
- <code class="filename">smb.conf</code> file</a> shows the simplest printing-related setup for <code class="filename">smb.conf</code> to
- enable basic CUPS support:
- </p><div class="example"><a name="cups-exam-simple"></a><p class="title"><b>Example 22.1. Simplest Printing-Related smb.conf</b></p><div class="example-contents"><table border="0" summary="Simple list" class="simplelist"><tr><td> </td></tr><tr><td><em class="parameter"><code>[global]</code></em></td></tr><tr><td><a class="indexterm" name="id399370"></a><em class="parameter"><code>load printers = yes</code></em></td></tr><tr><td><a class="indexterm" name="id399381"></a><em class="parameter"><code>printing = cups</code></em></td></tr><tr><td><a class="indexterm" name="id399393"></a><em class="parameter"><code>printcap name = cups</code></em></td></tr><tr><td> </td></tr><tr><td><em class="parameter"><code>[printers]</code></em></td></tr><tr><td><a class="indexterm" name="id399413"></a><em class="parameter"><code>comment = All Printers</code></em></td></tr><tr><td><a class="indexterm" name="id399424"></a><em class="parameter"><code>path = /var/spool/samba</code></em></td></tr><tr><td><a class="indexterm" name="id399436"></a><em class="parameter"><code>browseable = no</code></em></td></tr><tr><td><a class="indexterm" name="id399447"></a><em class="parameter"><code>guest ok = yes</code></em></td></tr><tr><td><a class="indexterm" name="id399459"></a><em class="parameter"><code>writable = no</code></em></td></tr><tr><td><a class="indexterm" name="id399470"></a><em class="parameter"><code>printable = yes</code></em></td></tr><tr><td><a class="indexterm" name="id399482"></a><em class="parameter"><code>printer admin = root, @ntadmins, @smbprintadm</code></em></td></tr></table></div></div><br class="example-break"><p>
-<a class="indexterm" name="id399497"></a>
-<a class="indexterm" name="id399504"></a>
-<a class="indexterm" name="id399510"></a>
- This is all you need for basic printing setup for CUPS. It will print all graphic, text, PDF, and PostScript
- files submitted from Windows clients. However, most of your Windows users would not know how to send these
- kinds of files to print without opening a GUI application. Windows clients tend to have local printer drivers
- installed, and the GUI application's print buttons start a printer driver. Your users also rarely send files
- from the command line. Unlike UNIX clients, they rarely submit graphic, text, or PDF formatted files directly
- to the spooler. They nearly exclusively print from GUI applications with a <span class="quote">&#8220;<span class="quote">printer driver</span>&#8221;</span>
- hooked between the application's native format and the print data stream. If the backend printer is not a
- PostScript device, the print data stream is <span class="quote">&#8220;<span class="quote">binary,</span>&#8221;</span> sensible only for the target printer. Read
- on to learn what problem this may cause and how to avoid it.
- </p></div><div class="sect2" title="More Complex CUPS smb.conf Settings"><div class="titlepage"><div><div><h3 class="title"><a name="id399534"></a>More Complex CUPS <code class="filename">smb.conf</code> Settings</h3></div></div></div><p>
- <a class="link" href="CUPS-printing.html#overridesettings" title="Example 22.2. Overriding Global CUPS Settings for One Printer">The Overriding Global CUPS Settings for One Printer example</a>
- is a slightly more complex printing-related setup for <code class="filename">smb.conf</code>. It enables general CUPS printing
- support for all printers, but defines one printer share, which is set up differently.
- </p><div class="example"><a name="overridesettings"></a><p class="title"><b>Example 22.2. Overriding Global CUPS Settings for One Printer</b></p><div class="example-contents"><table border="0" summary="Simple list" class="simplelist"><tr><td> </td></tr><tr><td><em class="parameter"><code>[global]</code></em></td></tr><tr><td><a class="indexterm" name="id399588"></a><em class="parameter"><code>printing = cups</code></em></td></tr><tr><td><a class="indexterm" name="id399599"></a><em class="parameter"><code>printcap name = cups</code></em></td></tr><tr><td><a class="indexterm" name="id399611"></a><em class="parameter"><code>load printers = yes</code></em></td></tr><tr><td> </td></tr><tr><td><em class="parameter"><code>[printers]</code></em></td></tr><tr><td><a class="indexterm" name="id399631"></a><em class="parameter"><code>comment = All Printers</code></em></td></tr><tr><td><a class="indexterm" name="id399643"></a><em class="parameter"><code>path = /var/spool/samba</code></em></td></tr><tr><td><a class="indexterm" name="id399654"></a><em class="parameter"><code>guest ok = yes</code></em></td></tr><tr><td><a class="indexterm" name="id399666"></a><em class="parameter"><code>writable = no</code></em></td></tr><tr><td><a class="indexterm" name="id399677"></a><em class="parameter"><code>printable = yes</code></em></td></tr><tr><td><a class="indexterm" name="id399689"></a><em class="parameter"><code>printer admin = root, @ntadmins, @smbprintadm</code></em></td></tr><tr><td> </td></tr><tr><td><em class="parameter"><code>[special_printer]</code></em></td></tr><tr><td><a class="indexterm" name="id399709"></a><em class="parameter"><code>comment = A special printer with his own settings</code></em></td></tr><tr><td><a class="indexterm" name="id399721"></a><em class="parameter"><code>path = /var/spool/samba-special</code></em></td></tr><tr><td><a class="indexterm" name="id399733"></a><em class="parameter"><code>printing = sysv</code></em></td></tr><tr><td><a class="indexterm" name="id399744"></a><em class="parameter"><code>printcap = lpstat</code></em></td></tr><tr><td><a class="indexterm" name="id399756"></a><em class="parameter"><code>print command = echo "NEW: `date`: printfile %f" &gt;&gt; /tmp/smbprn.log ; echo " `date`: p-%p s-%s f-%f" &gt;&gt; /tmp/smbprn.log ; echo " `date`: j-%j J-%J z-%z c-%c" &gt;&gt; /tmp/smbprn.log ; rm %f </code></em></td></tr><tr><td><a class="indexterm" name="id399769"></a><em class="parameter"><code>guest ok = no</code></em></td></tr><tr><td><a class="indexterm" name="id399781"></a><em class="parameter"><code>writable = no</code></em></td></tr><tr><td><a class="indexterm" name="id399792"></a><em class="parameter"><code>printable = yes</code></em></td></tr><tr><td><a class="indexterm" name="id399804"></a><em class="parameter"><code>printer admin = kurt</code></em></td></tr><tr><td><a class="indexterm" name="id399815"></a><em class="parameter"><code>hosts deny = 0.0.0.0</code></em></td></tr><tr><td><a class="indexterm" name="id399827"></a><em class="parameter"><code>hosts allow = turbo_xp, 10.160.50.23, 10.160.51.60</code></em></td></tr></table></div></div><br class="example-break"><p>
- This special share is only for testing purposes. It does not write the print job to a file. It just logs the job parameters
- known to Samba into the <code class="filename">/tmp/smbprn.log</code> file and deletes the job-file. Moreover, the
- <a class="link" href="smb.conf.5.html#PRINTERADMIN" target="_top">printer admin</a> of this share is <span class="quote">&#8220;<span class="quote">kurt</span>&#8221;</span> (not the <span class="quote">&#8220;<span class="quote">@ntadmins</span>&#8221;</span> group),
- guest access is not allowed, the share isn't published to the Network Neighborhood (so you need to know it is there), and it
- allows access from only three hosts. To prevent CUPS from kicking in and taking over the print jobs for that share, we need to set
- <a class="link" href="smb.conf.5.html#PRINTING" target="_top">printing = sysv</a> and <a class="link" href="smb.conf.5.html#PRINTCAP" target="_top">printcap = lpstat</a>.
- </p></div></div><div class="sect1" title="Advanced Configuration"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id399894"></a>Advanced Configuration</h2></div></div></div><p>
- Before we delve into all the configuration options, let us clarify a few points. <span class="emphasis"><em>Network printing
- needs to be organized and set up correctly</em></span>. This frequently doesn't happen. Legacy systems or small
- business LAN environments often lack design and good housekeeping.
- </p><div class="sect2" title="Central Spooling vs. &#8220;Peer-to-Peer&#8221; Printing"><div class="titlepage"><div><div><h3 class="title"><a name="id399907"></a>Central Spooling vs. <span class="quote">&#8220;<span class="quote">Peer-to-Peer</span>&#8221;</span> Printing</h3></div></div></div><p>
-<a class="indexterm" name="id399919"></a>
- <a class="indexterm" name="id399926"></a>
- <a class="indexterm" name="id399935"></a>
- Many small office or home networks, as well as badly organized larger environments, allow each client a direct
- access to available network printers. This is generally a bad idea. It often blocks one client's access to the
- printer when another client's job is printing. It might freeze the first client's application while it is
- waiting to get rid of the job. Also, there are frequent complaints about various jobs being printed with their
- pages mixed with each other. A better concept is the use of a print server: it routes all jobs through one
- central system, which responds immediately, takes jobs from multiple concurrent clients, and transfers them to
- the printer(s) in the correct order.
- </p></div><div class="sect2" title="Raw Print Serving: Vendor Drivers on Windows Clients"><div class="titlepage"><div><div><h3 class="title"><a name="id399952"></a>Raw Print Serving: Vendor Drivers on Windows Clients</h3></div></div></div><p>
- <a class="indexterm" name="id399960"></a>
- <a class="indexterm" name="id399967"></a>
- Most traditionally configured UNIX print servers acting on behalf of
- Samba's Windows clients represented a really simple setup. Their only
- task was to manage the <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span> spooling of all jobs handed to them by
- Samba. This approach meant that the Windows clients were expected to
- prepare the print job file that is ready to be sent to the printing
- device. In this case, a native (vendor-supplied) Windows printer driver needs to
- be installed on each and every client for the target device.
- </p><p>
-<a class="indexterm" name="id399984"></a>
-<a class="indexterm" name="id399991"></a>
- It is possible to configure CUPS, Samba, and your Windows clients in the
- same traditional and simple way. When CUPS printers are configured
- for raw print-through mode operation, it is the responsibility of the
- Samba client to fully render the print job (file). The file must be
- sent in a format that is suitable for direct delivery to the
- printer. Clients need to run the vendor-provided drivers to do
- this. In this case, CUPS will not do any print file format conversion
- work.
- </p><p>
- The easiest printing configuration possible is raw print-through.
- This is achieved by installation of the printer as if it were physically
- attached to the Windows client. You then redirect output to a raw network
- print queue. This procedure may be followed to achieve this:
- </p><div class="procedure" title="Procedure 22.1. Configuration Steps for Raw CUPS Printing Support"><a name="id400009"></a><p class="title"><b>Procedure 22.1. Configuration Steps for Raw CUPS Printing Support</b></p><ol class="procedure" type="1"><li class="step" title="Step 1"><p>
-<a class="indexterm" name="id400020"></a>
- Edit <code class="filename">/etc/cups/mime.types</code> to uncomment the line
- near the end of the file that has:
-</p><pre class="screen">
-#application/octet-...
-</pre><p>
- </p></li><li class="step" title="Step 2"><p>
-<a class="indexterm" name="id400046"></a>
- Do the same for the file <code class="filename">/etc/cups/mime.convs</code>.
- </p></li><li class="step" title="Step 3"><p>
- Add a raw printer using the Web interface. Point your browser at
- <code class="constant">http://localhost:631</code>. Enter Administration, and add
- the printer following the prompts. Do not install any drivers for it.
- Choose Raw. Choose queue name <code class="constant">Raw Queue</code>.
- </p></li><li class="step" title="Step 4"><p>
- In the <code class="filename">smb.conf</code> file <code class="constant">[printers]</code> section add
- <a class="link" href="smb.conf.5.html#USECLIENTDRIVER" target="_top">use client driver = Yes</a>,
- and in the <code class="constant">[global]</code> section add
- <a class="link" href="smb.conf.5.html#PRINTING" target="_top">printing = CUPS</a>, plus
- <a class="link" href="smb.conf.5.html#PRINTCAP" target="_top">printcap = CUPS</a>.
- </p></li><li class="step" title="Step 5"><p>
- Install the printer as if it is a local printer, that is, Printing to <code class="constant">LPT1:</code>.
- </p></li><li class="step" title="Step 6"><p>
- Edit the configuration under the <span class="guimenu">Detail</span> tab and create a
- <code class="constant">local port</code> that points to the raw printer queue that
- you have configured above. Example: <code class="constant">\\server\raw_q</code>.
- Here, the name <code class="constant">raw_q</code> is the name you gave the print
- queue in the CUPS environment.
- </p></li></ol></div></div><div class="sect2" title="Installation of Windows Client Drivers"><div class="titlepage"><div><div><h3 class="title"><a name="id400166"></a>Installation of Windows Client Drivers</h3></div></div></div><p>
- The printer drivers on the Windows clients may be installed
- in two functionally different ways:
- </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Manually install the drivers locally on each client,
- one by one; this yields the old LanMan style
- printing and uses a <code class="filename">\\sambaserver\printershare</code>
- type of connection.</p></li><li class="listitem"><p>
- <a class="indexterm" name="id400193"></a>
- Deposit and prepare the drivers (for later download) on
- the print server (Samba); this enables the clients to use
- <span class="quote">&#8220;<span class="quote">Point'n'Print</span>&#8221;</span> to get drivers semi-automatically installed the
- first time they access the printer; with this method NT/200x/XP
- clients use the <span class="emphasis"><em>SPOOLSS/MS-RPC</em></span>
- type printing calls.</p></li></ul></div><p>
- The second method is recommended for use over the first as it reduces the
- administrative efforts and prevents that different versions of the drivers
- are used accidentally.
- </p></div><div class="sect2" title="Explicitly Enable &#8220;raw&#8221; Printing for application/octet-stream"><div class="titlepage"><div><div><h3 class="title"><a name="cups-raw"></a>Explicitly Enable <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span> Printing for <span class="emphasis"><em>application/octet-stream</em></span></h3></div></div></div><p>
- <a class="indexterm" name="id400234"></a>
- <a class="indexterm" name="id400241"></a>
- <a class="indexterm" name="id400248"></a>
- If you use the first option (drivers are installed on the client
- side), there is one setting to take care of: CUPS needs to be told
- that it should allow <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span> printing of deliberate (binary) file
- formats. The CUPS files that need to be correctly set for raw mode
- printers to work are:
- </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="filename">/etc/cups/mime.types</code></p></li><li class="listitem"><p><code class="filename">/etc/cups/mime.convs</code></p></li></ul></div><p>
- Both contain entries (at the end of the respective files) that must be uncommented to allow RAW mode
- operation. In <code class="filename">/etc/cups/mime.types</code>, make sure this line is present:
-</p><pre class="programlisting">
-application/octet-stream
-</pre><p>
- <a class="indexterm" name="id400298"></a>
- <a class="indexterm" name="id400305"></a>
- In <code class="filename">/etc/cups/mime.convs</code>, have this line:
- <a class="indexterm" name="id400318"></a>
-</p><pre class="programlisting">
-application/octet-stream application/vnd.cups-raw 0 -
-</pre><p>
- If these two files are not set up correctly for raw Windows client
- printing, you may encounter the dreaded <code class="computeroutput">Unable to
- convert file 0</code> in your CUPS <code class="filename">error_log</code> file.
- </p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
- Editing the <code class="filename">mime.convs</code> and the <code class="filename">mime.types</code> file does
- not <span class="emphasis"><em>enforce</em></span> <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span> printing, it only <span class="emphasis"><em>allows</em></span> it.
- </p></div><p title="Background"><b>Background. </b>
- <a class="indexterm" name="id400379"></a>
-<a class="indexterm" name="id400386"></a>
- That CUPS is a more security-aware printing system than traditional ones does not by default allow a user to
- send deliberate (possibly binary) data to printing devices. This could be easily abused to launch a
- <span class="quote">&#8220;<span class="quote">Denial of Service</span>&#8221;</span> attack on your printer(s), causing at least the loss of a lot of paper and
- ink. <span class="quote">&#8220;<span class="quote">Unknown</span>&#8221;</span> data are tagged by CUPS as <em class="parameter"><code>MIME type: application/octet-stream</code></em>
- and not allowed to go to the printer. By default, you can only send other (known) MIME types <span class="quote">&#8220;<span class="quote">raw.</span>&#8221;</span>
- Sending data <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span> means that CUPS does not try to convert them and passes them to the printer
- untouched.
- </p><p>
- This is all you need to know to get the CUPS/Samba combo printing
- <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span> files prepared by Windows clients, which have vendor drivers
- locally installed. If you are not interested in background information about
- more advanced CUPS/Samba printing, simply skip the remaining sections
- of this chapter.
- </p></div><div class="sect2" title="Driver Upload Methods"><div class="titlepage"><div><div><h3 class="title"><a name="id400430"></a>Driver Upload Methods</h3></div></div></div><p>
- This section describes three familiar methods, plus one new one, by which
- printer drivers may be uploaded.
- </p><p>
- <a class="indexterm" name="id400442"></a>
- If you want to use the MS-RPC-type printing, you must upload the
- drivers onto the Samba server first (<em class="parameter"><code>[print$]</code></em>
- share). For a discussion on how to deposit printer drivers on the
- Samba host (so the Windows clients can download and use them via
- <span class="quote">&#8220;<span class="quote">Point'n'Print</span>&#8221;</span>), please refer to the <a class="link" href="classicalprinting.html" title="Chapter 21. Classical Printing Support">Classical Printing
- chapter</a> of this book. There you will find a description or reference to
- three methods of preparing the client drivers on the Samba server:
- </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
- <a class="indexterm" name="id400475"></a>
- The GUI, <span class="quote">&#8220;<span class="quote">Add Printer Wizard</span>&#8221;</span> <span class="emphasis"><em>upload-from-a-Windows-client</em></span> method.
- </p></li><li class="listitem"><p>
- The command line, <span class="quote">&#8220;<span class="quote">smbclient/rpcclient</span>&#8221;</span> upload-from-a-UNIX-workstation method.
- </p></li><li class="listitem"><p>
- <a class="indexterm" name="id400502"></a>
- The Imprints tool set method.
- </p></li></ul></div><p>
-<a class="indexterm" name="id400513"></a>
- These three methods apply to CUPS all the same. The <code class="literal">cupsaddsmb</code> utility is a new and more
- convenient way to load the Windows drivers into Samba and is provided if you use CUPS.
- </p><p>
- <code class="literal">cupsaddsmb</code> is discussed in much detail later in this chapter. But we first
- explore the CUPS filtering system and compare the Windows and UNIX printing architectures.
- </p></div></div><div class="sect1" title="Advanced Intelligent Printing with PostScript Driver Download"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id400541"></a>Advanced Intelligent Printing with PostScript Driver Download</h2></div></div></div><p>
- <a class="indexterm" name="id400549"></a>
- We now know how to set up a <span class="quote">&#8220;<span class="quote">dump</span>&#8221;</span> print server, that is, a server that spools
- print jobs <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span>, leaving the print data untouched.
- </p><p>
- You might need to set up CUPS in a smarter way. The reasons could be manifold:
- </p><a class="indexterm" name="id400572"></a><a class="indexterm" name="id400578"></a><a class="indexterm" name="id400585"></a><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Maybe your boss wants to get monthly statistics: Which
- printer did how many pages? What was the average data size of a job?
- What was the average print run per day? What are the typical hourly
- peaks in printing? Which department prints how much?</p></li><li class="listitem"><p>Maybe you are asked to set up a print quota system:
- Users should not be able to print more jobs once they have surpassed
- a given limit per period.</p></li><li class="listitem"><p>Maybe your previous network printing setup is a mess
- and must be re-organized from a clean beginning.</p></li><li class="listitem"><p>Maybe you are experiencing too many <span class="quote">&#8220;<span class="quote">blue screens</span>&#8221;</span>
- originating from poorly debugged printer drivers running in NT <span class="quote">&#8220;<span class="quote">kernel mode</span>&#8221;</span>?</p></li></ul></div><p>
- These goals cannot be achieved by a raw print server. To build a
- server meeting these requirements, you'll first need to learn
- how CUPS works and how you can enable its features.
- </p><p>
- What follows is the comparison of some fundamental concepts for
- Windows and UNIX printing, then a description of the
- CUPS filtering system, how it works, and how you can tweak it.
- </p><div class="sect2" title="GDI on Windows, PostScript on UNIX"><div class="titlepage"><div><div><h3 class="title"><a name="gdipost"></a>GDI on Windows, PostScript on UNIX</h3></div></div></div><p>
- <a class="indexterm" name="id400646"></a>
- <a class="indexterm" name="id400652"></a>
- Network printing is one of the most complicated and error-prone
- day-to-day tasks any user or administrator may encounter. This is
- true for all OS platforms, and there are reasons it is so.
- </p><p>
- <a class="indexterm" name="id400664"></a>
- <a class="indexterm" name="id400671"></a>
-<a class="indexterm" name="id400678"></a>
-<a class="indexterm" name="id400685"></a>
-<a class="indexterm" name="id400692"></a>
- You can't expect to throw just any file format at a printer and have it get printed. A file format conversion
- must take place. The problem is that there is no common standard for print file formats across all
- manufacturers and printer types. While PostScript (trademark held by Adobe) and, to an extent, PCL (trademark
- held by Hewlett-Packard) have developed into semi-official <span class="quote">&#8220;<span class="quote">standards</span>&#8221;</span> by being the most widely
- used page description languages (PDLs), there are still many manufacturers who <span class="quote">&#8220;<span class="quote">roll their own</span>&#8221;</span>
- (their reasons may be unacceptable license fees for using printer-embedded PostScript interpreters, and so on).
- </p></div><div class="sect2" title="Windows Drivers, GDI, and EMF"><div class="titlepage"><div><div><h3 class="title"><a name="id400715"></a>Windows Drivers, GDI, and EMF</h3></div></div></div><p>
- <a class="indexterm" name="id400723"></a>
- <a class="indexterm" name="id400730"></a>
- <a class="indexterm" name="id400737"></a>
-<a class="indexterm" name="id400743"></a>
- In Windows OS, the format conversion job is done by the printer drivers. On MS Windows OS platforms all
- application programmers have at their disposal a built-in API, the graphical device interface (GDI), as part
- and parcel of the OS itself to base themselves on. This GDI core is used as one common unified ground for all
- Windows programs to draw pictures, fonts, and documents <span class="emphasis"><em>on screen</em></span> as well as <span class="emphasis"><em>on
- paper</em></span> (print). Therefore, printer driver developers can standardize on a well-defined GDI output
- for their own driver input. Achieving WYSIWYG (What You See Is What You Get) is relatively easy, because the
- on-screen graphic primitives, as well as the on-paper drawn objects, come from one common source. This source,
- the GDI, often produces a file format called Enhanced MetaFile (EMF). The EMF is processed by the printer
- driver and converted to the printer-specific file format.
- </p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
- <a class="indexterm" name="id400771"></a>
-<a class="indexterm" name="id400778"></a>
-<a class="indexterm" name="id400785"></a>
- To the GDI foundation in MS Windows, Apple has chosen to put paper and screen output on a common foundation
- for its (BSD-UNIX-based, did you know?) Mac OS X and Darwin operating <a class="indexterm" name="id400793"></a> <a class="indexterm" name="id400800"></a>
- <a class="indexterm" name="id400807"></a> <a class="indexterm" name="id400813"></a> systems.
- Apple's <span class="emphasis"><em>core graphic engine</em></span> uses a <span class="emphasis"><em>PDF</em></span> derivative for all display work.
- </p></div><p>
- The example in <a class="link" href="CUPS-printing.html#f1small" title="Figure 22.1. Windows Printing to a Local Printer.">Windows Printing to a Local Printer</a> illustrates local Windows
- printing.
- </p><div class="figure"><a name="f1small"></a><p class="title"><b>Figure 22.1. Windows Printing to a Local Printer.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/1small.png" alt="Windows Printing to a Local Printer."></div></div></div><br class="figure-break"></div><div class="sect2" title="UNIX Printfile Conversion and GUI Basics"><div class="titlepage"><div><div><h3 class="title"><a name="id400881"></a>UNIX Printfile Conversion and GUI Basics</h3></div></div></div><p>
- <a class="indexterm" name="id400889"></a>
- <a class="indexterm" name="id400896"></a>
- <a class="indexterm" name="id400903"></a>
- <a class="indexterm" name="id400909"></a>
- In UNIX and Linux, there is no comparable layer built into the OS kernel(s) or the X (screen display) server.
- Every application is responsible for itself to create its print output. Fortunately, most use PostScript and
- that at least gives some common ground. Unfortunately, there are many different levels of quality for this
- PostScript. And worse, there is a huge difference (and no common root) in the way the same document is
- displayed on screen and how it is presented on paper. WYSIWYG is more difficult to achieve. This goes back to
- the time, decades ago, when the predecessors of X.org, designing the UNIX foundations and protocols for
- graphical user interfaces, refused to take responsibility for <span class="quote">&#8220;<span class="quote">paper output</span>&#8221;</span>, as some had
- demanded at the time, and restricted itself to <span class="quote">&#8220;<span class="quote">on-screen only.</span>&#8221;</span> (For some years now, the
- <span class="quote">&#8220;<span class="quote">Xprint</span>&#8221;</span> project has been under development, attempting to build printing support into the X
- framework, including a PostScript and a PCL driver, but it is not yet ready for prime time.) You can see this
- unfavorable inheritance up to the present day by looking into the various <span class="quote">&#8220;<span class="quote">font</span>&#8221;</span> directories on
- your system; there are separate ones for fonts used for X display and fonts to be used on paper.
- </p><p title="Background"><b>Background. </b>
- <a class="indexterm" name="id400950"></a>
-<a class="indexterm" name="id400956"></a>
-<a class="indexterm" name="id400963"></a>
-<a class="indexterm" name="id400970"></a>
-<a class="indexterm" name="id400977"></a>
-<a class="indexterm" name="id400984"></a>
-<a class="indexterm" name="id400990"></a>
-<a class="indexterm" name="id400997"></a>
-<a class="indexterm" name="id401004"></a>
-<a class="indexterm" name="id401011"></a>
- The PostScript programming language is an <span class="quote">&#8220;<span class="quote">invention</span>&#8221;</span> by Adobe, but its specifications have been
- published extensively. Its strength lies in its powerful abilities to describe graphical objects (fonts,
- shapes, patterns, lines, curves, and dots), their attributes (color, linewidth), and the way to manipulate
- (scale, distort, rotate, shift) them. Because of its open specification, anybody with the skill can start
- writing his or her own implementation of a PostScript interpreter and use it to display PostScript files on
- screen or on paper. Most graphical output devices are based on the concept of <span class="quote">&#8220;<span class="quote">raster images</span>&#8221;</span> or
- <span class="quote">&#8220;<span class="quote">pixels</span>&#8221;</span> (one notable exception is pen plotters). Of course, you can look at a PostScript file in
- its textual form and you will be reading its PostScript code, the language instructions that need to be
- interpreted by a rasterizer. Rasterizers produce pixel images, which may be displayed on screen by a viewer
- program or on paper by a printer.
- </p></div><div class="sect2" title="PostScript and Ghostscript"><div class="titlepage"><div><div><h3 class="title"><a name="post-and-ghost"></a>PostScript and Ghostscript</h3></div></div></div><p>
- <a class="indexterm" name="id401051"></a>
- <a class="indexterm" name="id401058"></a>
- <a class="indexterm" name="id401067"></a>
-<a class="indexterm" name="id401076"></a>
-<a class="indexterm" name="id401083"></a>
- So UNIX is lacking a common ground for printing on paper and displaying on screen. Despite this unfavorable
- legacy for UNIX, basic printing is fairly easy if you have PostScript printers at your disposal. The reason is
- that these devices have a built-in PostScript language <span class="quote">&#8220;<span class="quote">interpreter,</span>&#8221;</span> also called a raster image
- processor (RIP), (which makes them more expensive than other types of printers; throw PostScript toward them,
- and they will spit out your printed pages. The RIP does all the hard work of converting the PostScript drawing
- commands into a bitmap picture as you see it on paper, in a resolution as done by your printer. This is no
- different than PostScript printing a file from a Windows origin.
- </p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
- <a class="indexterm" name="id401106"></a>
-<a class="indexterm" name="id401112"></a>
-<a class="indexterm" name="id401119"></a>
- Traditional UNIX programs and printing systems while using PostScript are largely not
- PPD-aware. PPDs are <span class="quote">&#8220;<span class="quote">PostScript Printer Description</span>&#8221;</span> files. They enable you to specify and
- control all options a printer supports: duplexing, stapling, and punching. Therefore, UNIX users for a long
- time couldn't choose many of the supported device and job options, unlike Windows or Apple users. But now
- there is CUPS. as illustrated in <a class="link" href="CUPS-printing.html#f2small" title="Figure 22.2. Printing to a PostScript Printer.">Printing to a PostScript Printer</a>.
- </p></div><div class="figure"><a name="f2small"></a><p class="title"><b>Figure 22.2. Printing to a PostScript Printer.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/2small.png" alt="Printing to a PostScript Printer."></div></div></div><br class="figure-break"><p>
- <a class="indexterm" name="id401193"></a>
- However, there are other types of printers out there. These do not know how to print PostScript. They use
- their own PDL, often proprietary. To print to them is much more demanding. Since your UNIX applications mostly
- produce PostScript, and since these devices do not understand PostScript, you need to convert the print files
- to a format suitable for your printer on the host before you can send it away.
- </p></div><div class="sect2" title="Ghostscript: The Software RIP for Non-PostScript Printers"><div class="titlepage"><div><div><h3 class="title"><a name="id401205"></a>Ghostscript: The Software RIP for Non-PostScript Printers</h3></div></div></div><p>
- <a class="indexterm" name="id401213"></a>
- Here is where Ghostscript kicks in. Ghostscript is the traditional (and quite powerful) PostScript interpreter
- used on UNIX platforms. It is a RIP in software, capable of doing a <span class="emphasis"><em>lot</em></span> of file format
- conversions for a very broad spectrum of hardware devices as well as software file formats. Ghostscript
- technology and drivers are what enable PostScript printing to non-PostScript hardware. This is shown in
- <a class="link" href="CUPS-printing.html#f3small" title="Figure 22.3. Ghostscript as a RIP for Non-PostScript Printers.">Ghostscript as a RIP for Non-PostScript Printers</a>.
- </p><div class="figure"><a name="f3small"></a><p class="title"><b>Figure 22.3. Ghostscript as a RIP for Non-PostScript Printers.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/3small.png" alt="Ghostscript as a RIP for Non-PostScript Printers."></div></div></div><br class="figure-break"><div class="tip" title="Tip" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3><p>
-<a class="indexterm" name="id401280"></a>
-<a class="indexterm" name="id401286"></a>
-<a class="indexterm" name="id401293"></a>
- Use the <span class="quote">&#8220;<span class="quote">gs -h</span>&#8221;</span> command to check for all built-in <span class="quote">&#8220;<span class="quote">devices</span>&#8221;</span> on your Ghostscript
- version. If you specify a parameter of <em class="parameter"><code>-sDEVICE=png256</code></em> on your Ghostscript command
- line, you are asking Ghostscript to convert the input into a PNG file. Naming a <span class="quote">&#8220;<span class="quote">device</span>&#8221;</span> on the
- command line is the most important single parameter to tell Ghostscript exactly how it should render the
- input. New Ghostscript versions are released at fairly regular intervals, now by artofcode LLC. They are
- initially put under the <span class="quote">&#8220;<span class="quote">AFPL</span>&#8221;</span> license, but re-released under the GNU GPL as soon as the next
- AFPL version appears. GNU Ghostscript is probably the version installed on most Samba systems. But it has some
- deficiencies. <a class="indexterm" name="id401326"></a> Therefore, ESP Ghostscript was developed as an enhancement over GNU Ghostscript,
- with lots of bug-fixes, additional devices, and improvements. It is jointly maintained by developers from
- CUPS, Gutenprint, MandrakeSoft, SuSE, Red Hat, and Debian. It includes the <span class="quote">&#8220;<span class="quote">cups</span>&#8221;</span> device
- (essential to print to non-PS printers from CUPS).
- </p></div></div><div class="sect2" title="PostScript Printer Description (PPD) Specification"><div class="titlepage"><div><div><h3 class="title"><a name="id401346"></a>PostScript Printer Description (PPD) Specification</h3></div></div></div><p>
- <a class="indexterm" name="id401354"></a>
-<a class="indexterm" name="id401360"></a>
-<a class="indexterm" name="id401367"></a>
- While PostScript in essence is a PDL to represent the page layout in a device-independent way, real-world
- print jobs are always ending up being output on hardware with device-specific features. To take care of all
- the differences in hardware and to allow for innovations, Adobe has specified a syntax and file format for
- PostScript Printer Description (PPD) files. Every PostScript printer ships with one of these files.
- </p><p>
- PPDs contain all the information about general and special features of the
- given printer model: Which different resolutions can it handle? Does
- it have a duplexing unit? How many paper trays are there? What media
- types and sizes does it take? For each item, it also names the special
- command string to be sent to the printer (mostly inside the PostScript
- file) in order to enable it.
- </p><p>
- Information from these PPDs is meant to be taken into account by the
- printer drivers. Therefore, installed as part of the Windows
- PostScript driver for a given printer is the printer's PPD. Where it
- makes sense, the PPD features are presented in the drivers' UI dialogs
- to display to the user a choice of print options. In the end, the
- user selections are somehow written (in the form of special
- PostScript, PJL, JCL, or vendor-dependent commands) into the PostScript
- file created by the driver.
- </p><div class="warning" title="Warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p>
- <a class="indexterm" name="id401396"></a>
-<a class="indexterm" name="id401402"></a>
- A PostScript file that was created to contain device-specific commands
- for achieving a certain print job output (e.g., duplexed, stapled, and
- punched) on a specific target machine may not print as expected, or
- may not be printable at all on other models; it also may not be fit
- for further processing by software (e.g., by a PDF distilling program).
- </p></div></div><div class="sect2" title="Using Windows-Formatted Vendor PPDs"><div class="titlepage"><div><div><h3 class="title"><a name="id401414"></a>Using Windows-Formatted Vendor PPDs</h3></div></div></div><p>
-<a class="indexterm" name="id401422"></a>
-<a class="indexterm" name="id401429"></a>
-<a class="indexterm" name="id401436"></a>
- CUPS can handle all spec-compliant PPDs as supplied by the manufacturers for their PostScript models. Even if
- a vendor does not mention our favorite OS in his or her manuals and brochures, you can safely trust this:
- <span class="emphasis"><em>If you get the Windows NT version of the PPD, you can use it unchanged in CUPS</em></span> and thus
- access the full power of your printer just like a Windows NT user could!
- </p><div class="tip" title="Tip" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3><p>
- To check the spec compliance of any PPD online, go to <a class="ulink" href="http://www.cups.org/testppd.php" target="_top">http://www.cups.org/testppd.php</a> and upload your PPD. You will
- see the results displayed immediately. CUPS in all versions after 1.1.19 has a much stricter internal PPD
- parsing and checking code enabled; in case of printing trouble, this online resource should be one of your
- first pit stops.
- </p></div><div class="warning" title="Warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p>
- <a class="indexterm" name="id401469"></a>
- <a class="indexterm" name="id401476"></a>
- For real PostScript printers, <span class="emphasis"><em>do not</em></span> use the <span class="emphasis"><em>Foomatic</em></span> or
- <span class="emphasis"><em>cupsomatic</em></span> PPDs from Linuxprinting.org. With these devices, the original vendor-provided
- PPDs are always the first choice.
- </p></div><div class="tip" title="Tip" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3><p>
-<a class="indexterm" name="id401499"></a>
- If you are looking for an original vendor-provided PPD of a specific device, and you know that an NT4 box (or
- any other Windows box) on your LAN has the PostScript driver installed, just use <code class="literal">smbclient
- //NT4-box/print\$ -U username</code> to access the Windows directory where all printer driver files are
- stored. First look in the <code class="filename">W32X86/2</code> subdirectory for the PPD you are seeking.
- </p></div></div><div class="sect2" title="CUPS Also Uses PPDs for Non-PostScript Printers"><div class="titlepage"><div><div><h3 class="title"><a name="id401523"></a>CUPS Also Uses PPDs for Non-PostScript Printers</h3></div></div></div><p>
-<a class="indexterm" name="id401531"></a>
-<a class="indexterm" name="id401538"></a>
-<a class="indexterm" name="id401545"></a>
- CUPS also uses specially crafted PPDs to handle non-PostScript printers. These PPDs are usually not available
- from the vendors (and no, you can't just take the PPD of a PostScript printer with the same model name and
- hope it works for the non-PostScript version too). To understand how these PPDs work for non-PS printers, we
- first need to dive deeply into the CUPS filtering and file format conversion architecture. Stay tuned.
- </p></div></div><div class="sect1" title="The CUPS Filtering Architecture"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id401558"></a>The CUPS Filtering Architecture</h2></div></div></div><p>
-<a class="indexterm" name="id401566"></a>
-<a class="indexterm" name="id401573"></a>
-<a class="indexterm" name="id401580"></a>
-<a class="indexterm" name="id401587"></a>
-<a class="indexterm" name="id401593"></a>
-The core of the CUPS filtering system is based on Ghostscript. In addition to Ghostscript, CUPS uses some
-other filters of its own. You (or your OS vendor) may have plugged in even more filters. CUPS handles all data
-file formats under the label of various MIME types. Every incoming print file is subjected to an initial
-autotyping. The autotyping determines its given MIME type. A given MIME type implies zero or more possible
-filtering chains relevant to the selected target printer. This section discusses how MIME types recognition
-and conversion rules interact. They are used by CUPS to automatically set up a working filtering chain for any
-given input data format.
-</p><p>
-If CUPS rasterizes a PostScript file natively to a bitmap, this is done in two stages:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
-<a class="indexterm" name="id401616"></a>
-<a class="indexterm" name="id401623"></a>
- The first stage uses a Ghostscript device named <span class="quote">&#8220;<span class="quote">cups</span>&#8221;</span>
- (this is since version 1.1.15) and produces a generic raster format
- called <span class="quote">&#8220;<span class="quote">CUPS raster</span>&#8221;</span>.
- </p></li><li class="listitem"><p>
-<a class="indexterm" name="id401643"></a>
- The second stage uses a <span class="quote">&#8220;<span class="quote">raster driver</span>&#8221;</span> that converts
- the generic CUPS raster to a device-specific raster.
- </p></li></ul></div><p>
-<a class="indexterm" name="id401658"></a>
-<a class="indexterm" name="id401665"></a>
-<a class="indexterm" name="id401672"></a>
-Make sure your Ghostscript version has the <span class="quote">&#8220;<span class="quote">cups</span>&#8221;</span> device compiled in (check with <code class="literal">gs -h |
-grep cups</code>). Otherwise you may encounter the dreaded <code class="computeroutput">Unable to convert file
-0</code> in your CUPS error_log file. To have <span class="quote">&#8220;<span class="quote">cups</span>&#8221;</span> as a device in your Ghostscript,
-you either need to patch GNU Ghostscript and recompile or use
-<a class="indexterm" name="id401700"></a><a class="ulink" href="http://www.cups.org/ghostscript.php" target="_top">ESP Ghostscript</a>. The superior alternative is ESP
-Ghostscript. It supports not just CUPS, but 300 other devices (while GNU Ghostscript supports only about 180).
-Because of this broad output device support, ESP Ghostscript is the first choice for non-CUPS spoolers, too.
-It is now recommended by Linuxprinting.org for all spoolers.
-</p><p>
-<a class="indexterm" name="id401720"></a>
-<a class="indexterm" name="id401726"></a>
-<a class="indexterm" name="id401733"></a>
-<a class="indexterm" name="id401740"></a>
-CUPS printers may be set up to use external rendering paths. One of the most common is provided by the
-Foomatic/cupsomatic concept from <a class="ulink" href="http://www.linuxprinting.org/" target="_top">Linuxprinting.org</a>. This
-uses the classical Ghostscript approach, doing everything in one step. It does not use the
-<span class="quote">&#8220;<span class="quote">cups</span>&#8221;</span> device, but one of the many others. However, even for Foomatic/cupsomatic usage, best
-results and <a class="indexterm" name="id401759"></a> broadest printer
-model support is provided by ESP Ghostscript (more about Foomatic/cupsomatic, particularly the new version
-called now <span class="emphasis"><em>foomatic-rip</em></span>, follows).
-</p><div class="sect2" title="MIME Types and CUPS Filters"><div class="titlepage"><div><div><h3 class="title"><a name="id401774"></a>MIME Types and CUPS Filters</h3></div></div></div><p>
- <a class="indexterm" name="id401782"></a>
- <a class="indexterm" name="id401792"></a>
-<a class="indexterm" name="id401798"></a>
-<a class="indexterm" name="id401805"></a>
-<a class="indexterm" name="id401812"></a>
- CUPS reads the file <code class="filename">/etc/cups/mime.types</code> (and all other files carrying a
- <code class="filename">*.types</code> suffix in the same directory) upon startup. These files contain the MIME type
- recognition rules that are applied when CUPS runs its autotyping routines. The rule syntax is explained in the
- man page for <code class="filename">mime.types</code> and in the comments section of the
- <code class="filename">mime.types</code> file itself. A simple rule reads like this:
- <a class="indexterm" name="id401845"></a>
-</p><pre class="programlisting">
-application/pdf pdf string(0,%PDF)
-</pre><p>
-<a class="indexterm" name="id401858"></a>
-<a class="indexterm" name="id401865"></a>
- This means if a filename has a <code class="filename">.pdf</code> suffix or if the magic string
- <span class="emphasis"><em>%PDF</em></span> is right at the beginning of the file itself (offset 0 from the start), then it is a
- PDF file (<em class="parameter"><code>application/pdf</code></em>). Another rule is this:
-</p><pre class="programlisting">
-application/postscript ai eps ps string(0,%!) string(0,&lt;04&gt;%!)
-</pre><p>
-<a class="indexterm" name="id401895"></a>
-<a class="indexterm" name="id401902"></a>
-<a class="indexterm" name="id401909"></a>
-<a class="indexterm" name="id401916"></a>
-<a class="indexterm" name="id401923"></a>
-<a class="indexterm" name="id401929"></a>
- If the filename has one of the suffixes <code class="filename">.ai</code>, <code class="filename">.eps</code>,
- <code class="filename">.ps</code>, or if the file itself starts with one of the strings <span class="emphasis"><em>%!</em></span> or
- <span class="emphasis"><em>&lt;04&gt;%!</em></span>, it is a generic PostScript file
- (<em class="parameter"><code>application/postscript</code></em>).
- </p><div class="warning" title="Warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p>
-<a class="indexterm" name="id401972"></a>
- Don't confuse the other mime.types files your system might be using
- with the one in the <code class="filename">/etc/cups/</code> directory.
- </p></div><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
-<a class="indexterm" name="id401990"></a>
-<a class="indexterm" name="id401997"></a>
-<a class="indexterm" name="id402004"></a>
-<a class="indexterm" name="id402010"></a>
-<a class="indexterm" name="id402017"></a>
- There is an important difference between two similar MIME types in CUPS: one is
- <em class="parameter"><code>application/postscript</code></em>, the other is
- <em class="parameter"><code>application/vnd.cups-postscript</code></em>. While <em class="parameter"><code>application/postscript</code></em> is
- meant to be device-independent, job options for the file are still outside the PS file content, embedded in
- command line or environment variables by CUPS, <em class="parameter"><code>application/vnd.cups-postscript</code></em> may have
- the job options inserted into the PostScript data itself (where applicable). The transformation of the generic
- PostScript (<em class="parameter"><code>application/postscript</code></em>) to the device-specific version
- (<em class="parameter"><code>application/vnd.cups-postscript</code></em>) is the responsibility of the CUPS
- <em class="parameter"><code>pstops</code></em> filter. pstops uses information contained in the PPD to do the transformation.
- </p></div><p>
-<a class="indexterm" name="id402073"></a>
-<a class="indexterm" name="id402080"></a>
-<a class="indexterm" name="id402087"></a>
-<a class="indexterm" name="id402093"></a>
-<a class="indexterm" name="id402100"></a>
-<a class="indexterm" name="id402106"></a>
-<a class="indexterm" name="id402113"></a>
-<a class="indexterm" name="id402120"></a>
-<a class="indexterm" name="id402126"></a>
-<a class="indexterm" name="id402133"></a>
-<a class="indexterm" name="id402140"></a>
-<a class="indexterm" name="id402147"></a>
-<a class="indexterm" name="id402154"></a>
-<a class="indexterm" name="id402161"></a>
-<a class="indexterm" name="id402167"></a>
-<a class="indexterm" name="id402174"></a>
- CUPS can handle ASCII text, HP-GL, PDF, PostScript, DVI, and
- many image formats (GIF, PNG, TIFF, JPEG, Photo-CD, SUN-Raster,
- PNM, PBM, SGI-RGB, and more) and their associated MIME types
- with its filters.
- </p></div><div class="sect2" title="MIME Type Conversion Rules"><div class="titlepage"><div><div><h3 class="title"><a name="id402185"></a>MIME Type Conversion Rules</h3></div></div></div><p>
- <a class="indexterm" name="id402193"></a>
- <a class="indexterm" name="id402200"></a>
-<a class="indexterm" name="id402206"></a>
-<a class="indexterm" name="id402213"></a>
-<a class="indexterm" name="id402220"></a>
- CUPS reads the file <code class="filename">/etc/cups/mime.convs</code>
- (and all other files named with a <code class="filename">*.convs</code>
- suffix in the same directory) upon startup. These files contain
- lines naming an input MIME type, an output MIME type, a format
- conversion filter that can produce the output from the input type,
- and virtual costs associated with this conversion. One example line
- reads like this:
-</p><pre class="programlisting">
-application/pdf application/postscript 33 pdftops
-</pre><p>
-<a class="indexterm" name="id402248"></a>
- This means that the <em class="parameter"><code>pdftops</code></em> filter will take
- <em class="parameter"><code>application/pdf</code></em> as input and produce
- <em class="parameter"><code>application/postscript</code></em> as output; the virtual
- cost of this operation is 33 CUPS-$. The next filter is more
- expensive, costing 66 CUPS-$:
- <a class="indexterm" name="id402274"></a>
-</p><pre class="programlisting">
-application/vnd.hp-HPGL application/postscript 66 hpgltops
-</pre><p>
-<a class="indexterm" name="id402287"></a>
- This is the <em class="parameter"><code>hpgltops</code></em>, which processes HP-GL
- plotter files to PostScript.
- <a class="indexterm" name="id402300"></a>
-</p><pre class="programlisting">
-application/octet-stream
-</pre><p>
- Here are two more examples:
- <a class="indexterm" name="id402313"></a>
-<a class="indexterm" name="id402320"></a>
-<a class="indexterm" name="id402327"></a>
-<a class="indexterm" name="id402334"></a>
-</p><pre class="programlisting">
-application/x-shell application/postscript 33 texttops
-text/plain application/postscript 33 texttops
-</pre><p>
-<a class="indexterm" name="id402347"></a>
- The last two examples name the <em class="parameter"><code>texttops</code></em> filter to work on
- <em class="parameter"><code>text/plain</code></em> as well as on <em class="parameter"><code>application/x-shell</code></em>. (Hint: This
- differentiation is needed for the syntax highlighting feature of <em class="parameter"><code>texttops</code></em>).
- </p></div><div class="sect2" title="Filtering Overview"><div class="titlepage"><div><div><h3 class="title"><a name="id402381"></a>Filtering Overview</h3></div></div></div><p>
- <a class="indexterm" name="id402389"></a>
- There are many more combinations named in <code class="filename">mime.convs</code>. However, you are not limited to use
- the ones predefined there. You can plug in any filter you like to the CUPS framework. It must meet, or must be
- made to meet, some minimal requirements. If you find (or write) a cool conversion filter of some kind, make
- sure it complies with what CUPS needs and put in the right lines in <code class="filename">mime.types</code> and
- <code class="filename">mime.convs</code>; then it will work seamlessly inside CUPS.
- </p><div class="sect3" title="Filter Requirements"><div class="titlepage"><div><div><h4 class="title"><a name="id402418"></a>Filter Requirements</h4></div></div></div><p>
- The <span class="quote">&#8220;<span class="quote">CUPS requirements</span>&#8221;</span> for filters are simple. Take filenames or <code class="filename">stdin</code> as
- input and write to <code class="filename">stdout</code>. They should take these arguments:
- </p><div class="variablelist"><dl><dt><span class="term">printer</span></dt><dd><p>
- The name of the printer queue (normally this is the name of the filter being run).
- </p></dd><dt><span class="term">job</span></dt><dd><p>
- The numeric job ID for the job being printed.
- </p></dd><dt><span class="term">user</span></dt><dd><p>
- The string from the originating-user-name attribute.
- </p></dd><dt><span class="term">title</span></dt><dd><p>
- The string from the job-name attribute.
- </p></dd><dt><span class="term">copies</span></dt><dd><p>
- The numeric value from the number-copies attribute.
- </p></dd><dt><span class="term">options</span></dt><dd><p>
- The job options.
- </p></dd><dt><span class="term">filename</span></dt><dd><p>
- (optionally) The print request file (if missing, filters expect data
- fed through <code class="filename">stdin</code>). In most cases, it is easy to
- write a simple wrapper script around existing filters to make them work with CUPS.
- </p></dd></dl></div></div></div><div class="sect2" title="Prefilters"><div class="titlepage"><div><div><h3 class="title"><a name="id402529"></a>Prefilters</h3></div></div></div><p>
- <a class="indexterm" name="id402537"></a>
-<a class="indexterm" name="id402544"></a>
-<a class="indexterm" name="id402551"></a>
- As previously stated, PostScript is the central file format to any UNIX-based
- printing system. From PostScript, CUPS generates raster data to feed
- non-PostScript printers.
- </p><p>
-<a class="indexterm" name="id402562"></a>
-<a class="indexterm" name="id402569"></a>
-<a class="indexterm" name="id402576"></a>
-<a class="indexterm" name="id402583"></a>
-<a class="indexterm" name="id402589"></a>
-<a class="indexterm" name="id402596"></a>
-<a class="indexterm" name="id402603"></a>
-<a class="indexterm" name="id402609"></a>
-<a class="indexterm" name="id402616"></a>
-<a class="indexterm" name="id402623"></a>
- But what happens if you send one of the supported non-PS formats to print? Then CUPS runs
- <span class="quote">&#8220;<span class="quote">prefilters</span>&#8221;</span> on these input formats to generate PostScript first. There are prefilters to create
- PostScript from ASCII text, PDF, DVI, or HP-GL. The outcome of these filters is always of MIME type
- <em class="parameter"><code>application/postscript</code></em> (meaning that any device-specific print options are not yet
- embedded into the PostScript by CUPS and that the next filter to be called is pstops). Another prefilter is
- running on all supported image formats, the <em class="parameter"><code>imagetops</code></em> filter. Its outcome is always of
- MIME type <em class="parameter"><code>application/vnd.cups-postscript</code></em> (not application/postscript), meaning it has
- the print options already embedded into the file. This is shown in <a class="link" href="CUPS-printing.html#f4small" title="Figure 22.4. Prefiltering in CUPS to Form PostScript.">Prefiltering in
- CUPS to Form PostScript</a>.
- </p><div class="figure"><a name="f4small"></a><p class="title"><b>Figure 22.4. Prefiltering in CUPS to Form PostScript.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/4small.png" width="135" alt="Prefiltering in CUPS to Form PostScript."></div></div></div><br class="figure-break"></div><div class="sect2" title="pstops"><div class="titlepage"><div><div><h3 class="title"><a name="id402708"></a>pstops</h3></div></div></div><p>
-<a class="indexterm" name="id402716"></a>
-<a class="indexterm" name="id402722"></a>
-<a class="indexterm" name="id402729"></a>
-<a class="indexterm" name="id402736"></a>
-<a class="indexterm" name="id402743"></a>
-<a class="indexterm" name="id402750"></a>
-<a class="indexterm" name="id402756"></a>
- <span class="emphasis"><em>pstops</em></span> is a filter that is used to convert <em class="parameter"><code>application/postscript</code></em> to
- <em class="parameter"><code>application/vnd.cups-postscript</code></em>. As stated earlier, this filter inserts all
- device-specific print options (commands to the printer to ask for the duplexing of output, or stapling and
- punching it, and so on) into the PostScript file. An example is illustrated in <a class="link" href="CUPS-printing.html#f5small" title="Figure 22.5. Adding Device-Specific Print Options.">Adding Device-Specific Print Options</a>.
- </p><div class="figure"><a name="f5small"></a><p class="title"><b>Figure 22.5. Adding Device-Specific Print Options.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/5small.png" width="135" alt="Adding Device-Specific Print Options."></div></div></div><br class="figure-break"><p>
- This is not all. Other tasks performed by it are:
- </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
- Selecting the range of pages to be printed (e.g., you can choose to
- print only pages <span class="quote">&#8220;<span class="quote">3, 6, 8-11, 16, and 19-21</span>&#8221;</span>, or only odd-numbered
- pages).
- </p></li><li class="listitem"><p>
- Putting two or more logical pages on one sheet of paper (the
- so-called <span class="quote">&#8220;<span class="quote">number-up</span>&#8221;</span> function).
- </p></li><li class="listitem"><p>Counting the pages of the job to insert the accounting
- information into the <code class="filename">/var/log/cups/page_log</code>.
- </p></li></ul></div></div><div class="sect2" title="pstoraster"><div class="titlepage"><div><div><h3 class="title"><a name="id402868"></a>pstoraster</h3></div></div></div><p>
-<a class="indexterm" name="id402876"></a>
-<a class="indexterm" name="id402882"></a>
-<a class="indexterm" name="id402889"></a>
- <em class="parameter"><code>pstoraster</code></em> is at the core of the CUPS filtering system. It is responsible for the first
- stage of the rasterization process. Its input is of MIME type application/vnd.cups-postscript; its output is
- application/vnd.cups-raster. This output format is not yet meant to be printable. Its aim is to serve as a
- general-purpose input format for more specialized <span class="emphasis"><em>raster drivers</em></span> that are able to
- generate device-specific printer data. This is shown in <a class="link" href="CUPS-printing.html#cups-raster" title="Figure 22.6. PostScript to Intermediate Raster Format.">the PostScript to
- Intermediate Raster Format diagram</a>.
- </p><div class="figure"><a name="cups-raster"></a><p class="title"><b>Figure 22.6. PostScript to Intermediate Raster Format.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/6small.png" width="135" alt="PostScript to Intermediate Raster Format."></div></div></div><br class="figure-break"><p>
-<a class="indexterm" name="id402960"></a>
-<a class="indexterm" name="id402967"></a>
-<a class="indexterm" name="id402974"></a>
-<a class="indexterm" name="id402981"></a>
- CUPS raster is a generic raster format with powerful features. It is able to include per-page information,
- color profiles, and more, to be used by the downstream raster drivers. Its MIME type is registered with IANA
- and its specification is, of course, completely open. It is designed to make it quite easy and inexpensive for
- manufacturers to develop Linux and UNIX raster drivers for their printer models should they choose to do so.
- CUPS always takes care of the first stage of rasterization so these vendors do not need to care about
- Ghostscript complications (in fact, there are currently more than one vendor financing the development of CUPS
- raster drivers). This is illustrated in <a class="link" href="CUPS-printing.html#cups-raster2" title="Figure 22.7. CUPS-Raster Production Using Ghostscript.">the CUPS-Raster Production Using
- Ghostscript illustration</a>.
- </p><div class="figure"><a name="cups-raster2"></a><p class="title"><b>Figure 22.7. CUPS-Raster Production Using Ghostscript.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/7small.png" alt="CUPS-Raster Production Using Ghostscript."></div></div></div><br class="figure-break"><p>
-<a class="indexterm" name="id403046"></a>
-<a class="indexterm" name="id403053"></a>
-<a class="indexterm" name="id403059"></a>
-<a class="indexterm" name="id403066"></a>
- CUPS versions before version 1.1.15 shipped a binary (or source code) standalone filter, named
- <em class="parameter"><code>pstoraster</code></em>. <em class="parameter"><code>pstoraster</code></em>, which was derived from GNU Ghostscript
- 5.50 and could be installed instead of and in addition to any GNU or AFPL Ghostscript package without
- conflicting.
- </p><p>
- Since version 1.1.15, this feature has changed. The functions for this filter have been integrated back
- into Ghostscript (now based on GNU Ghostscript version 7.05). The <em class="parameter"><code>pstoraster</code></em> filter is
- now a simple shell script calling <code class="literal">gs</code> with the <code class="literal">-sDEVICE=cups</code> parameter.
- If your Ghostscript fails when this command is executed: <code class="literal">gs -h |grep cups</code>, you might not
- be able to print, update your Ghostscript.
- </p></div><div class="sect2" title="imagetops and imagetoraster"><div class="titlepage"><div><div><h3 class="title"><a name="id403119"></a>imagetops and imagetoraster</h3></div></div></div><p>
-<a class="indexterm" name="id403127"></a>
-<a class="indexterm" name="id403134"></a>
- In the section about prefilters, we mentioned the prefilter
- that generates PostScript from image formats. The <em class="parameter"><code>imagetoraster</code></em>
- filter is used to convert directly from image to raster, without the
- intermediate PostScript stage. It is used more often than the previously
- mentioned prefilters. We summarize in a flowchart the image file
- filtering in <a class="link" href="CUPS-printing.html#small8" title="Figure 22.8. Image Format to CUPS-Raster Format Conversion.">the Image Format to CUPS-Raster Format Conversion illustration</a>.
- </p><div class="figure"><a name="small8"></a><p class="title"><b>Figure 22.8. Image Format to CUPS-Raster Format Conversion.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/8small.png" alt="Image Format to CUPS-Raster Format Conversion."></div></div></div><br class="figure-break"></div><div class="sect2" title="rasterto [printers specific]"><div class="titlepage"><div><div><h3 class="title"><a name="id403199"></a>rasterto [printers specific]</h3></div></div></div><p>
-<a class="indexterm" name="id403207"></a>
-<a class="indexterm" name="id403214"></a>
-<a class="indexterm" name="id403220"></a>
-<a class="indexterm" name="id403227"></a>
-<a class="indexterm" name="id403234"></a>
-<a class="indexterm" name="id403241"></a>
-<a class="indexterm" name="id403248"></a>
-<a class="indexterm" name="id403254"></a>
-<a class="indexterm" name="id403261"></a>
-<a class="indexterm" name="id403268"></a>
-<a class="indexterm" name="id403275"></a>
- CUPS ships with quite a variety of raster drivers for processing CUPS raster. On my system, I find in
- /usr/lib/cups/filter/ the following: <em class="parameter"><code>rastertoalps</code></em>, <em class="parameter"><code>rastertobj</code></em>,
- <em class="parameter"><code>rastertoepson</code></em>, <em class="parameter"><code>rastertoescp</code></em>, <em class="parameter"><code>rastertopcl</code></em>,
- <em class="parameter"><code>rastertoturboprint</code></em>, <em class="parameter"><code>rastertoapdk</code></em>,
- <em class="parameter"><code>rastertodymo</code></em>, <em class="parameter"><code>rastertoescp</code></em>, <em class="parameter"><code>rastertohp</code></em>,
- and <em class="parameter"><code>rastertoprinter</code></em>. Don't worry if you have fewer drivers than this; some of these are
- installed by commercial add-ons to CUPS (like <em class="parameter"><code>rastertoturboprint</code></em>), and others (like
- <em class="parameter"><code>rastertoprinter</code></em>) by third-party driver development projects (such as Gutenprint)
- wanting to cooperate as closely as possible with CUPS. See <a class="link" href="CUPS-printing.html#small9" title="Figure 22.9. Raster to Printer-Specific Formats.">the Raster to
- Printer-Specific Formats illustration</a>.
- </p><div class="figure"><a name="small9"></a><p class="title"><b>Figure 22.9. Raster to Printer-Specific Formats.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/9small.png" alt="Raster to Printer-Specific Formats."></div></div></div><br class="figure-break"></div><div class="sect2" title="CUPS Backends"><div class="titlepage"><div><div><h3 class="title"><a name="id403411"></a>CUPS Backends</h3></div></div></div><p>
-<a class="indexterm" name="id403419"></a>
-<a class="indexterm" name="id403425"></a>
- The last part of any CUPS filtering chain is a backend. Backends
- are special programs that send the print-ready file to the final
- device. There is a separate backend program for any transfer
- protocol for sending print jobs over the network, and one for every local
- interface. Every CUPS print queue needs to have a CUPS <span class="quote">&#8220;<span class="quote">device-URI</span>&#8221;</span>
- associated with it. The device URI is the way to encode the backend
- used to send the job to its destination. Network device-URIs use
- two slashes in their syntax, local device URIs only one, as you can
- see from the following list. Keep in mind that local interface names
- may vary greatly from my examples, if your OS is not Linux:
- </p><div class="variablelist"><dl><dt><span class="term">usb</span></dt><dd><p>
- This backend sends print files to USB-connected printers. An
- example for the CUPS device-URI to use is
- <code class="filename">usb:/dev/usb/lp0</code>.
- </p></dd><dt><span class="term">serial</span></dt><dd><p>
- This backend sends print files to serially connected printers.
- An example for the CUPS device-URI to use is
- <code class="filename">serial:/dev/ttyS0?baud=11500</code>.
- </p></dd><dt><span class="term">parallel</span></dt><dd><p>
- This backend sends print files to printers connected to the
- parallel port. An example for the CUPS device-URI to use is
- <code class="filename">parallel:/dev/lp0</code>.
- </p></dd><dt><span class="term">SCSI</span></dt><dd><p>
- This backend sends print files to printers attached to the
- SCSI interface. An example for the CUPS device-URI to use is
- <code class="filename">scsi:/dev/sr1</code>.
- </p></dd><dt><span class="term">lpd</span></dt><dd><p>
- This backend sends print files to LPR/LPD-connected network
- printers. An example for the CUPS device-URI to use is
- <code class="filename">lpd://remote_host_name/remote_queue_name</code>.
- </p></dd><dt><span class="term">AppSocket/HP JetDirect</span></dt><dd><p>
- This backend sends print files to AppSocket (a.k.a., HP
- JetDirect) connected network printers. An example for the CUPS
- device-URI to use is
- <code class="filename">socket://10.11.12.13:9100</code>.
- </p></dd><dt><span class="term">ipp</span></dt><dd><p>
- This backend sends print files to IPP-connected network
- printers (or to other CUPS servers). Examples for CUPS device-URIs
- to use are
- <code class="filename">ipp:://192.193.194.195/ipp</code>
- (for many HP printers) and
- <code class="filename">ipp://remote_cups_server/printers/remote_printer_name</code>.
- </p></dd><dt><span class="term">http</span></dt><dd><p>
- This backend sends print files to HTTP-connected printers.
- (The http:// CUPS backend is only a symlink to the ipp:// backend.)
- Examples for the CUPS device-URIs to use are
- <code class="filename">http:://192.193.194.195:631/ipp</code>
- (for many HP printers) and
- <code class="filename">http://remote_cups_server:631/printers/remote_printer_name</code>.
- </p></dd><dt><span class="term">smb</span></dt><dd><p>
- This backend sends print files to printers shared by a Windows
- host. Examples of CUPS device-URIs that may be used includes:
- </p><p>
- </p><table border="0" summary="Simple list" class="simplelist"><tr><td><code class="filename">smb://workgroup/server/printersharename</code></td></tr><tr><td><code class="filename">smb://server/printersharename</code></td></tr><tr><td><code class="filename">smb://username:password@workgroup/server/printersharename</code></td></tr><tr><td><code class="filename">smb://username:password@server/printersharename</code></td></tr></table><p>
- </p><p>
- The smb:// backend is a symlink to the Samba utility
- <em class="parameter"><code>smbspool</code></em> (does not ship with CUPS). If the
- symlink is not present in your CUPS backend directory, have your
- root user create it: <code class="literal">ln -s `which smbspool'
- /usr/lib/cups/backend/smb</code>.
- </p></dd></dl></div><p>
- It is easy to write your own backends as shell or Perl scripts if you
- need any modification or extension to the CUPS print system. One
- reason could be that you want to create <span class="quote">&#8220;<span class="quote">special</span>&#8221;</span> printers that send
- the print jobs as email (through a <span class="quote">&#8220;<span class="quote">mailto:/</span>&#8221;</span> backend), convert them to
- PDF (through a <span class="quote">&#8220;<span class="quote">pdfgen:/</span>&#8221;</span> backend) or dump them to <span class="quote">&#8220;<span class="quote">/dev/null</span>&#8221;</span>. (In
- fact, I have the systemwide default printer set up to be connected to
- a devnull:/ backend: there are just too many people sending jobs
- without specifying a printer, and scripts and programs that do not name
- a printer. The systemwide default deletes the job and sends a polite
- email back to the $USER asking him or her to always specify the correct
- printer name.)
- </p><p>
-<a class="indexterm" name="id403677"></a>
-<a class="indexterm" name="id403684"></a>
- Not all of the mentioned backends may be present on your system or
- usable (depending on your hardware configuration). One test for all
- available CUPS backends is provided by the <span class="emphasis"><em>lpinfo</em></span>
- utility. Used with the <code class="option">-v</code> parameter, it lists
- all available backends:
- </p><pre class="screen">
- <code class="prompt">$ </code><strong class="userinput"><code>lpinfo -v</code></strong>
- </pre></div><div class="sect2" title="The Role of cupsomatic/foomatic"><div class="titlepage"><div><div><h3 class="title"><a name="id403719"></a>The Role of <em class="parameter"><code>cupsomatic/foomatic</code></em></h3></div></div></div><p>
- <a class="indexterm" name="id403731"></a>
- <a class="indexterm" name="id403738"></a>
-<a class="indexterm" name="id403745"></a>
-<a class="indexterm" name="id403752"></a>
-<a class="indexterm" name="id403758"></a>
- <em class="parameter"><code>cupsomatic</code></em> filters may be the most widely used on CUPS
- installations. You must be clear that these were not
- developed by the CUPS people. They are a third-party add-on to
- CUPS. They utilize the traditional Ghostscript devices to render jobs
- for CUPS. When troubleshooting, you should know about the
- difference. Here the whole rendering process is done in one stage,
- inside Ghostscript, using an appropriate device for the target
- printer. <em class="parameter"><code>cupsomatic</code></em> uses PPDs that are generated from the Foomatic
- Printer &amp; Driver Database at Linuxprinting.org.
- </p><p>
- You can recognize these PPDs from the line calling the
- <em class="parameter"><code>cupsomatic</code></em> filter:
-</p><pre class="programlisting">
-*cupsFilter: "application/vnd.cups-postscript 0 cupsomatic"
-</pre><p>
- You may find this line among the first 40 or so lines of the PPD
- file. If you have such a PPD installed, the printer shows up in the
- CUPS Web interface with a <em class="parameter"><code>foomatic</code></em> namepart for
- the driver description. <em class="parameter"><code>cupsomatic</code></em> is a Perl script that runs
- Ghostscript with all the complicated command line options
- autoconstructed from the selected PPD and command line options given to
- the print job.
- </p><p>
- <a class="indexterm" name="id403816"></a>
-<a class="indexterm" name="id403822"></a>
-<a class="indexterm" name="id403829"></a>
-<a class="indexterm" name="id403836"></a>
-<a class="indexterm" name="id403843"></a>
-<a class="indexterm" name="id403850"></a>
-<a class="indexterm" name="id403856"></a>
-<a class="indexterm" name="id403863"></a>
-<a class="indexterm" name="id403870"></a>
-<a class="indexterm" name="id403877"></a>
-<a class="indexterm" name="id403884"></a>
- However, <em class="parameter"><code>cupsomatic</code></em> is now deprecated. Its PPDs (especially the first
- generation of them, still in heavy use out there) are not meeting the
- Adobe specifications. You might also suffer difficulties when you try
- to download them with <span class="quote">&#8220;<span class="quote">Point'n'Print</span>&#8221;</span> to Windows clients. A better
- and more powerful successor is now available: it is called <em class="parameter"><code>foomatic-rip</code></em>. To use
- <em class="parameter"><code>foomatic-rip</code></em> as a filter with CUPS, you need the new type of PPDs, which
- have a similar but different line:
-</p><pre class="programlisting">
-*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
-</pre><p>
- The PPD-generating engine at Linuxprinting.org has been revamped.
- The new PPDs comply with the Adobe spec. They also provide a
- new way to specify different quality levels (hi-res photo, normal
- color, grayscale, and draft) with a single click, whereas before you
- could have required five or more different selections (media type,
- resolution, inktype, and dithering algorithm). There is support for
- custom-size media built in. There is support to switch
- print options from page to page in the middle of a job. And the
- best thing is that the new <code class="constant">foomatic-rip</code> works seamlessly with all
- legacy spoolers too (like LPRng, BSD-LPD, PDQ, PPR, and so on), providing
- for them access to use PPDs for their printing.
- </p></div><div class="sect2" title="The Complete Picture"><div class="titlepage"><div><div><h3 class="title"><a name="id403933"></a>The Complete Picture</h3></div></div></div><p>
- If you want to see an overview of all the filters and how they
- relate to each other, the complete picture of the puzzle is at the end
- of this chapter.
- </p></div><div class="sect2" title="mime.convs"><div class="titlepage"><div><div><h3 class="title"><a name="id403945"></a><code class="filename">mime.convs</code></h3></div></div></div><p>
- CUPS autoconstructs all possible filtering chain paths for any given
- MIME type and every printer installed. But how does it decide in
- favor of or against a specific alternative? (There may be cases
- where there is a choice of two or more possible filtering chains for
- the same target printer.) Simple. You may have noticed the figures in
- the third column of the mime.convs file. They represent virtual costs
- assigned to this filter. Every possible filtering chain will sum up to
- a total <span class="quote">&#8220;<span class="quote">filter cost.</span>&#8221;</span> CUPS decides for the most <span class="quote">&#8220;<span class="quote">inexpensive</span>&#8221;</span> route.
- </p><div class="tip" title="Tip" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3><p>
-<a class="indexterm" name="id403972"></a>
-<a class="indexterm" name="id403979"></a>
- Setting <em class="parameter"><code>FilterLimit 1000</code></em> in
- <code class="filename">cupsd.conf</code> will not allow more filters to
- run concurrently than will consume a total of 1000 virtual filter
- cost. This is an efficient way to limit the load of any CUPS
- server by setting an appropriate <span class="quote">&#8220;<span class="quote">FilterLimit</span>&#8221;</span> value. A FilterLimit of
- 200 allows roughly one job at a time, while a FilterLimit of 1000 allows
- approximately five jobs maximum at a time.
- </p></div></div><div class="sect2" title="&#8220;Raw&#8221; Printing"><div class="titlepage"><div><div><h3 class="title"><a name="id404006"></a><span class="quote">&#8220;<span class="quote">Raw</span>&#8221;</span> Printing</h3></div></div></div><p>
-<a class="indexterm" name="id404016"></a>
-<a class="indexterm" name="id404023"></a>
-<a class="indexterm" name="id404029"></a>
- You can tell CUPS to print (nearly) any file <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span>. <span class="quote">&#8220;<span class="quote">Raw</span>&#8221;</span> means it will not be
- filtered. CUPS will send the file to the printer <span class="quote">&#8220;<span class="quote">as is</span>&#8221;</span> without bothering if the printer is able
- to digest it. Users need to take care themselves that they send sensible data formats only. Raw printing can
- happen on any queue if the <span class="quote">&#8220;<span class="quote"><em class="parameter"><code>-o raw</code></em></span>&#8221;</span> option is specified on the command
- line. You can also set up raw-only queues by simply not associating any PPD with it. This command:
-</p><pre class="screen">
-<code class="prompt">$ </code><strong class="userinput"><code>lpadmin -P rawprinter -v socket://11.12.13.14:9100 -E</code></strong>
-</pre><p>
- sets up a queue named <span class="quote">&#8220;<span class="quote">rawprinter</span>&#8221;</span>, connected via the <span class="quote">&#8220;<span class="quote">socket</span>&#8221;</span> protocol (a.k.a.
- <span class="quote">&#8220;<span class="quote">HP JetDirect</span>&#8221;</span>) to the device at IP address 11.12.1.3.14, using port 9100. (If you had added a
- PPD with <code class="literal">-P /path/to/PPD</code> to this command line, you would have installed a
- <span class="quote">&#8220;<span class="quote">normal</span>&#8221;</span> print queue.)
- </p><p>
- CUPS will automatically treat each job sent to a queue as a <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span> one
- if it can't find a PPD associated with the queue. However, CUPS will
- only send known MIME types (as defined in its own mime.types file) and
- refuse others.
- </p></div><div class="sect2" title="application/octet-stream Printing"><div class="titlepage"><div><div><h3 class="title"><a name="id404106"></a>application/octet-stream Printing</h3></div></div></div><p>
-<a class="indexterm" name="id404114"></a>
-<a class="indexterm" name="id404121"></a>
- Any MIME type with no rule in the <code class="filename">/etc/cups/mime.types</code> file is regarded as unknown
- or <em class="parameter"><code>application/octet-stream</code></em> and will not be
- sent. Because CUPS refuses to print unknown MIME types by default,
- you will probably have experienced that print jobs originating
- from Windows clients were not printed. You may have found an error
- message in your CUPS logs like:
- </p><p><code class="computeroutput">
- Unable to convert file 0 to printable format for job
- </code></p><p>
- To enable the printing of <em class="parameter"><code>application/octet-stream</code></em> files, edit
- these two files:
- </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="filename">/etc/cups/mime.convs</code></p></li><li class="listitem"><p><code class="filename">/etc/cups/mime.types</code></p></li></ul></div><p>
-<a class="indexterm" name="id404181"></a>
- Both contain entries (at the end of the respective files) that must be uncommented to allow raw mode
- operation for <em class="parameter"><code>application/octet-stream</code></em>. In <code class="filename">/etc/cups/mime.types</code>
- make sure this line is present:
- <a class="indexterm" name="id404202"></a>
-</p><pre class="programlisting">
-application/octet-stream
-</pre><p>
- This line (with no specific autotyping rule set) makes all files
- not otherwise auto-typed a member of <em class="parameter"><code>application/octet-stream</code></em>. In
- <code class="filename">/etc/cups/mime.convs</code>, have this
- line:
-</p><pre class="programlisting">
-application/octet-stream application/vnd.cups-raw 0 -
-</pre><p>
- <a class="indexterm" name="id404234"></a>
- This line tells CUPS to use the <span class="emphasis"><em>Null Filter</em></span>
- (denoted as <span class="quote">&#8220;<span class="quote">-</span>&#8221;</span>, doing nothing at all) on
- <em class="parameter"><code>application/octet-stream</code></em>, and tag the result as
- <em class="parameter"><code>application/vnd.cups-raw</code></em>. This last one is
- always a green light to the CUPS scheduler to now hand the file over
- to the backend connecting to the printer and sending it over.
- </p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
- Editing the <code class="filename">mime.convs</code> and the <code class="filename">mime.types</code> file does not
- <span class="emphasis"><em>enforce</em></span> <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span> printing, it only <span class="emphasis"><em>allows</em></span> it.
- </p></div><p title="Background"><b>Background. </b>
-<a class="indexterm" name="id404298"></a>
-<a class="indexterm" name="id404305"></a>
-<a class="indexterm" name="id404311"></a>
-<a class="indexterm" name="id404318"></a>
- That CUPS is a more security-aware printing system than traditional ones
- does not by default allow one to send deliberate (possibly binary)
- data to printing devices. (This could be easily abused to launch a
- Denial of Service attack on your printer(s), causing at least the loss
- of a lot of paper and ink.) <span class="quote">&#8220;<span class="quote">Unknown</span>&#8221;</span> data are regarded by CUPS
- as <span class="emphasis"><em>MIME type</em></span> <span class="emphasis"><em>application/octet-stream</em></span>. While you
- <span class="emphasis"><em>can</em></span> send data <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span>, the MIME type for these must
- be one that is known to CUPS and allowed by it. The file
- <code class="filename">/etc/cups/mime.types</code> defines the <span class="quote">&#8220;<span class="quote">rules</span>&#8221;</span> of how CUPS
- recognizes MIME types. The file <code class="filename">/etc/cups/mime.convs</code> decides which file
- conversion filter(s) may be applied to which MIME types.
- </p></div><div class="sect2" title="PostScript Printer Descriptions for Non-PostScript Printers"><div class="titlepage"><div><div><h3 class="title"><a name="id404367"></a>PostScript Printer Descriptions for Non-PostScript Printers</h3></div></div></div><p>
- <a class="indexterm" name="id404375"></a>
-<a class="indexterm" name="id404381"></a>
-<a class="indexterm" name="id404388"></a>
-<a class="indexterm" name="id404395"></a>
-<a class="indexterm" name="id404402"></a>
-<a class="indexterm" name="id404408"></a>
- Originally PPDs were meant to be used for PostScript printers
- only. Here, they help to send device-specific commands and settings
- to the RIP, which processes the job file. CUPS has extended this
- scope for PPDs to cover non-PostScript printers too. This was not
- difficult, because it is a standardized file format. In a way
- it was logical too: CUPS handles PostScript and uses a PostScript
- RIP (Ghostscript) to process the job files. The only difference is that
- a PostScript printer has the RIP built-in, for other types of
- printers the Ghostscript RIP runs on the host computer.
- </p><p>
- PPDs for a non-PostScript printer have a few lines that are unique to
- CUPS. The most important one looks similar to this:
- <a class="indexterm" name="id404425"></a>
-</p><pre class="programlisting">
-*cupsFilter: application/vnd.cups-raster 66 rastertoprinter
-</pre><p>
- It is the last piece in the CUPS filtering puzzle. This line tells the
- CUPS daemon to use as a last filter <em class="parameter"><code>rastertoprinter</code></em>. This filter
- should be served as input an <em class="parameter"><code>application/vnd.cups-raster</code></em> MIME type
- file. Therefore, CUPS should autoconstruct a filtering chain, which
- delivers as its last output the specified MIME type. This is then
- taken as input to the specified <em class="parameter"><code>rastertoprinter</code></em> filter. After
- the last filter has done its work (<em class="parameter"><code>rastertoprinter</code></em> is a Gutenprint
- filter), the file should go to the backend, which sends it to the
- output device.
- </p><p>
- CUPS by default ships only a few generic PPDs, but they are good for
- several hundred printer models. You may not be able to control
- different paper trays, or you may get larger margins than your
- specific model supports. See Table 21.1<a class="link" href="CUPS-printing.html#cups-ppds" title="Table 22.1. PPDs Shipped with CUPS">&#8220;PPDs Shipped with CUPS&#8221;</a> for summary information.
- </p><div class="table"><a name="cups-ppds"></a><p class="title"><b>Table 22.1. PPDs Shipped with CUPS</b></p><div class="table-contents"><table summary="PPDs Shipped with CUPS" border="1"><colgroup><col align="left"><col align="justify"></colgroup><thead><tr><th align="left">PPD file</th><th align="justify">Printer type</th></tr></thead><tbody><tr><td align="left">deskjet.ppd</td><td align="justify">older HP inkjet printers and compatible</td></tr><tr><td align="left">deskjet2.ppd</td><td align="justify">newer HP inkjet printers and compatible </td></tr><tr><td align="left">dymo.ppd</td><td align="justify">label printers </td></tr><tr><td align="left">epson9.ppd</td><td align="justify">Epson 24-pin impact printers and compatible </td></tr><tr><td align="left">epson24.ppd</td><td align="justify">Epson 24-pin impact printers and compatible </td></tr><tr><td align="left">okidata9.ppd</td><td align="justify">Okidata 9-pin impact printers and compatible </td></tr><tr><td align="left">okidat24.ppd</td><td align="justify">Okidata 24-pin impact printers and compatible </td></tr><tr><td align="left">stcolor.ppd</td><td align="justify">older Epson Stylus Color printers </td></tr><tr><td align="left">stcolor2.ppd</td><td align="justify">newer Epson Stylus Color printers </td></tr><tr><td align="left">stphoto.ppd</td><td align="justify">older Epson Stylus Photo printers </td></tr><tr><td align="left">stphoto2.ppd</td><td align="justify">newer Epson Stylus Photo printers </td></tr><tr><td align="left">laserjet.ppd</td><td align="justify">all PCL printers </td></tr></tbody></table></div></div><br class="table-break"></div><div class="sect2" title="cupsomatic/foomatic-rip Versus Native CUPS Printing"><div class="titlepage"><div><div><h3 class="title"><a name="id404631"></a><span class="emphasis"><em>cupsomatic/foomatic-rip</em></span> Versus <span class="emphasis"><em>Native CUPS</em></span> Printing</h3></div></div></div><p>
- <a class="indexterm" name="id404644"></a>
- <a class="indexterm" name="id404651"></a>
- Native CUPS rasterization works in two steps:
- </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
-<a class="indexterm" name="id404665"></a>
- First is the <em class="parameter"><code>pstoraster</code></em> step. It uses the special CUPS
- <a class="indexterm" name="id404678"></a>
- device from ESP Ghostscript 7.05.x as its tool.
- </p></li><li class="listitem"><p>
- Second is the <em class="parameter"><code>rasterdriver</code></em> step. It uses various
- device-specific filters; there are several vendors who provide good
- quality filters for this step. Some are free software, some are
- shareware, and some are proprietary.
- </p></li></ul></div><p>
- Often this produces better quality (and has several more advantages) than other methods.
- This is shown in <a class="link" href="CUPS-printing.html#cupsomatic-dia" title="Figure 22.10. cupsomatic/foomatic Processing Versus Native CUPS."> the cupsomatic/foomatic Processing Versus Native CUPS
- illustration</a>.
- </p><div class="figure"><a name="cupsomatic-dia"></a><p class="title"><b>Figure 22.10. cupsomatic/foomatic Processing Versus Native CUPS.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/10small.png" alt="cupsomatic/foomatic Processing Versus Native CUPS."></div></div></div><br class="figure-break"><p>
- One other method is the <em class="parameter"><code>cupsomatic/foomatic-rip</code></em>
- way. Note that <em class="parameter"><code>cupsomatic</code></em> is <span class="emphasis"><em>not</em></span> made by the CUPS
- developers. It is an independent contribution to printing development,
- made by people from Linuxprinting.org.<sup>[<a name="id404773" href="#ftn.id404773" class="footnote">6</a>]</sup>
- <em class="parameter"><code>cupsomatic</code></em> is no longer developed, maintained, or supported. It now been
- replaced by <em class="parameter"><code>foomatic-rip</code></em>. <em class="parameter"><code>foomatic-rip</code></em> is a complete rewrite
- of the old <em class="parameter"><code>cupsomatic</code></em> idea, but very much improved and generalized to
- other (non-CUPS) spoolers. An upgrade to <em class="parameter"><code>foomatic-rip</code></em> is strongly
- advised, especially if you are upgrading to a recent version of CUPS,
- too.
- </p><p>
- <a class="indexterm" name="id404820"></a>
- <a class="indexterm" name="id404826"></a>
- Like the old <em class="parameter"><code>cupsomatic</code></em> method, the <em class="parameter"><code>foomatic-rip</code></em> (new) method
- from Linuxprinting.org uses the traditional Ghostscript print file processing, doing everything in a single
- step. It therefore relies on all the other devices built into Ghostscript. The quality is as good (or bad) as
- Ghostscript rendering is in other spoolers. The advantage is that this method supports many printer models not
- supported (yet) by the more modern CUPS method.
- </p><p>
- Of course, you can use both methods side by side on one system (and even for one printer, if you set up
- different queues) and find out which works best for you.
- </p><p>
-<a class="indexterm" name="id404856"></a>
-<a class="indexterm" name="id404863"></a>
-<a class="indexterm" name="id404870"></a>
-<a class="indexterm" name="id404877"></a>
-<a class="indexterm" name="id404884"></a>
-<a class="indexterm" name="id404890"></a>
- <em class="parameter"><code>cupsomatic</code></em> kidnaps the print file after the
- <em class="parameter"><code>application/vnd.cups-postscript</code></em> stage and deviates it through the CUPS-external,
- systemwide Ghostscript installation. Therefore, the print file bypasses the <em class="parameter"><code>pstoraster</code></em>
- filter (and also bypasses the CUPS raster drivers <em class="parameter"><code>rastertosomething</code></em>). After Ghostscript
- finished its rasterization, <em class="parameter"><code>cupsomatic</code></em> hands the rendered file directly to the CUPS
- backend. <a class="link" href="CUPS-printing.html#cupsomatic-dia" title="Figure 22.10. cupsomatic/foomatic Processing Versus Native CUPS.">cupsomatic/foomatic Processing Versus Native
- CUPS</a>, illustrates the difference between native CUPS rendering and the
- <em class="parameter"><code>Foomatic/cupsomatic</code></em> method.
- </p></div><div class="sect2" title="Examples for Filtering Chains"><div class="titlepage"><div><div><h3 class="title"><a name="id404945"></a>Examples for Filtering Chains</h3></div></div></div><p>
- Here are a few examples of commonly occurring filtering chains to
- illustrate the workings of CUPS.
- </p><p>
-<a class="indexterm" name="id404957"></a>
-<a class="indexterm" name="id404964"></a>
-<a class="indexterm" name="id404971"></a>
-<a class="indexterm" name="id404978"></a>
- Assume you want to print a PDF file to an HP JetDirect-connected
- PostScript printer, but you want to print pages 3-5, 7, and 11-13
- only, and you want to print them <span class="quote">&#8220;<span class="quote">two-up</span>&#8221;</span> and <span class="quote">&#8220;<span class="quote">duplex</span>&#8221;</span>:
- </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Your print options (page selection as required, two-up,
- duplex) are passed to CUPS on the command line.</p></li><li class="listitem"><p>The (complete) PDF file is sent to CUPS and autotyped as
- <em class="parameter"><code>application/pdf</code></em>.</p></li><li class="listitem"><p>The file therefore must first pass the
- <em class="parameter"><code>pdftops</code></em> prefilter, which produces PostScript
- MIME type <em class="parameter"><code>application/postscript</code></em> (a preview here
- would still show all pages of the original PDF).</p></li><li class="listitem"><p>The file then passes the <em class="parameter"><code>pstops</code></em>
- filter that applies the command line options: it selects pages
- 2-5, 7, and 11-13, creates the imposed layout <span class="quote">&#8220;<span class="quote">two pages on one sheet</span>&#8221;</span>, and
- inserts the correct <span class="quote">&#8220;<span class="quote">duplex</span>&#8221;</span> command (as defined in the printer's
- PPD) into the new PostScript file; the file is now of PostScript MIME
- type
- <em class="parameter"><code>application/vnd.cups-postscript</code></em>.</p></li><li class="listitem"><p>The file goes to the <em class="parameter"><code>socket</code></em>
- backend, which transfers the job to the printers.</p></li></ul></div><p>
- The resulting filter chain, therefore, is as shown in <a class="link" href="CUPS-printing.html#pdftosocket" title="Figure 22.11. PDF to Socket Chain.">the PDF to socket chain
- illustration</a>.
- </p><a class="indexterm" name="id405080"></a><div class="figure"><a name="pdftosocket"></a><p class="title"><b>Figure 22.11. PDF to Socket Chain.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/pdftosocket.png" alt="PDF to Socket Chain."></div></div></div><br class="figure-break"><p>
-<a class="indexterm" name="id405128"></a>
-<a class="indexterm" name="id405135"></a>
-<a class="indexterm" name="id405142"></a>
- Assume you want to print the same filter to an USB-connected Epson Stylus Photo Printer installed with the CUPS
- <code class="filename">stphoto2.ppd</code>. The first few filtering stages are nearly the same:
- </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
- Your print options (page selection as required, two-up,
- duplex) are passed to CUPS on the command line.
- </p></li><li class="listitem"><p>
- The (complete) PDF file is sent to CUPS and autotyped as
- <em class="parameter"><code>application/pdf</code></em>.
- </p></li><li class="listitem"><p>
-<a class="indexterm" name="id405179"></a>
-<a class="indexterm" name="id405185"></a>
- The file must first pass the <em class="parameter"><code>pdftops</code></em> prefilter, which produces PostScript
- MIME type <em class="parameter"><code>application/postscript</code></em> (a preview here would still show all
- pages of the original PDF).
- </p></li><li class="listitem"><p>
-<a class="indexterm" name="id405209"></a>
-<a class="indexterm" name="id405216"></a>
- The file then passes the <span class="quote">&#8220;<span class="quote">pstops</span>&#8221;</span> filter that applies
- the command line options: it selects the pages 2-5, 7, and 11-13,
- creates the imposed layout <span class="quote">&#8220;<span class="quote">two pages on one sheet,</span>&#8221;</span> and inserts the
- correct <span class="quote">&#8220;<span class="quote">duplex</span>&#8221;</span> command (oops this printer and PPD
- do not support duplex printing at all, so this option will
- be ignored) into the new PostScript file; the file is now of PostScript
- MIME type <em class="parameter"><code>application/vnd.cups-postscript</code></em>.
- </p></li><li class="listitem"><p>
- The file then passes the <em class="parameter"><code>pstoraster</code></em> stage and becomes MIME type
- <em class="parameter"><code>application/cups-raster</code></em>.
- </p></li><li class="listitem"><p>
-<a class="indexterm" name="id405267"></a>
- Finally, the <em class="parameter"><code>rastertoepson</code></em> filter
- does its work (as indicated in the printer's PPD), creating the
- printer-specific raster data and embedding any user-selected
- print options into the print data stream.
- </p></li><li class="listitem"><p>
- The file goes to the <em class="parameter"><code>usb</code></em> backend, which transfers the job to the printers.
- </p></li></ul></div><p>
- The resulting filter chain therefore is as shown in <a class="link" href="CUPS-printing.html#pdftoepsonusb" title="Figure 22.12. PDF to USB Chain.">the PDF to USB Chain
- illustration</a>.
- </p><div class="figure"><a name="pdftoepsonusb"></a><p class="title"><b>Figure 22.12. PDF to USB Chain.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/pdftoepsonusb.png" alt="PDF to USB Chain."></div></div></div><br class="figure-break"></div><div class="sect2" title="Sources of CUPS Drivers/PPDs"><div class="titlepage"><div><div><h3 class="title"><a name="id405347"></a>Sources of CUPS Drivers/PPDs</h3></div></div></div><p>
- On the Internet you can now find many thousands of CUPS-PPD files
- (with their companion filters), in many national languages
- supporting more than 1,000 non-PostScript models.
- </p><div class="itemizedlist"><a class="indexterm" name="id405360"></a><a class="indexterm" name="id405369"></a><ul class="itemizedlist" type="disc"><li class="listitem"><p>
- <a class="ulink" href="http://www.easysw.com/printpro/" target="_top">ESP PrintPro</a>
- (commercial, non-free) is packaged with more than 3,000 PPDs, ready for
- successful use <span class="quote">&#8220;<span class="quote">out of the box</span>&#8221;</span> on Linux, Mac OS X, IBM-AIX,
- HP-UX, Sun-Solaris, SGI-IRIX, Compaq Tru64, Digital UNIX, and
- other commercial Unices (it is written by the CUPS developers
- themselves and its sales help finance the further development of
- CUPS, as they feed their creators).
- </p></li><li class="listitem"><p>
- The <a class="ulink" href="http://gimp-print.sourceforge.net/" target="_top">Gutenprint Project</a>
- (GPL, free software) provides around 140 PPDs (supporting nearly 400 printers, many driven
- to photo quality output), to be used alongside the Gutenprint CUPS filters.
- </p></li><li class="listitem"><p>
- <a class="ulink" href="http://www.turboprint.de/english.html/" target="_top">TurboPrint </a> (shareware, non-free) supports
- roughly the same number of printers in excellent quality.
- </p></li><li class="listitem"><p>
- <a class="ulink" href="http://www-124.ibm.com/developerworks/oss/linux/projects/omni/" target="_top">OMNI </a>
- (LPGL, free) is a package made by IBM, now containing support for more
- than 400 printers, stemming from the inheritance of IBM OS/2 know-how
- ported over to Linux (CUPS support is in a beta stage at present).
- </p></li><li class="listitem"><p>
- <a class="ulink" href="http://hpinkjet.sourceforge.net/" target="_top">HPIJS </a> (BSD-style licenses, free)
- supports approximately 150 of HP's own printers and also provides
- excellent print quality now (currently available only via the Foomatic path).
- </p></li><li class="listitem"><p>
- <a class="ulink" href="http://www.linuxprinting.org/" target="_top">Foomatic/cupsomatic </a>
- (LPGL, free) from Linuxprinting.org provide PPDs for practically every Ghostscript
- filter known to the world (including Omni, Gutenprint, and HPIJS).
- </p></li></ul></div></div><div class="sect2" title="Printing with Interface Scripts"><div class="titlepage"><div><div><h3 class="title"><a name="id405456"></a>Printing with Interface Scripts</h3></div></div></div><p>
-<a class="indexterm" name="id405464"></a>
-<a class="indexterm" name="id405470"></a>
- CUPS also supports the use of <span class="quote">&#8220;<span class="quote">interface scripts</span>&#8221;</span> as known from
- System V AT&amp;T printing systems. These are often used for PCL
- printers, from applications that generate PCL print jobs. Interface
- scripts are specific to printer models. They have a role similar to
- PPDs for PostScript printers. Interface scripts may inject the Escape
- sequences as required into the print data stream if the user, for example, selects
- a certain paper tray, or changes paper orientation, or uses A3
- paper. Interface scripts are practically unknown in the Linux
- realm. On HP-UX platforms they are more often used. You can use any
- working interface script on CUPS too. Just install the printer with
- the <code class="literal">-i</code> option:
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>lpadmin -p pclprinter -v socket://11.12.13.14:9100 \
- -i /path/to/interface-script</code></strong>
-</pre><p>
- Interface scripts might be the <span class="quote">&#8220;<span class="quote">unknown animal</span>&#8221;</span> to many. However,
- with CUPS they provide the easiest way to plug in your own custom-written filtering
- script or program into one specific print queue (some information about the traditional
- use of interface scripts is found at
- <a class="ulink" href="http://playground.sun.com/printing/documentation/interface.html" target="_top">
- http://playground.sun.com/printing/documentation/interface.html</a>).
- </p></div></div><div class="sect1" title="Network Printing (Purely Windows)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id405534"></a>Network Printing (Purely Windows)</h2></div></div></div><p>
-Network printing covers a lot of ground. To understand what exactly
-goes on with Samba when it is printing on behalf of its Windows
-clients, let's first look at a <span class="quote">&#8220;<span class="quote">purely Windows</span>&#8221;</span> setup: Windows clients
-with a Windows NT print server.
-</p><div class="sect2" title="From Windows Clients to an NT Print Server"><div class="titlepage"><div><div><h3 class="title"><a name="id405549"></a>From Windows Clients to an NT Print Server</h3></div></div></div><p>
-Windows clients printing to an NT-based print server have two
-options. They may:
-<a class="indexterm" name="id405558"></a>
-<a class="indexterm" name="id405564"></a>
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Execute the driver locally and render the GDI output
- (EMF) into the printer-specific format on their own.
- </p></li><li class="listitem"><p>Send the GDI output (EMF) to the server, where the
- driver is executed to render the printer-specific output.
- </p></li></ul></div><p>
-Both print paths are shown in the flowcharts in <a class="link" href="CUPS-printing.html#small11" title="Figure 22.13. Print Driver Execution on the Client.">
-Print Driver Execution on the Client</a>, and
-<a class="link" href="CUPS-printing.html#small12" title="Figure 22.14. Print Driver Execution on the Server.">Print Driver Execution on the Server</a>.
-</p></div><div class="sect2" title="Driver Execution on the Client"><div class="titlepage"><div><div><h3 class="title"><a name="id405607"></a>Driver Execution on the Client</h3></div></div></div><p>
-In the first case, the print server must spool the file as raw, meaning it shouldn't touch the job file and try
-to convert it in any way. This is what a traditional UNIX-based print server can do too, and at a better
-performance and more reliably than an NT print server. This is what most Samba administrators probably are
-familiar with. One advantage of this setup is that this <span class="quote">&#8220;<span class="quote">spooling-only</span>&#8221;</span> print server may be used
-even if no driver(s) for UNIX is available. It is sufficient to have the Windows client drivers available and
-installed on the clients. This is illustrated in <a class="link" href="CUPS-printing.html#small11" title="Figure 22.13. Print Driver Execution on the Client.">the Print Driver Execution on the
-Client diagram</a>.
-</p><div class="figure"><a name="small11"></a><p class="title"><b>Figure 22.13. Print Driver Execution on the Client.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/11small.png" alt="Print Driver Execution on the Client."></div></div></div><br class="figure-break"></div><div class="sect2" title="Driver Execution on the Server"><div class="titlepage"><div><div><h3 class="title"><a name="id405672"></a>Driver Execution on the Server</h3></div></div></div><p>
-<a class="indexterm" name="id405680"></a>
-<a class="indexterm" name="id405687"></a>
-<a class="indexterm" name="id405693"></a>
-<a class="indexterm" name="id405700"></a>
-<a class="indexterm" name="id405706"></a>
-The other path executes the printer driver on the server. The client transfers print files in EMF format to
-the server. The server uses the PostScript, PCL, ESC/P, or other driver to convert the EMF file into the
-printer-specific language. It is not possible for UNIX to do the same. Currently, there is no program or
-method to convert a Windows client's GDI output on a UNIX server into something a printer could understand.
-This is illustrated in <a class="link" href="CUPS-printing.html#small12" title="Figure 22.14. Print Driver Execution on the Server.">the Print Driver Execution on the Server diagram</a>.
-</p><div class="figure"><a name="small12"></a><p class="title"><b>Figure 22.14. Print Driver Execution on the Server.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/12small.png" alt="Print Driver Execution on the Server."></div></div></div><br class="figure-break"><p>
-However, something similar is possible with CUPS, so read on.
-</p></div></div><div class="sect1" title="Network Printing (Windows Clients and UNIX/Samba Print Servers)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id405771"></a>Network Printing (Windows Clients and UNIX/Samba Print
-Servers)</h2></div></div></div><p>
-Since UNIX print servers <span class="emphasis"><em>cannot</em></span> execute the Win32
-program code on their platform, the picture is somewhat
-different. However, this does not limit your options all that
-much. On the contrary, you may have a way here to implement printing
-features that are not possible otherwise.
-</p><div class="sect2" title="From Windows Clients to a CUPS/Samba Print Server"><div class="titlepage"><div><div><h3 class="title"><a name="id405787"></a>From Windows Clients to a CUPS/Samba Print Server</h3></div></div></div><p>
-Here is a simple recipe showing how you can take advantage of CUPS's
-powerful features for the benefit of your Windows network printing
-clients:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Let the Windows clients send PostScript to the CUPS
- server.</p></li><li class="listitem"><p>Let the CUPS server render the PostScript into device-specific raster format.</p></li></ul></div><p>
-This requires the clients to use a PostScript driver (even if the
-printer is a non-PostScript model. It also requires that you have a
-driver on the CUPS server.
-</p><p>
-First, to enable CUPS-based printing through Samba, the following options should be set in your <code class="filename">smb.conf</code>
-file <em class="parameter"><code>[global]</code></em> section:
-</p><table border="0" summary="Simple list" class="simplelist"><tr><td><a class="indexterm" name="id405836"></a><em class="parameter"><code>printing = cups</code></em></td></tr><tr><td><a class="indexterm" name="id405848"></a><em class="parameter"><code>printcap = cups</code></em></td></tr></table><p>
-When these parameters are specified, all manually set print directives (like <a class="link" href="smb.conf.5.html#PRINTCOMMAND" target="_top">print command</a> or <a class="link" href="smb.conf.5.html#LPPAUSECOMMAND" target="_top">lppause command</a>) in <code class="filename">smb.conf</code> (as well as in Samba itself) will be
-ignored. Instead, Samba will directly interface with CUPS through its application program interface (API), as
-long as Samba has been compiled with CUPS library (libcups) support. If Samba has not been compiled with CUPS
-support, and if no other print commands are set up, then printing will use the <span class="emphasis"><em>System V</em></span>
-AT&amp;T command set, with the -oraw option automatically passing through (if you want your own defined print
-commands to work with a Samba server that has CUPS support compiled in, simply use <a class="link" href="smb.conf.5.html#CLASSICALPRINTING" target="_top">classicalprinting = sysv</a>). This is illustrated in <a class="link" href="CUPS-printing.html#f13small" title="Figure 22.15. Printing via CUPS/Samba Server.">the Printing via
-CUPS/Samba Server diagram</a>.
-</p><div class="figure"><a name="f13small"></a><p class="title"><b>Figure 22.15. Printing via CUPS/Samba Server.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/13small.png" alt="Printing via CUPS/Samba Server."></div></div></div><br class="figure-break"></div><div class="sect2" title="Samba Receiving Job-Files and Passing Them to CUPS"><div class="titlepage"><div><div><h3 class="title"><a name="id405962"></a>Samba Receiving Job-Files and Passing Them to CUPS</h3></div></div></div><p>
-Samba <span class="emphasis"><em>must</em></span> use its own spool directory (it is set by a line similar to <a class="link" href="smb.conf.5.html#PATH" target="_top">path = /var/spool/samba</a>, in the <em class="parameter"><code>[printers]</code></em> or <em class="parameter"><code>[printername]</code></em> section of <code class="filename">smb.conf</code>). Samba receives the job in its own spool space and passes it
-into the spool directory of CUPS (the CUPS spool directory is set by the <em class="parameter"><code>RequestRoot</code></em>
-directive in a line that defaults to <em class="parameter"><code>RequestRoot /var/spool/cups</code></em>). CUPS checks the
-access rights of its spool directory and resets it to healthy values with every restart. We have seen quite a
-few people who used a common spooling space for Samba and CUPS, and struggled for weeks with this
-<span class="quote">&#8220;<span class="quote">problem.</span>&#8221;</span>
-</p><p>
-A Windows user authenticates only to Samba (by whatever means is
-configured). If Samba runs on the same host as CUPS, you only need to
-allow <span class="quote">&#8220;<span class="quote">localhost</span>&#8221;</span> to print. If it runs on different machines, you
-need to make sure the Samba host gets access to printing on CUPS.
-</p></div></div><div class="sect1" title="Network PostScript RIP"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id406034"></a>Network PostScript RIP</h2></div></div></div><p>
-This section discusses the use of CUPS filters on the server configuration where
-clients make use of a PostScript driver with CUPS-PPDs.
-</p><p>
-<a class="indexterm" name="id406048"></a>
-<a class="indexterm" name="id406054"></a>
-<a class="indexterm" name="id406061"></a>
-PPDs can control all print device options. They are usually provided by the manufacturer if you own
-a PostScript printer, that is. PPD files are always a component of PostScript printer drivers on MS Windows or
-Apple Mac OS systems. They are ASCII files containing user-selectable print options, mapped to appropriate
-PostScript, PCL, or PJL commands for the target printer. Printer driver GUI dialogs translate these options
-<span class="quote">&#8220;<span class="quote">on the fly</span>&#8221;</span> into buttons and drop-down lists for the user to select.
-</p><p>
-CUPS can load, without any conversions, the PPD file from any Windows (NT is recommended) PostScript driver
-and handle the options. There is a Web browser interface to the print options (select <a class="ulink" href="http://localhost:631/printers/" target="_top">http://localhost:631/printers/</a> and click on one
-<span class="guibutton">Configure Printer</span> button to see it) or a command line interface (see <code class="literal">man
-lpoptions</code> or see if you have <code class="literal">lphelp</code> on your system). There are also some
-different GUI front-ends on Linux/UNIX, which can present PPD options to users. PPD options are normally meant
-to be evaluated by the PostScript RIP on the real PostScript printer.
-</p><div class="sect2" title="PPDs for Non-PS Printers on UNIX"><div class="titlepage"><div><div><h3 class="title"><a name="id406112"></a>PPDs for Non-PS Printers on UNIX</h3></div></div></div><p>
-<a class="indexterm" name="id406120"></a>
-CUPS does not limit itself to <span class="quote">&#8220;<span class="quote">real</span>&#8221;</span> PostScript printers in its use of PPDs. The CUPS developers
-have extended the scope of the PPD concept to also describe available device and driver options for
-non-PostScript printers through CUPS-PPDs.
-</p><p>
-This is logical, because CUPS includes a fully featured PostScript interpreter (RIP). This RIP is based on
-Ghostscript. It can process all received PostScript (and additionally many other file formats) from clients.
-All CUPS-PPDs geared to non-PostScript printers contain an additional line, starting with the keyword
-<em class="parameter"><code>*cupsFilter</code></em>. This line tells the CUPS print system which printer-specific filter to use
-for the interpretation of the supplied PostScript. Thus CUPS lets all its printers appear as PostScript
-devices to its clients, because it can act as a PostScript RIP for those printers, processing the received
-PostScript code into a proper raster print format.
-</p></div><div class="sect2" title="PPDs for Non-PS Printers on Windows"><div class="titlepage"><div><div><h3 class="title"><a name="id406149"></a>PPDs for Non-PS Printers on Windows</h3></div></div></div><p>
-<a class="indexterm" name="id406157"></a>
-CUPS-PPDs can also be used on Windows clients, on top of a <span class="quote">&#8220;<span class="quote">core</span>&#8221;</span> PostScript driver (now
-recommended is the CUPS PostScript Driver for Windows NT/200x/XP; you can also use the Adobe one, with
-limitations). This feature enables CUPS to do a few tricks no other spooler can do:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
- Act as a networked PostScript RIP handling print files from all client platforms in a uniform way.
- </p></li><li class="listitem"><p>
- Act as a central accounting and billing server, since all files are passed through the pstops filter and are therefore
- logged in the CUPS <code class="filename">page_log</code> file. <span class="emphasis"><em>Note:</em></span> this cannot happen with
- <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span> print jobs, which always remain unfiltered per definition.
- </p></li><li class="listitem"><p>
- Enable clients to consolidate on a single PostScript driver, even for many different target printers.
- </p></li></ul></div><p>
-Using CUPS PPDs on Windows clients enables them to control all print job settings just as a UNIX client can do.
-</p></div></div><div class="sect1" title="Windows Terminal Servers (WTS) as CUPS Clients"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id406210"></a>Windows Terminal Servers (WTS) as CUPS Clients</h2></div></div></div><p>
-This setup may be of special interest to people experiencing major problems in WTS environments. WTS often
-need a multitude of non-PostScript drivers installed to run their clients' variety of different printer
-models. This often imposes the price of much increased instability.
-</p><div class="sect2" title="Printer Drivers Running in &#8220;Kernel Mode&#8221; Cause Many Problems"><div class="titlepage"><div><div><h3 class="title"><a name="id406222"></a>Printer Drivers Running in <span class="quote">&#8220;<span class="quote">Kernel Mode</span>&#8221;</span> Cause Many
-Problems</h3></div></div></div><p>
-Windows NT printer drivers, which run in <span class="quote">&#8220;<span class="quote">kernel mode</span>&#8221;</span>, introduce a high risk for the stability
-of the system if the driver is not really stable and well-tested. And there are a lot of bad drivers out
-there! Especially notorious is the example of the PCL printer driver that had an additional sound module
-running to notify users via soundcard of their finished jobs. Do I need to say that this one was also reliably
-causing <span class="quote">&#8220;<span class="quote">blue screens of death</span>&#8221;</span> on a regular basis?
-</p><p>
-PostScript drivers are generally well-tested. They are not known to cause any problems, even though they also
-run in kernel mode. This might be because until now there have been only two different PostScript drivers: the
-one from Adobe and the one from Microsoft. Both are well-tested and are as stable as you can imagine on
-Windows. The CUPS driver is derived from the Microsoft one.
-</p></div><div class="sect2" title="Workarounds Impose Heavy Limitations"><div class="titlepage"><div><div><h3 class="title"><a name="id406253"></a>Workarounds Impose Heavy Limitations</h3></div></div></div><p>
-In an attempt to work around problems, site administrators have resorted to restricting the
-allowed drivers installed on their WTS to one generic PCL and one PostScript driver. This, however, restricts
-the number of printer options available for clients to use. Often they can't get out more than simplex
-prints from one standard paper tray, while their devices could do much better if driven by a different driver!
-</p></div><div class="sect2" title="CUPS: A &#8220;Magical Stone&#8221;?"><div class="titlepage"><div><div><h3 class="title"><a name="id406267"></a>CUPS: A <span class="quote">&#8220;<span class="quote">Magical Stone</span>&#8221;</span>?</h3></div></div></div><p>
-<a class="indexterm" name="id406278"></a>
-<a class="indexterm" name="id406284"></a>
-Using a PostScript driver, enabled with a CUPS-PPD, seems to be a very elegant way to overcome all these
-shortcomings. There are, depending on the version of Windows OS you use, up to three different PostScript
-drivers now available: Adobe, Microsoft, and CUPS PostScript drivers. None of them is known to cause major
-stability problems on WTS (even if used with many different PPDs). The clients will be able to (again) choose
-paper trays, duplex printing, and other settings. However, there is a certain price for this too: a CUPS
-server acting as a PostScript RIP for its clients requires more CPU and RAM than when just acting as a
-<span class="quote">&#8220;<span class="quote">raw spooling</span>&#8221;</span> device. Plus, this setup is not yet widely tested, although the first feedbacks
-look very promising.
-</p></div><div class="sect2" title="PostScript Drivers with No Major Problems, Even in Kernel Mode"><div class="titlepage"><div><div><h3 class="title"><a name="id406303"></a>PostScript Drivers with No Major Problems, Even in Kernel
-Mode</h3></div></div></div><p>
-<a class="indexterm" name="id406311"></a>
-<a class="indexterm" name="id406318"></a>
-<a class="indexterm" name="id406325"></a>
-<a class="indexterm" name="id406332"></a>
-<a class="indexterm" name="id406339"></a>
-<a class="indexterm" name="id406346"></a>
-More recent printer drivers on W200x and XP no longer run in kernel mode (unlike Windows NT). However, both
-operating systems can still use the NT drivers, running in kernel mode (you can roughly tell which is which as
-the drivers in subdirectory <span class="quote">&#8220;<span class="quote">2</span>&#8221;</span> of <span class="quote">&#8220;<span class="quote">W32X86</span>&#8221;</span> are <span class="quote">&#8220;<span class="quote">old</span>&#8221;</span> ones). As was
-said before, the Adobe as well as the Microsoft PostScript drivers are not known to cause any stability
-problems. The CUPS driver is derived from the Microsoft one. There is a simple reason for this: the MS DDK
-(Device Development Kit) for Windows NT (which used to be available at no cost to licensees of Visual Studio)
-includes the source code of the Microsoft driver, and licensees of Visual Studio are allowed to use and modify
-it for their own driver development efforts. This is what the CUPS people have done. The license does not
-allow them to publish the whole of the source code. However, they have released the <span class="quote">&#8220;<span class="quote">diff</span>&#8221;</span> under
-the GPL, and if you are the owner of an <span class="quote">&#8220;<span class="quote">MS DDK for Windows NT,</span>&#8221;</span> you can check the driver
-yourself.
-</p></div></div><div class="sect1" title="Configuring CUPS for Driver Download"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id406382"></a>Configuring CUPS for Driver Download</h2></div></div></div><p>
-As we have said before, all previously known methods to prepare client printer drivers on the Samba server for
-download and Point'n'Print convenience of Windows workstations are working with CUPS, too. These methods were
-described in <a class="link" href="classicalprinting.html" title="Chapter 21. Classical Printing Support">Classical Printing</a>. In reality, this is a pure Samba
-business and relates only to the Samba-Windows client relationship.
-</p><div class="sect2" title="cupsaddsmb: The Unknown Utility"><div class="titlepage"><div><div><h3 class="title"><a name="id406400"></a><span class="emphasis"><em>cupsaddsmb</em></span>: The Unknown Utility</h3></div></div></div><p>
-<a class="indexterm" name="id406410"></a>
-The <em class="parameter"><code>cupsaddsmb</code></em> utility (shipped with all current CUPS versions) is an alternative
-method to transfer printer drivers into the Samba <em class="parameter"><code>[print$]</code></em> share. Remember, this
-share is where clients expect drivers deposited and set up for download and installation. It makes the sharing
-of any (or all) installed CUPS printers quite easy. <code class="literal">cupsaddsmb</code> can use the Adobe PostScript
-driver as well as the newly developed CUPS PostScript driver for Windows NT/200x/XP.
-<em class="parameter"><code>cupsaddsmb</code></em> does <span class="emphasis"><em>not</em></span> work with arbitrary vendor printer drivers,
-but only with the <span class="emphasis"><em>exact</em></span> driver files that are named in its man page.
-</p><p>
-The CUPS printer driver is available from the CUPS download site. Its package name is
-<code class="filename">cups-samba-[version].tar.gz</code>. It is preferred over the Adobe drivers because it has a
-number of advantages:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>It supports a much more accurate page accounting.</p></li><li class="listitem"><p>It supports banner pages and page labels on all printers.</p></li><li class="listitem"><p>It supports the setting of a number of job IPP attributes
- (such as job priority, page label, and job billing).</p></li></ul></div><p>
-However, currently only Windows NT, 2000, and XP are supported by the
-CUPS drivers. You will also need to get the respective part of the Adobe driver
-if you need to support Windows 95, 98, and Me clients.
-</p></div><div class="sect2" title="Prepare Your smb.conf for cupsaddsmb"><div class="titlepage"><div><div><h3 class="title"><a name="id406488"></a>Prepare Your <code class="filename">smb.conf</code> for <code class="literal">cupsaddsmb</code></h3></div></div></div><p>
-Prior to running <code class="literal">cupsaddsmb</code>, you need the settings in
-<code class="filename">smb.conf</code> as shown in <a class="link" href="CUPS-printing.html#cupsadd-ex" title="Example 22.3. smb.conf for cupsaddsmb Usage">the <code class="filename">smb.conf</code> for cupsaddsmb Usage</a>.
-</p><div class="example"><a name="cupsadd-ex"></a><p class="title"><b>Example 22.3. smb.conf for cupsaddsmb Usage</b></p><div class="example-contents"><table border="0" summary="Simple list" class="simplelist"><tr><td> </td></tr><tr><td><em class="parameter"><code>[global]</code></em></td></tr><tr><td><a class="indexterm" name="id406557"></a><em class="parameter"><code>load printers = yes</code></em></td></tr><tr><td><a class="indexterm" name="id406569"></a><em class="parameter"><code>printing = cups</code></em></td></tr><tr><td><a class="indexterm" name="id406580"></a><em class="parameter"><code>printcap name = cups</code></em></td></tr><tr><td> </td></tr><tr><td><em class="parameter"><code>[printers]</code></em></td></tr><tr><td><a class="indexterm" name="id406600"></a><em class="parameter"><code>comment = All Printers</code></em></td></tr><tr><td><a class="indexterm" name="id406612"></a><em class="parameter"><code>path = /var/spool/samba</code></em></td></tr><tr><td><a class="indexterm" name="id406623"></a><em class="parameter"><code>browseable = no</code></em></td></tr><tr><td># setting depends on your requirements</td></tr><tr><td><a class="indexterm" name="id406638"></a><em class="parameter"><code>guest ok = yes</code></em></td></tr><tr><td><a class="indexterm" name="id406650"></a><em class="parameter"><code>writable = no</code></em></td></tr><tr><td><a class="indexterm" name="id406661"></a><em class="parameter"><code>printable = yes</code></em></td></tr><tr><td><a class="indexterm" name="id406673"></a><em class="parameter"><code>printer admin = root</code></em></td></tr><tr><td> </td></tr><tr><td><em class="parameter"><code>[print$]</code></em></td></tr><tr><td><a class="indexterm" name="id406694"></a><em class="parameter"><code>comment = Printer Drivers</code></em></td></tr><tr><td><a class="indexterm" name="id406705"></a><em class="parameter"><code>path = /etc/samba/drivers</code></em></td></tr><tr><td><a class="indexterm" name="id406717"></a><em class="parameter"><code>browseable = yes</code></em></td></tr><tr><td><a class="indexterm" name="id406728"></a><em class="parameter"><code>guest ok = no</code></em></td></tr><tr><td><a class="indexterm" name="id406740"></a><em class="parameter"><code>read only = yes</code></em></td></tr><tr><td><a class="indexterm" name="id406751"></a><em class="parameter"><code>write list = root, @smbprintadm</code></em></td></tr></table></div></div><br class="example-break"></div><div class="sect2" title="CUPS &#8220;PostScript Driver for Windows NT/200x/XP&#8221;"><div class="titlepage"><div><div><h3 class="title"><a name="id406765"></a>CUPS <span class="quote">&#8220;<span class="quote">PostScript Driver for Windows NT/200x/XP</span>&#8221;</span></h3></div></div></div><p>
-<a class="indexterm" name="id406775"></a>
-CUPS users may get the exact same package from <a class="ulink" href="http://www.cups.org/software.html" target="_top">http://www.cups.org/software.html</a>. It is a separate package
-from the CUPS-based software files, tagged as CUPS 1.1.x Windows NT/200x/XP Printer Driver for Samba (tar.gz,
-192k). The filename to download is <code class="filename">cups-samba-1.1.x.tar.gz</code>. Upon untar and unzipping, it
-will reveal these files:
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>tar xvzf cups-samba-1.1.19.tar.gz</code></strong>
-cups-samba.install
-cups-samba.license
-cups-samba.readme
-cups-samba.remove
-cups-samba.ss
-</pre><p>
-<a class="indexterm" name="id406818"></a>
-<a class="indexterm" name="id406827"></a>
-These have been packaged with the ESP meta-packager software EPM. The <code class="filename">*.install</code> and
-<code class="filename">*.remove</code> files are simple shell scripts, which untar the <code class="filename">*.ss</code> (the
-<code class="filename">*.ss</code> is nothing else but a tar archive, which can be untarred by <span class="quote">&#8220;<span class="quote">tar</span>&#8221;</span> too).
-Then it puts the content into <code class="filename">/usr/share/cups/drivers/</code>. This content includes three
-files:
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>tar tv cups-samba.ss</code></strong>
-cupsdrvr.dll
-cupsui.dll
-cups.hlp
-</pre><p>
-The <em class="parameter"><code>cups-samba.install</code></em> shell scripts are easy to
-handle:
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>./cups-samba.install</code></strong>
-[....]
-Installing software...
-Updating file permissions...
-Running post-install commands...
-Installation is complete.
-</pre><p>
-The script should automatically put the driver files into the
-<code class="filename">/usr/share/cups/drivers/</code> directory:
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>cp /usr/share/drivers/cups.hlp /usr/share/cups/drivers/</code></strong>
-</pre><div class="warning" title="Warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p>
-Due to a bug, one recent CUPS release puts the <code class="filename">cups.hlp</code> driver file
-into<code class="filename">/usr/share/drivers/</code> instead of <code class="filename">/usr/share/cups/drivers/</code>. To work
-around this, copy/move the file (after running the <code class="literal">./cups-samba.install</code> script) manually to
-the correct place.
-</p></div><p>
-<a class="indexterm" name="id406970"></a>
-This new CUPS PostScript driver is currently binary only, but free of charge. No complete source code is
-provided (yet). The reason is that it has been developed with the help of the Microsoft DDK and compiled with
-Microsoft Visual Studio 6. Driver developers are not allowed to distribute the whole of the source code as
-free software. However, CUPS developers released the <span class="quote">&#8220;<span class="quote">diff</span>&#8221;</span> in source code under the GPL, so
-anybody with a license for Visual Studio and a DDK will be able to compile for himself or herself.
-</p></div><div class="sect2" title="Recognizing Different Driver Files"><div class="titlepage"><div><div><h3 class="title"><a name="id406987"></a>Recognizing Different Driver Files</h3></div></div></div><p>
-The CUPS drivers do not support the older Windows 95/98/Me, but only the Windows NT/2000/XP client.
-</p><p>Windows NT, 2000, and XP are supported by:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>cups.hlp</p></li><li class="listitem"><p>cupsdrvr.dll</p></li><li class="listitem"><p>cupsui.dll</p></li></ul></div><p>
-Adobe drivers are available for the older Windows 95/98/Me as well as
-for Windows NT/2000/XP clients. The set of files is different from the
-different platforms.
-</p><p>Windows 95, 98, and ME are supported by:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>ADFONTS.MFM</p></li><li class="listitem"><p>ADOBEPS4.DRV</p></li><li class="listitem"><p>ADOBEPS4.HLP</p></li><li class="listitem"><p>DEFPRTR2.PPD</p></li><li class="listitem"><p>ICONLIB.DLL</p></li><li class="listitem"><p>PSMON.DLL</p></li></ul></div><p>Windows NT, 2000, and XP are supported by:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>ADOBEPS5.DLL</p></li><li class="listitem"><p>ADOBEPSU.DLL</p></li><li class="listitem"><p>ADOBEPSU.HLP</p></li></ul></div><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
-<a class="indexterm" name="id407080"></a>
-If both the Adobe driver files and the CUPS driver files for the support of Windows NT/200x/XP are presently
-installed on the server, the Adobe files will be ignored and the CUPS files will be used. If you prefer
- for whatever reason to use Adobe-only drivers, move away the three CUPS driver files.
-The Windows 9x/Me clients use the Adobe drivers in any case.
-</p></div></div><div class="sect2" title="Acquiring the Adobe Driver Files"><div class="titlepage"><div><div><h3 class="title"><a name="id407098"></a>Acquiring the Adobe Driver Files</h3></div></div></div><p>
-Acquiring the Adobe driver files seems to be unexpectedly difficult for many users. They are not available on
-the Adobe Web site as single files, and the self-extracting and/or self-installing Windows-.exe is not easy to
-locate either. You probably need to use the included native installer and run the installation process on one
-client once. This will install the drivers (and one generic PostScript printer) locally on the client. When
-they are installed, share the generic PostScript printer. After this, the client's <em class="parameter"><code>[print$]</code></em> share holds the Adobe files, which you can get with smbclient from the CUPS host.
-</p></div><div class="sect2" title="ESP Print Pro PostScript Driver for Windows NT/200x/XP"><div class="titlepage"><div><div><h3 class="title"><a name="id407118"></a>ESP Print Pro PostScript Driver for Windows NT/200x/XP</h3></div></div></div><p>
-<a class="indexterm" name="id407126"></a>
-Users of the ESP Print Pro software are able to install the ESP print drivers package as an alternative to the
-Adobe PostScript drivers. To do so, retrieve the driver files from the normal download area of the ESP Print
-Pro software at <a class="ulink" href="http://www.easysw.com/software.html" target="_top">Easy Software</a> web site.
-You need to locate the link labeled <span class="quote">&#8220;<span class="quote">SAMBA</span>&#8221;</span> among the <span class="guilabel">Download Printer Drivers for ESP
-Print Pro 4.x</span> area and download the package. Once installed, you can prepare any driver by simply
-highlighting the printer in the Printer Manager GUI and selecting <span class="guilabel">Export Driver...</span> from
-the menu. Of course, you need to have prepared Samba beforehand to handle the driver files; that is, set up
-the <em class="parameter"><code>[print$]</code></em> share, and so on. The ESP Print Pro package includes the CUPS driver
-files as well as a (licensed) set of Adobe drivers for the Windows 95/98/Me client family.
-</p></div><div class="sect2" title="Caveats to Be Considered"><div class="titlepage"><div><div><h3 class="title"><a name="id407173"></a>Caveats to Be Considered</h3></div></div></div><p>
-<a class="indexterm" name="id407181"></a>
-<a class="indexterm" name="id407187"></a>
-<a class="indexterm" name="id407194"></a>
-<a class="indexterm" name="id407201"></a>
-Once you have run the install script (and possibly manually moved the <code class="filename">cups.hlp</code> file to
-<code class="filename">/usr/share/cups/drivers/</code>), the driver is ready to be put into Samba's <em class="parameter"><code>[print$]</code></em> share (which often maps to <code class="filename">/etc/samba/drivers/</code> and contains a
-subdirectory tree with <span class="emphasis"><em>WIN40</em></span> and <span class="emphasis"><em>W32X86</em></span> branches). You do this by
-running <code class="literal">cupsaddsmb</code> (see also <code class="literal">man cupsaddsmb</code> for CUPS since release
-1.1.16).
-</p><div class="tip" title="Tip" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3><p>
-<a class="indexterm" name="id407257"></a>
-<a class="indexterm" name="id407264"></a>
-You may need to put root into the smbpasswd file by running <code class="literal">smbpasswd</code>; this is especially
-important if you should run this whole procedure for the first time and are not working in an environment
-where everything is configured for <span class="emphasis"><em>single sign-on</em></span> to a Windows Domain Controller.
-</p></div><p>
-Once the driver files are in the <em class="parameter"><code>[print$]</code></em> share and are initialized, they are ready
-to be downloaded and installed by the Windows NT/200x/XP clients.
-</p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
-Win 9x/Me clients will not work with the CUPS PostScript driver. For these you still need to use the
-<code class="filename">ADOBE*.*</code> drivers, as previously stated.
-</p></div><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
-It is not harmful if you still have the <code class="filename">ADOBE*.*</code> driver files from previous installations
-in the <code class="filename">/usr/share/cups/drivers/</code> directory. The new <code class="literal">cupsaddsmb</code> (from
-1.1.16) will automatically prefer its own drivers if it finds both.
-</p></div><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
-<a class="indexterm" name="id407333"></a>
-<a class="indexterm" name="id407340"></a>
-Should your Windows clients have had the old <code class="filename">ADOBE*.*</code> files for the Adobe PostScript
-driver installed, the download and installation of the new CUPS PostScript driver for Windows NT/200x/XP will
-fail at first. You need to wipe the old driver from the clients first. It is not enough to
-<span class="quote">&#8220;<span class="quote">delete</span>&#8221;</span> the printer, because the driver files will still be kept by the clients and re-used if
-you try to re-install the printer. To really get rid of the Adobe driver files on the clients, open the
-<span class="guilabel">Printers</span> folder (possibly via <span class="guilabel">Start -&gt; Settings -&gt; Control Panel -&gt;
-Printers</span>), right-click on the folder background, and select <span class="guimenuitem">Server
-Properties</span>. When the new dialog opens, select the <span class="guilabel">Drivers</span> tab. On the list
-select the driver you want to delete and click the <span class="guilabel">Delete</span> button. This will only work if
-there is not one single printer left that uses that particular driver. You need to <span class="quote">&#8220;<span class="quote">delete</span>&#8221;</span> all
-printers using this driver in the <span class="guilabel">Printers</span> folder first. You will need Administrator
-privileges to do this.
-</p></div><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
-<a class="indexterm" name="id407407"></a>
-<a class="indexterm" name="id407416"></a>
-Once you have successfully downloaded the CUPS PostScript driver to a client, you can easily switch all
-printers to this one by proceeding as described in <a class="link" href="classicalprinting.html" title="Chapter 21. Classical Printing Support">Classical Printing
-Support</a>. Either change a driver for an existing printer by running the <span class="guilabel">Printer
-Properties</span> dialog, or use <code class="literal">rpcclient</code> with the <code class="literal">setdriver</code>
-subcommand.
-</p></div></div><div class="sect2" title="Windows CUPS PostScript Driver Versus Adobe Driver"><div class="titlepage"><div><div><h3 class="title"><a name="id407452"></a>Windows CUPS PostScript Driver Versus Adobe Driver</h3></div></div></div><p>
-Are you interested in a comparison between the CUPS and the Adobe PostScript drivers? For our purposes, these
-are the most important items that weigh in favor of CUPS:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>No hassle with the Adobe EULA.</p></li><li class="listitem"><p>No hassle with the question, <span class="quote">&#8220;<span class="quote">Where do I
- get the ADOBE*.* driver files?</span>&#8221;</span></p></li><li class="listitem"><p>
- <a class="indexterm" name="id407480"></a>
- The Adobe drivers (on request of the printer PPD associated with them) often put a PJL header in front of the
- main PostScript part of the print file. Thus, the print file starts with <em class="parameter"><code>&lt;1B
- &gt;%-12345X</code></em> or <em class="parameter"><code>&lt;escape&gt;%-12345X</code></em> instead of
- <em class="parameter"><code>%!PS</code></em>. This leads to the CUPS daemon autotyping the incoming file as a print-ready file,
- not initiating a pass through the <em class="parameter"><code>pstops</code></em> filter (to speak more technically, it is not
- regarded as the generic MIME-type <a class="indexterm" name="id407514"></a>
- <em class="parameter"><code>application/postscript</code></em>, but as the more special MIME type
- <a class="indexterm" name="id407527"></a>
- <em class="parameter"><code>application/cups.vnd-postscript</code></em>), which therefore also leads to the page accounting in
- <em class="parameter"><code>/var/log/cups/page_log</code></em> not receiving the exact number of pages; instead the dummy page
- number of <span class="quote">&#8220;<span class="quote">1</span>&#8221;</span> is logged in a standard setup).
- </p></li><li class="listitem"><p>The Adobe driver has more options to misconfigure the
-<a class="indexterm" name="id407556"></a>
- PostScript generated by it (like setting it inadvertently to
- <span class="guilabel">Optimize for Speed</span> instead of
- <span class="guilabel">Optimize for Portability</span>, which
- could lead to CUPS being unable to process it).</p></li><li class="listitem"><p>The CUPS PostScript driver output sent by Windows
-<a class="indexterm" name="id407580"></a>
- clients to the CUPS server is guaranteed to autotype
- as the generic MIME type <em class="parameter"><code>application/postscript</code></em>,
- thus passing through the CUPS <em class="parameter"><code>pstops</code></em> filter and logging the
- correct number of pages in the <code class="filename">page_log</code> for
- accounting and quota purposes.</p></li><li class="listitem"><p>
- <a class="indexterm" name="id407611"></a>
- The CUPS PostScript driver supports the sending of additional standard (IPP) print options by Windows
- NT/200x/XP clients. Such additional print options are naming the CUPS standard <span class="emphasis"><em>banner
- pages</em></span> (or the custom ones, should they be installed at the time of driver download), using the CUPS
- page-label option, setting a job priority, and setting the scheduled time of printing (with the option to
- support additional useful IPP job attributes in the future).
- </p></li><li class="listitem"><p>The CUPS PostScript driver supports the inclusion of
- the new <em class="parameter"><code>*cupsJobTicket</code></em> comments at the
- beginning of the PostScript file (which could be used in the future
- for all sorts of beneficial extensions on the CUPS side, but which will
- not disturb any other applications because they will regard it as a comment
- and simply ignore it).</p></li><li class="listitem"><p>The CUPS PostScript driver will be the heart of the
- fully fledged CUPS IPP client for Windows NT/200x/XP to be released soon
- (probably alongside the first beta release for CUPS 1.2).</p></li></ul></div></div><div class="sect2" title="Run cupsaddsmb (Quiet Mode)"><div class="titlepage"><div><div><h3 class="title"><a name="id407647"></a>Run cupsaddsmb (Quiet Mode)</h3></div></div></div><p>
-<a class="indexterm" name="id407655"></a>
-<a class="indexterm" name="id407662"></a>
-The <code class="literal">cupsaddsmb</code> command copies the needed files into your <em class="parameter"><code>[print$]</code></em>
-share. Additionally, the PPD associated with this printer is copied from <code class="filename">/etc/cups/ppd/</code>
-to <em class="parameter"><code>[print$]</code></em>. There the files wait for convenient Windows client installations via
-Point'n'Print. Before we can run the command successfully, we need to be sure that we can authenticate toward
-Samba. If you have a small network, you are probably using user-level security (<a class="link" href="smb.conf.5.html#SECURITY" target="_top">security = user</a>).
-</p><p>
-Here is an example of a successfully run <code class="literal">cupsaddsmb</code> command:
-<a class="indexterm" name="id407717"></a>
-<a class="indexterm" name="id407724"></a>
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>cupsaddsmb -U root infotec_IS2027</code></strong>
-Password for root required to access localhost via Samba: <strong class="userinput"><code>['secret']</code></strong>
-</pre><p>
-<a class="indexterm" name="id407755"></a>
-To share <span class="emphasis"><em>all</em></span> printers and drivers, use the
-<code class="option">-a</code> parameter instead of a printer name. Since
-<code class="literal">cupsaddsmb</code> <span class="quote">&#8220;<span class="quote">exports</span>&#8221;</span> the printer drivers to Samba, it should be
-obvious that it only works for queues with a CUPS driver associated.
-</p></div><div class="sect2" title="Run cupsaddsmb with Verbose Output"><div class="titlepage"><div><div><h3 class="title"><a name="id407782"></a>Run cupsaddsmb with Verbose Output</h3></div></div></div><p>
-<a class="indexterm" name="id407790"></a>
-Probably you want to see what's going on. Use the
-<code class="option">-v</code> parameter to get a more verbose output. The
-output below was edited for better readability: all <span class="quote">&#8220;<span class="quote">\</span>&#8221;</span> at the end of
-a line indicate that I inserted an artificial line break plus some
-indentation here:
-<a class="indexterm" name="id407805"></a>
-<a class="indexterm" name="id407814"></a>
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>cupsaddsmb -U root -v infotec_2105</code></strong>
-Password for root required to access localhost via GANDALF:
-Running command: smbclient //localhost/print\$ -N -U'root%secret' \
- -c 'mkdir W32X86; \
- put /var/spool/cups/tmp/3e98bf2d333b5 W32X86/infotec_2105.ppd; \
- put /usr/share/cups/drivers/cupsdrvr.dll W32X86/cupsdrvr.dll; \
- put /usr/share/cups/drivers/cupsui.dll W32X86/cupsui.dll; \
- put /usr/share/cups/drivers/cups.hlp W32X86/cups.hlp'
-added interface ip=10.160.51.60 bcast=10.160.51.255 nmask=255.255.252.0
-Domain=[CUPS-PRINT] OS=[UNIX] Server=[Samba 2.2.7a]
-NT_STATUS_OBJECT_NAME_COLLISION making remote directory \W32X86
-putting file /var/spool/cups/tmp/3e98bf2d333b5 as \W32X86/infotec_2105.ppd
-putting file /usr/share/cups/drivers/cupsdrvr.dll as \W32X86/cupsdrvr.dll
-putting file /usr/share/cups/drivers/cupsui.dll as \W32X86/cupsui.dll
-putting file /usr/share/cups/drivers/cups.hlp as \W32X86/cups.hlp
-
-Running command: rpcclient localhost -N -U'root%secret'
- -c 'adddriver "Windows NT x86" \
- "infotec_2105:cupsdrvr.dll:infotec_2105.ppd:cupsui.dll:cups.hlp:NULL: \
- RAW:NULL"'
-cmd = adddriver "Windows NT x86" \
- "infotec_2105:cupsdrvr.dll:infotec_2105.ppd:cupsui.dll:cups.hlp:NULL: \
- RAW:NULL"
-Printer Driver infotec_2105 successfully installed.
-
-Running command: smbclient //localhost/print\$ -N -U'root%secret' \
--c 'mkdir WIN40; \
- put /var/spool/cups/tmp/3e98bf2d333b5 WIN40/infotec_2105.PPD; \
- put /usr/share/cups/drivers/ADFONTS.MFM WIN40/ADFONTS.MFM; \
- put /usr/share/cups/drivers/ADOBEPS4.DRV WIN40/ADOBEPS4.DRV; \
- put /usr/share/cups/drivers/ADOBEPS4.HLP WIN40/ADOBEPS4.HLP; \
- put /usr/share/cups/drivers/DEFPRTR2.PPD WIN40/DEFPRTR2.PPD; \
- put /usr/share/cups/drivers/ICONLIB.DLL WIN40/ICONLIB.DLL; \
- put /usr/share/cups/drivers/PSMON.DLL WIN40/PSMON.DLL;'
- added interface ip=10.160.51.60 bcast=10.160.51.255 nmask=255.255.252.0
- Domain=[CUPS-PRINT] OS=[UNIX] Server=[Samba 2.2.7a]
- NT_STATUS_OBJECT_NAME_COLLISION making remote directory \WIN40
- putting file /var/spool/cups/tmp/3e98bf2d333b5 as \WIN40/infotec_2105.PPD
- putting file /usr/share/cups/drivers/ADFONTS.MFM as \WIN40/ADFONTS.MFM
- putting file /usr/share/cups/drivers/ADOBEPS4.DRV as \WIN40/ADOBEPS4.DRV
- putting file /usr/share/cups/drivers/ADOBEPS4.HLP as \WIN40/ADOBEPS4.HLP
- putting file /usr/share/cups/drivers/DEFPRTR2.PPD as \WIN40/DEFPRTR2.PPD
- putting file /usr/share/cups/drivers/ICONLIB.DLL as \WIN40/ICONLIB.DLL
- putting file /usr/share/cups/drivers/PSMON.DLL as \WIN40/PSMON.DLL
-
- Running command: rpcclient localhost -N -U'root%secret' \
- -c 'adddriver "Windows 4.0" \
- "infotec_2105:ADOBEPS4.DRV:infotec_2105.PPD:NULL:ADOBEPS4.HLP: \
- PSMON.DLL:RAW:ADOBEPS4.DRV,infotec_2105.PPD,ADOBEPS4.HLP,PSMON.DLL, \
- ADFONTS.MFM,DEFPRTR2.PPD,ICONLIB.DLL"'
- cmd = adddriver "Windows 4.0" "infotec_2105:ADOBEPS4.DRV:\
- infotec_2105.PPD:NULL:ADOBEPS4.HLP:PSMON.DLL:RAW:ADOBEPS4.DRV,\
- infotec_2105.PPD,ADOBEPS4.HLP,PSMON.DLL,ADFONTS.MFM,DEFPRTR2.PPD,\
- ICONLIB.DLL"
- Printer Driver infotec_2105 successfully installed.
-
- Running command: rpcclient localhost -N -U'root%secret' \
- -c 'setdriver infotec_2105 infotec_2105'
- cmd = setdriver infotec_2105 infotec_2105
- Successfully set infotec_2105 to driver infotec_2105.
-</pre><div class="warning" title="Warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p>
-You will see the root password for the Samba account printed on screen.
-</p></div><p>
-If you look closely, you'll discover your root password was transferred unencrypted over the wire, so beware!
-Also, if you look further, you may discover error messages like NT_STATUS_OBJECT_NAME_COLLISION in the output.
-This will occur when the directories WIN40 and W32X86 already existed in the <em class="parameter"><code>[print$]</code></em>
-driver download share (from a previous driver installation). These are harmless warning messages.
-</p></div><div class="sect2" title="Understanding cupsaddsmb"><div class="titlepage"><div><div><h3 class="title"><a name="id407885"></a>Understanding cupsaddsmb</h3></div></div></div><p>
-<a class="indexterm" name="id407892"></a>
-What has happened? What did <code class="literal">cupsaddsmb</code> do? There are five stages of the procedure:
-</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
- <a class="indexterm" name="id407917"></a>
- Call the CUPS server via IPP and request the driver files and the PPD file for the named printer.</p></li><li class="listitem"><p>Store the files temporarily in the local TEMPDIR (as defined in <code class="filename">cupsd.conf</code>).</p></li><li class="listitem"><p>Connect via smbclient to the Samba server's <em class="parameter"><code>[print$]</code></em> share and put the files into the
- share's WIN40 (for Windows 9x/Me) and W32X86 (for Windows NT/200x/XP) subdirectories.</p></li><li class="listitem"><p>
- <a class="indexterm" name="id407951"></a>
- Connect via rpcclient to the Samba server and execute the <code class="literal">adddriver</code> command with the correct parameters.
- </p></li><li class="listitem"><p>
- <a class="indexterm" name="id407971"></a>
- Connect via rpcclient to the Samba server a second time and execute the <code class="literal">setdriver</code> command.</p></li></ol></div><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
-You can run the <code class="literal">cupsaddsmb</code> utility with parameters to specify one remote host as Samba host
-and a second remote host as CUPS host. Especially if you want to get a deeper understanding, it is a good idea
-to try it and see more clearly what is going on (though in real life most people will have their CUPS and
-Samba servers run on the same host):
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>cupsaddsmb -H sambaserver -h cupsserver -v printer</code></strong>
-</pre><p>
-</p></div></div><div class="sect2" title="How to Recognize If cupsaddsmb Completed Successfully"><div class="titlepage"><div><div><h3 class="title"><a name="id408021"></a>How to Recognize If cupsaddsmb Completed Successfully</h3></div></div></div><p>
-You <span class="emphasis"><em>must</em></span> always check if the utility completed
-successfully in all fields. You need at minimum these three messages
-among the output:
-</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p><span class="emphasis"><em>Printer Driver infotec_2105 successfully
- installed.</em></span> # (for the W32X86 == Windows NT/200x/XP
- architecture).</p></li><li class="listitem"><p><span class="emphasis"><em>Printer Driver infotec_2105 successfully
- installed.</em></span> # (for the WIN40 == Windows 9x/Me
- architecture).</p></li><li class="listitem"><p><span class="emphasis"><em>Successfully set [printerXPZ] to driver
- [printerXYZ].</em></span></p></li></ol></div><p>
-These messages are probably not easily recognized in the general
-output. If you run <code class="literal">cupsaddsmb</code> with the <code class="option">-a</code>
-parameter (which tries to prepare <span class="emphasis"><em>all</em></span> active CUPS
-printer drivers for download), you might miss if individual printer
-drivers had problems installing properly. A redirection of the
-output will help you analyze the results in retrospective.
-</p><p>
-If you get:
-</p><pre class="screen">
-SetPrinter call failed!
-result was WERR_ACCESS_DENIED
-</pre><p>
-it means that you might have set <a class="link" href="smb.conf.5.html#USECLIENTDRIVER" target="_top">use client driver = yes</a> for this printer.
-Setting it to <span class="quote">&#8220;<span class="quote">no</span>&#8221;</span> will solve the problem. Refer to the <code class="filename">smb.conf</code> man page for explanation of
-the <em class="parameter"><code>use client driver</code></em>.
-</p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
-It is impossible to see any diagnostic output if you do not run <code class="literal">cupsaddsmb</code> in verbose mode.
-Therefore, we strongly recommend against use of the default quiet mode. It will hide any problems from you that
-might occur.
-</p></div></div><div class="sect2" title="cupsaddsmb with a Samba PDC"><div class="titlepage"><div><div><h3 class="title"><a name="id408132"></a>cupsaddsmb with a Samba PDC</h3></div></div></div><p>
-<a class="indexterm" name="id408140"></a>
-<a class="indexterm" name="id408147"></a>
-Can't get the standard <code class="literal">cupsaddsmb</code> command to run on a Samba PDC? Are you asked for the
-password credential again and again, and the command just will not take off at all? Try one of these
-variations:
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>cupsaddsmb -U MIDEARTH\\root -v printername</code></strong>
-<code class="prompt">root# </code><strong class="userinput"><code>cupsaddsmb -H SAURON -U MIDEARTH\\root -v printername</code></strong>
-<code class="prompt">root# </code><strong class="userinput"><code>cupsaddsmb -H SAURON -U MIDEARTH\\root -h cups-server -v printername</code></strong>
-</pre><p>
-(Note the two backslashes: the first one is required to <span class="quote">&#8220;<span class="quote">escape</span>&#8221;</span> the second one).
-</p></div><div class="sect2" title="cupsaddsmb Flowchart"><div class="titlepage"><div><div><h3 class="title"><a name="id408209"></a>cupsaddsmb Flowchart</h3></div></div></div><p>
-<a class="indexterm" name="id408217"></a>
-<a class="indexterm" name="id408224"></a>
-<a class="link" href="CUPS-printing.html#small14" title="Figure 22.16. cupsaddsmb Flowchart.">The cupsaddsmb Flowchart</a> shows a chart about the procedures, command flows, and
-data flows of the <code class="literal">cupaddsmb</code> command. Note again: cupsaddsmb is
-not intended to, and does not work with, raw print queues!
-</p><div class="figure"><a name="small14"></a><p class="title"><b>Figure 22.16. cupsaddsmb Flowchart.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/14small.png" alt="cupsaddsmb Flowchart."></div></div></div><br class="figure-break"></div><div class="sect2" title="Installing the PostScript Driver on a Client"><div class="titlepage"><div><div><h3 class="title"><a name="id408287"></a>Installing the PostScript Driver on a Client</h3></div></div></div><p>
-<a class="indexterm" name="id408295"></a>
-<a class="indexterm" name="id408302"></a>
-After <code class="literal">cupsaddsmb</code> is completed, your driver is prepared for the clients to use. Here are the
-steps you must perform to download and install it via Point'n'Print. From a Windows client, browse to the
-CUPS/Samba server:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
- <a class="indexterm" name="id408323"></a>
- Open the <span class="guilabel">Printers</span> share of Samba in Network Neighborhood.</p></li><li class="listitem"><p>Right-click on the printer in question.</p></li><li class="listitem"><p>From the opening context menu select
- <span class="guimenuitem">Install...</span> or
- <span class="guimenuitem">Connect...</span> (depending on the Windows version you use).</p></li></ul></div><p>
-After a few seconds, there should be a new printer in your client's <span class="emphasis"><em>local</em></span>
-<span class="guilabel">Printers</span> folder. On Windows XP it will follow a naming convention of
-<span class="emphasis"><em>PrinterName on SambaServer</em></span>. (In my current case it is infotec_2105 on kde-bitshop). If
-you want to test it and send your first job from an application like Microsoft Word,
-the new printer appears in a
-<code class="filename">\\SambaServer\PrinterName</code> entry in the drop-down list of available printers.
-</p><p>
-<a class="indexterm" name="id408387"></a>
-<a class="indexterm" name="id408394"></a>
-<a class="indexterm" name="id408401"></a>
-<code class="literal">cupsaddsmb</code> will only reliably work with CUPS version 1.1.15 or higher and with Samba
-version 2.2.4, or later. If it does not work, or if the automatic printer driver download to the clients does
-not succeed, you can still manually install the CUPS printer PPD on top of the Adobe PostScript driver on
-clients. Then point the client's printer queue to the Samba printer share for a UNC type of connection:
-</p><pre class="screen">
-<code class="prompt">C:\&gt; </code><strong class="userinput"><code>net use lpt1: \\sambaserver\printershare /user:ntadmin</code></strong>
-</pre><p>
-should you desire to use the CUPS networked PostScript RIP functions. (Note that user <span class="quote">&#8220;<span class="quote">ntadmin</span>&#8221;</span>
-needs to be a valid Samba user with the required privileges to access the printershare.) This sets up the
-printer connection in the traditional LanMan way (not using MS-RPC).
-</p></div><div class="sect2" title="Avoiding Critical PostScript Driver Settings on the Client"><div class="titlepage"><div><div><h3 class="title"><a name="cups-avoidps1"></a>Avoiding Critical PostScript Driver Settings on the Client</h3></div></div></div><p>
-Printing works, but there are still problems. Most jobs print well, some do not print at all. Some jobs have
-problems with fonts, which do not look very good. Some jobs print fast and some are dead-slow. Many of these
-problems can be greatly reduced or even completely eliminated if you follow a few guidelines. Remember, if
-your print device is not PostScript-enabled, you are treating your Ghostscript installation on your CUPS host
-with the output your client driver settings produce. Treat it well:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
- Avoid the PostScript Output Option: Optimize for Speed setting. Use the Optimize for Portability instead
- (Adobe PostScript driver).</p></li><li class="listitem"><p>
- Don't use the Page Independence: NO setting. Instead, use Page Independence: YES (CUPS PostScript Driver).
- </p></li><li class="listitem"><p>
- Recommended is the True Type Font Downloading Option: Native True Type over Automatic and Outline;
- you should by all means avoid Bitmap (Adobe PostScript Driver).</p></li><li class="listitem"><p>
- Choose True Type Font: Download as Softfont into Printer over the default Replace by Device
- Font (for exotic fonts, you may need to change it back to get a printout at all; Adobe).</p></li><li class="listitem"><p>
- Sometimes you can choose PostScript Language Level: in case of problems try 2
- instead of 3 (the latest ESP Ghostscript package handles Level 3 PostScript very well; Adobe).
- </p></li><li class="listitem"><p>
- Say Yes to PostScript Error Handler (Adobe).</p></li></ul></div></div></div><div class="sect1" title="Installing PostScript Driver Files Manually Using rpcclient"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id408496"></a>Installing PostScript Driver Files Manually Using rpcclient</h2></div></div></div><p>
-Of course, you can run all the commands that are embedded into the
-cupsaddsmb convenience utility yourself, one by one, and upload
-and prepare the driver files for future client downloads.
-</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>Prepare Samba (a CUPS print queue with the name of the
- printer should be there. We are providing the driver now).</p></li><li class="listitem"><p>Copy all files to <em class="parameter"><code>[print$]</code></em>.</p></li><li class="listitem"><p>
- <a class="indexterm" name="id408532"></a>
- Run <code class="literal">rpcclient adddriver</code>
- (for each client architecture you want to support).</p></li><li class="listitem"><p>
- <a class="indexterm" name="id408552"></a>
- Run <code class="literal">rpcclient setdriver.</code></p></li></ol></div><p>
-<a class="indexterm" name="id408571"></a>
-<a class="indexterm" name="id408580"></a>
-<a class="indexterm" name="id408589"></a>
-<a class="indexterm" name="id408598"></a>
-<a class="indexterm" name="id408607"></a>
-We are going to do this now. First, read the man page on <em class="parameter"><code>rpcclient</code></em> to get a first idea.
-Look at all the printing-related subcommands: <code class="literal">enumprinters</code>, <code class="literal">enumdrivers</code>,
-<code class="literal">enumports</code>, <code class="literal">adddriver</code>, and <code class="literal">setdriver</code> are among the
-most interesting ones. <em class="parameter"><code>rpcclient</code></em> implements an important part of the MS-RPC protocol.
-You can use it to query (and command) a Windows NT (or 200x/XP) PC, too. MS-RPC is used by Windows clients,
-among other things, to benefit from the Point'n'Print features. Samba can now mimic this as well.
-</p><div class="sect2" title="A Check of the rpcclient man Page"><div class="titlepage"><div><div><h3 class="title"><a name="id408662"></a>A Check of the rpcclient man Page</h3></div></div></div><p>
-First let's check the <em class="parameter"><code>rpcclient</code></em> man page. Here are two relevant passages:
-</p><p>
-<a class="indexterm" name="id408680"></a>
-<a class="indexterm" name="id408686"></a>
-<a class="indexterm" name="id408693"></a>
-<code class="literal">adddriver &lt;arch&gt; &lt;config&gt;</code> Execute an <code class="literal">AddPrinterDriver()</code> RPC
-to install the printer driver information on the server. The driver files should already exist in the
-directory returned by <code class="literal">getdriverdir</code>. Possible values for <em class="parameter"><code>arch</code></em> are the
-same as those for the <code class="literal">getdriverdir</code> command. The <em class="parameter"><code>config</code></em> parameter is
-defined as follows:
-</p><pre class="screen">
-Long Printer Name:\
-Driver File Name:\
-Data File Name:\
-Config File Name:\
-Help File Name:\
-Language Monitor Name:\
-Default Data Type:\
-Comma Separated list of Files
-</pre><p>
-Any empty fields should be entered as the string <span class="quote">&#8220;<span class="quote">NULL</span>&#8221;</span>.
-</p><p>
-Samba does not need to support the concept of print monitors, since these only apply to local printers whose
-drivers can use a bidirectional link for communication. This field should be <span class="quote">&#8220;<span class="quote">NULL</span>&#8221;</span>. On a remote
-NT print server, the print monitor for a driver must already be installed before adding the driver or else the
-RPC will fail.
-</p><p>
-<a class="indexterm" name="id408764"></a>
-<a class="indexterm" name="id408770"></a>
-<code class="literal">setdriver &lt;printername&gt; &lt;drivername&gt;</code> Execute a <code class="literal">SetPrinter()</code>
-command to update the printer driver associated with an installed printer. The printer driver must already be
-correctly installed on the print server.
-</p><p>
-<a class="indexterm" name="id408794"></a>
-<a class="indexterm" name="id408801"></a>
-See also the <code class="literal">enumprinters</code> and <code class="literal">enumdrivers</code> commands to
-obtain a list of installed printers and drivers.
-</p></div><div class="sect2" title="Understanding the rpcclient man Page"><div class="titlepage"><div><div><h3 class="title"><a name="id408822"></a>Understanding the rpcclient man Page</h3></div></div></div><p>
-<a class="indexterm" name="id408830"></a>
-The <span class="emphasis"><em>exact</em></span> format isn't made too clear by the man page, since you have to deal with some
-parameters containing spaces. Here is a better description for it. We have line-broken the command and
-indicated the breaks with <span class="quote">&#8220;<span class="quote">\</span>&#8221;</span>. Usually you would type the command in one line without the line
-breaks:
-</p><pre class="screen">
-adddriver "Architecture" \
- "LongPrinterName:DriverFile:DataFile:ConfigFile:HelpFile:\
- LanguageMonitorFile:DataType:ListOfFiles,Comma-separated"
-</pre><p>
-What the man pages denote as a simple <em class="parameter"><code>&lt;config&gt;</code></em> keyword in reality consists of
-eight colon-separated fields. The last field may take multiple (in some very insane cases, even 20 different
-additional) files. This might sound confusing at first. What the man pages call the
-<span class="quote">&#8220;<span class="quote">LongPrinterName</span>&#8221;</span> in reality should be called the <span class="quote">&#8220;<span class="quote">Driver Name</span>&#8221;</span>. You can name it
-anything you want, as long as you use this name later in the <code class="literal">rpcclient ... setdriver</code>
-command. For practical reasons, many name the driver the same as the printer.
-</p><p>
-It isn't simple at all. I hear you asking: <span class="quote">&#8220;<span class="quote">How do I know which files are Driver File</span>&#8221;</span>,
-<span class="quote">&#8220;<span class="quote">Data File</span>&#8221;</span>, <span class="quote">&#8220;<span class="quote">Config File</span>&#8221;</span>, <span class="quote">&#8220;<span class="quote">Help File</span>&#8221;</span> and <span class="quote">&#8220;<span class="quote">Language Monitor
-File in each case?</span>&#8221;</span> For an answer, you may want to have a look at how a Windows NT box with a shared
-printer presents the files to us. Remember that this whole procedure has to be developed by the Samba Team by
-listening to the traffic caused by Windows computers on the wire. We may as well turn to a Windows box now and
-access it from a UNIX workstation. We will query it with <code class="literal">rpcclient</code> to see what it tells us
-and try to understand the man page more clearly.
-</p></div><div class="sect2" title="Producing an Example by Querying a Windows Box"><div class="titlepage"><div><div><h3 class="title"><a name="id408914"></a>Producing an Example by Querying a Windows Box</h3></div></div></div><p>
-<a class="indexterm" name="id408922"></a>
-<a class="indexterm" name="id408932"></a>
-We could run <code class="literal">rpcclient</code> with a <code class="literal">getdriver</code> or a
-<code class="literal">getprinter</code> subcommand (in level 3 verbosity) against it. Just sit down at a UNIX or Linux
-workstation with the Samba utilities installed, then type the following command:
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient -U'user%secret' NT-SERVER -c 'getdriver printername 3'</code></strong>
-</pre><p>
-From the result it should become clear which is which. Here is an example from my installation:
-<a class="indexterm" name="id408980"></a>
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient -U'Danka%xxxx' W200xSERVER \
- -c'getdriver "DANKA InfoStream Virtual Printer" 3'</code></strong>
- cmd = getdriver "DANKA InfoStream Virtual Printer" 3
-
- [Windows NT x86]
- Printer Driver Info 3:
- Version: [2]
- Driver Name: [DANKA InfoStream]
- Architecture: [Windows NT x86]
- Driver Path: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\PSCRIPT.DLL]
- Datafile: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\INFOSTRM.PPD]
- Configfile: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\PSCRPTUI.DLL]
- Helpfile: [C:\WINNT\System32\spool\DRIVERS\W32X86\2\PSCRIPT.HLP]
-
- Dependentfiles: []
- Dependentfiles: []
- Dependentfiles: []
- Dependentfiles: []
- Dependentfiles: []
- Dependentfiles: []
- Dependentfiles: []
-
- Monitorname: []
- Defaultdatatype: []
-</pre><p>
-Some printer drivers list additional files under the label <em class="parameter"><code>Dependentfiles</code></em>, and these
-would go into the last field <em class="parameter"><code>ListOfFiles,Comma-separated</code></em>. For the CUPS PostScript
-drivers, we do not need any (nor would we for the Adobe PostScript driver); therefore, the field will get a
-<span class="quote">&#8220;<span class="quote">NULL</span>&#8221;</span> entry.
-</p></div><div class="sect2" title="Requirements for adddriver and setdriver to Succeed"><div class="titlepage"><div><div><h3 class="title"><a name="id409034"></a>Requirements for adddriver and setdriver to Succeed</h3></div></div></div><p>
-<a class="indexterm" name="id409042"></a>
-<a class="indexterm" name="id409051"></a>
-<a class="indexterm" name="id409058"></a>
-From the man page (and from the quoted output of <code class="literal">cupsaddsmb</code> above) it becomes clear that
-you need to have certain conditions in order to make the manual uploading and initializing of the driver files
-succeed. The two <code class="literal">rpcclient</code> subcommands (<code class="literal">adddriver</code> and
-<code class="literal">setdriver</code>) need to encounter the following preconditions to complete successfully:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>You are connected as <a class="link" href="smb.conf.5.html#PRINTERADMIN" target="_top">printer admin</a> or root (this is
- <span class="emphasis"><em>not</em></span> the <span class="quote">&#8220;<span class="quote">Printer Operators</span>&#8221;</span> group in NT, but the <span class="emphasis"><em>printer
- admin</em></span> group as defined in the <em class="parameter"><code>[global]</code></em> section of <code class="filename">smb.conf</code>).
- </p></li><li class="listitem"><p>Copy all required driver files to <code class="filename">\\SAMBA\print$\w32x86</code> and
- <code class="filename">\\SAMBA\print$\win40</code> as appropriate. They will end up in the <span class="quote">&#8220;<span class="quote">0</span>&#8221;</span> respective
- <span class="quote">&#8220;<span class="quote">2</span>&#8221;</span> subdirectories later. For now, <span class="emphasis"><em>do not</em></span> put them there; they'll be
- automatically used by the <code class="literal">adddriver</code> subcommand. (If you use <code class="literal">smbclient</code> to
- put the driver files into the share, note that you need to escape the <span class="quote">&#8220;<span class="quote">$</span>&#8221;</span>: <code class="literal">smbclient
- //sambaserver/print\$ -U root.</code>)</p></li><li class="listitem"><p>The user you're connecting as must be able to write to
- the <em class="parameter"><code>[print$]</code></em> share and create
- subdirectories.</p></li><li class="listitem"><p>The printer you are going to set up for the Windows
- clients needs to be installed in CUPS already.</p></li><li class="listitem"><p>
- <a class="indexterm" name="id409202"></a>
- <a class="indexterm" name="id409211"></a>
- The CUPS printer must be known to Samba; otherwise the <code class="literal">setdriver</code> subcommand fails with an
- NT_STATUS_UNSUCCESSFUL error. To check if the printer is known by Samba, you may use the
- <code class="literal">enumprinters</code> subcommand to <code class="literal">rpcclient</code>. A long-standing bug prevented a
- proper update of the printer list until every smbd process had received a SIGHUP or was restarted. Remember
- this in case you've created the CUPS printer just recently and encounter problems: try restarting Samba.
- </p></li></ul></div></div><div class="sect2" title="Manual Driver Installation in 15 Steps"><div class="titlepage"><div><div><h3 class="title"><a name="id409245"></a>Manual Driver Installation in 15 Steps</h3></div></div></div><p>
-We are going to install a printer driver now by manually executing all
-required commands. Because this may seem a rather complicated process at
-first, we go through the procedure step by step, explaining every
-single action item as it comes up.
-</p><div class="procedure" title="Procedure 22.2. Manual Driver Installation"><a name="id409256"></a><p class="title"><b>Procedure 22.2. Manual Driver Installation</b></p><ol class="procedure" type="1"><li class="step" title="Install the printer on CUPS."><p class="title"><b>Install the printer on CUPS.</b></p><pre class="screen">
- <code class="prompt">root# </code><strong class="userinput"><code>lpadmin -p mysmbtstprn -v socket://10.160.51.131:9100 -E \
- -P canonIR85.ppd</code></strong>
- </pre><p>
- This installs a printer with the name <em class="parameter"><code>mysmbtstprn</code></em>
- to the CUPS system. The printer is accessed via a socket
- (a.k.a. JetDirect or Direct TCP/IP) connection. You need to be root
- for this step.
- </p></li><li class="step" title="(Optional.) Check if the printer is recognized by Samba."><p class="title"><b>(Optional.) Check if the printer is recognized by Samba.</b></p><p>
- <a class="indexterm" name="id409310"></a>
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient -Uroot%xxxx -c 'enumprinters' localhost \
- | grep -C2 mysmbtstprn</code></strong>
-flags:[0x800000]
-name:[\\kde-bitshop\mysmbtstprn]
-description:[\\kde-bitshop\mysmbtstprn,,mysmbtstprn]
-comment:[mysmbtstprn]
-</pre><p>
- </p><p>
- This should show the printer in the list. If not, stop and restart the Samba daemon (smbd) or send a HUP signal:
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>kill -HUP `pidof smbd`</code></strong>
-</pre><p>
- Check again. Troubleshoot and repeat until successful. Note the <span class="quote">&#8220;<span class="quote">empty</span>&#8221;</span> field between the two
- commas in the <span class="quote">&#8220;<span class="quote">description</span>&#8221;</span> line. The driver name would appear here if there was one already. You
- need to know root's Samba password (as set by the <code class="literal">smbpasswd</code> command) for this step and most
- of the following steps. Alternatively, you can authenticate as one of the users from the <span class="quote">&#8220;<span class="quote">write
- list</span>&#8221;</span> as defined in <code class="filename">smb.conf</code> for <em class="parameter"><code>[print$]</code></em>.
- </p></li><li class="step" title="(Optional.) Check if Samba knows a driver for the printer."><p class="title"><b>(Optional.) Check if Samba knows a driver for the printer.</b></p><p>
- <a class="indexterm" name="id409401"></a>
- <a class="indexterm" name="id409410"></a>
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2'\
- localhost | grep driver </code></strong>
-
-drivername:[]
-
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2' \
- localhost | grep -C4 driv</code></strong>
-
-servername:[\\kde-bitshop]
-printername:[\\kde-bitshop\mysmbtstprn]
-sharename:[mysmbtstprn]
-portname:[Samba Printer Port]
-drivername:[]
-comment:[mysmbtstprn]
-location:[]
-sepfile:[]
-printprocessor:[winprint]
-
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient -U root%xxxx -c 'getdriver mysmbtstprn' localhost</code></strong>
- result was WERR_UNKNOWN_PRINTER_DRIVER
-</pre><p>
-None of the three commands shown above should show a driver.
-This step was done for the purpose of demonstrating this condition. An
-attempt to connect to the printer at this stage will prompt a
-message along the lines of, <span class="quote">&#8220;<span class="quote">The server does not have the required printer
-driver installed.</span>&#8221;</span>
-</p></li><li class="step" title="Put all required driver files into Samba's [print$]."><p class="title"><b>Put all required driver files into Samba's
-[print$].</b></p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>smbclient //localhost/print\$ -U 'root%xxxx' \
- -c 'cd W32X86; \
- put /etc/cups/ppd/mysmbtstprn.ppd mysmbtstprn.PPD; \
- put /usr/share/cups/drivers/cupsui.dll cupsui.dll; \
- put /usr/share/cups/drivers/cupsdrvr.dll cupsdrvr.dll; \
- put /usr/share/cups/drivers/cups.hlp cups.hlp'</code></strong>
-</pre><p>
-(This command should be entered in one long single line. Line breaks and the line ends indicated by
-<span class="quote">&#8220;<span class="quote">\</span>&#8221;</span> have been inserted for readability reasons.) This step is <span class="emphasis"><em>required</em></span> for
-the next one to succeed. It makes the driver files physically present in the <em class="parameter"><code>[print$]</code></em>
-share. However, clients would still not be able to install them, because Samba does not yet treat them as
-driver files. A client asking for the driver would still be presented with a <span class="quote">&#8220;<span class="quote">not installed here</span>&#8221;</span>
-message.
-</p></li><li class="step" title="Verify where the driver files are now."><p class="title"><b>Verify where the driver files are now.</b></p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>ls -l /etc/samba/drivers/W32X86/</code></strong>
-total 669
-drwxr-sr-x 2 root ntadmin 532 May 25 23:08 2
-drwxr-sr-x 2 root ntadmin 670 May 16 03:15 3
--rwxr--r-- 1 root ntadmin 14234 May 25 23:21 cups.hlp
--rwxr--r-- 1 root ntadmin 278380 May 25 23:21 cupsdrvr.dll
--rwxr--r-- 1 root ntadmin 215848 May 25 23:21 cupsui.dll
--rwxr--r-- 1 root ntadmin 169458 May 25 23:21 mysmbtstprn.PPD
-</pre><p>
-The driver files now are in the W32X86 architecture <span class="quote">&#8220;<span class="quote">root</span>&#8221;</span> of
-<em class="parameter"><code>[print$]</code></em>.
-</p></li><li class="step" title="Tell Samba that these are driver files (adddriver)."><p class="title"><b>Tell Samba that these are driver files (<code class="literal">adddriver</code>).</b></p><p>
-<a class="indexterm" name="id409581"></a>
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient -Uroot%xxxx -c 'adddriver "Windows NT x86" \
- "mydrivername:cupsdrvr.dll:mysmbtstprn.PPD: \
- cupsui.dll:cups.hlp:NULL:RAW:NULL"' \
- localhost</code></strong>
-Printer Driver mydrivername successfully installed.
-</pre><p>
-You cannot repeat this step if it fails. It could fail even as a result of a simple typo. It will most likely
-have moved a part of the driver files into the <span class="quote">&#8220;<span class="quote">2</span>&#8221;</span> subdirectory. If this step fails, you need to
-go back to the fourth step and repeat it before you can try this one again. In this step, you need to choose a
-name for your driver. It is normally a good idea to use the same name as is used for the printer name;
-however, in big installations you may use this driver for a number of printers that obviously have different
-names, so the name of the driver is not fixed.
-</p></li><li class="step" title="Verify where the driver files are now."><p class="title"><b>Verify where the driver files are now.</b></p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>ls -l /etc/samba/drivers/W32X86/</code></strong>
-total 1
-drwxr-sr-x 2 root ntadmin 532 May 25 23:22 2
-drwxr-sr-x 2 root ntadmin 670 May 16 03:15 3
-
-<code class="prompt">root# </code><strong class="userinput"><code>ls -l /etc/samba/drivers/W32X86/2</code></strong>
-total 5039
-[....]
--rwxr--r-- 1 root ntadmin 14234 May 25 23:21 cups.hlp
--rwxr--r-- 1 root ntadmin 278380 May 13 13:53 cupsdrvr.dll
--rwxr--r-- 1 root ntadmin 215848 May 13 13:53 cupsui.dll
--rwxr--r-- 1 root ntadmin 169458 May 25 23:21 mysmbtstprn.PPD
-</pre><p>
-Notice how step 6 also moved the driver files to the appropriate
-subdirectory. Compare this with the situation after step 5.
-</p></li><li class="step" title="(Optional.) Verify if Samba now recognizes the driver."><p class="title"><b>(Optional.) Verify if Samba now recognizes the driver.</b></p><p>
-<a class="indexterm" name="id409675"></a>
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient -Uroot%xxxx -c 'enumdrivers 3' \
- localhost | grep -B2 -A5 mydrivername</code></strong>
-Printer Driver Info 3:
-Version: [2]
-Driver Name: [mydrivername]
-Architecture: [Windows NT x86]
-Driver Path: [\\kde-bitshop\print$\W32X86\2\cupsdrvr.dll]
-Datafile: [\\kde-bitshop\print$\W32X86\2\mysmbtstprn.PPD]
-Configfile: [\\kde-bitshop\print$\W32X86\2\cupsui.dll]
-Helpfile: [\\kde-bitshop\print$\W32X86\2\cups.hlp]
-</pre><p>
-Remember, this command greps for the name you chose for the
-driver in step 6. This command must succeed before you can proceed.
-</p></li><li class="step" title="Tell Samba which printer should use these driver files (setdriver)."><p class="title"><b>Tell Samba which printer should use these driver files (<code class="literal">setdriver</code>).</b></p><p>
-<a class="indexterm" name="id409725"></a>
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient -Uroot%xxxx -c 'setdriver mysmbtstprn mydrivername' \
- localhost</code></strong>
-Successfully set mysmbtstprn to driver mydrivername
-</pre><p>
-Since you can bind any printer name (print queue) to any driver, this is a convenient way to set up many
-queues that use the same driver. You do not need to repeat all the previous steps for the setdriver command to
-succeed. The only preconditions are that <code class="literal">enumdrivers</code> must find the driver and
-<code class="literal">enumprinters</code> must find the printer.
-</p></li><li class="step" title="(Optional) Verify if Samba has recognized this association."><p class="title"><b>(Optional) Verify if Samba has recognized this association.</b></p><p>
-<a class="indexterm" name="id409780"></a>
-<a class="indexterm" name="id409790"></a>
-<a class="indexterm" name="id409799"></a>
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2' localhost \
- | grep driver</code></strong>
-drivername:[mydrivername]
-
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient -Uroot%xxxx -c 'getprinter mysmbtstprn 2' localhost \
- | grep -C4 driv</code></strong>
-servername:[\\kde-bitshop]
-printername:[\\kde-bitshop\mysmbtstprn]
-sharename:[mysmbtstprn]
-portname:[Done]
-drivername:[mydrivername]
-comment:[mysmbtstprn]
-location:[]
-sepfile:[]
-printprocessor:[winprint]
-
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient -U root%xxxx -c 'getdriver mysmbtstprn' localhost</code></strong>
-[Windows NT x86]
-Printer Driver Info 3:
- Version: [2]
- Driver Name: [mydrivername]
- Architecture: [Windows NT x86]
- Driver Path: [\\kde-bitshop\print$\W32X86\2\cupsdrvr.dll]
- Datafile: [\\kde-bitshop\print$\W32X86\2\mysmbtstprn.PPD]
- Configfile: [\\kde-bitshop\print$\W32X86\2\cupsui.dll]
- Helpfile: [\\kde-bitshop\print$\W32X86\2\cups.hlp]
- Monitorname: []
- Defaultdatatype: [RAW]
- Monitorname: []
- Defaultdatatype: [RAW]
-
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient -Uroot%xxxx -c 'enumprinters' localhost \
- | grep mysmbtstprn</code></strong>
- name:[\\kde-bitshop\mysmbtstprn]
- description:[\\kde-bitshop\mysmbtstprn,mydrivername,mysmbtstprn]
- comment:[mysmbtstprn]
-
-</pre><p>
-<a class="indexterm" name="id409867"></a>
-Compare these results with the ones from steps 2 and 3. Every one of these commands show the driver is installed. Even
-the <code class="literal">enumprinters</code> command now lists the driver
-on the <span class="quote">&#8220;<span class="quote">description</span>&#8221;</span> line.
-</p></li><li class="step" title="(Optional.) Tickle the driver into a correct device mode."><p class="title"><b>(Optional.) Tickle the driver into a correct
-device mode.</b></p><p>
-<a class="indexterm" name="id409899"></a>
-You certainly know how to install the driver on the client. In case
-you are not particularly familiar with Windows, here is a short
-recipe: Browse the Network Neighborhood, go to the Samba server, and look
-for the shares. You should see all shared Samba printers.
-Double-click on the one in question. The driver should get
-installed and the network connection set up. Another way is to
-open the <span class="guilabel">Printers (and Faxes)</span> folder, right-click on the printer in
-question, and select <span class="guilabel">Connect</span> or <span class="guilabel">Install</span>. As a result, a new printer
-should appear in your client's local <span class="guilabel">Printers (and Faxes)</span>
-folder, named something like <span class="guilabel">printersharename on Sambahostname</span>.
-</p><p>
-It is important that you execute this step as a Samba printer admin
-(as defined in <code class="filename">smb.conf</code>). Here is another method
-to do this on Windows XP. It uses a command line, which you may type
-into the <span class="quote">&#8220;<span class="quote">DOS box</span>&#8221;</span> (type root's smbpassword when prompted):
-</p><pre class="screen">
-<code class="prompt">C:\&gt; </code><strong class="userinput"><code>runas /netonly /user:root "rundll32 printui.dll,PrintUIEntry \
- /in /n \\sambaserver\mysmbtstprn"</code></strong>
-</pre><p>
-Change any printer setting once (like changing <span class="emphasis"><em><span class="guilabel">portrait</span> to
-<span class="guilabel">landscape</span></em></span>), click on <span class="guibutton">Apply</span>, and change the setting back.
-</p></li><li class="step" title="Install the printer on a client (Point'n'Print)."><p class="title"><b>Install the printer on a client (Point'n'Print).</b></p><p>
-<a class="indexterm" name="id410008"></a>
-</p><pre class="screen">
-<code class="prompt">C:\&gt; </code><strong class="userinput"><code>rundll32 printui.dll,PrintUIEntry /in /n "\\sambaserver\mysmbtstprn"</code></strong>
-</pre><p>
-If it does not work, it could be a permissions problem with the <em class="parameter"><code>[print$]</code></em> share.
-</p></li><li class="step" title="(Optional) Print a test page."><p class="title"><b>(Optional) Print a test page.</b></p><a class="indexterm" name="id410048"></a><pre class="screen">
-<code class="prompt">C:\&gt; </code><strong class="userinput"><code>rundll32 printui.dll,PrintUIEntry /p /n "\\sambaserver\mysmbtstprn"</code></strong>
-</pre><p>
-Then hit [TAB] five times, [ENTER] twice, [TAB] once, and [ENTER] again, and march to the printer.
-</p></li><li class="step" title="(Recommended.) Study the test page."><p class="title"><b>(Recommended.) Study the test page.</b></p><p>
-Hmmm. Just kidding! By now you know everything about printer installations and you do not need to read a word.
-Just put it in a frame and bolt it to the wall with the heading "MY FIRST RPCCLIENT-INSTALLED PRINTER"
- why not just throw it away!
-</p></li><li class="step" title="(Obligatory.) Enjoy. Jump. Celebrate your success."><p class="title"><b>(Obligatory.) Enjoy. Jump. Celebrate your success.</b></p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>echo "Cheeeeerioooooo! Success..." &gt;&gt; /var/log/samba/log.smbd</code></strong>
-</pre></li></ol></div></div><div class="sect2" title="Troubleshooting Revisited"><div class="titlepage"><div><div><h3 class="title"><a name="id410123"></a>Troubleshooting Revisited</h3></div></div></div><p>
-<a class="indexterm" name="id410131"></a>
-The setdriver command will fail if in Samba's mind the queue is not
-already there. A successful installation displays the promising message that the:
-</p><pre class="screen">
-Printer Driver ABC successfully installed.
-</pre><p>
-following the <code class="literal">adddriver</code> parts of the procedure. But you may also see
-a disappointing message like this one:
-<code class="computeroutput">
-result was NT_STATUS_UNSUCCESSFUL
-</code></p><p>
-<a class="indexterm" name="id410160"></a>
-<a class="indexterm" name="id410167"></a>
-It is not good enough that you can see the queue in CUPS, using the <code class="literal">lpstat -p ir85wm</code>
-command. A bug in most recent versions of Samba prevents the proper update of the queue list. The recognition
-of newly installed CUPS printers fails unless you restart Samba or send a HUP to all smbd processes. To verify
-if this is the reason why Samba does not execute the <code class="literal">setdriver</code> command successfully, check
-if Samba <span class="quote">&#8220;<span class="quote">sees</span>&#8221;</span> the printer:
-<a class="indexterm" name="id410192"></a>
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient transmeta -N -U'root%xxxx' -c 'enumprinters 0'|grep ir85wm</code></strong>
- printername:[ir85wm]
-</pre><p>
-An alternate command could be this:
-<a class="indexterm" name="id410221"></a>
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>rpcclient transmeta -N -U'root%secret' -c 'getprinter ir85wm' </code></strong>
- cmd = getprinter ir85wm
- flags:[0x800000]
- name:[\\transmeta\ir85wm]
- description:[\\transmeta\ir85wm,ir85wm,DPD]
- comment:[CUPS PostScript-Treiber for Windows NT/200x/XP]
-</pre><p>
-By the way, you can use these commands, plus a few more, of course, to install drivers on remote Windows NT print servers too!
-</p></div></div><div class="sect1" title="The Printing *.tdb Files"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id410254"></a>The Printing <code class="filename">*.tdb</code> Files</h2></div></div></div><p>
-<a class="indexterm" name="id410268"></a>
-<a class="indexterm" name="id410275"></a>
-<a class="indexterm" name="id410284"></a>
-<a class="indexterm" name="id410293"></a>
-<a class="indexterm" name="id410302"></a>
-<a class="indexterm" name="id410310"></a>
-<a class="indexterm" name="id410319"></a>
-<a class="indexterm" name="id410328"></a>
-<a class="indexterm" name="id410337"></a>
-<a class="indexterm" name="id410346"></a>
-<a class="indexterm" name="id410355"></a>
-<a class="indexterm" name="id410364"></a>
-<a class="indexterm" name="id410373"></a>
-Some mystery is associated with the series of files with a tdb suffix appearing in every Samba installation.
-They are <code class="filename">connections.tdb</code>, <code class="filename">printing.tdb</code>,
-<code class="filename">share_info.tdb</code>, <code class="filename">ntdrivers.tdb</code>, <code class="filename">unexpected.tdb</code>,
-<code class="filename">brlock.tdb</code>, <code class="filename">locking.tdb</code>, <code class="filename">ntforms.tdb</code>,
-<code class="filename">messages.tdb</code> , <code class="filename">ntprinters.tdb</code>, <code class="filename">sessionid.tdb</code>,
-and <code class="filename">secrets.tdb</code>. What is their purpose?
-</p><div class="sect2" title="Trivial Database Files"><div class="titlepage"><div><div><h3 class="title"><a name="id410454"></a>Trivial Database Files</h3></div></div></div><p>
-<a class="indexterm" name="id410462"></a>
-A Windows NT (print) server keeps track of all information needed to serve its duty toward its clients by
-storing entries in the Windows registry. Client queries are answered by reading from the registry,
-Administrator or user configuration settings that are saved by writing into the registry. Samba and UNIX
-obviously do not have such a Registry. Samba instead keeps track of all client-related information in a series
-of <code class="filename">*.tdb</code> files. (TDB stands for trivial data base). These are often located in
-<code class="filename">/var/lib/samba/</code> or <code class="filename">/var/lock/samba/</code>. The printing-related files are
-<code class="filename">ntprinters.tdb</code>, <code class="filename">printing.tdb</code>,<code class="filename">ntforms.tdb</code>, and
-<code class="filename">ntdrivers.tdb</code>.
-</p></div><div class="sect2" title="Binary Format"><div class="titlepage"><div><div><h3 class="title"><a name="id410516"></a>Binary Format</h3></div></div></div><p>
-<code class="filename">*.tdb</code> files are not human readable. They are written in a binary format. <span class="quote">&#8220;<span class="quote">Why not
-ASCII?</span>&#8221;</span>, you may ask. <span class="quote">&#8220;<span class="quote">After all, ASCII configuration files are a good and proven tradition on
-UNIX.</span>&#8221;</span> The reason for this design decision by the Samba Team is mainly performance. Samba needs to be
-fast; it runs a separate <code class="literal">smbd</code> process for each client connection, in some environments many
-thousands of them. Some of these <code class="literal">smbds</code> might need to write-access the same
-<code class="filename">*.tdb</code> file <span class="emphasis"><em>at the same time</em></span>. The file format of Samba's
-<code class="filename">*.tdb</code> files allows for this provision. Many smbd processes may write to the same
-<code class="filename">*.tdb</code> file at the same time. This wouldn't be possible with pure ASCII files.
-</p></div><div class="sect2" title="Losing *.tdb Files"><div class="titlepage"><div><div><h3 class="title"><a name="id410577"></a>Losing <code class="filename">*.tdb</code> Files</h3></div></div></div><p>
-It is very important that all <code class="filename">*.tdb</code> files remain consistent over all write and read
-accesses. However, it may happen that these files <span class="emphasis"><em>do</em></span> get corrupted. (A <code class="literal">kill -9
-`pidof smbd'</code> while a write access is in progress could do the damage, as could a power interruption,
-etc.). In cases of trouble, a deletion of the old printing-related <code class="filename">*.tdb</code> files may be the
-only option. After that, you need to re-create all print-related setups unless you have made a backup of the
-<code class="filename">*.tdb</code> files in time.
-</p></div><div class="sect2" title="Using tdbbackup"><div class="titlepage"><div><div><h3 class="title"><a name="id410623"></a>Using <code class="literal">tdbbackup</code></h3></div></div></div><p>
-<a class="indexterm" name="id410636"></a>
-<a class="indexterm" name="id410647"></a>
-Samba ships with a little utility that helps the root user of your system to backup your
-<code class="filename">*.tdb</code> files. If you run it with no argument, it prints a usage message:
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>tdbbackup</code></strong>
- Usage: tdbbackup [options] &lt;fname...&gt;
-
- Version:3.0a
- -h this help message
- -s suffix set the backup suffix
- -v verify mode (restore if corrupt)
-</pre><p>
-Here is how I backed up my <code class="filename">printing.tdb</code> file:
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>ls</code></strong>
-. browse.dat locking.tdb ntdrivers.tdb printing.tdb
-.. share_info.tdb connections.tdb messages.tdb ntforms.tdb
-printing.tdbkp unexpected.tdb brlock.tdb gmon.out namelist.debug
-ntprinters.tdb sessionid.tdb
-
-<code class="prompt">root# </code><strong class="userinput"><code>tdbbackup -s .bak printing.tdb</code></strong>
- printing.tdb : 135 records
-
-<code class="prompt">root# </code><strong class="userinput"><code>ls -l printing.tdb*</code></strong>
- -rw------- 1 root root 40960 May 2 03:44 printing.tdb
- -rw------- 1 root root 40960 May 2 03:44 printing.tdb.bak
-
-</pre></div></div><div class="sect1" title="CUPS Print Drivers from Linuxprinting.org"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id410734"></a>CUPS Print Drivers from Linuxprinting.org</h2></div></div></div><p>
-<a class="indexterm" name="id410742"></a>
-CUPS ships with good support for HP LaserJet-type printers. You can install the generic driver as follows:
-<a class="indexterm" name="id410750"></a>
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>lpadmin -p laserjet4plus -v parallel:/dev/lp0 -E -m laserjet.ppd</code></strong>
-</pre><p>
-The <code class="option">-m</code> switch will retrieve the <code class="filename">laserjet.ppd</code> from the standard
-repository for not-yet-installed PPDs, which CUPS typically stores in
-<code class="filename">/usr/share/cups/model</code>. Alternatively, you may use <code class="option">-P /path/to/your.ppd</code>.
-</p><p>
-The generic <code class="filename">laserjet.ppd,</code> however, does not support every special option for every
-LaserJet-compatible model. It constitutes a sort of <span class="quote">&#8220;<span class="quote">least common denominator</span>&#8221;</span> of all the models.
-If for some reason you must pay for the commercially available ESP Print Pro drivers, your first move should
-be to consult the database on the <a class="ulink" href="http://www.linuxprinting.org/printer_list.cgi" target="_top">Linuxprinting</a> Web site. Linuxprinting.org has
-excellent recommendations about which driver is best used for each printer. Its database is kept current by
-the tireless work of Till Kamppeter from Mandrakesoft, who is also the principal author of the
-<code class="literal">foomatic-rip</code> utility.
-</p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
-<a class="indexterm" name="id410831"></a>
-<a class="indexterm" name="id410838"></a>
-<a class="indexterm" name="id410845"></a>
-The former <code class="literal">cupsomatic</code> concept is now being replaced by the new successor, a much more
-powerful <code class="literal">foomatic-rip</code>. <code class="literal">cupsomatic</code> is no longer maintained. Here is the
-new URL to the <a class="ulink" href="http://www.linuxprinting.org/driver_list.cgi" target="_top">Foomatic-3.0</a>
-database. If you upgrade to <code class="literal">foomatic-rip</code>, remember to also upgrade to the new-style PPDs
-for your Foomatic-driven printers. foomatic-rip will not work with PPDs generated for the old
-<code class="literal">cupsomatic</code>. The new-style PPDs are 100% compliant with the Adobe PPD specification. They
-are also intended to be used by Samba and the cupsaddsmb utility, to provide the driver files for the Windows
-clients!
-</p></div><div class="sect2" title="foomatic-rip and Foomatic Explained"><div class="titlepage"><div><div><h3 class="title"><a name="id410895"></a>foomatic-rip and Foomatic Explained</h3></div></div></div><p>
-<a class="indexterm" name="id410903"></a>
-<a class="indexterm" name="id410909"></a>
-Nowadays, most Linux distributions rely on the utilities from the <a class="ulink" href="http://www.linuxprinting.org/" target="_top">Linuxprinting.org</a> to create their printing-related software
-(which, by the way, works on all UNIXes and on Mac OS X and Darwin, too). The utilities from this sire have a
-very end-user-friendly interface that allows for an easy update of drivers and PPDs for all supported models,
-all spoolers, all operating systems, and all package formats (because there is none). Its history goes back a
-few years.
-</p><p>
-Recently, Foomatic has achieved the astonishing milestone of <a class="ulink" href="http://www.linuxprinting.org/printer_list.cgi?make=Anyone" target="_top">1,000 listed</a> printer models.
-Linuxprinting.org keeps all the important facts about printer drivers, supported models, and which options are
-available for the various driver/printer combinations in its <a class="ulink" href="http://www.linuxprinting.org/foomatic.html" target="_top">Foomatic</a> database. Currently there are <a class="ulink" href="http://www.linuxprinting.org/driver_list.cgi" target="_top">245 drivers</a> in the database. Many drivers support
-various models, and many models may be driven by different drivers its your choice!
-</p><div class="sect3" title="690 &#8220;Perfect&#8221; Printers"><div class="titlepage"><div><div><h4 class="title"><a name="id410956"></a>690 <span class="quote">&#8220;<span class="quote">Perfect</span>&#8221;</span> Printers</h4></div></div></div><p>
-<a class="indexterm" name="id410967"></a>
-At present, there are 690 devices dubbed as working perfectly: 181 are <span class="emphasis"><em>mostly</em></span> perfect, 96
-are <span class="emphasis"><em>partially</em></span> perfect, and 46 are paperweights. Keeping in mind that most of these are
-non-PostScript models (PostScript printers are automatically supported by CUPS to perfection by using their
-own manufacturer-provided Windows PPD), and that a multifunctional device never qualifies as working perfectly
-if it does not also scan and copy and fax under GNU/Linux then this is a truly astonishing
-achievement! Three years ago the number was not more than 500, and Linux or UNIX printing at the time wasn't
-anywhere near the quality it is today.
-</p></div><div class="sect3" title="How the Printing HOWTO Started It All"><div class="titlepage"><div><div><h4 class="title"><a name="id410991"></a>How the Printing HOWTO Started It All</h4></div></div></div><p>
-A few years ago <a class="ulink" href="http://www2.picante.com/" target="_top">Grant Taylor</a> started it all. The
-roots of today's Linuxprinting.org are in the first <a class="ulink" href="http://www.linuxprinting.org/foomatic2.9/howto/" target="_top">Linux Printing HOWTO</a> that he authored. As a
-side-project to this document, which served many Linux users and admins to guide their first steps in this
-complicated and delicate setup (to a scientist, printing is <span class="quote">&#8220;<span class="quote">applying a structured deposition of
-distinct patterns of ink or toner particles on paper substrates</span>&#8221;</span>), he started to build in a little
-Postgres database with information about the hardware and driver zoo that made up Linux printing of the time.
-This database became the core component of today's Foomatic collection of tools and data. In the meantime, it
-has moved to an XML representation of the data.
-</p></div><div class="sect3" title="Foomatic's Strange Name"><div class="titlepage"><div><div><h4 class="title"><a name="id411022"></a>Foomatic's Strange Name</h4></div></div></div><p>
-<a class="indexterm" name="id411030"></a>
-<span class="quote">&#8220;<span class="quote">Why the funny name?</span>&#8221;</span> you ask. When it really took off, around spring 2000, CUPS was far less
-popular than today, and most systems used LPD, LPRng, or even PDQ to print. CUPS shipped with a few generic
-drivers (good for a few hundred different printer models). These didn't support many device-specific options.
-CUPS also shipped with its own built-in rasterization filter (<em class="parameter"><code>pstoraster</code></em>, derived from
-Ghostscript). On the other hand, CUPS provided brilliant support for <span class="emphasis"><em>controlling</em></span> all
-printer options through standardized and well-defined PPD files. Plus, CUPS was designed to be easily
-extensible.
-</p><p>
-Taylor already had in his database a respectable compilation of facts about many more printers and the
-Ghostscript <span class="quote">&#8220;<span class="quote">drivers</span>&#8221;</span> they run with. His idea, to generate PPDs from the database information and
-use them to make standard Ghostscript filters work within CUPS, proved to work very well. It also killed
-several birds with one stone:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>It made all current and future Ghostscript filter
- developments available for CUPS.</p></li><li class="listitem"><p>It made available a lot of additional printer models
- to CUPS users (because often the traditional Ghostscript way of
- printing was the only one available).</p></li><li class="listitem"><p>It gave all the advanced CUPS options (Web interface,
- GUI driver configurations) to users wanting (or needing) to use
- Ghostscript filters.</p></li></ul></div></div><div class="sect3" title="cupsomatic, pdqomatic, lpdomatic, directomatic"><div class="titlepage"><div><div><h4 class="title"><a name="id411086"></a>cupsomatic, pdqomatic, lpdomatic, directomatic</h4></div></div></div><p>
-<a class="indexterm" name="id411094"></a>
-<a class="indexterm" name="id411100"></a>
-<a class="indexterm" name="id411107"></a>
-CUPS worked through a quickly hacked-up filter script named <a class="ulink" href="http://www.linuxprinting.org/download.cgi?filename=cupsomatic&amp;show=0" target="_top">cupsomatic</a>. cupsomatic
-ran the printfile through Ghostscript, constructing automatically the rather complicated command line needed.
-It just needed to be copied into the CUPS system to make it work. To configure the way cupsomatic controls the
-Ghostscript rendering process, it needs a CUPS-PPD. This PPD is generated directly from the contents of the
-database. For CUPS and the respective printer/filter combo, another Perl script named CUPS-O-Matic did the PPD
-generation. After that was working, Taylor implemented within a few days a similar thing for two other
-spoolers. Names chosen for the config-generator scripts were <a class="ulink" href="http://www.linuxprinting.org/download.cgi?filename=lpdomatic&amp;show=0" target="_top">PDQ-O-Matic</a> (for PDQ)
-and <a class="ulink" href="http://www.linuxprinting.org/download.cgi?filename=lpdomatic&amp;show=0" target="_top">LPD-O-Matic</a>
-(for you guessed it LPD); the configuration here didn't use PPDs but other
-spooler-specific files.
-</p><p>
-From late summer of that year, <a class="ulink" href="http://www.linuxprinting.org/till/" target="_top">Till Kamppeter</a> started
-to put work into the database. Kamppeter had been newly employed by <a class="ulink" href="http://www.mandrakesoft.com/" target="_top">Mandrakesoft</a> to convert its printing system over to CUPS, after
-they had seen his <a class="ulink" href="http://www.fltk.org/" target="_top">FLTK</a>-based <a class="ulink" href="http://cups.sourceforge.net/xpp/" target="_top">XPP</a> (a GUI front-end to the CUPS lp-command). He added a huge
-amount of new information and new printers. He also developed the support for other spoolers, like <a class="ulink" href="http://ppr.sourceforge.net/" target="_top">PPR</a> (via ppromatic), <a class="ulink" href="http://sourceforge.net/projects/lpr/" target="_top">GNUlpr</a>, and <a class="ulink" href="http://www.lprng.org/" target="_top">LPRng</a> (both via an extended lpdomatic) and spooler-less printing (<a class="ulink" href="http://www.linuxprinting.org/download.cgi?filename=directomatic&amp;show=0" target="_top">directomatic</a>).
-</p><p>
-So, to answer your question, <span class="quote">&#8220;<span class="quote">Foomatic</span>&#8221;</span> is the general name for all the overlapping code and data
-behind the <span class="quote">&#8220;<span class="quote">*omatic</span>&#8221;</span> scripts. Foomatic, up to versions 2.0.x, required (ugly) Perl data
-structures attached to Linuxprinting.org PPDs for CUPS. It had a different <span class="quote">&#8220;<span class="quote">*omatic</span>&#8221;</span> script for
-every spooler, as well as different printer configuration files.
-</p></div><div class="sect3" title="The Grand Unification Achieved"><div class="titlepage"><div><div><h4 class="title"><a name="id411224"></a>The <span class="emphasis"><em>Grand Unification</em></span> Achieved</h4></div></div></div><p>
-<a class="indexterm" name="id411235"></a>
-This has all changed in Foomatic versions 2.9 (beta) and released as <span class="quote">&#8220;<span class="quote">stable</span>&#8221;</span> 3.0. It has now
-achieved the convergence of all *omatic scripts and is called the <a class="ulink" href="http://www.linuxprinting.org/foomatic2.9/download.cgi?filename=foomatic-rip&amp;show=0" target="_top">foomatic-rip</a>.
-This single script is the unification of the previously different spooler-specific *omatic scripts.
-foomatic-rip is used by all the different spoolers alike, and because it can read PPDs (both the original
-PostScript printer PPDs and the Linuxprinting.org-generated ones), all of a sudden all supported spoolers can
-have the power of PPDs at their disposal. Users only need to plug foomatic-rip into their system. For users
-there is improved media type and source support paper sizes and trays are easier to configure.
-</p><p>
-<a class="indexterm" name="id411264"></a>
-<a class="indexterm" name="id411270"></a>
-<a class="indexterm" name="id411276"></a>
-Also, the new generation of Linuxprinting.org PPDs no longer contains Perl data structures. If you are a
-distro maintainer and have used the previous version of Foomatic, you may want to give the new one a spin, but
-remember to generate a new-version set of PPDs via the new <a class="ulink" href="http://www.linuxprinting.org/download/foomatic/foomatic-db-engine-3.0.0beta1.tar.gz" target="_top">foomatic-db-engine!</a>.
-Individual users just need to generate a single new PPD specific to their model by <a class="ulink" href="http://www.linuxprinting.org/kpfeifle/LinuxKongress2002/Tutorial/II.Foomatic-User/II.tutorial-handout-foomatic-user.html" target="_top">following
-the steps</a> outlined in the Foomatic tutorial or in this chapter. This new development is truly amazing.
-</p><p>
-<a class="indexterm" name="id411303"></a>
-<a class="indexterm" name="id411310"></a>
-<a class="indexterm" name="id411317"></a>
-foomatic-rip is a very clever wrapper around the need to run Ghostscript with a different syntax, options,
-device selections, and/or filters for each different printer or spooler. At the same time, it can read the PPD
-associated with a print queue and modify the print job according to the user selections. Together with this
-comes the 100% compliance of the new Foomatic PPDs with the Adobe spec. Some innovative features of the
-Foomatic concept may surprise users. It will support custom paper sizes for many printers and will support
-printing on media drawn from different paper trays within the same job (in both cases, even where there is no
-support for this from Windows-based vendor printer drivers).
-</p></div><div class="sect3" title="Driver Development Outside"><div class="titlepage"><div><div><h4 class="title"><a name="id411332"></a>Driver Development Outside</h4></div></div></div><p>
-<a class="indexterm" name="id411340"></a>
-Most driver development itself does not happen within Linuxprinting.org. Drivers are written by independent
-maintainers. Linuxprinting.org just pools all the information and stores it in its database. In addition, it
-also provides the Foomatic glue to integrate the many drivers into any modern (or legacy) printing system
-known to the world.
-</p><p>
-Speaking of the different driver development groups, most of the work is currently done in three projects:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
-<a class="indexterm" name="id411360"></a>
- <a class="ulink" href="http://www-124.ibm.com/developerworks/oss/linux/projects/omni/" target="_top">Omni</a>
- a free software project by IBM that tries to convert its printer
- driver knowledge from good-ol' OS/2 times into a modern, modular,
- universal driver architecture for Linux/UNIX (still beta). This
- currently supports 437 models.</p></li><li class="listitem"><p>
-<a class="indexterm" name="id411383"></a>
- <a class="ulink" href="http://hpinkjet.sf.net/" target="_top">HPIJS</a>
- a free software project by HP to provide the support for its own
- range of models (very mature, printing in most cases is perfect and
- provides true photo quality). This currently supports 369
- models.</p></li><li class="listitem"><p>
-<a class="indexterm" name="id411404"></a>
- <a class="ulink" href="http://gimp-print.sourceforge.net/" target="_top">Gutenprint</a> a free software
- effort, started by Michael Sweet (also lead developer for CUPS), now
- directed by Robert Krawitz, which has achieved an amazing level of
- photo print quality (many Epson users swear that its quality is
- better than the vendor drivers provided by Epson for the Microsoft
- platforms). This currently supports 522 models.</p></li></ul></div></div><div class="sect3" title="Forums, Downloads, Tutorials, Howtos (Also for Mac OS X and Commercial UNIX)"><div class="titlepage"><div><div><h4 class="title"><a name="id411425"></a>Forums, Downloads, Tutorials, Howtos (Also for Mac OS X and Commercial UNIX)</h4></div></div></div><p>
-Linuxprinting.org today is the one-stop shop to download printer drivers. Look for printer information and
-<a class="ulink" href="http://www.linuxprinting.org//kpfeifle/LinuxKongress2002/Tutorial/" target="_top">tutorials</a> or solve
-printing problems in its popular <a class="ulink" href="http://www.linuxprinting.org/newsportal/" target="_top">forums</a>. This
-forum is not just for GNU/Linux users, but admins of <a class="ulink" href="http://www.linuxprinting.org/macosx/" target="_top">
-commercial UNIX systems</a> are also going there, and the relatively new
-<a class="ulink" href="http://www.linuxprinting.org/newsportal/thread.php3?name=linuxprinting.macosx.general" target="_top">Mac OS X
-forum</a> has turned out to be one of the most frequented forums after only a few weeks.
-</p><p>
-<a class="indexterm" name="id411464"></a>
-<a class="indexterm" name="id411470"></a>
-<a class="indexterm" name="id411477"></a>
-Linuxprinting.org and the Foomatic driver wrappers around Ghostscript are now a standard tool-chain for
-printing on all the important distros. Most of them also have CUPS underneath. While in recent years most
-printer data had been added by Kamppeter, many additional contributions came from engineers with SuSE, Red
-Hat, Conectiva, Debian, and others. Vendor-neutrality is an important goal of the Foomatic project. Mandrake
-and Conectiva have merged and are now called Mandriva.
-</p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
-Till Kamppeter from Mandrakesoft is doing an excellent job in his spare time to maintain Linuxprinting.org and
-Foomatic. So if you use it often, please send him a note showing your appreciation.
-</p></div></div><div class="sect3" title="Foomatic Database-Generated PPDs"><div class="titlepage"><div><div><h4 class="title"><a name="id411496"></a>Foomatic Database-Generated PPDs</h4></div></div></div><p>
-<a class="indexterm" name="id411504"></a>
-<a class="indexterm" name="id411511"></a>
-<a class="indexterm" name="id411518"></a>
-<a class="indexterm" name="id411525"></a>
-<a class="indexterm" name="id411531"></a>
-<a class="indexterm" name="id411538"></a>
-<a class="indexterm" name="id411545"></a>
-<a class="indexterm" name="id411552"></a>
-<a class="indexterm" name="id411558"></a>
-The Foomatic database is an amazing piece of ingenuity in itself. Not only does it keep the printer and driver
-information, but it is organized in a way that it can generate PPD files on the fly from its internal
-XML-based datasets. While these PPDs are modeled to the Adobe specification of PPDs, the
-Linuxprinting.org/Foomatic-PPDs do not normally drive PostScript printers. They are used to describe all the
-bells and whistles you could ring or blow on an Epson Stylus inkjet, or an HP Photosmart, or what-have-you.
-The main trick is one little additional line, not envisaged by the PPD specification, starting with the
-<em class="parameter"><code>*cupsFilter</code></em> keyword. It tells the CUPS daemon how to proceed with the PostScript print
-file (old-style Foomatic-PPDs named the cupsomatic filter script, while the new-style PPDs are now call
-foomatic-rip). This filter script calls Ghostscript on the host system (the recommended variant is ESP
-Ghostscript) to do the rendering work. foomatic-rip knows which filter or internal device setting it should
-ask from Ghostscript to convert the PostScript print job into a raster format ready for the target device.
-This usage of PPDs to describe the options of non-PostScript printers was the invention of the CUPS
-developers. The rest is easy. GUI tools (like KDE's marvelous <a class="ulink" href="http://printing.kde.org/overview/kprinter.phtml" target="_top">kprinter</a> or the GNOME <a class="ulink" href="http://gtklp.sourceforge.net/" target="_top">gtklp</a> xpp and the CUPS Web interface) read the PPD as well and use
-this information to present the available settings to the user as an intuitive menu selection.
-</p></div></div><div class="sect2" title="foomatic-rip and Foomatic PPD Download and Installation"><div class="titlepage"><div><div><h3 class="title"><a name="id411599"></a>foomatic-rip and Foomatic PPD Download and Installation</h3></div></div></div><p>
-Here are the steps to install a foomatic-rip-driven LaserJet 4 Plus-compatible
-printer in CUPS (note that recent distributions of SuSE, UnitedLinux and
-Mandrake may ship with a complete package of Foomatic-PPDs plus the
-<code class="literal">foomatic-rip</code> utility. Going directly to
-Linuxprinting.org ensures that you get the latest driver/PPD files).
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Open your browser at the Linuxprinting.org printer list <a class="ulink" href="http://www.linuxprinting.org/printer_list.cgi" target="_top">page.</a>
- </p></li><li class="listitem"><p>Check the complete list of printers in the
- <a class="ulink" href="http://www.linuxprinting.org/printer_list.cgi?make=Anyone" target="_top">database.</a>.
- </p></li><li class="listitem"><p>Select your model and click on the link.
- </p></li><li class="listitem"><p>You'll arrive at a page listing all drivers working with this
- model (for all printers, there will always be <span class="emphasis"><em>one</em></span>
- recommended driver. Try this one first).
- </p></li><li class="listitem"><p>In our case (HP LaserJet 4 Plus), we'll arrive at the default driver for the
- <a class="ulink" href="http://www.linuxprinting.org/show_printer.cgi?recnum=HP-LaserJet_4_Plus" target="_top">HP-LaserJet 4 Plus.</a>
- </p></li><li class="listitem"><p>The recommended driver is ljet4.</p></li><li class="listitem"><p>Several links are provided here. You should visit them all if you
- are not familiar with the Linuxprinting.org database.
- </p></li><li class="listitem"><p>There is a link to the database page for the
- <a class="ulink" href="http://www.linuxprinting.org/show_driver.cgi?driver=ljet4" target="_top">ljet4</a>.
- On the driver's page, you'll find important and detailed information
- about how to use that driver within the various available
- spoolers.</p></li><li class="listitem"><p>Another link may lead you to the home page of the
- author of the driver.</p></li><li class="listitem"><p>Important links are the ones that provide hints with
- setup instructions for <a class="ulink" href="http://www.linuxprinting.org/cups-doc.html" target="_top">CUPS</a>;
- <a class="ulink" href="http://www.linuxprinting.org/pdq-doc.html" target="_top">PDQ</a>;
- <a class="ulink" href="http://www.linuxprinting.org/lpd-doc.html" target="_top">LPD, LPRng, and GNUlpr</a>);
- as well as <a class="ulink" href="http://www.linuxprinting.org/ppr-doc.html" target="_top">PPR</a>
- or <span class="quote">&#8220;<span class="quote">spoolerless</span>&#8221;</span> <a class="ulink" href="http://www.linuxprinting.org/direct-doc.html" target="_top">printing</a>.
- </p></li><li class="listitem"><p>You can view the PPD in your browser through this link:
- <a class="ulink" href="http://www.linuxprinting.org/ppd-o-matic.cgi?driver=ljet4&amp;printer=HP-LaserJet_4_Plus&amp;show=1" target="_top">http://www.linuxprinting.org/ppd-o-matic.cgi?driver=ljet4&amp;printer=HP-LaserJet_4_Plus&amp;show=1</a>
- </p></li><li class="listitem"><p>Most importantly, you can also generate and download
- the <a class="ulink" href="http://www.linuxprinting.org/ppd-o-matic.cgi?driver=ljet4&amp;printer=HP-LaserJet_4_Plus&amp;show=0" target="_top">PPD</a>.
- </p></li><li class="listitem"><p>The PPD contains all the information needed to use our
- model and the driver; once installed, this works transparently
- for the user. Later you'll only need to choose resolution, paper size,
- and so on, from the Web-based menu, or from the print dialog GUI, or from
- the command line.</p></li><li class="listitem"><p>If you ended up on the drivers
- <a class="ulink" href="http://www.linuxprinting.org/show_driver.cgi?driver=ljet4" target="_top">page</a>,
- you can choose to use the <span class="quote">&#8220;<span class="quote">PPD-O-Matic</span>&#8221;</span> online PPD generator
- program.</p></li><li class="listitem"><p>Select the exact model and check either <span class="guilabel">Download</span> or
- <span class="guilabel">Display PPD file</span> and click <span class="guilabel">Generate PPD file</span>.</p></li><li class="listitem"><p>If you save the PPD file from the browser view, please
- do not use cut and paste (since it could possibly damage line endings
- and tabs, which makes the PPD likely to fail its duty), but use <span class="guimenuitem">Save
- as...</span> in your browser's menu. (It is best to use the <span class="guilabel">Download</span> option
- directly from the Web page.)</p></li><li class="listitem"><p>Another interesting part on each driver page is
- the <span class="guimenuitem">Show execution details</span> button. If you
- select your printer model and click on that button,
- a complete Ghostscript command line will be displayed, enumerating all options
- available for that combination of driver and printer model. This is a great way to
- <span class="quote">&#8220;<span class="quote">learn Ghostscript by doing</span>&#8221;</span>. It is also an excellent cheat sheet
- for all experienced users who need to reconstruct a good command line
- for that darned printing script, but can't remember the exact
- syntax. </p></li><li class="listitem"><p>Sometime during your visit to Linuxprinting.org, save
- the PPD to a suitable place on your hard disk, say
- <code class="filename">/path/to/my-printer.ppd</code> (if you prefer to install
- your printers with the help of the CUPS Web interface, save the PPD to
- the <code class="filename">/usr/share/cups/model/</code> path and restart
- cupsd).</p></li><li class="listitem"><p>Then install the printer with a suitable command line,
- like this:
- </p><pre class="screen">
- <code class="prompt">root# </code><strong class="userinput"><code>lpadmin -p laserjet4plus -v parallel:/dev/lp0 -E \
- -P path/to/my-printer.ppd</code></strong>
- </pre></li><li class="listitem"><p>For all the new-style <span class="quote">&#8220;<span class="quote">Foomatic-PPDs</span>&#8221;</span>
- from Linuxprinting.org, you also need a special CUPS filter named
- foomatic-rip.
- </p></li><li class="listitem"><p>The foomatic-rip Perl script itself also makes some
- interesting <a class="ulink" href="http://www.linuxprinting.org/foomatic2.9/download.cgi?filename=foomatic-rip&amp;show=1" target="_top">reading</a>
- because it is well documented by Kamppeter's in-line comments (even
- non-Perl hackers will learn quite a bit about printing by reading
- it).</p></li><li class="listitem"><p>Save foomatic-rip either directly in
- <code class="filename">/usr/lib/cups/filter/foomatic-rip</code> or somewhere in
- your $PATH (and remember to make it world-executable). Again,
- do not save by copy and paste but use the appropriate link or the
- <span class="guimenuitem">Save as...</span> menu item in your browser.</p></li><li class="listitem"><p>If you save foomatic-rip in your $PATH, create a symlink:
- </p><pre class="screen">
- <code class="prompt">root# </code><strong class="userinput"><code>cd /usr/lib/cups/filter/ ; ln -s `which foomatic-rip'</code></strong>
- </pre><p>
- </p><p>
- CUPS will discover this new available filter at startup after restarting
- cupsd.</p></li></ul></div><p>
-Once you print to a print queue set up with the Foomatic PPD, CUPS will insert the appropriate commands and
-comments into the resulting PostScript job file. foomatic-rip is able to read and act upon these and uses some
-specially encoded Foomatic comments embedded in the job file. These in turn are used to construct
-(transparently for you, the user) the complicated Ghostscript command line telling the printer driver exactly
-how the resulting raster data should look and which printer commands to embed into the data stream. You need:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>A <span class="quote">&#8220;<span class="quote">foomatic+something</span>&#8221;</span> PPD but this is not enough
- to print with CUPS (it is only <span class="emphasis"><em>one</em></span> important
- component).</p></li><li class="listitem"><p>The <em class="parameter"><code>foomatic-rip</code></em> filter script (Perl) in
- <code class="filename">/usr/lib/cups/filters/</code>.</p></li><li class="listitem"><p>Perl to make foomatic-rip run.</p></li><li class="listitem"><p>Ghostscript (because it is doing the main work,
- controlled by the PPD/foomatic-rip combo) to produce the raster data
- fit for your printer model's consumption.</p></li><li class="listitem"><p>Ghostscript <span class="emphasis"><em>must</em></span> (depending on
- the driver/model) contain support for a certain device representing
- the selected driver for your model (as shown by <code class="literal">gs -h</code>).</p></li><li class="listitem"><p>foomatic-rip needs a new version of PPDs (PPD versions
- produced for cupsomatic do not work with foomatic-rip).</p></li></ul></div></div></div><div class="sect1" title="Page Accounting with CUPS"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id412022"></a>Page Accounting with CUPS</h2></div></div></div><p>
-<a class="indexterm" name="id412030"></a>
-Often there are questions regarding print quotas where Samba users (that is, Windows clients) should not be
-able to print beyond a certain number of pages or data volume per day, week, or month. This feature is
-dependent on the real print subsystem you're using. Samba's part is always to receive the job files from the
-clients (filtered <span class="emphasis"><em>or</em></span> unfiltered) and hand them over to this printing subsystem.
-</p><p>
-Of course one could hack things with one's own scripts. But then there is CUPS. CUPS supports quotas that can
-be based on the size of jobs or on the number of pages or both, and can span any time period you want.
-</p><div class="sect2" title="Setting Up Quotas"><div class="titlepage"><div><div><h3 class="title"><a name="id412052"></a>Setting Up Quotas</h3></div></div></div><p>
-<a class="indexterm" name="id412060"></a>
-This is an example command of how root would set a print quota in CUPS, assuming an existing printer named
-<span class="quote">&#8220;<span class="quote">quotaprinter</span>&#8221;</span>:
-<a class="indexterm" name="id412073"></a>
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>lpadmin -p quotaprinter -o job-quota-period=604800 \
- -o job-k-limit=1024 -o job-page-limit=100</code></strong>
-</pre><p>
-This would limit every single user to print no more than 100 pages or 1024 KB of
-data (whichever comes first) within the last 604,800 seconds ( = 1 week).
-</p></div><div class="sect2" title="Correct and Incorrect Accounting"><div class="titlepage"><div><div><h3 class="title"><a name="id412102"></a>Correct and Incorrect Accounting</h3></div></div></div><p>
-For CUPS to count correctly, the printfile needs to pass the CUPS pstops filter; otherwise it uses a dummy
-count of <span class="quote">&#8220;<span class="quote">one</span>&#8221;</span>. Some print files do not pass it (e.g., image files), but then those are mostly
-one-page jobs anyway. This also means that proprietary drivers for the target printer running on the client
-computers and CUPS/Samba, which then spool these files as <span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span> (i.e., leaving them untouched,
-not filtering them), will be counted as one-pagers too!
-</p><p>
-You need to send PostScript from the clients (i.e., run a PostScript driver there) to have the chance to get
-accounting done. If the printer is a non-PostScript model, you need to let CUPS do the job to convert the file
-to a print-ready format for the target printer. This is currently working for about a thousand different
-printer models. Linuxprinting.org has a driver <a class="ulink" href="http://www.linuxprinting.org/printer_list.cgi" target="_top">list</a>.
-</p></div><div class="sect2" title="Adobe and CUPS PostScript Drivers for Windows Clients"><div class="titlepage"><div><div><h3 class="title"><a name="id412135"></a>Adobe and CUPS PostScript Drivers for Windows Clients</h3></div></div></div><p>
-<a class="indexterm" name="id412143"></a>
-<a class="indexterm" name="id412150"></a>
-<a class="indexterm" name="id412157"></a>
-<a class="indexterm" name="id412164"></a>
-<a class="indexterm" name="id412170"></a>
-Before CUPS 1.1.16, your only option was to use the Adobe PostScript driver on the Windows clients. The output
-of this driver was not always passed through the <code class="literal">pstops</code> filter on the CUPS/Samba side, and
-therefore was not counted correctly (the reason is that it often, depending on the PPD being used, wrote a
-PJL-header in front of the real PostScript, which caused CUPS to skip <code class="literal">pstops</code> and go
-directly to the <code class="literal">pstoraster</code> stage).
-</p><p>
-From CUPS 1.1.16 and later releases, you can use the CUPS PostScript driver for Windows NT/200x/XP
-clients (which is tagged in the download area of <code class="filename">http://www.cups.org/</code> as the
-<code class="filename">cups-samba-1.1.16.tar.gz</code> package). It does <span class="emphasis"><em>not</em></span> work for Windows
-9x/Me clients, but it guarantees:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p> <a class="indexterm" name="id412225"></a> To not write a PJL-header.</p></li><li class="listitem"><p>To still read and support all PJL-options named in the
- driver PPD with its own means.</p></li><li class="listitem"><p>That the file will pass through the <code class="literal">pstops</code> filter
- on the CUPS/Samba server.</p></li><li class="listitem"><p>To page-count correctly the print file.</p></li></ul></div><p>
-You can read more about the setup of this combination in the man page for <code class="literal">cupsaddsmb</code> (which
-is only present with CUPS installed, and only current from CUPS 1.1.16).
-</p></div><div class="sect2" title="The page_log File Syntax"><div class="titlepage"><div><div><h3 class="title"><a name="id412266"></a>The page_log File Syntax</h3></div></div></div><p>
-<a class="indexterm" name="id412274"></a>
-These are the items CUPS logs in the <code class="filename">page_log</code> for every page of a job:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Printer name</p></li><li class="listitem"><p>User name</p></li><li class="listitem"><p>Job ID</p></li><li class="listitem"><p>Time of printing</p></li><li class="listitem"><p>Page number</p></li><li class="listitem"><p>Number of copies</p></li><li class="listitem"><p>A billing information string (optional)</p></li><li class="listitem"><p>The host that sent the job (included since version 1.1.19)</p></li></ul></div><p>
-Here is an extract of my CUPS server's <code class="filename">page_log</code> file to illustrate the
-format and included items:
-</p><pre class="screen">
-tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 1 3 #marketing 10.160.50.13
-tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 2 3 #marketing 10.160.50.13
-tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 3 3 #marketing 10.160.50.13
-tec_IS2027 kurt 401 [22/Apr/2003:10:28:43 +0100] 4 3 #marketing 10.160.50.13
-Dig9110 boss 402 [22/Apr/2003:10:33:22 +0100] 1 440 finance-dep 10.160.51.33
-</pre><p>
-This was job ID <em class="parameter"><code>401</code></em>, printed on <em class="parameter"><code>tec_IS2027</code></em>
-by user <em class="parameter"><code>kurt</code></em>, a 64-page job printed in three copies, billed to
-<em class="parameter"><code>#marketing</code></em>, and sent from IP address <code class="constant">10.160.50.13.</code>
- The next job had ID <em class="parameter"><code>402</code></em>, was sent by user <em class="parameter"><code>boss</code></em>
-from IP address <code class="constant">10.160.51.33</code>, printed from one page 440 copies, and
-is set to be billed to <em class="parameter"><code>finance-dep</code></em>.
-</p></div><div class="sect2" title="Possible Shortcomings"><div class="titlepage"><div><div><h3 class="title"><a name="id412406"></a>Possible Shortcomings</h3></div></div></div><p>
-What flaws or shortcomings are there with this quota system?
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>The ones named above (wrongly logged job in case of
- printer hardware failure, and so on).</p></li><li class="listitem"><p>In reality, CUPS counts the job pages that are being
- processed in <span class="emphasis"><em>software</em></span> (that is, going through the
- RIP) rather than the physical sheets successfully leaving the
- printing device. Thus, if there is a jam while printing the fifth sheet out
- of 1,000 and the job is aborted by the printer, the page count will
- still show the figure of 1,000 for that job.</p></li><li class="listitem"><p>All quotas are the same for all users (no flexibility
- to give the boss a higher quota than the clerk) and no support for
- groups.</p></li><li class="listitem"><p>No means to read out the current balance or the
- <span class="quote">&#8220;<span class="quote">used-up</span>&#8221;</span> number of current quota.</p></li><li class="listitem"><p>A user having used up 99 sheets of a 100 quota will
- still be able to send and print a 1,000 sheet job.</p></li><li class="listitem"><p>A user being denied a job because of a filled-up quota
- does not get a meaningful error message from CUPS other than
- <span class="quote">&#8220;<span class="quote">client-error-not-possible</span>&#8221;</span>.</p></li></ul></div></div><div class="sect2" title="Future Developments"><div class="titlepage"><div><div><h3 class="title"><a name="id412465"></a>Future Developments</h3></div></div></div><p>
-This is the best system currently available, and there are huge
-improvements under development for CUPS 1.2:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Page counting will go into the backends (these talk
- directly to the printer and will increase the count in sync with the
- actual printing process; thus, a jam at the fifth sheet will lead to a
- stop in the counting).</p></li><li class="listitem"><p>Quotas will be handled more flexibly.</p></li><li class="listitem"><p>Probably there will be support for users to inquire
- about their accounts in advance.</p></li><li class="listitem"><p>Probably there will be support for some other tools
- around this topic.</p></li></ul></div></div><div class="sect2" title="Other Accounting Tools"><div class="titlepage"><div><div><h3 class="title"><a name="id412500"></a>Other Accounting Tools</h3></div></div></div><p>
-Other accounting tools that can be used includes: PrintAnalyzer, pyKota, printbill, LogReport.
-For more information regarding these tools you can try a Google search.
-</p></div></div><div class="sect1" title="Additional Material"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id412512"></a>Additional Material</h2></div></div></div><p>
-A printer queue with <span class="emphasis"><em>no</em></span> PPD associated to it is a
-<span class="quote">&#8220;<span class="quote">raw</span>&#8221;</span> printer, and all files will go directly there as received by the
-spooler. The exceptions are file types <em class="parameter"><code>application/octet-stream</code></em>
-that need the pass-through feature enabled. <span class="quote">&#8220;<span class="quote">Raw</span>&#8221;</span> queues do not do any
-filtering at all; they hand the file directly to the CUPS backend.
-This backend is responsible for sending the data to the device
-(as in the <span class="quote">&#8220;<span class="quote">device URI</span>&#8221;</span> notation: <code class="filename">lpd://, socket://,
-smb://, ipp://, http://, parallel:/, serial:/, usb:/</code>, and so on).
-</p><p>
-cupsomatic/Foomatic are <span class="emphasis"><em>not</em></span> native CUPS drivers
-and they do not ship with CUPS. They are a third-party add-on
-developed at Linuxprinting.org. As such, they are a brilliant hack to
-make all models (driven by Ghostscript drivers/filters in traditional
-spoolers) also work via CUPS, with the same (good or bad!) quality as
-in these other spoolers. <em class="parameter"><code>cupsomatic</code></em> is only a vehicle to execute a
-Ghostscript command line at that stage in the CUPS filtering chain
-where normally the native CUPS <em class="parameter"><code>pstoraster</code></em> filter would kick
-in. <em class="parameter"><code>cupsomatic</code></em> bypasses <em class="parameter"><code>pstoraster</code></em>, kidnaps the print file from CUPS,
-and redirects it to go through Ghostscript. CUPS accepts this
-because the associated cupsomatic/foomatic-PPD specifies:
-
-</p><pre class="programlisting">
-*cupsFilter: "application/vnd.cups-postscript 0 cupsomatic"
-</pre><p>
-
-This line persuades CUPS to hand the file to <em class="parameter"><code>cupsomatic</code></em> once it has
-successfully converted it to the MIME type
-<em class="parameter"><code>application/vnd.cups-postscript</code></em>. This conversion will not happen for
-jobs arriving from Windows that are autotyped
-<em class="parameter"><code>application/octet-stream</code></em>, with the according changes in
-<code class="filename">/etc/cups/mime.types</code> in place.
-</p><p>
-CUPS is widely configurable and flexible, even regarding its filtering
-mechanism. Another workaround in some situations would be to have in
-<code class="filename">/etc/cups/mime.types</code> entries as follows:
-
-</p><pre class="programlisting">
-application/postscript application/vnd.cups-raw 0 -
-application/vnd.cups-postscript application/vnd.cups-raw 0 -
-</pre><p>
-
-This would prevent all PostScript files from being filtered (rather,
-they will through the virtual <span class="emphasis"><em>nullfilter</em></span>
-denoted with <span class="quote">&#8220;<span class="quote">-</span>&#8221;</span>). This could only be useful for PostScript printers. If you
-want to print PostScript code on non-PostScript printers (provided they support ASCII
-text printing), an entry as follows could be useful:
-
-</p><pre class="programlisting">
-*/* application/vnd.cups-raw 0 -
-</pre><p>
-
-and would effectively send <span class="emphasis"><em>all</em></span> files to the
-backend without further processing.
-</p><p>
-You could have the following entry:
-
-</p><pre class="programlisting">
-application/vnd.cups-postscript application/vnd.cups-raw 0 \
- my_PJL_stripping_filter
-</pre><p>
-
-You will need to write a <em class="parameter"><code>my_PJL_stripping_filter</code></em>
-(which could be a shell script) that parses the PostScript and removes the
-unwanted PJL. This needs to conform to CUPS filter design
-(mainly, receive and pass the parameters printername, job-id,
-username, jobtitle, copies, print options, and possibly the
-filename). It is installed as world executable into
-<code class="filename">/usr/lib/cups/filters/</code> and is called by CUPS
-if it encounters a MIME type <em class="parameter"><code>application/vnd.cups-postscript</code></em>.
-</p><p>
-CUPS can handle <em class="parameter"><code>-o job-hold-until=indefinite</code></em>.
-This keeps the job in the queue on hold. It will only be printed
-upon manual release by the printer operator. This is a requirement in
-many central reproduction departments, where a few operators manage
-the jobs of hundreds of users on some big machine, where no user is
-allowed to have direct access (such as when the operators often need
-to load the proper paper type before running the 10,000 page job
-requested by marketing for the mailing, and so on).
-</p></div><div class="sect1" title="Autodeletion or Preservation of CUPS Spool Files"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id412700"></a>Autodeletion or Preservation of CUPS Spool Files</h2></div></div></div><p>
-<a class="indexterm" name="id412708"></a>
-<a class="indexterm" name="id412715"></a>
-<a class="indexterm" name="id412722"></a>
-Samba print files pass through two spool directories. One is the incoming directory managed by Samba (set in
-the <a class="link" href="smb.conf.5.html#PATH" target="_top">path = /var/spool/samba</a> directive in the <em class="parameter"><code>[printers]</code></em> section of <code class="filename">smb.conf</code>). The other is the spool directory of your UNIX print subsystem. For
-CUPS it is normally <code class="filename">/var/spool/cups/</code>, as set by the <code class="filename">cupsd.conf</code>
-directive <code class="filename">RequestRoot /var/spool/cups</code>.
-</p><div class="sect2" title="CUPS Configuration Settings Explained"><div class="titlepage"><div><div><h3 class="title"><a name="id412773"></a>CUPS Configuration Settings Explained</h3></div></div></div><p>
-Some important parameter settings in the CUPS configuration file
-<code class="filename">cupsd.conf</code> are:
-</p><div class="variablelist"><dl><dt><span class="term">PreserveJobHistory Yes</span></dt><dd><p>
- This keeps some details of jobs in cupsd's mind (well, it keeps the
- c12345, c12346, and so on, files in the CUPS spool directory, which does a
- similar job as the old-fashioned BSD-LPD control files). This is set
- to <span class="quote">&#8220;<span class="quote">Yes</span>&#8221;</span> as a default.
- </p></dd><dt><span class="term">PreserveJobFiles Yes</span></dt><dd><p>
- This keeps the job files themselves in cupsd's mind
- (it keeps the d12345, d12346, etc., files in the CUPS spool
- directory). This is set to <span class="quote">&#8220;<span class="quote">No</span>&#8221;</span> as the CUPS
- default.
- </p></dd><dt><span class="term"><span class="quote">&#8220;<span class="quote">MaxJobs 500</span>&#8221;</span></span></dt><dd><p>
- This directive controls the maximum number of jobs
- that are kept in memory. Once the number of jobs reaches the limit,
- the oldest completed job is automatically purged from the system to
- make room for the new one. If all of the known jobs are still
- pending or active, then the new job will be rejected. Setting the
- maximum to 0 disables this functionality. The default setting is
- 0.
- </p></dd></dl></div><p>
-(There are also additional settings for <em class="parameter"><code>MaxJobsPerUser</code></em> and
-<em class="parameter"><code>MaxJobsPerPrinter</code></em>.)
-</p></div><div class="sect2" title="Preconditions"><div class="titlepage"><div><div><h3 class="title"><a name="id412850"></a>Preconditions</h3></div></div></div><p>
-For everything to work as it should, you need to have three things:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>A Samba smbd that is compiled against <code class="filename">libcups</code> (check
- on Linux by running <strong class="userinput"><code>ldd `which smbd'</code></strong>).</p></li><li class="listitem"><p>A Samba-<code class="filename">smb.conf</code> setting of
- <a class="link" href="smb.conf.5.html#PRINTING" target="_top">printing = cups</a>.</p></li><li class="listitem"><p>Another Samba <code class="filename">smb.conf</code> setting of
- <a class="link" href="smb.conf.5.html#PRINTCAP" target="_top">printcap = cups</a>.</p></li></ul></div><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
-In this case, all other manually set printing-related commands (like
-<a class="link" href="smb.conf.5.html#PRINTCOMMAND" target="_top">print command</a>,
-<a class="link" href="smb.conf.5.html#LPQCOMMAND" target="_top">lpq command</a>,
-<a class="link" href="smb.conf.5.html#LPRMCOMMAND" target="_top">lprm command</a>,
-<a class="link" href="smb.conf.5.html#LPPAUSECOMMAND" target="_top">lppause command</a>, and
-<a class="link" href="smb.conf.5.html#LPRESUMECOMMAND" target="_top">lpresume command</a>) are ignored, and they should normally have no
-influence whatsoever on your printing.
-</p></div></div><div class="sect2" title="Manual Configuration"><div class="titlepage"><div><div><h3 class="title"><a name="id412978"></a>Manual Configuration</h3></div></div></div><p>
-If you want to do things manually, replace the <a class="link" href="smb.conf.5.html#PRINTING" target="_top">printing = cups</a>
-by <a class="link" href="smb.conf.5.html#PRINTING" target="_top">printing = bsd</a>. Then your manually set commands may work
-(I haven't tested this), and a <a class="link" href="smb.conf.5.html#PRINTCOMMAND" target="_top">print command = lp -d %P %s; rm %s</a>
-may do what you need.
-</p></div></div><div class="sect1" title="Printing from CUPS to Windows-Attached Printers"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id413023"></a>Printing from CUPS to Windows-Attached Printers</h2></div></div></div><p>
-<a class="indexterm" name="id413031"></a>
-<a class="indexterm" name="id413037"></a>
-From time to time the question arises, how can you print <span class="emphasis"><em>to</em></span> a Windows-attached printer
-<span class="emphasis"><em>from</em></span> Samba? Normally the local connection from Windows host to printer would be done by
-USB or parallel cable, but this does not matter to Samba. From here only an SMB connection needs to be opened
-to the Windows host. Of course, this printer must be shared first. As you have learned by now, CUPS uses
-<span class="emphasis"><em>backends</em></span> to talk to printers and other servers. To talk to Windows shared printers, you
-need to use the <code class="filename">smb</code> (surprise, surprise!) backend. Check if this is in the CUPS backend
-directory. This usually resides in <code class="filename">/usr/lib/cups/backend/</code>. You need to find an
-<code class="filename">smb</code> file there. It should be a symlink to <code class="filename">smbspool</code>, and the file
-must exist and be executable:
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>ls -l /usr/lib/cups/backend/</code></strong>
-total 253
-drwxr-xr-x 3 root root 720 Apr 30 19:04 .
-drwxr-xr-x 6 root root 125 Dec 19 17:13 ..
--rwxr-xr-x 1 root root 10692 Feb 16 21:29 canon
--rwxr-xr-x 1 root root 10692 Feb 16 21:29 epson
-lrwxrwxrwx 1 root root 3 Apr 17 22:50 http -&gt; ipp
--rwxr-xr-x 1 root root 17316 Apr 17 22:50 ipp
--rwxr-xr-x 1 root root 15420 Apr 20 17:01 lpd
--rwxr-xr-x 1 root root 8656 Apr 20 17:01 parallel
--rwxr-xr-x 1 root root 2162 Mar 31 23:15 pdfdistiller
-lrwxrwxrwx 1 root root 25 Apr 30 19:04 ptal -&gt; /usr/sbin/ptal-cups
--rwxr-xr-x 1 root root 6284 Apr 20 17:01 scsi
-lrwxrwxrwx 1 root root 17 Apr 2 03:11 smb -&gt; /usr/bin/smbspool
--rwxr-xr-x 1 root root 7912 Apr 20 17:01 socket
--rwxr-xr-x 1 root root 9012 Apr 20 17:01 usb
-
-<code class="prompt">root# </code><strong class="userinput"><code>ls -l `which smbspool`</code></strong>
--rwxr-xr-x 1 root root 563245 Dec 28 14:49 /usr/bin/smbspool
-</pre><p>
-If this symlink does not exist, create it:
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>ln -s `which smbspool` /usr/lib/cups/backend/smb</code></strong>
-</pre><p>
-<a class="indexterm" name="id413146"></a>
-<a class="indexterm" name="id413153"></a>
-<code class="literal">smbspool</code> was written by Mike Sweet from the CUPS folks. It is included and ships with
-Samba. It may also be used with print subsystems other than CUPS, to spool jobs to Windows printer shares. To
-set up printer <em class="replaceable"><code>winprinter</code></em> on CUPS, you need to have a driver for it. Essentially
-this means to convert the print data on the CUPS/Samba host to a format that the printer can digest (the
-Windows host is unable to convert any files you may send). This also means you should be able to print to the
-printer if it were hooked directly at your Samba/CUPS host. For troubleshooting purposes, this is what you
-should do to determine if that part of the process chain is in order. Then proceed to fix the network
-connection/authentication to the Windows host, and so on.
-</p><p>
-To install a printer with the <em class="parameter"><code>smb</code></em> backend on CUPS, use this command:
-</p><pre class="screen">
-<code class="prompt">root# </code><strong class="userinput"><code>lpadmin -p winprinter -v smb://WINDOWSNETBIOSNAME/printersharename \
- -P /path/to/PPD</code></strong>
-</pre><p>
-<a class="indexterm" name="id413205"></a>
-<a class="indexterm" name="id413212"></a>
-<a class="indexterm" name="id413218"></a>
-The PPD must be able to direct CUPS to generate the print data for the target model. For PostScript printers,
-just use the PPD that would be used with the Windows NT PostScript driver. But what can you do if the printer
-is only accessible with a password? Or if the printer's host is part of another workgroup? This is provided
-for: You can include the required parameters as part of the <code class="filename">smb://</code> device-URI like this:
-</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="filename">smb://WORKGROUP/WINDOWSNETBIOSNAME/printersharename</code></p></li><li class="listitem"><p><code class="filename">smb://username:password@WORKGROUP/WINDOWSNETBIOSNAME/printersharename</code></p></li><li class="listitem"><p><code class="filename">smb://username:password@WINDOWSNETBIOSNAME/printersharename</code></p></li></ul></div><p>
-Note that the device URI will be visible in the process list of the Samba server (e.g., when someone uses the
-<code class="literal">ps -aux</code> command on Linux), even if the username and passwords are sanitized before they get
-written into the log files. This is an inherently insecure option; however, it is the only one. Don't use it
-if you want to protect your passwords. Better share the printer in a way that does not require a password!
-Printing will only work if you have a working NetBIOS name resolution up and running. Note that this is a
-feature of CUPS and you do not necessarily need to have smbd running.
-
-</p></div><div class="sect1" title="More CUPS Filtering Chains"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id413279"></a>More CUPS Filtering Chains</h2></div></div></div><p>
-The diagrams in <a class="link" href="CUPS-printing.html#cups1" title="Figure 22.17. Filtering Chain 1.">Filtering Chain 1</a> and <a class="link" href="CUPS-printing.html#cups2" title="Figure 22.18. Filtering Chain with cupsomatic">Filtering Chain with
-cupsomatic</a> show how CUPS handles print jobs.
-</p><div class="figure"><a name="cups1"></a><p class="title"><b>Figure 22.17. Filtering Chain 1.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/cups1.png" alt="Filtering Chain 1."></div></div></div><br class="figure-break"><div class="figure"><a name="cups2"></a><p class="title"><b>Figure 22.18. Filtering Chain with cupsomatic</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/cups2.png" width="243" alt="Filtering Chain with cupsomatic"></div></div></div><br class="figure-break"></div><div class="sect1" title="Common Errors"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id413388"></a>Common Errors</h2></div></div></div><div class="sect2" title="Windows 9x/Me Client Can't Install Driver"><div class="titlepage"><div><div><h3 class="title"><a name="id413394"></a>Windows 9x/Me Client Can't Install Driver</h3></div></div></div><p>For Windows 9x/Me, clients require the printer names to be eight
- characters (or <span class="quote">&#8220;<span class="quote">8 plus 3 chars suffix</span>&#8221;</span>) max; otherwise, the driver files
- will not get transferred when you want to download them from Samba.</p></div><div class="sect2" title="&#8220;cupsaddsmb&#8221; Keeps Asking for Root Password in Never-ending Loop"><div class="titlepage"><div><div><h3 class="title"><a name="root-ask-loop"></a><span class="quote">&#8220;<span class="quote">cupsaddsmb</span>&#8221;</span> Keeps Asking for Root Password in Never-ending Loop</h3></div></div></div><p>Have you set <a class="link" href="smb.conf.5.html#SECURITY" target="_top">security = user</a>? Have
- you used <code class="literal">smbpasswd</code> to give root a Samba account?
- You can do two things: open another terminal and execute
- <code class="literal">smbpasswd -a root</code> to create the account and
- continue entering the password into the first terminal. Or, break
- out of the loop by pressing Enter twice (without trying to type a
- password).</p><p>
- If the error is <span class="quote">&#8220;<span class="quote">Tree connect failed: NT_STATUS_BAD_NETWORK_NAME</span>&#8221;</span>,
- you may have forgotten to create the <code class="filename">/etc/samba/drivers</code> directory.
- </p></div><div class="sect2" title="&#8220;cupsaddsmb&#8221; or &#8220;rpcclient addriver&#8221; Emit Error"><div class="titlepage"><div><div><h3 class="title"><a name="id413464"></a><span class="quote">&#8220;<span class="quote">cupsaddsmb</span>&#8221;</span> or <span class="quote">&#8220;<span class="quote">rpcclient addriver</span>&#8221;</span> Emit Error</h3></div></div></div><p>
- If <code class="literal">cupsaddsmb</code>, or <code class="literal">rpcclient addriver</code> emit the error message
- WERR_BAD_PASSWORD, refer to <a class="link" href="CUPS-printing.html#root-ask-loop" title="&#8220;cupsaddsmb&#8221; Keeps Asking for Root Password in Never-ending Loop">the previous common error</a>.
- </p></div><div class="sect2" title="&#8220;cupsaddsmb&#8221; Errors"><div class="titlepage"><div><div><h3 class="title"><a name="id413500"></a><span class="quote">&#8220;<span class="quote">cupsaddsmb</span>&#8221;</span> Errors</h3></div></div></div><p>
- The use of <span class="quote">&#8220;<span class="quote">cupsaddsmb</span>&#8221;</span> gives <span class="quote">&#8220;<span class="quote">No PPD file for printer...</span>&#8221;</span>
- message while PPD file is present. What might the problem be?
- </p><p>
- Have you enabled printer sharing on CUPS? This means, do you have a <code class="literal">&lt;Location
- /printers&gt;....&lt;/Location&gt;</code> section in CUPS server's <code class="filename">cupsd.conf</code> that
- does not deny access to the host you run <span class="quote">&#8220;<span class="quote">cupsaddsmb</span>&#8221;</span> from? It <span class="emphasis"><em>could</em></span> be an
- issue if you use cupsaddsmb remotely, or if you use it with a <code class="option">-h</code> parameter:
- <strong class="userinput"><code>cupsaddsmb -H sambaserver -h cupsserver -v printername</code></strong>.
- </p><p>Is your <em class="parameter"><code>TempDir</code></em> directive in
- <code class="filename">cupsd.conf</code> set to a valid value, and is it writable?
- </p></div><div class="sect2" title="Client Can't Connect to Samba Printer"><div class="titlepage"><div><div><h3 class="title"><a name="id413571"></a>Client Can't Connect to Samba Printer</h3></div></div></div><p>Use <code class="literal">smbstatus</code> to check which user
- you are from Samba's point of view. Do you have the privileges to
- write into the <em class="parameter"><code>[print$]</code></em>
- share?</p></div><div class="sect2" title="New Account Reconnection from Windows 200x/XP Troubles"><div class="titlepage"><div><div><h3 class="title"><a name="id413594"></a>New Account Reconnection from Windows 200x/XP Troubles</h3></div></div></div><p>
-Once you are connected as the wrong user (for example, as <code class="constant">nobody</code>, which often occurs if
-you have <a class="link" href="smb.conf.5.html#MAPTOGUEST" target="_top">map to guest = bad user</a>), Windows Explorer will not accept an
-attempt to connect again as a different user. There will not be any bytes transferred on the wire to Samba,
-but still you'll see a stupid error message that makes you think Samba has denied access. Use
-<code class="literal">smbstatus</code> to check for active connections. Kill the PIDs. You still can't re-connect, and
-you get the dreaded <code class="computeroutput">You can't connect with a second account from the same
-machine</code> message as soon as you try. And you do not see a single byte arriving at Samba (see
-logs; use <span class="quote">&#8220;<span class="quote">ethereal</span>&#8221;</span>) indicating a renewed connection attempt. Shut all Explorer Windows. This
-makes Windows forget what it has cached in its memory as established connections. Then reconnect as the right
-user. The best method is to use a DOS terminal window and <span class="emphasis"><em>first</em></span> do <strong class="userinput"><code>net use z:
-\\GANDALF\print$ /user:root</code></strong>. Check with <code class="literal">smbstatus</code> that you are
-connected under a different account. Now open the <span class="guilabel">Printers</span> folder (on the Samba server in
-the <span class="guilabel">Network Neighborhood</span>), right-click on the printer in question, and select
-<span class="guibutton">Connect....</span>.
-</p></div><div class="sect2" title="Avoid Being Connected to the Samba Server as the Wrong User"><div class="titlepage"><div><div><h3 class="title"><a name="id413674"></a>Avoid Being Connected to the Samba Server as the Wrong User</h3></div></div></div><p>
-<a class="indexterm" name="id413682"></a>
-You see per <code class="literal">smbstatus</code> that you are connected as user nobody, but you want to be root or
-printer admin. This is probably due to <a class="link" href="smb.conf.5.html#MAPTOGUEST" target="_top">map to guest = bad user</a>, which
-silently connected you under the guest account when you gave (maybe by accident) an incorrect username. Remove
-<a class="link" href="smb.conf.5.html#MAPTOGUEST" target="_top">map to guest</a> if you want to prevent this.
-</p></div><div class="sect2" title="Upgrading to CUPS Drivers from Adobe Drivers"><div class="titlepage"><div><div><h3 class="title"><a name="id413721"></a>Upgrading to CUPS Drivers from Adobe Drivers</h3></div></div></div><p>
-This information came from a mailing list posting regarding problems experienced when
-upgrading from Adobe drivers to CUPS drivers on Microsoft Windows NT/200x/XP clients.
-</p><p>First delete all old Adobe-using printers. Then delete all old Adobe drivers. (On Windows 200x/XP, right-click in
-the background of <span class="guilabel">Printers</span> folder, select <span class="guimenuitem">Server Properties...</span>, select
-tab <span class="guilabel">Drivers</span>, and delete here).</p></div><div class="sect2" title="Can't Use &#8220;cupsaddsmb&#8221; on Samba Server, Which Is a PDC"><div class="titlepage"><div><div><h3 class="title"><a name="id413755"></a>Can't Use <span class="quote">&#8220;<span class="quote">cupsaddsmb</span>&#8221;</span> on Samba Server, Which Is a PDC</h3></div></div></div><p>Do you use the <span class="quote">&#8220;<span class="quote">naked</span>&#8221;</span> root user name? Try to do it
-this way: <strong class="userinput"><code>cupsaddsmb -U <em class="replaceable"><code>DOMAINNAME</code></em>\\root -v
-<em class="replaceable"><code>printername</code></em></code></strong>&gt; (note the two backslashes: the first one is
-required to <span class="quote">&#8220;<span class="quote">escape</span>&#8221;</span> the second one).</p></div><div class="sect2" title="Deleted Windows 200x Printer Driver Is Still Shown"><div class="titlepage"><div><div><h3 class="title"><a name="id413790"></a>Deleted Windows 200x Printer Driver Is Still Shown</h3></div></div></div><p>Deleting a printer on the client will not delete the
-driver too (to verify, right-click on the white background of the
-<span class="guilabel">Printers</span> folder, select <span class="guimenuitem">Server Properties</span> and click on the
-<span class="guilabel">Drivers</span> tab). These same old drivers will be re-used when you try to
-install a printer with the same name. If you want to update to a new
-driver, delete the old ones first. Deletion is only possible if no
-other printer uses the same driver.</p></div><div class="sect2" title="Windows 200x/XP Local Security Policies"><div class="titlepage"><div><div><h3 class="title"><a name="id413821"></a>Windows 200x/XP Local Security Policies</h3></div></div></div><a class="indexterm" name="id413826"></a><a class="indexterm" name="id413833"></a><p>Local security policies may not allow the installation of unsigned drivers <span class="quote">&#8220;<span class="quote">local
-security policies</span>&#8221;</span> may not allow the installation of printer drivers at all.</p></div><div class="sect2" title="Administrator Cannot Install Printers for All Local Users"><div class="titlepage"><div><div><h3 class="title"><a name="id413852"></a>Administrator Cannot Install Printers for All Local Users</h3></div></div></div><p>
-<a class="indexterm" name="id413860"></a>
-<a class="indexterm" name="id413866"></a>
-Windows XP handles SMB printers on a <span class="quote">&#8220;<span class="quote">per-user</span>&#8221;</span> basis.
-This means every user needs to install the printer himself or herself. To have a printer available for
-everybody, you might want to use the built-in IPP client capabilities of Win XP. Add a printer with the print
-path of <em class="parameter"><code>http://cupsserver:631/printers/printername</code></em>. We're still looking into this one.
-Maybe a logon script could automatically install printers for all users.
-</p></div><div class="sect2" title="Print Change, Notify Functions on NT Clients"><div class="titlepage"><div><div><h3 class="title"><a name="id413888"></a>Print Change, Notify Functions on NT Clients</h3></div></div></div><p>For print change, notify functions on NT++ clients. These need to run the <code class="literal">Server</code>
-service first (renamed to <code class="literal">File &amp; Print Sharing for MS Networks</code> in XP).</p></div><div class="sect2" title="Windows XP SP1"><div class="titlepage"><div><div><h3 class="title"><a name="id413911"></a>Windows XP SP1</h3></div></div></div><p>Windows XP SP1 introduced a Point and Print Restriction Policy (this restriction does not apply to
-<span class="quote">&#8220;<span class="quote">Administrator</span>&#8221;</span> or <span class="quote">&#8220;<span class="quote">Power User</span>&#8221;</span> groups of users). In Group Policy Object Editor, go
-to <span class="guimenu">User Configuration -&gt; Administrative Templates -&gt; Control Panel -&gt; Printers</span>. The policy
-is automatically set to <code class="constant">Enabled</code> and the <code class="constant">Users can only Point and Print to
-machines in their Forest</code> . You probably need to change it to <code class="constant">Disabled</code> or
-<code class="constant">Users can only Point and Print to these servers</code> to make driver downloads from Samba
-possible.
-</p></div><div class="sect2" title="Print Options for All Users Can't Be Set on Windows 200x/XP"><div class="titlepage"><div><div><h3 class="title"><a name="id413953"></a>Print Options for All Users Can't Be Set on Windows 200x/XP</h3></div></div></div><p>How are you doing it? I bet the wrong way (it is not easy to find out, though). There are three
-different ways to bring you to a dialog that <span class="emphasis"><em>seems</em></span> to set everything. All three dialogs
-<span class="emphasis"><em>look</em></span> the same, yet only one of them does what you intend. You need to be Administrator or
-Print Administrator to do this for all users. Here is how I do it on XP:
-</p><div class="orderedlist"><ol class="orderedlist" type="A"><li class="listitem"><p>The first wrong way:
-
- </p><div class="orderedlist"><ol class="orderedlist" type="I"><li class="listitem"><p>Open the <span class="guilabel">Printers</span>
- folder.</p></li><li class="listitem"><p>Right-click on the printer
- (<span class="guilabel">remoteprinter on cupshost</span>) and
- select in context menu <span class="guimenuitem">Printing
- Preferences...</span></p></li><li class="listitem"><p>Look at this dialog closely and remember what it looks like.</p></li></ol></div><p>
- </p></li><li class="listitem"><p>The second wrong way:
- </p><div class="orderedlist"><ol class="orderedlist" type="I"><li class="listitem"><p>Open the <span class="guilabel">Printers</span> folder.</p></li><li class="listitem"><p>Right-click on the printer (<span class="guilabel">remoteprinter on
- cupshost</span>) and select the context menu
- <span class="guimenuitem">Properties</span>.</p></li><li class="listitem"><p>Click on the <span class="guilabel">General</span> tab.</p></li><li class="listitem"><p>Click on the button <span class="guibutton">Printing
- Preferences...</span></p></li><li class="listitem"><p>A new dialog opens. Keep this dialog open and go back
- to the parent dialog.</p></li></ol></div><p>
- </p></li><li class="listitem"><p>The third and correct way:
- </p><div class="orderedlist"><ol class="orderedlist" type="I"><li class="listitem"><p>Open the <span class="guilabel">Printers</span> folder.</p></li><li class="listitem"><p>Right-click on the printer (<span class="guilabel">remoteprinter on
- cupshost</span>) and select the context menu
- <span class="guimenuitem">Properties</span>.</p></li><li class="listitem"><p>Click on the <span class="guilabel">Advanced</span>
- tab. (If everything is <span class="quote">&#8220;<span class="quote">grayed out,</span>&#8221;</span> then you are not logged
- in as a user with enough privileges).</p></li><li class="listitem"><p>Click on the <span class="guibutton">Printing
- Defaults...</span> button.</p></li><li class="listitem"><p>On any of the two new tabs, click on the
- <span class="guibutton">Advanced...</span> button.</p></li><li class="listitem"><p>A new dialog opens. Compare this one to the other
- identical-looking one from step <span class="quote">&#8220;<span class="quote">B.5</span>&#8221;</span> or A.3".</p></li></ol></div><p>
- </p></li></ol></div><p>
-Do you see any difference? I don't either. However, only the last one, which you arrived at with steps
-<span class="quote">&#8220;<span class="quote">C.1. to C.6.</span>&#8221;</span>, will save any settings permanently and be the defaults for new users. If you want
-all clients to get the same defaults, you need to conduct these steps <span class="emphasis"><em>as Administrator</em></span>
-(<a class="link" href="smb.conf.5.html#PRINTERADMIN" target="_top">printer admin</a> in <code class="filename">smb.conf</code>) <span class="emphasis"><em>before</em></span> a client downloads the
-driver (the clients can later set their own <span class="emphasis"><em>per-user defaults</em></span> by following the procedures
-<span class="emphasis"><em>A</em></span> or <span class="emphasis"><em>B</em></span>).
-</p></div><div class="sect2" title="Most Common Blunders in Driver Settings on Windows Clients"><div class="titlepage"><div><div><h3 class="title"><a name="id414222"></a>Most Common Blunders in Driver Settings on Windows Clients</h3></div></div></div><p>
-Don't use <em class="parameter"><code>Optimize for Speed</code></em>, but use <em class="parameter"><code>Optimize for Portability</code></em>
-instead (Adobe PS Driver). Don't use <em class="parameter"><code>Page Independence: No</code></em>. Always settle with
-<em class="parameter"><code>Page Independence: Yes</code></em> (Microsoft PS Driver and CUPS PS Driver for Windows NT/200x/XP).
-If there are problems with fonts, use <em class="parameter"><code>Download as Softfont into printer</code></em> (Adobe PS
-Driver). For <span class="guilabel">TrueType Download Options</span> choose <code class="constant">Outline</code>. Use
-PostScript Level 2 if you are having trouble with a non-PS printer and if there is a choice.
-</p></div><div class="sect2" title="cupsaddsmb Does Not Work with Newly Installed Printer"><div class="titlepage"><div><div><h3 class="title"><a name="id414274"></a><code class="literal">cupsaddsmb</code> Does Not Work with Newly Installed Printer</h3></div></div></div><p>
-Symptom: The last command of <code class="literal">cupsaddsmb</code> does not complete successfully. If the <code class="literal">cmd
-= setdriver printername printername</code> result was NT_STATUS_UNSUCCESSFUL, then possibly the printer was
-not yet recognized by Samba. Did it show up in Network Neighborhood? Did it show up in <code class="literal">rpcclient
-hostname -c `enumprinters'</code>? Restart smbd (or send a <code class="literal">kill -HUP</code> to all processes
-listed by <code class="literal">smbstatus</code>, and try again.
-</p></div><div class="sect2" title="Permissions on /var/spool/samba/ Get Reset After Each Reboot"><div class="titlepage"><div><div><h3 class="title"><a name="id414320"></a>Permissions on <code class="filename">/var/spool/samba/</code> Get Reset After Each Reboot</h3></div></div></div><p>
-Have you ever by accident set the CUPS spool directory to the same location (<em class="parameter"><code>RequestRoot
-/var/spool/samba/</code></em> in <code class="filename">cupsd.conf</code> or the other way round:
-<code class="filename">/var/spool/cups/</code> is set as <a class="link" href="smb.conf.5.html#PATH" target="_top">path</a>&gt; in the <em class="parameter"><code>[printers]</code></em> section)? These <em class="parameter"><code>must</code></em> be different. Set <em class="parameter"><code>RequestRoot
-/var/spool/cups/</code></em> in <code class="filename">cupsd.conf</code> and <a class="link" href="smb.conf.5.html#PATH" target="_top">path =
-/var/spool/samba</a> in the <em class="parameter"><code>[printers]</code></em> section of <code class="filename">smb.conf</code>. Otherwise,
-cupsd will sanitize permissions to its spool directory with each restart and printing will not work reliably.
-</p></div><div class="sect2" title="Print Queue Called &#8220;lp&#8221; Mishandles Print Jobs"><div class="titlepage"><div><div><h3 class="title"><a name="id414413"></a>Print Queue Called <span class="quote">&#8220;<span class="quote">lp</span>&#8221;</span> Mishandles Print Jobs</h3></div></div></div><p>
-In this case a print queue called <span class="quote">&#8220;<span class="quote">lp</span>&#8221;</span> intermittently swallows jobs and
-spits out completely different ones from what was sent.
-</p><p>
-<a class="indexterm" name="id414432"></a>
-<a class="indexterm" name="id414439"></a>
-<a class="indexterm" name="id414446"></a>
-It is a bad idea to name any printer <span class="quote">&#8220;<span class="quote">lp</span>&#8221;</span>. This is the traditional UNIX name for the default
-printer. CUPS may be set up to do an automatic creation of Implicit Classes. This means, to group all printers
-with the same name to a pool of devices and load-balance the jobs across them in a round-robin fashion.
-Chances are high that someone else has a printer named <span class="quote">&#8220;<span class="quote">lp</span>&#8221;</span> too. You may receive that person's
-jobs and send your own to his or her device unwittingly. To have tight control over the printer names, set
-<em class="parameter"><code>BrowseShortNames No</code></em>. It will present any printer as
-<em class="replaceable"><code>printername@cupshost</code></em>, which gives you better control over what may happen in a
-large networked environment.
-</p></div><div class="sect2" title="Location of Adobe PostScript Driver Files for &#8220;cupsaddsmb&#8221;"><div class="titlepage"><div><div><h3 class="title"><a name="id414476"></a>Location of Adobe PostScript Driver Files for <span class="quote">&#8220;<span class="quote">cupsaddsmb</span>&#8221;</span></h3></div></div></div><p>
-Use <code class="literal">smbclient</code> to connect to any Windows box with a shared PostScript printer:
-<code class="literal">smbclient //windowsbox/print\$ -U guest</code>. You can navigate to the
-<code class="filename">W32X86/2</code> subdir to <code class="literal">mget ADOBE*</code> and other files or to
-<code class="filename">WIN40/0</code> to do the same. Another option is to download the <code class="filename">*.exe</code>
-packaged files from the Adobe Web site.
-</p></div></div><div class="sect1" title="Overview of the CUPS Printing Processes"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id414527"></a>Overview of the CUPS Printing Processes</h2></div></div></div><p>
-A complete overview of the CUPS printing processes can be found in <a class="link" href="CUPS-printing.html#a_small" title="Figure 22.19. CUPS Printing Overview.">the CUPS
-Printing Overview diagram</a>.
-</p><div class="figure"><a name="a_small"></a><p class="title"><b>Figure 22.19. CUPS Printing Overview.</b></p><div class="figure-contents"><div class="mediaobject"><img src="images/a_small.png" width="243" alt="CUPS Printing Overview."></div></div></div><br class="figure-break"></div><div class="footnotes"><br><hr width="100" align="left"><div class="footnote"><p><sup>[<a name="ftn.id404773" href="#id404773" class="para">6</a>] </sup>See also <a class="ulink" href="http://www.cups.org/cups-help.html" target="_top">http://www.cups.org/cups-help.html</a></p></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="classicalprinting.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="optional.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="VFS.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 21. Classical Printing Support </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 23. Stackable VFS modules</td></tr></table></div></body></html>