]> git.ipfire.org Git - thirdparty/cups.git/blob - doc/help/raster-driver.html
Merge pull request #5016 from jnerin/patch-1
[thirdparty/cups.git] / doc / help / raster-driver.html
1 <!doctype html>
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.11">
9 <meta name="author" content="Unknown">
10 <meta name="copyright" content="Unknown">
11 <meta name="version" content="0.0">
12 <style type="text/css"><!--
13 BODY {
14 font-family: lucida grande, geneva, helvetica, arial, sans-serif;
15 }
16
17 H1, H2, H3, H4, H5, H6, P, TD, TH {
18 font-family: lucida grande, geneva, helvetica, arial, sans-serif;
19 }
20
21 KBD {
22 font-family: monaco, courier, monospace;
23 font-weight: bold;
24 }
25
26 PRE {
27 font-family: monaco, courier, monospace;
28 }
29
30 PRE.command {
31 border: dotted thin #7f7f7f;
32 margin-left: 36pt;
33 padding: 10px;
34 }
35
36 P.compact {
37 margin: 0;
38 }
39
40 P.example {
41 font-style: italic;
42 margin-left: 36pt;
43 }
44
45 DL.man DD {
46 margin-left: 5em;
47 }
48
49 DL.man DT {
50 margin-left: 0;
51 }
52
53 PRE.man {
54 margin: 0;
55 }
56
57 PRE.example {
58 background: #eeeeee;
59 border: dotted thin #999999;
60 margin-left: 36pt;
61 padding: 10pt;
62 }
63
64 PRE.command EM, PRE.example EM {
65 font-family: lucida grande, geneva, helvetica, arial, sans-serif;
66 }
67
68 P.command {
69 font-family: monaco, courier, monospace;
70 margin-left: 36pt;
71 }
72
73 P.formula {
74 font-style: italic;
75 margin-left: 36pt;
76 }
77
78 BLOCKQUOTE {
79 background: #eeeeee;
80 border: solid thin #999999;
81 padding: 10pt;
82 }
83
84 A IMG {
85 border: none;
86 }
87
88 A:link:hover IMG {
89 background: #f0f0f0;
90 border-radius: 10px;
91 -moz-border-radius: 10px;
92 }
93
94 A:link, A:visited {
95 font-weight: inherit;
96 text-decoration: none;
97 }
98
99 A:link:hover, A:visited:hover, A:active {
100 text-decoration: underline;
101 }
102
103 SUB, SUP {
104 font-size: 50%;
105 }
106
107 TR.data, TD.data, TR.data TD {
108 margin-top: 10pt;
109 padding: 5pt;
110 border-bottom: solid 1pt #999999;
111 }
112
113 TR.data TH {
114 border-bottom: solid 1pt #999999;
115 padding-top: 10pt;
116 padding-left: 5pt;
117 text-align: left;
118 }
119
120 DIV.table TABLE {
121 border: solid thin #999999;
122 border-collapse: collapse;
123 border-spacing: 0;
124 margin-left: auto;
125 margin-right: auto;
126 }
127
128 DIV.table CAPTION {
129 caption-side: top;
130 font-size: 120%;
131 font-style: italic;
132 font-weight: bold;
133 margin-left: auto;
134 margin-right: auto;
135 }
136
137 DIV.table TABLE TD {
138 border: solid thin #cccccc;
139 padding-top: 5pt;
140 }
141
142 DIV.table TABLE TH {
143 background: #cccccc;
144 border: none;
145 border-bottom: solid thin #999999;
146 }
147
148 DIV.figure TABLE {
149 margin-left: auto;
150 margin-right: auto;
151 }
152
153 DIV.figure CAPTION {
154 caption-side: bottom;
155 font-size: 120%;
156 font-style: italic;
157 font-weight: bold;
158 margin-left: auto;
159 margin-right: auto;
160 }
161
162 TH.label {
163 text-align: right;
164 vertical-align: top;
165 }
166
167 TH.sublabel {
168 text-align: right;
169 font-weight: normal;
170 }
171
172 HR {
173 border: solid thin;
174 }
175
176 SPAN.info {
177 background: black;
178 border: thin solid black;
179 color: white;
180 font-size: 80%;
181 font-style: italic;
182 font-weight: bold;
183 white-space: nowrap;
184 }
185
186 H2 SPAN.info, H3 SPAN.info, H4 SPAN.info {
187 float: right;
188 font-size: 100%;
189 }
190
191 H1.title {
192 }
193
194 H2.title, H3.title {
195 border-bottom: solid 2pt #000000;
196 }
197
198 DIV.indent, TABLE.indent {
199 margin-top: 2em;
200 margin-left: auto;
201 margin-right: auto;
202 width: 90%;
203 }
204
205 TABLE.indent {
206 border-collapse: collapse;
207 }
208
209 TABLE.indent TD, TABLE.indent TH {
210 padding: 0;
211 }
212
213 TABLE.list {
214 border-collapse: collapse;
215 margin-left: auto;
216 margin-right: auto;
217 width: 90%;
218 }
219
220 TABLE.list TH {
221 background: white;
222 border-bottom: solid thin #cccccc;
223 color: #444444;
224 padding-top: 10pt;
225 padding-left: 5pt;
226 text-align: left;
227 vertical-align: bottom;
228 white-space: nowrap;
229 }
230
231 TABLE.list TH A {
232 color: #4444cc;
233 }
234
235 TABLE.list TD {
236 border-bottom: solid thin #eeeeee;
237 padding-top: 5pt;
238 padding-left: 5pt;
239 }
240
241 TABLE.list TR:nth-child(even) {
242 background: #f8f8f8;
243 }
244
245 TABLE.list TR:nth-child(odd) {
246 background: #f4f4f4;
247 }
248
249 DT {
250 margin-left: 36pt;
251 margin-top: 12pt;
252 }
253
254 DD {
255 margin-left: 54pt;
256 }
257
258 DL.category DT {
259 font-weight: bold;
260 }
261
262 P.summary {
263 margin-left: 36pt;
264 font-family: monaco, courier, monospace;
265 }
266
267 DIV.summary TABLE {
268 border: solid thin #999999;
269 border-collapse: collapse;
270 border-spacing: 0;
271 margin: 10px;
272 }
273
274 DIV.summary TABLE TD, DIV.summary TABLE TH {
275 border: solid thin #999999;
276 padding: 5px;
277 text-align: left;
278 vertical-align: top;
279 }
280
281 DIV.summary TABLE THEAD TH {
282 background: #eeeeee;
283 }
284
285 /* API documentation styles... */
286 div.body h1 {
287 margin: 0;
288 }
289 div.body h2 {
290 margin-top: 1.5em;
291 }
292 div.body h3, div.body h4, div.body h5 {
293 margin-bottom: 0.5em;
294 margin-top: 1.5em;
295 }
296 .class, .enumeration, .function, .struct, .typedef, .union {
297 border-bottom: solid thin #999999;
298 margin-bottom: 0;
299 margin-top: 2em;
300 }
301 .description {
302 margin-top: 0.5em;
303 }
304 code, p.code, pre, ul.code li {
305 font-family: monaco, courier, monospace;
306 font-size: 90%;
307 }
308 ul.code, ul.contents, ul.subcontents {
309 list-style-type: none;
310 margin: 0;
311 padding-left: 0;
312 }
313 ul.code li {
314 margin: 0;
315 }
316 ul.contents > li {
317 margin-top: 1em;
318 }
319 ul.contents li ul.code, ul.contents li ul.subcontents {
320 padding-left: 2em;
321 }
322 div.body dl {
323 margin-left: 0;
324 margin-top: 0;
325 }
326 div.body dt {
327 font-style: italic;
328 margin-left: 0;
329 margin-top: 0;
330 }
331 div.body dd {
332 margin-bottom: 0.5em;
333 }
334
335 /* This is just for the HTML files generated with the framedhelp target */
336 div.contents {
337 background: #e8e8e8;
338 border: solid thin black;
339 padding: 10px;
340 }
341 div.contents h1 {
342 font-size: 110%;
343 }
344 div.contents h2 {
345 font-size: 100%;
346 }
347 div.contents ul.contents {
348 font-size: 80%;
349 }
350 div.contents ul.subcontents li {
351 margin-left: 1em;
352 text-indent: -1em;
353 }
354 --></style>
355 </head>
356 <body>
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 macOS 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 <div class="contents">
388 <h2 class="title">Contents</h2>
389 <ul class="contents">
390 <li><a href="#BASICS">Printer Driver Basics</a></li>
391 <li><a href="#CREATING">Creating New PPD Files</a></li>
392 <li><a href="#FILTERS">Using Filters</a></li>
393 <li><a href="#COLOR">Implementing Color Management</a></li>
394 <li><a href="#MACOSX">Adding macOS Features</a></li>
395 </ul>
396 </div>
397 <div class="body">
398 <h2 class='title'><a name='BASICS'>Printer Driver Basics</a></h2>
399
400 <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>
401
402 <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>
403
404 <div class='figure'><table summary='Raster Filter Chain'>
405 <caption>Figure 1: <a name='FIGURE_1'>Raster Filter Chain</a></caption>
406 <tr><td><img src='../images/cups-raster-chain.png' width='700' height='150' alt='Raster Filter Chain'></td></tr>
407 </table></div>
408
409 <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>
410
411 <div class='table'><table summary='Standard CUPS Raster Filters'>
412 <caption>Table 1: <a name='TABLE_1'>Standard CUPS Raster Filters</a></caption>
413 <thead>
414 <tr><th>Filter</th><th>PDLs</th><th>ppdc DriverType</th><th>ppdc #include file</th></tr>
415 </thead>
416 <tbody>
417 <tr><td>rastertoepson</td><td>ESC/P, ESC/P2</td><td>epson</td><td>epson.h</td></tr>
418 <tr><td>rastertoescpx</td><td>ESC/P, ESC/P2, EPSON Remote Mode</td><td>escp</td><td>escp.h</td></tr>
419 <tr><td>rastertohp</td><td>HP-PCL3, HP-PCL5</td><td>hp</td><td>hp.h</td></tr>
420 <tr><td>rastertolabel</td><td>CPCL, Dymo, EPL1, EPL2, Intellitech PCL, ZPL</td><td>label</td><td>label.h</td></tr>
421 <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>
422 </tbody>
423 </table></div>
424
425 <p>The optional port monitor handles interface-specific protocol or encoding issues. For example, some raster printers use the 1284.4 communications protocol.</p>
426
427 <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>
428
429 <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>
430
431 <div class='figure'><table summary='Command Filter Chain'>
432 <caption>Figure 2: <a name='FIGURE_2'>Command Filter Chain</a></caption>
433 <tr><td><img src='../images/cups-command-chain.png' width='575' height='150' alt='Command Filter Chain'></td></tr>
434 </table></div>
435
436 <p>Raster printer drivers must provide their own command filter.</p>
437
438
439 <h2 class='title'><a name='CREATING'>Creating New PPD Files</a></h2>
440
441 <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>
442
443 <p class='example'>Listing 1: <a name='LISTING_1'>"examples/laserjet-basic.drv"</a></p>
444
445 <pre class='example'>
446 <I>// Include standard font and media definitions</I>
447 <a href='ref-ppdcfile.html#_include'>#include</a> &lt;font.defs&gt;
448 <a href='ref-ppdcfile.html#_include'>#include</a> &lt;media.defs&gt;
449
450 <I>// Include HP-PCL driver definitions</I>
451 <a href='ref-ppdcfile.html#_include'>#include</a> &lt;pcl.h&gt;
452
453 <I>// Specify that this driver uses the HP-PCL driver...</I>
454 <a href='ref-ppdcfile.html#DriverType'>DriverType</a> pcl
455
456 <I>// Specify the driver options via the model number...</I>
457 <a href='ref-ppdcfile.html#ModelNumber'>ModelNumber</a> ($PCL_PAPER_SIZE $PCL_PJL $PCL_PJL_RESOLUTION)
458
459 <I>// List the fonts that are supported, in this case all standard fonts...</I>
460 <a href='ref-ppdcfile.html#Font'>Font</a> *
461
462 <I>// Manufacturer and driver version</I>
463 <a href='ref-ppdcfile.html#Manufacturer'>Manufacturer</a> "HP"
464 <a href='ref-ppdcfile.html#Version'>Version</a> 1.0
465
466 <I>// Supported page sizes and their margins</I>
467 <a href='ref-ppdcfile.html#HWMargins'>HWMargins</a> 18 12 18 12
468 *<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Letter
469 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Legal
470 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Executive
471 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Monarch
472 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Statement
473 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> FanFoldGermanLegal
474
475 <a href='ref-ppdcfile.html#HWMargins'>HWMargins</a> 18 12.72 18 12.72
476 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Env10
477
478 <a href='ref-ppdcfile.html#HWMargins'>HWMargins</a> 9.72 12 9.72 12
479 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> A4
480 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> A5
481 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> B5
482 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> EnvC5
483 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> EnvDL
484 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> EnvISOB5
485 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Postcard
486 <a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> DoublePostcard
487
488 <I>// Only black-and-white output with mode 3 compression...</I>
489 <a href='ref-ppdcfile.html#ColorModel'>ColorModel</a> Gray k chunky 3
490
491 <I>// Supported resolutions</I>
492 <a href='ref-ppdcfile.html#Resolution'>Resolution</a> - 1 0 0 0 "300dpi/300 DPI"
493 *<a href='ref-ppdcfile.html#Resolution'>Resolution</a> - 8 0 0 0 "600dpi/600 DPI"
494
495 <I>// Supported input slots</I>
496 *<a href='ref-ppdcfile.html#InputSlot'>InputSlot</a> 7 "Auto/Automatic Selection"
497 <a href='ref-ppdcfile.html#InputSlot'>InputSlot</a> 2 "Manual/Tray 1 - Manual Feed"
498 <a href='ref-ppdcfile.html#InputSlot'>InputSlot</a> 4 "Upper/Tray 1"
499 <a href='ref-ppdcfile.html#InputSlot'>InputSlot</a> 1 "Lower/Tray 2"
500 <a href='ref-ppdcfile.html#InputSlot'>InputSlot</a> 5 "LargeCapacity/Tray 3"
501
502 <I>// Tray 3 is an option...</I>
503 <a href='ref-ppdcfile.html#Installable'>Installable</a> "OptionLargeCapacity/Tray 3 Installed"
504 <a href='ref-ppdcfile.html#UIConstraints'>UIConstraints</a> "*OptionLargeCapacity False *InputSlot LargeCapacity"
505
506 {
507 <I>// HP LaserJet 2100 Series</I>
508 <a href='ref-ppdcfile.html#Throughput'>Throughput</a> 10
509 <a href='ref-ppdcfile.html#ModelName'>ModelName</a> "LaserJet 2100 Series"
510 <a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "hpljt211.ppd"
511 }
512
513 {
514 <I>// LaserJet 2200 and 2300 series have duplexer option...</I>
515 <a href='ref-ppdcfile.html#Duplex'>Duplex</a> normal
516 <a href='ref-ppdcfile.html#Installable'>Installable</a> "OptionDuplex/Duplexer Installed"
517 <a href='ref-ppdcfile.html#UIConstraints'>UIConstraints</a> "*OptionDuplex False *Duplex"
518
519 {
520 <I>// HP LaserJet 2200 Series</I>
521 <a href='ref-ppdcfile.html#Throughput'>Throughput</a> 19
522 <a href='ref-ppdcfile.html#ModelName'>ModelName</a> "LaserJet 2200 Series"
523 <a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "hpljt221.ppd"
524 }
525
526 {
527 <I>// HP LaserJet 2300 Series</I>
528 <a href='ref-ppdcfile.html#Throughput'>Throughput</a> 25
529 <a href='ref-ppdcfile.html#ModelName'>ModelName</a> "LaserJet 2300 Series"
530 <a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "hpljt231.ppd"
531 }
532 }
533 </pre>
534
535
536 <h2 class='title'><a name='FILTERS'>Using Filters</a></h2>
537
538 <p>The standard CUPS raster filters can be specified using the
539 <a href='ref-ppdcfile.html#DriverType'><tt>DriverType</tt></a> directive, for example:</p>
540
541 <pre class='example'>
542 <I>// Specify that this driver uses the HP-PCL driver...</I>
543 <a href='ref-ppdcfile.html#DriverType'>DriverType</a> pcl
544 </pre>
545
546 <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>
547
548 <pre class='example'>
549 <a href='ref-ppdcfile.html#DriverType'>DriverType</a> custom
550 <a href='ref-ppdcfile.html#Filter'>Filter</a> application/vnd.cups-raster 100 /path/to/raster/filter
551 <a href='ref-ppdcfile.html#Filter'>Filter</a> application/vnd.cups-command 100 /path/to/command/filter
552 </pre>
553
554
555 <h2 class='title'><a name='COLOR'>Implementing Color Management</a></h2>
556
557 <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>
558
559 <pre class='example'>
560 <a href='ref-ppdcfile.html#Attribute'>Attribute</a> cupsICCProfile "ColorModel.MediaType.Resolution/Description" /path/to/ICC/profile
561 </pre>
562
563 <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>
564
565 <pre class='example'>
566 <a href='ref-ppdcfile.html#Attribute'>Attribute</a> cupsICCProfile "Gray../Grayscale Profile" /path/to/ICC/gray-profile
567 <a href='ref-ppdcfile.html#Attribute'>Attribute</a> cupsICCProfile "RGB../Full Color Profile" /path/to/ICC/rgb-profile
568 </pre>
569
570 <p>The options used for profile selection can be customized using the <tt>cupsICCQualifier2</tt> and <tt>cupsICCQualifier3</tt> attributes.</p>
571
572 <h3><span class='info'>Since macOS 10.5</span>Custom Color Matching Support</h3>
573
574 <p>macOS 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>
575
576 <pre class='example'>
577 <a href='ref-ppdcfile.html#Attribute'>Attribute</a> APSupportsCustomColorMatching "" true
578 <a href='ref-ppdcfile.html#Attribute'>Attribute</a> APDefaultCustomColorMatchingProfile "" sRGB
579 </pre>
580
581
582 <h2 class='title'><a name='MACOSX'>Adding macOS Features</a></h2>
583
584 <p>macOS 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>
585
586 <pre class='example'>
587 <a href='ref-ppdcfile.html#Attribute'>Attribute</a> APDialogExtension "" /Library/Printers/Vendor/filename.plugin
588 <a href='ref-ppdcfile.html#Attribute'>Attribute</a> APHelpBook "" /Library/Printers/Vendor/filename.bundle
589 <a href='ref-ppdcfile.html#Attribute'>Attribute</a> APPrinterIconPath "" /Library/Printers/Vendor/filename.icns
590 <a href='ref-ppdcfile.html#Attribute'>Attribute</a> APPrinterPreset "name/text" "*option choice ..."
591 </pre>
592 </div>
593 </body>
594 </html>