1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<!-- SECTION: Programming -->
4<head>
5	<title>Developing Raster Printer Drivers	</title>
6	<meta name="keywords" content="Programming">
7	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
8	<meta name="creator" content="Mini-XML v2.7">
9<style type="text/css"><!--
10BODY {
11  font-family: lucida grande, geneva, helvetica, arial, sans-serif;
12}
13
14H1, H2, H3, H4, H5, H6, P, TD, TH {
15  font-family: lucida grande, geneva, helvetica, arial, sans-serif;
16}
17
18KBD {
19  font-family: monaco, courier, monospace;
20  font-weight: bold;
21}
22
23PRE {
24  font-family: monaco, courier, monospace;
25}
26
27PRE.command {
28  border: dotted thin #7f7f7f;
29  margin-left: 36pt;
30  padding: 10px;
31}
32
33P.compact {
34  margin: 0;
35}
36
37P.example {
38  font-style: italic;
39  margin-left: 36pt;
40}
41
42DL.man DD {
43  margin-left: 5em;
44}
45
46DL.man DT {
47  margin-left: 0;
48}
49
50PRE.man {
51  margin: 0;
52}
53
54PRE.example {
55  background: #eeeeee;
56  border: dotted thin #999999;
57  margin-left: 36pt;
58  padding: 10pt;
59}
60
61PRE.command EM, PRE.example EM {
62  font-family: lucida grande, geneva, helvetica, arial, sans-serif;
63}
64
65P.command {
66  font-family: monaco, courier, monospace;
67  margin-left: 36pt;
68}
69
70P.formula {
71  font-style: italic;
72  margin-left: 36pt;
73}
74
75BLOCKQUOTE {
76  background: #eeeeee;
77  border: solid thin #999999;
78  padding: 10pt;
79}
80
81A IMG {
82  border: none;
83}
84
85A:link:hover IMG {
86  background: #f0f0f0;
87  border-radius: 10px;
88  -moz-border-radius: 10px;
89}
90
91A:link, A:visited {
92  font-weight: inherit;
93  text-decoration: none;
94}
95
96A:link:hover, A:visited:hover, A:active {
97  text-decoration: underline;
98}
99
100SUB, SUP {
101  font-size: 50%;
102}
103
104TR.data, TD.data, TR.data TD {
105  margin-top: 10pt;
106  padding: 5pt;
107  border-bottom: solid 1pt #999999;
108}
109
110TR.data TH {
111  border-bottom: solid 1pt #999999;
112  padding-top: 10pt;
113  padding-left: 5pt;
114  text-align: left;
115}
116
117DIV.table TABLE {
118  border: solid thin #999999;
119  border-collapse: collapse;
120  border-spacing: 0;
121  margin-left: auto;
122  margin-right: auto;
123}
124
125DIV.table CAPTION {
126  caption-side: top;
127  font-size: 120%;
128  font-style: italic;
129  font-weight: bold;
130  margin-left: auto;
131  margin-right: auto;
132}
133
134DIV.table TABLE TD {
135  border: solid thin #cccccc;
136  padding-top: 5pt;
137}
138
139DIV.table TABLE TH {
140  background: #cccccc;
141  border: none;
142  border-bottom: solid thin #999999;
143}
144
145DIV.figure TABLE {
146  margin-left: auto;
147  margin-right: auto;
148}
149
150DIV.figure CAPTION {
151  caption-side: bottom;
152  font-size: 120%;
153  font-style: italic;
154  font-weight: bold;
155  margin-left: auto;
156  margin-right: auto;
157}
158
159TH.label {
160  text-align: right;
161  vertical-align: top;
162}
163
164TH.sublabel {
165  text-align: right;
166  font-weight: normal;
167}
168
169HR {
170  border: solid thin;
171}
172
173SPAN.info {
174  background: black;
175  border: thin solid black;
176  color: white;
177  font-size: 80%;
178  font-style: italic;
179  font-weight: bold;
180  white-space: nowrap;
181}
182
183H2 SPAN.info, H3 SPAN.info, H4 SPAN.info {
184  float: right;
185  font-size: 100%;
186}
187
188H1.title {
189}
190
191H2.title, H3.title {
192  border-bottom: solid 2pt #000000;
193}
194
195DIV.indent, TABLE.indent {
196  margin-top: 2em;
197  margin-left: auto;
198  margin-right: auto;
199  width: 90%;
200}
201
202TABLE.indent {
203  border-collapse: collapse;
204}
205
206TABLE.indent TD, TABLE.indent TH {
207  padding: 0;
208}
209
210TABLE.list {
211  border-collapse: collapse;
212  margin-left: auto;
213  margin-right: auto;
214  width: 90%;
215}
216
217TABLE.list TH {
218  background: white;
219  border-bottom: solid thin #cccccc;
220  color: #444444;
221  padding-top: 10pt;
222  padding-left: 5pt;
223  text-align: left;
224  vertical-align: bottom;
225  white-space: nowrap;
226}
227
228TABLE.list TH A {
229  color: #4444cc;
230}
231
232TABLE.list TD {
233  border-bottom: solid thin #eeeeee;
234  padding-top: 5pt;
235  padding-left: 5pt;
236}
237
238TABLE.list TR:nth-child(even) {
239  background: #f8f8f8;
240}
241
242TABLE.list TR:nth-child(odd) {
243  background: #f4f4f4;
244}
245
246DT {
247  margin-left: 36pt;
248  margin-top: 12pt;
249}
250
251DD {
252  margin-left: 54pt;
253}
254
255DL.category DT {
256  font-weight: bold;
257}
258
259P.summary {
260  margin-left: 36pt;
261  font-family: monaco, courier, monospace;
262}
263
264DIV.summary TABLE {
265  border: solid thin #999999;
266  border-collapse: collapse;
267  border-spacing: 0;
268  margin: 10px;
269}
270
271DIV.summary TABLE TD, DIV.summary TABLE TH {
272  border: solid thin #999999;
273  padding: 5px;
274  text-align: left;
275  vertical-align: top;
276}
277
278DIV.summary TABLE THEAD TH {
279  background: #eeeeee;
280}
281
282/* API documentation styles... */
283div.body h1 {
284  margin: 0;
285}
286div.body h2 {
287  margin-top: 1.5em;
288}
289div.body h3, div.body h4, div.body h5 {
290  margin-bottom: 0.5em;
291  margin-top: 1.5em;
292}
293.class, .enumeration, .function, .struct, .typedef, .union {
294  border-bottom: solid thin #999999;
295  margin-bottom: 0;
296  margin-top: 2em;
297}
298.description {
299  margin-top: 0.5em;
300}
301code, p.code, pre, ul.code li {
302  font-family: monaco, courier, monospace;
303  font-size: 90%;
304}
305ul.code, ul.contents, ul.subcontents {
306  list-style-type: none;
307  margin: 0;
308  padding-left: 0;
309}
310ul.code li {
311  margin: 0;
312}
313ul.contents > li {
314  margin-top: 1em;
315}
316ul.contents li ul.code, ul.contents li ul.subcontents {
317  padding-left: 2em;
318}
319div.body dl {
320  margin-left: 0;
321  margin-top: 0;
322}
323div.body dt {
324  font-style: italic;
325  margin-left: 0;
326  margin-top: 0;
327}
328div.body dd {
329  margin-bottom: 0.5em;
330}
331
332/* This is just for the HTML files generated with the framedhelp target */
333div.contents {
334  background: #e8e8e8;
335  border: solid thin black;
336  padding: 10px;
337}
338div.contents h1 {
339  font-size: 110%;
340}
341div.contents h2 {
342  font-size: 100%;
343}
344div.contents ul.contents {
345  font-size: 80%;
346}
347div.contents ul.subcontents li {
348  margin-left: 1em;
349  text-indent: -1em;
350}
351--></style>
352</head>
353<body>
354<div class='body'>
355<!--
356  "$Id$"
357
358  Raster printer driver documentation for CUPS.
359
360  Copyright 2007-2012 by Apple Inc.
361  Copyright 1997-2007 by Easy Software Products.
362
363  These coded instructions, statements, and computer programs are the
364  property of Apple Inc. and are protected by Federal copyright
365  law.  Distribution and use rights are outlined in the file "LICENSE.txt"
366  which should have been included with this file.  If this file is
367  file is missing or damaged, see the license at "http://www.cups.org/".
368-->
369
370<h1 class='title'>Developing Raster Printer Drivers</h1>
371
372<p>This document describes how to develop printer drivers for raster printers. Topics include: <a href='#BASICS'>printer driver basics</a>, <a href='#CREATE'>creating new PPD files</a>, <a href='#FILTERS'>using filters</a>, <a href='#COLOR'>implementing color management</a>, and <a href='#MACOSX'>adding OS X features</a>.</p>
373
374<div class='summary'><table summary='General Information'>
375<tbody>
376<tr>
377	<th>See Also</th>
378	<td>Programming: <a href='postscript-driver.html'>Developing PostScript Printer Drivers</a><br>
379	Programming: <a href='api-filter.html'>Filter and Backend Programming</a><br>
380	Programming: <a href='ppd-compiler.html'>Introduction to the PPD Compiler</a><br>
381	Programming: <a href='api-raster.html'>Raster API</a><br>
382	References: <a href='ref-ppdcfile.html'>PPD Compiler Driver Information File Reference</a><br>
383	Specifications: <a href='spec-ppd.html'>CUPS PPD Extensions</a></td>
384</tr>
385</tbody>
386</table></div>
387<h2 class="title">Contents</h2>
388<ul class="contents">
389<li><a href="#BASICS">Printer Driver Basics</a></li>
390<li><a href="#CREATING">Creating New PPD Files</a></li>
391<li><a href="#FILTERS">Using Filters</a></li>
392<li><a href="#COLOR">Implementing Color Management</a></li>
393<li><a href="#MACOSX">Adding OS X Features</a></li>
394</ul>
395<h2 class='title'><a name='BASICS'>Printer Driver Basics</a></h2>
396
397<p>A CUPS raster printer driver consists of a PostScript Printer Description (PPD) file that describes the features and capabilities of the device, one or more <em>filter</em> programs that prepare print data for the device, and zero or more support files for color management, online help, and so forth. The PPD file includes references to all of the filters and support files used by the driver.</p>
398
399<p>Every time a user prints something the scheduler program, <a href='man-cupsd.html'>cupsd(8)</a>, determines the format of the print job and the programs required to convert that job into something the printer understands. CUPS includes filter programs for many common formats, for example to convert Portable Document Format (PDF) files into CUPS raster data. <a href='#FIGURE_1'>Figure 1</a> shows the data flow of a typical print job.</p>
400
401<div class='figure'><table summary='Raster Filter Chain'>
402<caption>Figure 1: <a name='FIGURE_1'>Raster Filter Chain</a></caption>
403<tr><td><img src='/images/cups-raster-chain.png' width='700' height='150' alt='Raster Filter Chain'></td></tr>
404</table></div>
405
406<p>The raster filter converts CUPS raster data into a format the printer understands, for example HP-PCL. CUPS includes several sample raster filters supporting standard page description languages (PDLs). <a href='#TABLE_1'>Table 1</a> shows the raster filters that are bundled with CUPS and the languages they support.</p>
407
408<div class='table'><table summary='Standard CUPS Raster Filters'>
409<caption>Table 1: <a name='TABLE_1'>Standard CUPS Raster Filters</a></caption>
410<thead>
411<tr><th>Filter</th><th>PDLs</th><th>ppdc DriverType</th><th>ppdc #include file</th></tr>
412</thead>
413<tbody>
414<tr><td>rastertoepson</td><td>ESC/P, ESC/P2</td><td>epson</td><td>epson.h</td></tr>
415<tr><td>rastertoescpx</td><td>ESC/P, ESC/P2, EPSON Remote Mode</td><td>escp</td><td>escp.h</td></tr>
416<tr><td>rastertohp</td><td>HP-PCL3, HP-PCL5</td><td>hp</td><td>hp.h</td></tr>
417<tr><td>rastertolabel</td><td>CPCL, Dymo, EPL1, EPL2, Intellitech PCL, ZPL</td><td>label</td><td>label.h</td></tr>
418<tr><td>rastertopclx</td><td>HP-RTL, HP-PCL3, HP-PCL3GUI, HP-PCL5, HP-PCL5c, HP-PCL5e</td><td>pcl</td><td>pcl.h</td></tr>
419</tbody>
420</table></div>
421
422<p>The optional port monitor handles interface-specific protocol or encoding issues. For example, some raster printers use the 1284.4 communications protocol.</p>
423
424<p>The backend handles communications with the printer, sending print data from the last filter to the printer and relaying back-channel data from the printer to the upstream filters. CUPS includes backend programs for common direct-connect interfaces and network protocols, and you can provide your own backend to support custom interfaces and protocols.</p>
425
426<p>The scheduler also supports a special "command" file format for sending maintenance commands and status queries to a printer or printer driver. Command print jobs typically use a single command filter program defined in the PPD file to generate the appropriate printer commands and handle any responses from the printer. <a href='#FIGURE_2'>Figure 2</a> shows the data flow of a typical command job.</p>
427
428<div class='figure'><table summary='Command Filter Chain'>
429<caption>Figure 2: <a name='FIGURE_2'>Command Filter Chain</a></caption>
430<tr><td><img src='/images/cups-command-chain.png' width='575' height='150' alt='Command Filter Chain'></td></tr>
431</table></div>
432
433<p>Raster printer drivers must provide their own command filter.</p>
434
435
436<h2 class='title'><a name='CREATING'>Creating New PPD Files</a></h2>
437
438<p>We recommend using the CUPS PPD compiler, <a href='man-ppdc.html'>ppdc(1)</a>, to create new PPD files since it manages many of the tedious (and error-prone!) details of paper sizes and localization for you. It also allows you to easily support multiple devices from a single source file. For more information see the "<a href='ppd-compiler.html'>Introduction to the PPD Compiler</a>" document. <a href='#LISTING_1'>Listing 1</a> shows a driver information file for several similar black-and-white HP-PCL5 laser printers.</p>
439
440<p class='example'>Listing 1: <a name='LISTING_1'>"examples/laserjet-basic.drv"</a></p>
441
442<pre class='example'>
443<I>// Include standard font and media definitions</I>
444<a href='ref-ppdcfile.html#_include'>#include</a> &lt;font.defs&gt;
445<a href='ref-ppdcfile.html#_include'>#include</a> &lt;media.defs&gt;
446
447<I>// Include HP-PCL driver definitions</I>
448<a href='ref-ppdcfile.html#_include'>#include</a> &lt;pcl.h&gt;
449
450<I>// Specify that this driver uses the HP-PCL driver...</I>
451<a href='ref-ppdcfile.html#DriverType'>DriverType</a> pcl
452
453<I>// Specify the driver options via the model number...</I>
454<a href='ref-ppdcfile.html#ModelNumber'>ModelNumber</a> ($PCL_PAPER_SIZE $PCL_PJL $PCL_PJL_RESOLUTION)
455
456<I>// List the fonts that are supported, in this case all standard fonts...</I>
457<a href='ref-ppdcfile.html#Font'>Font</a> *
458
459<I>// Manufacturer and driver version</I>
460<a href='ref-ppdcfile.html#Manufacturer'>Manufacturer</a> "HP"
461<a href='ref-ppdcfile.html#Version'>Version</a> 1.0
462
463<I>// Supported page sizes and their margins</I>
464<a href='ref-ppdcfile.html#HWMargins'>HWMargins</a> 18 12 18 12
465*<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Letter
466<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Legal
467<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Executive
468<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Monarch
469<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Statement
470<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> FanFoldGermanLegal
471
472<a href='ref-ppdcfile.html#HWMargins'>HWMargins</a> 18 12.72 18 12.72
473<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Env10
474
475<a href='ref-ppdcfile.html#HWMargins'>HWMargins</a> 9.72 12 9.72 12
476<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> A4
477<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> A5
478<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> B5
479<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> EnvC5
480<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> EnvDL
481<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> EnvISOB5
482<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Postcard
483<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> DoublePostcard
484
485<I>// Only black-and-white output with mode 3 compression...</I>
486<a href='ref-ppdcfile.html#ColorModel'>ColorModel</a> Gray k chunky 3
487
488<I>// Supported resolutions</I>
489<a href='ref-ppdcfile.html#Resolution'>Resolution</a> - 1 0 0 0 "300dpi/300 DPI"
490*<a href='ref-ppdcfile.html#Resolution'>Resolution</a> - 8 0 0 0 "600dpi/600 DPI"
491
492<I>// Supported input slots</I>
493*<a href='ref-ppdcfile.html#InputSlot'>InputSlot</a> 7 "Auto/Automatic Selection"
494<a href='ref-ppdcfile.html#InputSlot'>InputSlot</a> 2 "Manual/Tray 1 - Manual Feed"
495<a href='ref-ppdcfile.html#InputSlot'>InputSlot</a> 4 "Upper/Tray 1"
496<a href='ref-ppdcfile.html#InputSlot'>InputSlot</a> 1 "Lower/Tray 2"
497<a href='ref-ppdcfile.html#InputSlot'>InputSlot</a> 5 "LargeCapacity/Tray 3"
498
499<I>// Tray 3 is an option...</I>
500<a href='ref-ppdcfile.html#Installable'>Installable</a> "OptionLargeCapacity/Tray 3 Installed"
501<a href='ref-ppdcfile.html#UIConstraints'>UIConstraints</a> "*OptionLargeCapacity False *InputSlot LargeCapacity"
502
503{
504  <I>// HP LaserJet 2100 Series</I>
505  <a href='ref-ppdcfile.html#Throughput'>Throughput</a> 10
506  <a href='ref-ppdcfile.html#ModelName'>ModelName</a> "LaserJet 2100 Series"
507  <a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "hpljt211.ppd"
508}
509
510{
511  <I>// LaserJet 2200 and 2300 series have duplexer option...</I>
512  <a href='ref-ppdcfile.html#Duplex'>Duplex</a> normal
513  <a href='ref-ppdcfile.html#Installable'>Installable</a> "OptionDuplex/Duplexer Installed"
514  <a href='ref-ppdcfile.html#UIConstraints'>UIConstraints</a> "*OptionDuplex False *Duplex"
515
516  {
517    <I>// HP LaserJet 2200 Series</I>
518    <a href='ref-ppdcfile.html#Throughput'>Throughput</a> 19
519    <a href='ref-ppdcfile.html#ModelName'>ModelName</a> "LaserJet 2200 Series"
520    <a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "hpljt221.ppd"
521  }
522
523  {
524    <I>// HP LaserJet 2300 Series</I>
525    <a href='ref-ppdcfile.html#Throughput'>Throughput</a> 25
526    <a href='ref-ppdcfile.html#ModelName'>ModelName</a> "LaserJet 2300 Series"
527    <a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "hpljt231.ppd"
528  }
529}
530</pre>
531
532
533<h2 class='title'><a name='FILTERS'>Using Filters</a></h2>
534
535<p>The standard CUPS raster filters can be specified using the
536<a href='ref-ppdcfile.html#DriverType'><tt>DriverType</tt></a> directive, for example:</p>
537
538<pre class='example'>
539<I>// Specify that this driver uses the HP-PCL driver...</I>
540<a href='ref-ppdcfile.html#DriverType'>DriverType</a> pcl
541</pre>
542
543<p><a href='#TABLE_1'>Table 1</a> shows the driver types for each of the standard CUPS raster filters. For drivers that do not use the standard raster filters, the "custom" type is used with <a href='ref-ppdcfile.html#Filter'><tt>Filter</tt></a> directives:</p>
544
545<pre class='example'>
546<a href='ref-ppdcfile.html#DriverType'>DriverType</a> custom
547<a href='ref-ppdcfile.html#Filter'>Filter</a> application/vnd.cups-raster 100 /path/to/raster/filter
548<a href='ref-ppdcfile.html#Filter'>Filter</a> application/vnd.cups-command 100 /path/to/command/filter
549</pre>
550
551
552<h2 class='title'><a name='COLOR'>Implementing Color Management</a></h2>
553
554<p>CUPS uses ICC color profiles to provide more accurate color reproduction. The <a href='spec-ppd.html#cupsICCProfile'><tt>cupsICCProfile</tt></a> attribute defines the color profiles that are available for a given printer, for example:</p>
555
556<pre class='example'>
557<a href='ref-ppdcfile.html#Attribute'>Attribute</a> cupsICCProfile "ColorModel.MediaType.Resolution/Description" /path/to/ICC/profile
558</pre>
559
560<p>where "ColorModel.MediaType.Resolution" defines a selector based on the corresponding option selections. A simple driver might only define profiles for the color models that are supported, for example a printer supporting Gray and RGB might use:</p>
561
562<pre class='example'>
563<a href='ref-ppdcfile.html#Attribute'>Attribute</a> cupsICCProfile "Gray../Grayscale Profile" /path/to/ICC/gray-profile
564<a href='ref-ppdcfile.html#Attribute'>Attribute</a> cupsICCProfile "RGB../Full Color Profile" /path/to/ICC/rgb-profile
565</pre>
566
567<p>The options used for profile selection can be customized using the <tt>cupsICCQualifier2</tt> and <tt>cupsICCQualifier3</tt> attributes.</p>
568
569<h3><span class='info'>Since OS X 10.5</span>Custom Color Matching Support</h3>
570
571<p>OS X printer drivers that are based on an existing standard RGB colorspace can tell the system to use the corresponding colorspace instead of an arbitrary ICC color profile when doing color management. The <a href='#APCustom'><tt>APSupportsCustomColorMatching</tt></a> and <tt>APDefaultCustomColorMatchingProfile</tt> attributes can be used to enable this mode:</p>
572
573<pre class='example'>
574<a href='ref-ppdcfile.html#Attribute'>Attribute</a> APSupportsCustomColorMatching "" true
575<a href='ref-ppdcfile.html#Attribute'>Attribute</a> APDefaultCustomColorMatchingProfile "" sRGB
576</pre>
577
578
579<h2 class='title'><a name='MACOSX'>Adding OS X Features</a></h2>
580
581<p>OS X printer drivers can provide <a href='spec-ppd.html#MACOSX'>additional attributes</a> to specify additional option panes in the print dialog, an image of the printer, a help book, and option presets for the driver software:</p>
582
583<pre class='example'>
584<a href='ref-ppdcfile.html#Attribute'>Attribute</a> APDialogExtension "" /Library/Printers/Vendor/filename.plugin
585<a href='ref-ppdcfile.html#Attribute'>Attribute</a> APHelpBook "" /Library/Printers/Vendor/filename.bundle
586<a href='ref-ppdcfile.html#Attribute'>Attribute</a> APPrinterIconPath "" /Library/Printers/Vendor/filename.icns
587<a href='ref-ppdcfile.html#Attribute'>Attribute</a> APPrinterPreset "name/text" "*option choice ..."
588</pre>
589</div>
590</body>
591</html>
592