diff options
Diffstat (limited to 'docs/htmldocs/Samba3-HOWTO/CUPS-printing.html')
-rw-r--r-- | docs/htmldocs/Samba3-HOWTO/CUPS-printing.html | 3109 |
1 files changed, 3109 insertions, 0 deletions
diff --git a/docs/htmldocs/Samba3-HOWTO/CUPS-printing.html b/docs/htmldocs/Samba3-HOWTO/CUPS-printing.html new file mode 100644 index 0000000000..139358dae1 --- /dev/null +++ b/docs/htmldocs/Samba3-HOWTO/CUPS-printing.html @@ -0,0 +1,3109 @@ +<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.71.0"><link rel="start" href="index.html" title="The Official Samba-3 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" lang="en"><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"><<a href="mailto:kpfeifle@danka.de">kpfeifle@danka.de</a>></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"><<a href="mailto:CVizitiu@gbif.org">CVizitiu@gbif.org</a>></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"><<a href="mailto:jelmer@samba.org">jelmer@samba.org</a>></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#id392883">Introduction</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id392889">Features and Benefits</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id392940">Overview</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id393049">Basic CUPS Support Configuration</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id393149">Linking smbd with libcups.so</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id393337">Simple <code class="filename">smb.conf</code> Settings for CUPS</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id393584">More Complex CUPS <code class="filename">smb.conf</code> Settings</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id393980">Advanced Configuration</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id393994">Central Spooling vs. “<span class="quote">Peer-to-Peer</span>” Printing</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id394045">Raw Print Serving: Vendor Drivers on Windows Clients</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id394249">Installation of Windows Client Drivers</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#cups-raw">Explicitly Enable “<span class="quote">raw</span>” Printing for <span class="emphasis"><em>application/octet-stream</em></span></a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id394512">Driver Upload Methods</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id394623">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#id394797">Windows Drivers, GDI, and EMF</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id394963">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#id395287">Ghostscript: The Software RIP for Non-PostScript Printers</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id395426">PostScript Printer Description (PPD) Specification</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id395495">Using Windows-Formatted Vendor PPDs</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id395604">CUPS Also Uses PPDs for Non-PostScript Printers</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id395639">The CUPS Filtering Architecture</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id395860">MIME Types and CUPS Filters</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id396270">MIME Type Conversion Rules</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id396465">Filtering Overview</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id396616">Prefilters</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id396793">pstops</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id396952">pstoraster</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id397202">imagetops and imagetoraster</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id397282">rasterto [printers specific]</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id397494">CUPS Backends</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id397802">The Role of <em class="parameter"><code>cupsomatic/foomatic</code></em></a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id398021">The Complete Picture</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id398033"><code class="filename">mime.convs</code></a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id398094">“<span class="quote">Raw</span>” Printing</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id398194">application/octet-stream Printing</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id398455">PostScript Printer Descriptions for Non-PostScript Printers</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id398718"><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#id399033">Examples for Filtering Chains</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id399434">Sources of CUPS Drivers/PPDs</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id399543">Printing with Interface Scripts</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id399622">Network Printing (Purely Windows)</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id399636">From Windows Clients to an NT Print Server</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id399694">Driver Execution on the Client</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id399759">Driver Execution on the Server</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id399858">Network Printing (Windows Clients and UNIX/Samba Print +Servers)</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id399874">From Windows Clients to a CUPS/Samba Print Server</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id400039">Samba Receiving Job-Files and Passing Them to CUPS</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id400108">Network PostScript RIP</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id400187">PPDs for Non-PS Printers on UNIX</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id400224">PPDs for Non-PS Printers on Windows</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id400285">Windows Terminal Servers (WTS) as CUPS Clients</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id400296">Printer Drivers Running in “<span class="quote">Kernel Mode</span>” Cause Many +Problems</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id400328">Workarounds Impose Heavy Limitations</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id400341">CUPS: A “<span class="quote">Magical Stone</span>”?</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id400378">PostScript Drivers with No Major Problems, Even in Kernel +Mode</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id400456">Configuring CUPS for Driver Download</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id400475"><span class="emphasis"><em>cupsaddsmb</em></span>: The Unknown Utility</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id400563">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#id400868">CUPS “<span class="quote">PostScript Driver for Windows NT/200x/XP</span>”</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id401090">Recognizing Different Driver Files</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id401201">Acquiring the Adobe Driver Files</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id401221">ESP Print Pro PostScript Driver for Windows NT/200x/XP</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id401275">Caveats to Be Considered</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id401555">Windows CUPS PostScript Driver Versus Adobe Driver</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id401750">Run cupsaddsmb (Quiet Mode)</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id401880">Run cupsaddsmb with Verbose Output</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id402011">Understanding cupsaddsmb</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id402147">How to Recognize If cupsaddsmb Completed Successfully</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id402254">cupsaddsmb with a Samba PDC</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id402332">cupsaddsmb Flowchart</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id402410">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#id402619">Installing PostScript Driver Files Manually Using rpcclient</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id402785">A Check of the rpcclient man Page</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id402945">Understanding the rpcclient man Page</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id403037">Producing an Example by Querying a Windows Box</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id403163">Requirements for adddriver and setdriver to Succeed</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id403371">Manual Driver Installation in 15 Steps</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id404250">Troubleshooting Revisited</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id404381">The Printing <code class="filename">*.tdb</code> Files</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id404580">Trivial Database Files</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id404646">Binary Format</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id404707">Losing <code class="filename">*.tdb</code> Files</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id404753">Using <code class="literal">tdbbackup</code></a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id404864">CUPS Print Drivers from Linuxprinting.org</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id405024">foomatic-rip and Foomatic Explained</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id405729">foomatic-rip and Foomatic PPD Download and Installation</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id406151">Page Accounting with CUPS</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id406181">Setting Up Quotas</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406232">Correct and Incorrect Accounting</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406265">Adobe and CUPS PostScript Drivers for Windows Clients</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406396">The page_log File Syntax</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406532">Possible Shortcomings</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406590">Future Developments</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406625">Other Accounting Tools</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id406637">Additional Material</a></span></dt><dt><span class="sect1"><a href="CUPS-printing.html#id406826">Autodeletion or Preservation of CUPS Spool Files</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id406894">CUPS Configuration Settings Explained</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id406971">Preconditions</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407077">Manual Configuration</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id407111">Printing from CUPS to Windows-Attached Printers</a></span></dt><dt><span class="sect1"><a href="CUPS-printing.html#id407368">More CUPS Filtering Chains</a></span></dt><dt><span class="sect1"><a href="CUPS-printing.html#id407477">Common Errors</a></span></dt><dd><dl><dt><span class="sect2"><a href="CUPS-printing.html#id407482">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">cupsaddsmb</span>” Keeps Asking for Root Password in Never-ending Loop</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407549">“<span class="quote">cupsaddsmb</span>” or “<span class="quote">rpcclient addriver</span>” Emit Error</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407585">“<span class="quote">cupsaddsmb</span>” Errors</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407655">Client Can't Connect to Samba Printer</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407678">New Account Reconnection from Windows 200x/XP Troubles</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407756">Avoid Being Connected to the Samba Server as the Wrong User</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407795">Upgrading to CUPS Drivers from Adobe Drivers</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407830">Can't Use “<span class="quote">cupsaddsmb</span>” on Samba Server, Which Is a PDC</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407864">Deleted Windows 200x Printer Driver Is Still Shown</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407895">Windows 200x/XP Local Security Policies</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407926">Administrator Cannot Install Printers for All Local Users</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407963">Print Change, Notify Functions on NT Clients</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id407987">Win XP-SP1</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id408028">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#id408292">Most Common Blunders in Driver Settings on Windows Clients</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id408345"><code class="literal">cupsaddsmb</code> Does Not Work with Newly Installed Printer</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id408391">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#id408477">Print Queue Called “<span class="quote">lp</span>” Mishandles Print Jobs</a></span></dt><dt><span class="sect2"><a href="CUPS-printing.html#id408540">Location of Adobe PostScript Driver Files for “<span class="quote">cupsaddsmb</span>”</a></span></dt></dl></dd><dt><span class="sect1"><a href="CUPS-printing.html#id408591">Overview of the CUPS Printing Processes</a></span></dt></dl></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id392883"></a>Introduction</h2></div></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id392889"></a>Features and Benefits</h3></div></div></div><p> +<a class="indexterm" name="id392897"></a> + The Common UNIX Print System (<a 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">black box</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 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="id392927"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id392940"></a>Overview</h3></div></div></div><p> +<a class="indexterm" name="id392948"></a> +<a class="indexterm" name="id392954"></a> +<a class="indexterm" name="id392961"></a> +<a class="indexterm" name="id392968"></a> +<a class="indexterm" name="id392975"></a> +<a class="indexterm" name="id392984"></a> +<a class="indexterm" name="id392994"></a> +<a class="indexterm" name="id393000"></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 href="http://printing.kde.org/" target="_top">KDEPrint</a>). + </p><p> +<a class="indexterm" name="id393021"></a> +<a class="indexterm" name="id393028"></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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id393049"></a>Basic CUPS Support Configuration</h2></div></div></div><p> +<a class="indexterm" name="id393057"></a> +<a class="indexterm" name="id393063"></a> +<a class="indexterm" name="id393070"></a> +<a class="indexterm" name="id393077"></a> +<a class="indexterm" name="id393084"></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="indexterm" name="id393098"></a>printing = cups and <a class="indexterm" name="id393105"></a>printcap = cups. 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 href="http://localhost:631/documentation.html" target="_top">CUPS</a> web site. + </p><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id393149"></a>Linking smbd with libcups.so</h3></div></div></div><p> +<a class="indexterm" name="id393157"></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="id393179"></a> +<a class="indexterm" name="id393186"></a> + When Samba is compiled and linked with <code class="filename">libcups</code>, <a class="indexterm" name="id393198"></a>printcap = cups + 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 => /usr/lib/libssl.so.0.9.6 (0x4002d000) +libcrypto.so.0.9.6 => /usr/lib/libcrypto.so.0.9.6 (0x4005a000) +libcups.so.2 => /usr/lib/libcups.so.2 (0x40123000) +[....] +</pre><p> + </p><p> +<a class="indexterm" name="id393246"></a> + The line <code class="computeroutput">libcups.so.2 => /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" 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="indexterm" name="id393277"></a>printing = sysv. 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="indexterm" name="id393285"></a>print command; other commands are + <a class="indexterm" name="id393293"></a>lppause command, + <a class="indexterm" name="id393300"></a>lpresume command, + <a class="indexterm" name="id393307"></a>lpq command, + <a class="indexterm" name="id393314"></a>lprm command, + <a class="indexterm" name="id393321"></a>queuepause command and + <a class="indexterm" name="id393328"></a>queue resume command). + </p></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id393337"></a>Simple <code class="filename">smb.conf</code> Settings for CUPS</h3></div></div></div><p> + To summarize, <a 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 class="simplelist" border="0" summary="Simple list"><tr><td> </td></tr><tr><td><em class="parameter"><code>[global]</code></em></td></tr><tr><td><a class="indexterm" name="id393397"></a><em class="parameter"><code>load printers = yes</code></em></td></tr><tr><td><a class="indexterm" name="id393410"></a><em class="parameter"><code>printing = cups</code></em></td></tr><tr><td><a class="indexterm" name="id393422"></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="id393444"></a><em class="parameter"><code>comment = All Printers</code></em></td></tr><tr><td><a class="indexterm" name="id393456"></a><em class="parameter"><code>path = /var/spool/samba</code></em></td></tr><tr><td><a class="indexterm" name="id393469"></a><em class="parameter"><code>browseable = no</code></em></td></tr><tr><td><a class="indexterm" name="id393481"></a><em class="parameter"><code>public = yes</code></em></td></tr><tr><td><a class="indexterm" name="id393494"></a><em class="parameter"><code>guest ok = yes</code></em></td></tr><tr><td><a class="indexterm" name="id393506"></a><em class="parameter"><code>writable = no</code></em></td></tr><tr><td><a class="indexterm" name="id393519"></a><em class="parameter"><code>printable = yes</code></em></td></tr><tr><td><a class="indexterm" name="id393531"></a><em class="parameter"><code>printer admin = root, @ntadmins</code></em></td></tr></table></div></div><br class="example-break"><p> +<a class="indexterm" name="id393547"></a> +<a class="indexterm" name="id393554"></a> +<a class="indexterm" name="id393561"></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">printer driver</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">binary,</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id393584"></a>More Complex CUPS <code class="filename">smb.conf</code> Settings</h3></div></div></div><p> + <a 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 class="simplelist" border="0" summary="Simple list"><tr><td> </td></tr><tr><td><em class="parameter"><code>[global]</code></em></td></tr><tr><td><a class="indexterm" name="id393638"></a><em class="parameter"><code>printing = cups</code></em></td></tr><tr><td><a class="indexterm" name="id393651"></a><em class="parameter"><code>printcap name = cups</code></em></td></tr><tr><td><a class="indexterm" name="id393663"></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="id393685"></a><em class="parameter"><code>comment = All Printers</code></em></td></tr><tr><td><a class="indexterm" name="id393697"></a><em class="parameter"><code>path = /var/spool/samba</code></em></td></tr><tr><td><a class="indexterm" name="id393710"></a><em class="parameter"><code>public = yes</code></em></td></tr><tr><td><a class="indexterm" name="id393722"></a><em class="parameter"><code>guest ok = yes</code></em></td></tr><tr><td><a class="indexterm" name="id393735"></a><em class="parameter"><code>writable = no</code></em></td></tr><tr><td><a class="indexterm" name="id393747"></a><em class="parameter"><code>printable = yes</code></em></td></tr><tr><td><a class="indexterm" name="id393760"></a><em class="parameter"><code>printer admin = root, @ntadmins</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="id393781"></a><em class="parameter"><code>comment = A special printer with his own settings</code></em></td></tr><tr><td><a class="indexterm" name="id393794"></a><em class="parameter"><code>path = /var/spool/samba-special</code></em></td></tr><tr><td><a class="indexterm" name="id393807"></a><em class="parameter"><code>printing = sysv</code></em></td></tr><tr><td><a class="indexterm" name="id393819"></a><em class="parameter"><code>printcap = lpstat</code></em></td></tr><tr><td><a class="indexterm" name="id393832"></a><em class="parameter"><code>print command = echo "NEW: `date`: printfile %f" >> /tmp/smbprn.log ; echo " `date`: p-%p s-%s f-%f" >> /tmp/smbprn.log ; echo " `date`: j-%j J-%J z-%z c-%c" >> /tmp/smbprn.log ; rm %f </code></em></td></tr><tr><td><a class="indexterm" name="id393847"></a><em class="parameter"><code>public = no</code></em></td></tr><tr><td><a class="indexterm" name="id393859"></a><em class="parameter"><code>guest ok = no</code></em></td></tr><tr><td><a class="indexterm" name="id393872"></a><em class="parameter"><code>writable = no</code></em></td></tr><tr><td><a class="indexterm" name="id393884"></a><em class="parameter"><code>printable = yes</code></em></td></tr><tr><td><a class="indexterm" name="id393897"></a><em class="parameter"><code>printer admin = kurt</code></em></td></tr><tr><td><a class="indexterm" name="id393910"></a><em class="parameter"><code>hosts deny = 0.0.0.0</code></em></td></tr><tr><td><a class="indexterm" name="id393922"></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="indexterm" name="id393946"></a>printer admin of this share is “<span class="quote">kurt</span>” (not the “<span class="quote">@ntadmins</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="indexterm" name="id393962"></a>printing = sysv and <a class="indexterm" name="id393970"></a>printcap = lpstat. + </p></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id393980"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id393994"></a>Central Spooling vs. “<span class="quote">Peer-to-Peer</span>” Printing</h3></div></div></div><p> +<a class="indexterm" name="id394006"></a> + <a class="indexterm" name="id394013"></a> + <a class="indexterm" name="id394022"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id394045"></a>Raw Print Serving: Vendor Drivers on Windows Clients</h3></div></div></div><p> + <a class="indexterm" name="id394053"></a> + <a class="indexterm" name="id394060"></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">raw</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="id394077"></a> +<a class="indexterm" name="id394084"></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"><a name="id394102"></a><p class="title"><b>Procedure 22.1. Configuration Steps for Raw CUPS Printing Support</b></p><ol type="1"><li><p> +<a class="indexterm" name="id394113"></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><p> +<a class="indexterm" name="id394139"></a> + Do the same for the file <code class="filename">/etc/cups/mime.convs</code>. + </p></li><li><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><p> + In the <code class="filename">smb.conf</code> file <code class="constant">[printers]</code> section add + <a class="indexterm" name="id394185"></a>use client driver = Yes, + and in the <code class="constant">[global]</code> section add + <a class="indexterm" name="id394196"></a>printing = CUPS, plus + <a class="indexterm" name="id394203"></a>printcap = CUPS. + </p></li><li><p> + Install the printer as if it is a local printer, that is, Printing to <code class="constant">LPT1:</code>. + </p></li><li><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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id394249"></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 type="disc"><li><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><p> + <a class="indexterm" name="id394276"></a> + Deposit and prepare the drivers (for later download) on + the print server (Samba); this enables the clients to use + “<span class="quote">Point'n'Print</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. + </p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="cups-raw"></a>Explicitly Enable “<span class="quote">raw</span>” Printing for <span class="emphasis"><em>application/octet-stream</em></span></h3></div></div></div><p> + <a class="indexterm" name="id394316"></a> + <a class="indexterm" name="id394323"></a> + <a class="indexterm" name="id394330"></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">raw</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 type="disc"><li><p><code class="filename">/etc/cups/mime.types</code></p></li><li><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="id394380"></a> + <a class="indexterm" name="id394387"></a> + In <code class="filename">/etc/cups/mime.convs</code>, have this line: + <a class="indexterm" name="id394400"></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" 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">raw</span>” printing, it only <span class="emphasis"><em>allows</em></span> it. + </p></div><p><b>Background. </b> + <a class="indexterm" name="id394461"></a> +<a class="indexterm" name="id394468"></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">Denial of Service</span>” attack on your printer(s), causing at least the loss of a lot of paper and + ink. “<span class="quote">Unknown</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">raw.</span>” + Sending data “<span class="quote">raw</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">raw</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id394512"></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="id394524"></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">Point'n'Print</span>”), please refer to the <a 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 type="disc"><li><p> + <a class="indexterm" name="id394557"></a> + The GUI, “<span class="quote">Add Printer Wizard</span>” <span class="emphasis"><em>upload-from-a-Windows-client</em></span> method. + </p></li><li><p> + The command line, “<span class="quote">smbclient/rpcclient</span>” upload-from-a-UNIX-workstation method. + </p></li><li><p> + <a class="indexterm" name="id394584"></a> + The Imprints tool set method. + </p></li></ul></div><p> +<a class="indexterm" name="id394595"></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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id394623"></a>Advanced Intelligent Printing with PostScript Driver Download</h2></div></div></div><p> + <a class="indexterm" name="id394631"></a> + We now know how to set up a “<span class="quote">dump</span>” print server, that is, a server that spools + print jobs “<span class="quote">raw</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="id394654"></a><a class="indexterm" name="id394660"></a><a class="indexterm" name="id394667"></a><div class="itemizedlist"><ul type="disc"><li><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><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><p>Maybe your previous network printing setup is a mess + and must be re-organized from a clean beginning.</p></li><li><p>Maybe you are experiencing too many “<span class="quote">blue screens</span>” + originating from poorly debugged printer drivers running in NT “<span class="quote">kernel mode</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" lang="en"><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="id394728"></a> + <a class="indexterm" name="id394735"></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="id394746"></a> + <a class="indexterm" name="id394753"></a> +<a class="indexterm" name="id394759"></a> +<a class="indexterm" name="id394766"></a> +<a class="indexterm" name="id394773"></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">standards</span>” by being the most widely + used page description languages (PDLs), there are still many manufacturers who “<span class="quote">roll their own</span>” + (their reasons may be unacceptable license fees for using printer-embedded PostScript interpreters, and so on). + </p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id394797"></a>Windows Drivers, GDI, and EMF</h3></div></div></div><p> + <a class="indexterm" name="id394804"></a> + <a class="indexterm" name="id394811"></a> + <a class="indexterm" name="id394818"></a> +<a class="indexterm" name="id394824"></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" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p> + <a class="indexterm" name="id394852"></a> +<a class="indexterm" name="id394859"></a> +<a class="indexterm" name="id394866"></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="id394874"></a> <a class="indexterm" name="id394881"></a> + <a class="indexterm" name="id394888"></a> <a class="indexterm" name="id394894"></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 href="CUPS-printing.html#1small" 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="1small"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id394963"></a>UNIX Printfile Conversion and GUI Basics</h3></div></div></div><p> + <a class="indexterm" name="id394971"></a> + <a class="indexterm" name="id394978"></a> + <a class="indexterm" name="id394984"></a> + <a class="indexterm" name="id394991"></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">paper output</span>”, as some had + demanded at the time, and restricted itself to “<span class="quote">on-screen only.</span>” (For some years now, the + “<span class="quote">Xprint</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">font</span>” directories on + your system; there are separate ones for fonts used for X display and fonts to be used on paper. + </p><p><b>Background. </b> + <a class="indexterm" name="id395031"></a> +<a class="indexterm" name="id395038"></a> +<a class="indexterm" name="id395045"></a> +<a class="indexterm" name="id395051"></a> +<a class="indexterm" name="id395058"></a> +<a class="indexterm" name="id395065"></a> +<a class="indexterm" name="id395072"></a> +<a class="indexterm" name="id395079"></a> +<a class="indexterm" name="id395085"></a> +<a class="indexterm" name="id395092"></a> + The PostScript programming language is an “<span class="quote">invention</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">raster images</span>” or + “<span class="quote">pixels</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" lang="en"><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="id395133"></a> + <a class="indexterm" name="id395139"></a> + <a class="indexterm" name="id395148"></a> +<a class="indexterm" name="id395158"></a> +<a class="indexterm" name="id395164"></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">interpreter,</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" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p> + <a class="indexterm" name="id395187"></a> +<a class="indexterm" name="id395194"></a> +<a class="indexterm" name="id395200"></a> + Traditional UNIX programs and printing systems while using PostScript are largely not + PPD-aware. PPDs are “<span class="quote">PostScript Printer Description</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 href="CUPS-printing.html#2small" title="Figure 22.2. Printing to a PostScript Printer.">Printing to a PostScript Printer</a>. + </p></div><div class="figure"><a name="2small"></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="id395274"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id395287"></a>Ghostscript: The Software RIP for Non-PostScript Printers</h3></div></div></div><p> + <a class="indexterm" name="id395295"></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 href="CUPS-printing.html#3small" 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="3small"></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" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3><p> +<a class="indexterm" name="id395360"></a> +<a class="indexterm" name="id395367"></a> +<a class="indexterm" name="id395374"></a> + Use the “<span class="quote">gs -h</span>” command to check for all built-in “<span class="quote">devices</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">device</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">AFPL</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="id395406"></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, Gimp-Print, MandrakeSoft, SuSE, Red Hat, and Debian. It includes the “<span class="quote">cups</span>” device + (essential to print to non-PS printers from CUPS). + </p></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id395426"></a>PostScript Printer Description (PPD) Specification</h3></div></div></div><p> + <a class="indexterm" name="id395434"></a> +<a class="indexterm" name="id395441"></a> +<a class="indexterm" name="id395447"></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" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p> + <a class="indexterm" name="id395476"></a> +<a class="indexterm" name="id395483"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id395495"></a>Using Windows-Formatted Vendor PPDs</h3></div></div></div><p> +<a class="indexterm" name="id395503"></a> +<a class="indexterm" name="id395510"></a> +<a class="indexterm" name="id395516"></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" 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 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" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p> + <a class="indexterm" name="id395550"></a> + <a class="indexterm" name="id395556"></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" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3><p> +<a class="indexterm" name="id395580"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id395604"></a>CUPS Also Uses PPDs for Non-PostScript Printers</h3></div></div></div><p> +<a class="indexterm" name="id395612"></a> +<a class="indexterm" name="id395618"></a> +<a class="indexterm" name="id395625"></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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id395639"></a>The CUPS Filtering Architecture</h2></div></div></div><p> +<a class="indexterm" name="id395647"></a> +<a class="indexterm" name="id395653"></a> +<a class="indexterm" name="id395660"></a> +<a class="indexterm" name="id395667"></a> +<a class="indexterm" name="id395674"></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 type="disc"><li><p> +<a class="indexterm" name="id395702"></a> +<a class="indexterm" name="id395709"></a> + The first stage uses a Ghostscript device named “<span class="quote">cups</span>” + (this is since version 1.1.15) and produces a generic raster format + called “<span class="quote">CUPS raster</span>”. + </p></li><li><p> +<a class="indexterm" name="id395729"></a> + The second stage uses a “<span class="quote">raster driver</span>” that converts + the generic CUPS raster to a device-specific raster. + </p></li></ul></div><p> +<a class="indexterm" name="id395744"></a> +<a class="indexterm" name="id395751"></a> +<a class="indexterm" name="id395758"></a> +Make sure your Ghostscript version has the “<span class="quote">cups</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">cups</span>” as a device in your Ghostscript, +you either need to patch GNU Ghostscript and recompile or use +<a class="indexterm" name="id395786"></a><a 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="id395806"></a> +<a class="indexterm" name="id395812"></a> +<a class="indexterm" name="id395819"></a> +<a class="indexterm" name="id395826"></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 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">cups</span>” device, but one of the many others. However, even for Foomatic/cupsomatic usage, best +results and <a class="indexterm" name="id395845"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id395860"></a>MIME Types and CUPS Filters</h3></div></div></div><p> + <a class="indexterm" name="id395868"></a> + <a class="indexterm" name="id395878"></a> +<a class="indexterm" name="id395884"></a> +<a class="indexterm" name="id395891"></a> +<a class="indexterm" name="id395898"></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="id395931"></a> +</p><pre class="programlisting"> +application/pdf pdf string(0,%PDF) +</pre><p> +<a class="indexterm" name="id395944"></a> +<a class="indexterm" name="id395951"></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,<04>%!) +</pre><p> +<a class="indexterm" name="id395981"></a> +<a class="indexterm" name="id395988"></a> +<a class="indexterm" name="id395995"></a> +<a class="indexterm" name="id396002"></a> +<a class="indexterm" name="id396008"></a> +<a class="indexterm" name="id396015"></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><04>%!</em></span>, it is a generic PostScript file + (<em class="parameter"><code>application/postscript</code></em>). + </p><div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p> +<a class="indexterm" name="id396057"></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" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p> +<a class="indexterm" name="id396075"></a> +<a class="indexterm" name="id396082"></a> +<a class="indexterm" name="id396089"></a> +<a class="indexterm" name="id396095"></a> +<a class="indexterm" name="id396102"></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="id396158"></a> +<a class="indexterm" name="id396165"></a> +<a class="indexterm" name="id396172"></a> +<a class="indexterm" name="id396178"></a> +<a class="indexterm" name="id396185"></a> +<a class="indexterm" name="id396192"></a> +<a class="indexterm" name="id396198"></a> +<a class="indexterm" name="id396205"></a> +<a class="indexterm" name="id396211"></a> +<a class="indexterm" name="id396218"></a> +<a class="indexterm" name="id396225"></a> +<a class="indexterm" name="id396232"></a> +<a class="indexterm" name="id396239"></a> +<a class="indexterm" name="id396245"></a> +<a class="indexterm" name="id396252"></a> +<a class="indexterm" name="id396259"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id396270"></a>MIME Type Conversion Rules</h3></div></div></div><p> + <a class="indexterm" name="id396278"></a> + <a class="indexterm" name="id396284"></a> +<a class="indexterm" name="id396291"></a> +<a class="indexterm" name="id396298"></a> +<a class="indexterm" name="id396305"></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="id396332"></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="id396358"></a> +</p><pre class="programlisting"> +application/vnd.hp-HPGL application/postscript 66 hpgltops +</pre><p> +<a class="indexterm" name="id396371"></a> + This is the <em class="parameter"><code>hpgltops</code></em>, which processes HP-GL + plotter files to PostScript. + <a class="indexterm" name="id396384"></a> +</p><pre class="programlisting"> +application/octet-stream +</pre><p> + Here are two more examples: + <a class="indexterm" name="id396398"></a> +<a class="indexterm" name="id396404"></a> +<a class="indexterm" name="id396411"></a> +<a class="indexterm" name="id396418"></a> +</p><pre class="programlisting"> +application/x-shell application/postscript 33 texttops +text/plain application/postscript 33 texttops +</pre><p> +<a class="indexterm" name="id396431"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id396465"></a>Filtering Overview</h3></div></div></div><p> + <a class="indexterm" name="id396473"></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" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id396505"></a>Filter Requirements</h4></div></div></div><p> + The “<span class="quote">CUPS requirements</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 expected 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id396616"></a>Prefilters</h3></div></div></div><p> + <a class="indexterm" name="id396624"></a> +<a class="indexterm" name="id396631"></a> +<a class="indexterm" name="id396637"></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="id396649"></a> +<a class="indexterm" name="id396656"></a> +<a class="indexterm" name="id396663"></a> +<a class="indexterm" name="id396669"></a> +<a class="indexterm" name="id396676"></a> +<a class="indexterm" name="id396682"></a> +<a class="indexterm" name="id396689"></a> +<a class="indexterm" name="id396696"></a> +<a class="indexterm" name="id396703"></a> +<a class="indexterm" name="id396710"></a> + But what happens if you send one of the supported non-PS formats to print? Then CUPS runs + “<span class="quote">prefilters</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 href="CUPS-printing.html#4small" title="Figure 22.4. Prefiltering in CUPS to Form PostScript.">Prefiltering in + CUPS to Form PostScript</a>. + </p><div class="figure"><a name="4small"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id396793"></a>pstops</h3></div></div></div><p> +<a class="indexterm" name="id396801"></a> +<a class="indexterm" name="id396808"></a> +<a class="indexterm" name="id396814"></a> +<a class="indexterm" name="id396821"></a> +<a class="indexterm" name="id396828"></a> +<a class="indexterm" name="id396835"></a> +<a class="indexterm" name="id396842"></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 href="CUPS-printing.html#5small" title="Figure 22.5. Adding Device-Specific Print Options.">Adding Device-Specific Print Options</a>. + </p><div class="figure"><a name="5small"></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 type="disc"><li><p> + Selecting the range of pages to be printed (e.g., you can choose to + print only pages “<span class="quote">3, 6, 8-11, 16, and 19-21</span>”, or only odd-numbered + pages). + </p></li><li><p> + Putting two or more logical pages on one sheet of paper (the + so-called “<span class="quote">number-up</span>” function). + </p></li><li><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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id396952"></a>pstoraster</h3></div></div></div><p> +<a class="indexterm" name="id396960"></a> +<a class="indexterm" name="id396967"></a> +<a class="indexterm" name="id396973"></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 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="id397044"></a> +<a class="indexterm" name="id397051"></a> +<a class="indexterm" name="id397058"></a> +<a class="indexterm" name="id397065"></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 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="id397129"></a> +<a class="indexterm" name="id397136"></a> +<a class="indexterm" name="id397143"></a> +<a class="indexterm" name="id397149"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id397202"></a>imagetops and imagetoraster</h3></div></div></div><p> +<a class="indexterm" name="id397210"></a> +<a class="indexterm" name="id397217"></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 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id397282"></a>rasterto [printers specific]</h3></div></div></div><p> +<a class="indexterm" name="id397290"></a> +<a class="indexterm" name="id397297"></a> +<a class="indexterm" name="id397304"></a> +<a class="indexterm" name="id397310"></a> +<a class="indexterm" name="id397317"></a> +<a class="indexterm" name="id397324"></a> +<a class="indexterm" name="id397331"></a> +<a class="indexterm" name="id397338"></a> +<a class="indexterm" name="id397344"></a> +<a class="indexterm" name="id397351"></a> +<a class="indexterm" name="id397358"></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 Gimp-Print) + wanting to cooperate as closely as possible with CUPS. See <a 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id397494"></a>CUPS Backends</h3></div></div></div><p> +<a class="indexterm" name="id397502"></a> +<a class="indexterm" name="id397509"></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">device-URI</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 class="simplelist" border="0" summary="Simple list"><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">special</span>” printers that send + the print jobs as email (through a “<span class="quote">mailto:/</span>” backend), convert them to + PDF (through a “<span class="quote">pdfgen:/</span>” backend) or dump them to “<span class="quote">/dev/null</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="id397760"></a> +<a class="indexterm" name="id397767"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id397802"></a>The Role of <em class="parameter"><code>cupsomatic/foomatic</code></em></h3></div></div></div><p> + <a class="indexterm" name="id397814"></a> + <a class="indexterm" name="id397821"></a> +<a class="indexterm" name="id397828"></a> +<a class="indexterm" name="id397835"></a> +<a class="indexterm" name="id397842"></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 & 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 give to + the print job. + </p><p> + <a class="indexterm" name="id397899"></a> +<a class="indexterm" name="id397906"></a> +<a class="indexterm" name="id397912"></a> +<a class="indexterm" name="id397919"></a> +<a class="indexterm" name="id397926"></a> +<a class="indexterm" name="id397933"></a> +<a class="indexterm" name="id397940"></a> +<a class="indexterm" name="id397946"></a> +<a class="indexterm" name="id397953"></a> +<a class="indexterm" name="id397960"></a> +<a class="indexterm" name="id397967"></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">Point'n'Print</span>” to Windows clients. A better + and more powerful successor is now in a stable beta-version: 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id398021"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id398033"></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">filter cost.</span>” CUPS decides for the most “<span class="quote">inexpensive</span>” route. + </p><div class="tip" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3><p> +<a class="indexterm" name="id398060"></a> +<a class="indexterm" name="id398067"></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">FilterLimit</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id398094"></a>“<span class="quote">Raw</span>” Printing</h3></div></div></div><p> +<a class="indexterm" name="id398104"></a> +<a class="indexterm" name="id398111"></a> +<a class="indexterm" name="id398117"></a> + You can tell CUPS to print (nearly) any file “<span class="quote">raw</span>”. “<span class="quote">Raw</span>” means it will not be + filtered. CUPS will send the file to the printer “<span class="quote">as is</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"><em class="parameter"><code>-o raw</code></em></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">rawprinter</span>”, connected via the “<span class="quote">socket</span>” protocol (a.k.a. + “<span class="quote">HP JetDirect</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">normal</span>” print queue.) + </p><p> + CUPS will automatically treat each job sent to a queue as a “<span class="quote">raw</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id398194"></a>application/octet-stream Printing</h3></div></div></div><p> +<a class="indexterm" name="id398202"></a> +<a class="indexterm" name="id398209"></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 type="disc"><li><p><code class="filename">/etc/cups/mime.convs</code></p></li><li><p><code class="filename">/etc/cups/mime.types</code></p></li></ul></div><p> +<a class="indexterm" name="id398269"></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="id398290"></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="id398322"></a> + This line tells CUPS to use the <span class="emphasis"><em>Null Filter</em></span> + (denoted as “<span class="quote">-</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" 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">raw</span>” printing, it only <span class="emphasis"><em>allows</em></span> it. + </p></div><p><b>Background. </b> +<a class="indexterm" name="id398386"></a> +<a class="indexterm" name="id398393"></a> +<a class="indexterm" name="id398399"></a> +<a class="indexterm" name="id398406"></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">Unknown</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">raw</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">rules</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id398455"></a>PostScript Printer Descriptions for Non-PostScript Printers</h3></div></div></div><p> + <a class="indexterm" name="id398463"></a> +<a class="indexterm" name="id398469"></a> +<a class="indexterm" name="id398476"></a> +<a class="indexterm" name="id398483"></a> +<a class="indexterm" name="id398489"></a> +<a class="indexterm" name="id398496"></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="id398513"></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 Gimp-Print + 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 href="CUPS-printing.html#cups-ppds" title="Table 22.1. PPDs Shipped with CUPS">???</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id398718"></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="id398732"></a> + <a class="indexterm" name="id398739"></a> + Native CUPS rasterization works in two steps: + </p><div class="itemizedlist"><ul type="disc"><li><p> +<a class="indexterm" name="id398753"></a> + First is the <em class="parameter"><code>pstoraster</code></em> step. It uses the special CUPS + <a class="indexterm" name="id398766"></a> + device from ESP Ghostscript 7.05.x as its tool. + </p></li><li><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 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="id398861" href="#ftn.id398861">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="id398907"></a> + <a class="indexterm" name="id398914"></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="id398944"></a> +<a class="indexterm" name="id398951"></a> +<a class="indexterm" name="id398958"></a> +<a class="indexterm" name="id398964"></a> +<a class="indexterm" name="id398971"></a> +<a class="indexterm" name="id398978"></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 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id399033"></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="id399045"></a> +<a class="indexterm" name="id399052"></a> +<a class="indexterm" name="id399058"></a> +<a class="indexterm" name="id399065"></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">two-up</span>” and “<span class="quote">duplex</span>”: + </p><div class="itemizedlist"><ul type="disc"><li><p>Your print options (page selection as required, two-up, + duplex) are passed to CUPS on the command line.</p></li><li><p>The (complete) PDF file is sent to CUPS and autotyped as + <em class="parameter"><code>application/pdf</code></em>.</p></li><li><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><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">two pages on one sheet</span>”, and + inserts the correct “<span class="quote">duplex</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><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 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="id399167"></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="id399215"></a> +<a class="indexterm" name="id399222"></a> +<a class="indexterm" name="id399229"></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 type="disc"><li><p> + Your print options (page selection as required, two-up, + duplex) are passed to CUPS on the command line. + </p></li><li><p> + The (complete) PDF file is sent to CUPS and autotyped as + <em class="parameter"><code>application/pdf</code></em>. + </p></li><li><p> +<a class="indexterm" name="id399266"></a> +<a class="indexterm" name="id399272"></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><p> +<a class="indexterm" name="id399296"></a> +<a class="indexterm" name="id399303"></a> + The file then passes the “<span class="quote">pstops</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">two pages on one sheet,</span>” and inserts the + correct “<span class="quote">duplex</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><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><p> +<a class="indexterm" name="id399354"></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><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 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id399434"></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="id399447"></a><a class="indexterm" name="id399456"></a><ul type="disc"><li><p> + <a 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">out of the box</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><p> + The <a href="http://gimp-print.sourceforge.net/" target="_top">Gimp-Print Project</a> + (GPL, free software) provides around 140 PPDs (supporting nearly 400 printers, many driven + to photo quality output), to be used alongside the Gimp-Print CUPS filters. + </p></li><li><p> + <a 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><p> + <a 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><p> + <a 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><p> + <a 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, Gimp-Print, and HPIJS). + </p></li></ul></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id399543"></a>Printing with Interface Scripts</h3></div></div></div><p> +<a class="indexterm" name="id399551"></a> +<a class="indexterm" name="id399557"></a> + CUPS also supports the use of “<span class="quote">interface scripts</span>” as known from + System V AT&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">unknown animal</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 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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id399622"></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">purely Windows</span>” setup: Windows clients +with a Windows NT print server. +</p><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id399636"></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="id399645"></a> +<a class="indexterm" name="id399652"></a> +</p><div class="itemizedlist"><ul type="disc"><li><p>Execute the driver locally and render the GDI output + (EMF) into the printer-specific format on their own. + </p></li><li><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 href="CUPS-printing.html#small11" title="Figure 22.13. Print Driver Execution on the Client."> +Print Driver Execution on the Client</a>, and +<a 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id399694"></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">spooling-only</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 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id399759"></a>Driver Execution on the Server</h3></div></div></div><p> +<a class="indexterm" name="id399767"></a> +<a class="indexterm" name="id399774"></a> +<a class="indexterm" name="id399780"></a> +<a class="indexterm" name="id399787"></a> +<a class="indexterm" name="id399794"></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 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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id399858"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id399874"></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 type="disc"><li><p>Let the Windows clients send PostScript to the CUPS + server.</p></li><li><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 class="simplelist" border="0" summary="Simple list"><tr><td><a class="indexterm" name="id399924"></a><em class="parameter"><code>printing = cups</code></em></td></tr><tr><td><a class="indexterm" name="id399936"></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="indexterm" name="id399952"></a>print command or <a class="indexterm" name="id399959"></a>lppause command) 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&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="indexterm" name="id399981"></a>classicalprinting = sysv). This is illustrated in <a href="CUPS-printing.html#13small" title="Figure 22.15. Printing via CUPS/Samba Server.">the Printing via +CUPS/Samba Server diagram</a>. +</p><div class="figure"><a name="13small"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id400039"></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="indexterm" name="id400052"></a>path = /var/spool/samba, 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">problem.</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">localhost</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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id400108"></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="id400122"></a> +<a class="indexterm" name="id400129"></a> +<a class="indexterm" name="id400136"></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">on the fly</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 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id400187"></a>PPDs for Non-PS Printers on UNIX</h3></div></div></div><p> +<a class="indexterm" name="id400195"></a> +CUPS does not limit itself to “<span class="quote">real</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id400224"></a>PPDs for Non-PS Printers on Windows</h3></div></div></div><p> +<a class="indexterm" name="id400232"></a> +CUPS-PPDs can also be used on Windows clients, on top of a “<span class="quote">core</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 type="disc"><li><p> + Act as a networked PostScript RIP handling print files from all client platforms in a uniform way. + </p></li><li><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">raw</span>” print jobs, which always remain unfiltered per definition. + </p></li><li><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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id400285"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id400296"></a>Printer Drivers Running in “<span class="quote">Kernel Mode</span>” Cause Many +Problems</h3></div></div></div><p> +Windows NT printer drivers, which run in “<span class="quote">kernel mode</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">blue screens of death</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id400328"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id400341"></a>CUPS: A “<span class="quote">Magical Stone</span>”?</h3></div></div></div><p> +<a class="indexterm" name="id400352"></a> +<a class="indexterm" name="id400359"></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">raw spooling</span>” device. Plus, this setup is not yet widely tested, although the first feedbacks +look very promising. +</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id400378"></a>PostScript Drivers with No Major Problems, Even in Kernel +Mode</h3></div></div></div><p> +<a class="indexterm" name="id400386"></a> +<a class="indexterm" name="id400393"></a> +<a class="indexterm" name="id400400"></a> +<a class="indexterm" name="id400406"></a> +<a class="indexterm" name="id400413"></a> +<a class="indexterm" name="id400420"></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">2</span>” of “<span class="quote">W32X86</span>” are “<span class="quote">old</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">diff</span>” under +the GPL, and if you are the owner of an “<span class="quote">MS DDK for Windows NT,</span>” you can check the driver +yourself. +</p></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id400456"></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 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id400475"></a><span class="emphasis"><em>cupsaddsmb</em></span>: The Unknown Utility</h3></div></div></div><p> +<a class="indexterm" name="id400485"></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 type="disc"><li><p>It supports a much more accurate page accounting.</p></li><li><p>It supports banner pages and page labels on all printers.</p></li><li><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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id400563"></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 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 class="simplelist" border="0" summary="Simple list"><tr><td> </td></tr><tr><td><em class="parameter"><code>[global]</code></em></td></tr><tr><td><a class="indexterm" name="id400631"></a><em class="parameter"><code>load printers = yes</code></em></td></tr><tr><td><a class="indexterm" name="id400644"></a><em class="parameter"><code>printing = cups</code></em></td></tr><tr><td><a class="indexterm" name="id400656"></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="id400678"></a><em class="parameter"><code>comment = All Printers</code></em></td></tr><tr><td><a class="indexterm" name="id400690"></a><em class="parameter"><code>path = /var/spool/samba</code></em></td></tr><tr><td><a class="indexterm" name="id400703"></a><em class="parameter"><code>browseable = no</code></em></td></tr><tr><td><a class="indexterm" name="id400715"></a><em class="parameter"><code>public = yes</code></em></td></tr><tr><td># setting depends on your requirements</td></tr><tr><td><a class="indexterm" name="id400731"></a><em class="parameter"><code>guest ok = yes</code></em></td></tr><tr><td><a class="indexterm" name="id400744"></a><em class="parameter"><code>writable = no</code></em></td></tr><tr><td><a class="indexterm" name="id400756"></a><em class="parameter"><code>printable = yes</code></em></td></tr><tr><td><a class="indexterm" name="id400769"></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="id400790"></a><em class="parameter"><code>comment = Printer Drivers</code></em></td></tr><tr><td><a class="indexterm" name="id400803"></a><em class="parameter"><code>path = /etc/samba/drivers</code></em></td></tr><tr><td><a class="indexterm" name="id400816"></a><em class="parameter"><code>browseable = yes</code></em></td></tr><tr><td><a class="indexterm" name="id400828"></a><em class="parameter"><code>guest ok = no</code></em></td></tr><tr><td><a class="indexterm" name="id400841"></a><em class="parameter"><code>read only = yes</code></em></td></tr><tr><td><a class="indexterm" name="id400853"></a><em class="parameter"><code>write list = root</code></em></td></tr></table></div></div><br class="example-break"></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id400868"></a>CUPS “<span class="quote">PostScript Driver for Windows NT/200x/XP</span>”</h3></div></div></div><p> +<a class="indexterm" name="id400878"></a> +CUPS users may get the exact same package from <a 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="id400921"></a> +<a class="indexterm" name="id400930"></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">tar</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" 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="id401073"></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">diff</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id401090"></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 type="disc"><li><p>cups.hlp</p></li><li><p>cupsdrvr.dll</p></li><li><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 type="disc"><li><p>ADFONTS.MFM</p></li><li><p>ADOBEPS4.DRV</p></li><li><p>ADOBEPS4.HLP</p></li><li><p>DEFPRTR2.PPD</p></li><li><p>ICONLIB.DLL</p></li><li><p>PSMON.DLL</p></li></ul></div><p>Windows NT, 2000, and XP are supported by:</p><div class="itemizedlist"><ul type="disc"><li><p>ADOBEPS5.DLL</p></li><li><p>ADOBEPSU.DLL</p></li><li><p>ADOBEPSU.HLP</p></li></ul></div><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p> +<a class="indexterm" name="id401182"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id401201"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id401221"></a>ESP Print Pro PostScript Driver for Windows NT/200x/XP</h3></div></div></div><p> +<a class="indexterm" name="id401229"></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 href="http://www.easysw.com/software.html" target="_top">Easy Software</a> web site. +You need to locate the link labeled “<span class="quote">SAMBA</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id401275"></a>Caveats to Be Considered</h3></div></div></div><p> +<a class="indexterm" name="id401283"></a> +<a class="indexterm" name="id401290"></a> +<a class="indexterm" name="id401297"></a> +<a class="indexterm" name="id401304"></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" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3><p> +<a class="indexterm" name="id401360"></a> +<a class="indexterm" name="id401366"></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" 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" 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" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p> +<a class="indexterm" name="id401436"></a> +<a class="indexterm" name="id401443"></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">delete</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 -> Settings -> Control Panel -> +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">delete</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" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p> +<a class="indexterm" name="id401510"></a> +<a class="indexterm" name="id401519"></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 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id401555"></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 type="disc"><li><p>No hassle with the Adobe EULA.</p></li><li><p>No hassle with the question, “<span class="quote">Where do I + get the ADOBE*.* driver files?</span>”</p></li><li><p> + <a class="indexterm" name="id401583"></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><1B + >%-12345X</code></em> or <em class="parameter"><code><escape>%-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="id401617"></a> + <em class="parameter"><code>application/postscript</code></em>, but as the more special MIME type + <a class="indexterm" name="id401630"></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">1</span>” is logged in a standard setup). + </p></li><li><p>The Adobe driver has more options to misconfigure the +<a class="indexterm" name="id401658"></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><p>The CUPS PostScript driver output sent by Windows +<a class="indexterm" name="id401683"></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><p> + <a class="indexterm" name="id401713"></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><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><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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id401750"></a>Run cupsaddsmb (Quiet Mode)</h3></div></div></div><p> +<a class="indexterm" name="id401758"></a> +<a class="indexterm" name="id401765"></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="indexterm" name="id401798"></a>security = user). +</p><p> +Here is an example of a successfully run <code class="literal">cupsaddsmb</code> command: +<a class="indexterm" name="id401815"></a> +<a class="indexterm" name="id401822"></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="id401853"></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">exports</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id401880"></a>Run cupsaddsmb with Verbose Output</h3></div></div></div><p> +<a class="indexterm" name="id401888"></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">\</span>” at the end of +a line indicate that I inserted an artificial line break plus some +indentation here: +<a class="indexterm" name="id401904"></a> +<a class="indexterm" name="id401913"></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" 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id402011"></a>Understanding cupsaddsmb</h3></div></div></div><p> +<a class="indexterm" name="id402019"></a> +What has happened? What did <code class="literal">cupsaddsmb</code> do? There are five stages of the procedure: +</p><div class="orderedlist"><ol type="1"><li><p> + <a class="indexterm" name="id402043"></a> + Call the CUPS server via IPP and request the driver files and the PPD file for the named printer.</p></li><li><p>Store the files temporarily in the local TEMPDIR (as defined in <code class="filename">cupsd.conf</code>).</p></li><li><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><p> + <a class="indexterm" name="id402077"></a> + Connect via rpcclient to the Samba server and execute the <code class="literal">adddriver</code> command with the correct parameters. + </p></li><li><p> + <a class="indexterm" name="id402098"></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" 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id402147"></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 type="1"><li><p><span class="emphasis"><em>Printer Driver infotec_2105 successfully + installed.</em></span> # (for the W32X86 == Windows NT/200x/XP + architecture).</p></li><li><p><span class="emphasis"><em>Printer Driver infotec_2105 successfully + installed.</em></span> # (for the WIN40 == Windows 9x/Me + architecture).</p></li><li><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="indexterm" name="id402217"></a>use client driver = yes for this printer. +Setting it to “<span class="quote">no</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" 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id402254"></a>cupsaddsmb with a Samba PDC</h3></div></div></div><p> +<a class="indexterm" name="id402262"></a> +<a class="indexterm" name="id402269"></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">escape</span>” the second one). +</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id402332"></a>cupsaddsmb Flowchart</h3></div></div></div><p> +<a class="indexterm" name="id402339"></a> +<a class="indexterm" name="id402346"></a> +<a 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id402410"></a>Installing the PostScript Driver on a Client</h3></div></div></div><p> +<a class="indexterm" name="id402418"></a> +<a class="indexterm" name="id402425"></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 type="disc"><li><p> + <a class="indexterm" name="id402446"></a> + Open the <span class="guilabel">Printers</span> share of Samba in Network Neighborhood.</p></li><li><p>Right-click on the printer in question.</p></li><li><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 Winword, 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="id402510"></a> +<a class="indexterm" name="id402517"></a> +<a class="indexterm" name="id402524"></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:\> </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">ntadmin</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" lang="en"><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 type="disc"><li><p> + Avoid the PostScript Output Option: Optimize for Speed setting. Use the Optimize for Portability instead + (Adobe PostScript driver).</p></li><li><p> + Don't use the Page Independence: NO setting. Instead, use Page Independence: YES (CUPS PostScript Driver). + </p></li><li><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><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><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><p> + Say Yes to PostScript Error Handler (Adobe).</p></li></ul></div></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id402619"></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 type="1"><li><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><p>Copy all files to <em class="parameter"><code>[print$]</code></em>.</p></li><li><p> + <a class="indexterm" name="id402655"></a> + Run <code class="literal">rpcclient adddriver</code> + (for each client architecture you want to support).</p></li><li><p> + <a class="indexterm" name="id402675"></a> + Run <code class="literal">rpcclient setdriver.</code></p></li></ol></div><p> +<a class="indexterm" name="id402694"></a> +<a class="indexterm" name="id402703"></a> +<a class="indexterm" name="id402712"></a> +<a class="indexterm" name="id402721"></a> +<a class="indexterm" name="id402730"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id402785"></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="id402803"></a> +<a class="indexterm" name="id402810"></a> +<a class="indexterm" name="id402816"></a> +<code class="literal">adddriver <arch> <config></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">NULL</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">NULL</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="id402887"></a> +<a class="indexterm" name="id402894"></a> +<code class="literal">setdriver <printername> <drivername></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="id402917"></a> +<a class="indexterm" name="id402924"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id402945"></a>Understanding the rpcclient man Page</h3></div></div></div><p> +<a class="indexterm" name="id402953"></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">\</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><config></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">LongPrinterName</span>” in reality should be called the “<span class="quote">Driver Name</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">How do I know which files are Driver File</span>”, +“<span class="quote">Data File</span>”, “<span class="quote">Config File</span>”, “<span class="quote">Help File</span>” and “<span class="quote">Language Monitor +File in each case?</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id403037"></a>Producing an Example by Querying a Windows Box</h3></div></div></div><p> +<a class="indexterm" name="id403045"></a> +<a class="indexterm" name="id403055"></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="id403103"></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">NULL</span>” entry. +</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id403163"></a>Requirements for adddriver and setdriver to Succeed</h3></div></div></div><p> +<a class="indexterm" name="id403171"></a> +<a class="indexterm" name="id403180"></a> +<a class="indexterm" name="id403187"></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 type="disc"><li><p>You are connected as <a class="indexterm" name="id403227"></a>printer admin or root (this is + <span class="emphasis"><em>not</em></span> the “<span class="quote">Printer Operators</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><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">0</span>” respective + “<span class="quote">2</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">$</span>”: <code class="literal">smbclient + //sambaserver/print\$ -U root.</code>)</p></li><li><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><p>The printer you are going to set up for the Windows + clients needs to be installed in CUPS already.</p></li><li><p> + <a class="indexterm" name="id403328"></a> + <a class="indexterm" name="id403337"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id403371"></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"><a name="id403382"></a><p class="title"><b>Procedure 22.2. Manual Driver Installation</b></p><ol type="1"><li><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><p class="title"><b>(Optional.) Check if the printer is recognized by Samba.</b></p><p> + <a class="indexterm" name="id403435"></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">empty</span>” field between the two + commas in the “<span class="quote">description</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">write + list</span>” as defined in <code class="filename">smb.conf</code> for <em class="parameter"><code>[print$]</code></em>. + </p></li><li><p class="title"><b>(Optional.) Check if Samba knows a driver for the printer.</b></p><p> + <a class="indexterm" name="id403526"></a> + <a class="indexterm" name="id403536"></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">The server does not have the required printer +driver installed.</span>” +</p></li><li><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">\</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">not installed here</span>” +message. +</p></li><li><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">root</span>” of +<em class="parameter"><code>[print$]</code></em>. +</p></li><li><p class="title"><b>Tell Samba that these are driver files (<code class="literal">adddriver</code>).</b></p><p> +<a class="indexterm" name="id403706"></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">2</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><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><p class="title"><b>(Optional.) Verify if Samba now recognizes the driver.</b></p><p> +<a class="indexterm" name="id403801"></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><p><font color="red"><title>Tell Samba which printer should use these driver files (<code class="literal">setdriver</code>).</title></font></p><p> +<a class="indexterm" name="id403852"></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><p class="title"><b>(Optional) Verify if Samba has recognized this association.</b></p><p> +<a class="indexterm" name="id403907"></a> +<a class="indexterm" name="id403916"></a> +<a class="indexterm" name="id403926"></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="id403993"></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">description</span>” line. +</p></li><li><p class="title"><b>(Optional.) Tickle the driver into a correct +device mode.</b></p><p> +<a class="indexterm" name="id404026"></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">DOS box</span>” (type root's smbpassword when prompted): +</p><pre class="screen"> +<code class="prompt">C:\> </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><p class="title"><b>Install the printer on a client (Point'n'Print).</b></p><p> +<a class="indexterm" name="id404135"></a> +</p><pre class="screen"> +<code class="prompt">C:\> </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><p class="title"><b>(Optional) Print a test page.</b></p><a class="indexterm" name="id404175"></a><pre class="screen"> +<code class="prompt">C:\> </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><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><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..." >> /var/log/samba/log.smbd</code></strong> +</pre></li></ol></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id404250"></a>Troubleshooting Revisited</h3></div></div></div><p> +<a class="indexterm" name="id404258"></a> +The setdriver command will fail if in Samba's mind the queue is not +already there. A successful installation displys 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="id404287"></a> +<a class="indexterm" name="id404294"></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">sees</span>” the printer: +<a class="indexterm" name="id404319"></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="id404347"></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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id404381"></a>The Printing <code class="filename">*.tdb</code> Files</h2></div></div></div><p> +<a class="indexterm" name="id404395"></a> +<a class="indexterm" name="id404402"></a> +<a class="indexterm" name="id404410"></a> +<a class="indexterm" name="id404419"></a> +<a class="indexterm" name="id404428"></a> +<a class="indexterm" name="id404437"></a> +<a class="indexterm" name="id404446"></a> +<a class="indexterm" name="id404455"></a> +<a class="indexterm" name="id404464"></a> +<a class="indexterm" name="id404473"></a> +<a class="indexterm" name="id404482"></a> +<a class="indexterm" name="id404491"></a> +<a class="indexterm" name="id404500"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id404580"></a>Trivial Database Files</h3></div></div></div><p> +<a class="indexterm" name="id404588"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id404646"></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">Why not +ASCII?</span>”, you may ask. “<span class="quote">After all, ASCII configuration files are a good and proven tradition on +UNIX.</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id404707"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id404753"></a>Using <code class="literal">tdbbackup</code></h3></div></div></div><p> +<a class="indexterm" name="id404766"></a> +<a class="indexterm" name="id404777"></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] <fname...> + + 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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id404864"></a>CUPS Print Drivers from Linuxprinting.org</h2></div></div></div><p> +<a class="indexterm" name="id404872"></a> +CUPS ships with good support for HP LaserJet-type printers. You can install the generic driver as follows: +<a class="indexterm" name="id404880"></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">least common denominator</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 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" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p> +<a class="indexterm" name="id404961"></a> +<a class="indexterm" name="id404967"></a> +<a class="indexterm" name="id404974"></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 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id405024"></a>foomatic-rip and Foomatic Explained</h3></div></div></div><p> +<a class="indexterm" name="id405032"></a> +<a class="indexterm" name="id405039"></a> +Nowadays, most Linux distributions rely on the utilities from the <a 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 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 href="http://www.linuxprinting.org/foomatic.html" target="_top">Foomatic</a> database. Currently there are <a 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" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id405085"></a>690 “<span class="quote">Perfect</span>” Printers</h4></div></div></div><p> +<a class="indexterm" name="id405096"></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" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id405121"></a>How the Printing HOWTO Started It All</h4></div></div></div><p> +A few years ago <a 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 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">applying a structured deposition of +distinct patterns of ink or toner particles on paper substrates</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" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id405151"></a>Foomatic's Strange Name</h4></div></div></div><p> +<a class="indexterm" name="id405159"></a> +“<span class="quote">Why the funny name?</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">drivers</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 type="disc"><li><p>It made all current and future Ghostscript filter + developments available for CUPS.</p></li><li><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><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" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id405215"></a>cupsomatic, pdqomatic, lpdomatic, directomatic</h4></div></div></div><p> +<a class="indexterm" name="id405223"></a> +<a class="indexterm" name="id405230"></a> +<a class="indexterm" name="id405237"></a> +CUPS worked through a quickly hacked-up filter script named <a href="http://www.linuxprinting.org/download.cgi?filename=cupsomatic&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 href="http://www.linuxprinting.org/download.cgi?filename=lpdomatic&show=0" target="_top">PDQ-O-Matic</a> (for PDQ) +and <a href="http://www.linuxprinting.org/download.cgi?filename=lpdomatic&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 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 href="http://www.mandrakesoft.com/" target="_top">Mandrakesoft</a> to convert its printing system over to CUPS, after +they had seen his <a href="http://www.fltk.org/" target="_top">FLTK</a>-based <a 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 href="http://ppr.sourceforge.net/" target="_top">PPR</a> (via ppromatic), <a href="http://sourceforge.net/projects/lpr/" target="_top">GNUlpr</a>, and <a href="http://www.lprng.org/" target="_top">LPRng</a> (both via an extended lpdomatic) and spooler-less printing (<a href="http://www.linuxprinting.org/download.cgi?filename=directomatic&show=0" target="_top">directomatic</a>). +</p><p> +So, to answer your question, “<span class="quote">Foomatic</span>” is the general name for all the overlapping code and data +behind the “<span class="quote">*omatic</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">*omatic</span>” script for +every spooler, as well as different printer configuration files. +</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id405353"></a>The <span class="emphasis"><em>Grand Unification</em></span> Achieved</h4></div></div></div><p> +<a class="indexterm" name="id405364"></a> +This has all changed in Foomatic versions 2.9 (beta) and released as “<span class="quote">stable</span>” 3.0. It has now +achieved the convergence of all *omatic scripts and is called the <a href="http://www.linuxprinting.org/foomatic2.9/download.cgi?filename=foomatic-rip&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="id405393"></a> +<a class="indexterm" name="id405400"></a> +<a class="indexterm" name="id405406"></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 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 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="id405433"></a> +<a class="indexterm" name="id405440"></a> +<a class="indexterm" name="id405447"></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" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id405462"></a>Driver Development Outside</h4></div></div></div><p> +<a class="indexterm" name="id405470"></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 type="disc"><li><p> +<a class="indexterm" name="id405490"></a> + <a 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><p> +<a class="indexterm" name="id405513"></a> + <a 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><p> +<a class="indexterm" name="id405534"></a> + <a href="http://gimp-print.sf.net/" target="_top">Gimp-Print</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" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id405555"></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 href="http://www.linuxprinting.org//kpfeifle/LinuxKongress2002/Tutorial/" target="_top">tutorials</a> or solve +printing problems in its popular <a href="http://www.linuxprinting.org/newsportal/" target="_top">forums</a>. This +forum is not just for GNU/Linux users, but admins of <a href="http://www.linuxprinting.org/macosx/" target="_top"> +commercial UNIX systems</a> are also going there, and the relatively new +<a 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="id405594"></a> +<a class="indexterm" name="id405601"></a> +<a class="indexterm" name="id405607"></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" 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" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id405626"></a>Foomatic Database-Generated PPDs</h4></div></div></div><p> +<a class="indexterm" name="id405634"></a> +<a class="indexterm" name="id405641"></a> +<a class="indexterm" name="id405648"></a> +<a class="indexterm" name="id405655"></a> +<a class="indexterm" name="id405662"></a> +<a class="indexterm" name="id405668"></a> +<a class="indexterm" name="id405675"></a> +<a class="indexterm" name="id405682"></a> +<a class="indexterm" name="id405689"></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 href="http://printing.kde.org/overview/kprinter.phtml" target="_top">kprinter</a> or the GNOME <a 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id405729"></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 type="disc"><li><p>Open your browser at the Linuxprinting.org printer list <a href="http://www.linuxprinting.org/printer_list.cgi" target="_top">page.</a> + </p></li><li><p>Check the complete list of printers in the + <a href="http://www.linuxprinting.org/printer_list.cgi?make=Anyone" target="_top">database.</a>. + </p></li><li><p>Select your model and click on the link. + </p></li><li><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><p>In our case (HP LaserJet 4 Plus), we'll arrive at the default driver for the + <a href="http://www.linuxprinting.org/show_printer.cgi?recnum=HP-LaserJet_4_Plus" target="_top">HP-LaserJet 4 Plus.</a> + </p></li><li><p>The recommended driver is ljet4.</p></li><li><p>Several links are provided here. You should visit them all if you + are not familiar with the Linuxprinting.org database. + </p></li><li><p>There is a link to the database page for the + <a 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><p>Another link may lead you to the home page of the + author of the driver.</p></li><li><p>Important links are the ones that provide hints with + setup instructions for <a href="http://www.linuxprinting.org/cups-doc.html" target="_top">CUPS</a>; + <a href="http://www.linuxprinting.org/pdq-doc.html" target="_top">PDQ</a>; + <a href="http://www.linuxprinting.org/lpd-doc.html" target="_top">LPD, LPRng, and GNUlpr</a>); + as well as <a href="http://www.linuxprinting.org/ppr-doc.html" target="_top">PPR</a> + or “<span class="quote">spoolerless</span>” <a href="http://www.linuxprinting.org/direct-doc.html" target="_top">printing</a>. + </p></li><li><p>You can view the PPD in your browser through this link: + <a href="http://www.linuxprinting.org/ppd-o-matic.cgi?driver=ljet4&printer=HP-LaserJet_4_Plus&show=1" target="_top">http://www.linuxprinting.org/ppd-o-matic.cgi?driver=ljet4&printer=HP-LaserJet_4_Plus&show=1</a> + </p></li><li><p>Most importantly, you can also generate and download + the <a href="http://www.linuxprinting.org/ppd-o-matic.cgi?driver=ljet4&printer=HP-LaserJet_4_Plus&show=0" target="_top">PPD</a>. + </p></li><li><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><p>If you ended up on the drivers + <a href="http://www.linuxprinting.org/show_driver.cgi?driver=ljet4" target="_top">page</a>, + you can choose to use the “<span class="quote">PPD-O-Matic</span>” online PPD generator + program.</p></li><li><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><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><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">learn Ghostscript by doing</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><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><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><p>For all the new-style “<span class="quote">Foomatic-PPDs</span>” + from Linuxprinting.org, you also need a special CUPS filter named + foomatic-rip. + </p></li><li><p>The foomatic-rip Perl script itself also makes some + interesting <a href="http://www.linuxprinting.org/foomatic2.9/download.cgi?filename=foomatic-rip&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><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><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 type="disc"><li><p>A “<span class="quote">foomatic+something</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><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><p>Perl to make foomatic-rip run.</p></li><li><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><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><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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id406151"></a>Page Accounting with CUPS</h2></div></div></div><p> +<a class="indexterm" name="id406159"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id406181"></a>Setting Up Quotas</h3></div></div></div><p> +<a class="indexterm" name="id406189"></a> +This is an example command of how root would set a print quota in CUPS, assuming an existing printer named +“<span class="quote">quotaprinter</span>”: +<a class="indexterm" name="id406203"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id406232"></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">one</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">raw</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 href="http://www.linuxprinting.org/printer_list.cgi" target="_top">list</a>. +</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id406265"></a>Adobe and CUPS PostScript Drivers for Windows Clients</h3></div></div></div><p> +<a class="indexterm" name="id406273"></a> +<a class="indexterm" name="id406279"></a> +<a class="indexterm" name="id406286"></a> +<a class="indexterm" name="id406293"></a> +<a class="indexterm" name="id406300"></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 type="disc"><li><p> <a class="indexterm" name="id406354"></a> To not write a PJL-header.</p></li><li><p>To still read and support all PJL-options named in the + driver PPD with its own means.</p></li><li><p>That the file will pass through the <code class="literal">pstops</code> filter + on the CUPS/Samba server.</p></li><li><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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id406396"></a>The page_log File Syntax</h3></div></div></div><p> +<a class="indexterm" name="id406403"></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 type="disc"><li><p>Printer name</p></li><li><p>User name</p></li><li><p>Job ID</p></li><li><p>Time of printing</p></li><li><p>Page number</p></li><li><p>Number of copies</p></li><li><p>A billing information string (optional)</p></li><li><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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id406532"></a>Possible Shortcomings</h3></div></div></div><p> +What flaws or shortcomings are there with this quota system? +</p><div class="itemizedlist"><ul type="disc"><li><p>The ones named above (wrongly logged job in case of + printer hardware failure, and so on).</p></li><li><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><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><p>No means to read out the current balance or the + “<span class="quote">used-up</span>” number of current quota.</p></li><li><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><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">client-error-not-possible</span>”.</p></li></ul></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id406590"></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 type="disc"><li><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><p>Quotas will be handled more flexibly.</p></li><li><p>Probably there will be support for users to inquire + about their accounts in advance.</p></li><li><p>Probably there will be support for some other tools + around this topic.</p></li></ul></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id406625"></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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id406637"></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">raw</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">Raw</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">device URI</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">-</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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id406826"></a>Autodeletion or Preservation of CUPS Spool Files</h2></div></div></div><p> +<a class="indexterm" name="id406834"></a> +<a class="indexterm" name="id406840"></a> +<a class="indexterm" name="id406847"></a> +Samba print files pass through two spool directories. One is the incoming directory managed by Samba (set in +the <a class="indexterm" name="id406855"></a>path = /var/spool/samba 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id406894"></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">Yes</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">No</span>” as the CUPS + default. + </p></dd><dt><span class="term">“<span class="quote">MaxJobs 500</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id406971"></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 type="disc"><li><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><p>A Samba-<code class="filename">smb.conf</code> setting of + <a class="indexterm" name="id407008"></a>printing = cups.</p></li><li><p>Another Samba <code class="filename">smb.conf</code> setting of + <a class="indexterm" name="id407026"></a>printcap = cups.</p></li></ul></div><div class="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="indexterm" name="id407039"></a>print command, +<a class="indexterm" name="id407046"></a>lpq command, +<a class="indexterm" name="id407053"></a>lprm command, +<a class="indexterm" name="id407060"></a>lppause command, and +<a class="indexterm" name="id407067"></a>lpresume command) are ignored, and they should normally have no +influence whatsoever on your printing. +</p></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407077"></a>Manual Configuration</h3></div></div></div><p> +If you want to do things manually, replace the <a class="indexterm" name="id407086"></a>printing = cups +by <a class="indexterm" name="id407093"></a>printing = bsd. Then your manually set commands may work +(I haven't tested this), and a <a class="indexterm" name="id407100"></a>print command = lp -d %P %s; rm %s +may do what you need. +</p></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id407111"></a>Printing from CUPS to Windows-Attached Printers</h2></div></div></div><p> +<a class="indexterm" name="id407119"></a> +<a class="indexterm" name="id407126"></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 -> 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 -> /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 -> /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="id407234"></a> +<a class="indexterm" name="id407241"></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="id407294"></a> +<a class="indexterm" name="id407301"></a> +<a class="indexterm" name="id407307"></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 type="disc"><li><p><code class="filename">smb://WORKGROUP/WINDOWSNETBIOSNAME/printersharename</code></p></li><li><p><code class="filename">smb://username:password@WORKGROUP/WINDOWSNETBIOSNAME/printersharename</code></p></li><li><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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id407368"></a>More CUPS Filtering Chains</h2></div></div></div><p> +The diagrams in <a href="CUPS-printing.html#cups1" title="Figure 22.17. Filtering Chain 1.">Filtering Chain 1</a> and <a 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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id407477"></a>Common Errors</h2></div></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407482"></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">8 plus 3 chars suffix</span>”) max; otherwise, the driver files + will not get transferred when you want to download them from Samba.</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="root-ask-loop"></a>“<span class="quote">cupsaddsmb</span>” Keeps Asking for Root Password in Never-ending Loop</h3></div></div></div><p>Have you set <a class="indexterm" name="id407512"></a>security = user? 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">Tree connect failed: NT_STATUS_BAD_NETWORK_NAME</span>”, + you may have forgotten to create the <code class="filename">/etc/samba/drivers</code> directory. + </p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407549"></a>“<span class="quote">cupsaddsmb</span>” or “<span class="quote">rpcclient addriver</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 href="CUPS-printing.html#root-ask-loop" title="“cupsaddsmb” Keeps Asking for Root Password in Never-ending Loop">the previous common error</a>. + </p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407585"></a>“<span class="quote">cupsaddsmb</span>” Errors</h3></div></div></div><p> + The use of “<span class="quote">cupsaddsmb</span>” gives “<span class="quote">No PPD file for printer...</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"><Location + /printers>....</Location></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">cupsaddsmb</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407655"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407678"></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="indexterm" name="id407691"></a>map to guest = bad user), 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">ethereal</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407756"></a>Avoid Being Connected to the Samba Server as the Wrong User</h3></div></div></div><p> +<a class="indexterm" name="id407764"></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="indexterm" name="id407778"></a>map to guest = bad user, which +silently connected you under the guest account when you gave (maybe by accident) an incorrect username. Remove +<a class="indexterm" name="id407786"></a>map to guest if you want to prevent this. +</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407795"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407830"></a>Can't Use “<span class="quote">cupsaddsmb</span>” on Samba Server, Which Is a PDC</h3></div></div></div><p>Do you use the “<span class="quote">naked</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>> (note the two backslashes: the first one is +required to “<span class="quote">escape</span>” the second one).</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407864"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407895"></a>Windows 200x/XP Local Security Policies</h3></div></div></div><a class="indexterm" name="id407901"></a><a class="indexterm" name="id407908"></a><p>Local security policies may not allow the installation of unsigned drivers “<span class="quote">local +security policies</span>” may not allow the installation of printer drivers at all.</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407926"></a>Administrator Cannot Install Printers for All Local Users</h3></div></div></div><p> +<a class="indexterm" name="id407934"></a> +<a class="indexterm" name="id407941"></a> +Windows XP handles SMB printers on a “<span class="quote">per-user</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407963"></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 & Print Sharing for MS Networks</code> in XP).</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id407987"></a>Win XP-SP1</h3></div></div></div><p>Win XP-SP1 introduced a Point and Print Restriction Policy (this restriction does not apply to +“<span class="quote">Administrator</span>” or “<span class="quote">Power User</span>” groups of users). In Group Policy Object Editor, go +to <span class="guimenu">User Configuration -> Administrative Templates -> Control Panel -> 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id408028"></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 in on XP: +</p><div class="orderedlist"><ol type="A"><li><p>The first wrong way: + + </p><div class="orderedlist"><ol type="I"><li><p>Open the <span class="guilabel">Printers</span> + folder.</p></li><li><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><p>Look at this dialog closely and remember what it looks like.</p></li></ol></div><p> + </p></li><li><p>The second wrong way: + </p><div class="orderedlist"><ol type="I"><li><p>Open the <span class="guilabel">Printers</span> folder.</p></li><li><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><p>Click on the <span class="guilabel">General</span> tab.</p></li><li><p>Click on the button <span class="guibutton">Printing + Preferences...</span></p></li><li><p>A new dialog opens. Keep this dialog open and go back + to the parent dialog.</p></li></ol></div><p> + </p></li><li><p>The third and correct way: + </p><div class="orderedlist"><ol type="I"><li><p>Open the <span class="guilabel">Printers</span> folder.</p></li><li><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><p>Click on the <span class="guilabel">Advanced</span> + tab. (If everything is “<span class="quote">grayed out,</span>” then you are not logged + in as a user with enough privileges).</p></li><li><p>Click on the <span class="guibutton">Printing + Defaults...</span> button.</p></li><li><p>On any of the two new tabs, click on the + <span class="guibutton">Advanced...</span> button.</p></li><li><p>A new dialog opens. Compare this one to the other + identical-looking one from step “<span class="quote">B.5</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">C.1. to C.6.</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="indexterm" name="id408262"></a>printer admin 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id408292"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id408345"></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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id408391"></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="indexterm" name="id408424"></a>path> 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="indexterm" name="id408455"></a>path = +/var/spool/samba 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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id408477"></a>Print Queue Called “<span class="quote">lp</span>” Mishandles Print Jobs</h3></div></div></div><p> +In this case a print queue called “<span class="quote">lp</span>” intermittently swallows jobs and +spits out completely different ones from what was sent. +</p><p> +<a class="indexterm" name="id408496"></a> +<a class="indexterm" name="id408503"></a> +<a class="indexterm" name="id408510"></a> +It is a bad idea to name any printer “<span class="quote">lp</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">lp</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" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id408540"></a>Location of Adobe PostScript Driver Files for “<span class="quote">cupsaddsmb</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" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id408591"></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 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.id398861" href="#id398861">6</a>] </sup>See also <a 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> |