]> git.ipfire.org Git - thirdparty/cups.git/blame - doc/help/ppd-compiler.html
Merge changes from CUPS 1.4svn-r8628.
[thirdparty/cups.git] / doc / help / ppd-compiler.html
CommitLineData
745129be 1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
8b450588 2<html>
28b9d139 3<!-- SECTION: Programming -->
8b450588
MS
4<head>
5<title>Introduction to the PPD Compiler</title>
6<meta name="keywords" content="Programming">
7<meta name="creator" content="Mini-XML v2.6">
8<style type="text/css"><!--
9BODY {
10 font-family: lucida grande, geneva, helvetica, arial, sans-serif;
11}
12
13H1, H2, H3, H4, H5, H6, P, TD, TH {
14 font-family: lucida grande, geneva, helvetica, arial, sans-serif;
15}
16
17KBD {
18 font-family: monaco, courier, monospace;
19 font-weight: bold;
20}
21
22PRE {
23 font-family: monaco, courier, monospace;
24}
25
26PRE.command {
27 margin-left: 36pt;
28}
29
f11a948a
MS
30P.compact {
31 margin: 0;
32}
33
8b450588
MS
34P.example {
35 font-style: italic;
36 margin-left: 36pt;
37}
38
39PRE.example {
40 background: #eeeeee;
41 border: dotted thin #999999;
42 margin-left: 36pt;
178cb736 43 padding: 10pt;
8b450588
MS
44}
45
46PRE.command EM, PRE.example EM {
47 font-family: lucida grande, geneva, helvetica, arial, sans-serif;
48}
49
50P.command {
51 font-family: monaco, courier, monospace;
52 margin-left: 36pt;
53}
54
55P.formula {
56 font-style: italic;
57 margin-left: 36pt;
58}
59
60BLOCKQUOTE {
178cb736 61 background: #eeeeee;
8b450588
MS
62 border: solid thin #999999;
63 padding: 10pt;
64}
65
66A IMG {
67 border: none;
68}
69
70A:link:hover IMG {
71 background: #f0f0f0;
72 border-radius: 10px;
73 -moz-border-radius: 10px;
74}
75
76A:link, A:visited {
77 font-weight: normal;
78 text-decoration: none;
79}
80
81A:link:hover, A:visited:hover, A:active {
82 text-decoration: underline;
83}
84
85SUB, SUP {
86 font-size: 50%;
87}
88
89TR.data, TD.data, TR.data TD {
90 margin-top: 10pt;
91 padding: 5pt;
92 border-bottom: solid 1pt #999999;
93}
94
95TR.data TH {
96 border-bottom: solid 1pt #999999;
97 padding-top: 10pt;
98 padding-left: 5pt;
99 text-align: left;
100}
101
102DIV.table TABLE {
103 border: solid thin #999999;
104 border-collapse: collapse;
105 border-spacing: 0;
106 margin-left: auto;
107 margin-right: auto;
108}
109
110DIV.table CAPTION {
111 caption-side: top;
112 font-size: 120%;
113 font-style: italic;
114 font-weight: bold;
115 margin-left: auto;
116 margin-right: auto;
117}
118
119DIV.table TABLE TD {
120 border: solid thin #cccccc;
121 padding-top: 5pt;
122}
123
124DIV.table TABLE TH {
125 background: #cccccc;
126 border: none;
127 border-bottom: solid thin #999999;
128}
129
130DIV.figure TABLE {
131 margin-left: auto;
132 margin-right: auto;
133}
134
135DIV.figure CAPTION {
136 caption-side: bottom;
137 font-size: 120%;
138 font-style: italic;
139 font-weight: bold;
140 margin-left: auto;
141 margin-right: auto;
142}
143
144TH.label {
145 text-align: right;
146 vertical-align: top;
147}
148
149TH.sublabel {
150 text-align: right;
151 font-weight: normal;
152}
153
154HR {
155 border: solid thin;
156}
157
158SPAN.info {
159 background: black;
160 border: thin solid black;
161 color: white;
162 font-size: 80%;
163 font-style: italic;
164 font-weight: bold;
165 white-space: nowrap;
166}
167
168H2 SPAN.info, H3 SPAN.info, H4 SPAN.info {
169 float: right;
170 font-size: 100%;
171}
28b9d139 172
178cb736
MS
173H1.title {
174}
175
8b450588
MS
176H2.title, H3.title {
177 border-bottom: solid 2pt #000000;
178}
179
180DIV.indent, TABLE.indent {
181 margin-top: 2em;
182 margin-left: auto;
183 margin-right: auto;
184 width: 90%;
185}
186
187TABLE.indent {
188 border-collapse: collapse;
189}
190
191TABLE.indent TD, TABLE.indent TH {
192 padding: 0;
193}
194
195TABLE.list {
196 border-collapse: collapse;
197 margin-left: auto;
198 margin-right: auto;
199 width: 90%;
200}
201
202TABLE.list TH {
203 background: white;
204 border-bottom: solid thin #cccccc;
205 color: #444444;
206 padding-top: 10pt;
207 padding-left: 5pt;
208 text-align: left;
209 vertical-align: bottom;
210 white-space: nowrap;
211}
212
213TABLE.list TH A {
214 color: #4444cc;
215}
216
217TABLE.list TD {
218 border-bottom: solid thin #eeeeee;
219 padding-top: 5pt;
220 padding-left: 5pt;
221}
222
223TABLE.list TR:nth-child(even) {
224 background: #f8f8f8;
225}
226
227TABLE.list TR:nth-child(odd) {
228 background: #f4f4f4;
229}
230
231DT {
232 margin-left: 36pt;
233 margin-top: 12pt;
234}
235
236DD {
237 margin-left: 54pt;
238}
239
240DL.category DT {
241 font-weight: bold;
242}
243
244P.summary {
245 margin-left: 36pt;
246 font-family: monaco, courier, monospace;
247}
248
249DIV.summary TABLE {
250 border: solid thin #999999;
251 border-collapse: collapse;
252 border-spacing: 0;
253 margin: 10px;
254}
255
256DIV.summary TABLE TD, DIV.summary TABLE TH {
257 border: solid thin #999999;
258 padding: 5px;
259 text-align: left;
260 vertical-align: top;
261}
262
263DIV.summary TABLE THEAD TH {
264 background: #eeeeee;
265}
266
267/* API documentation styles... */
268div.body h1 {
269 margin: 0;
270}
271div.body h2 {
272 margin-top: 1.5em;
273}
274div.body h3, div.body h4, div.body h5 {
275 margin-bottom: 0.5em;
276 margin-top: 1.5em;
277}
278.class, .enumeration, .function, .struct, .typedef, .union {
279 border-bottom: solid thin #999999;
280 margin-bottom: 0;
281 margin-top: 2em;
282}
283.description {
284 margin-top: 0.5em;
285}
286code, p.code, pre, ul.code li {
287 font-family: monaco, courier, monospace;
288 font-size: 90%;
289}
290ul.code, ul.contents, ul.subcontents {
291 list-style-type: none;
292 margin: 0;
293 padding-left: 0;
294}
295ul.code li {
296 margin: 0;
297}
298ul.contents > li {
299 margin-top: 1em;
300}
301ul.contents li ul.code, ul.contents li ul.subcontents {
302 padding-left: 2em;
303}
304div.body dl {
305 margin-left: 0;
306 margin-top: 0;
307}
308div.body dt {
309 font-style: italic;
310 margin-left: 0;
311 margin-top: 0;
312}
313div.body dd {
314 margin-bottom: 0.5em;
315}
316
317/* This is just for the HTML files generated with the framedhelp target */
318div.contents {
319 background: #e8e8e8;
320 border: solid thin black;
321 padding: 10px;
322}
323div.contents h1 {
324 font-size: 110%;
325}
326div.contents h2 {
327 font-size: 100%;
328}
329div.contents ul.contents {
330 font-size: 80%;
331}
332div.contents ul.subcontents li {
333 margin-left: 1em;
334 text-indent: -1em;
335}
336--></style>
337</head>
338<body>
339<div class='body'>
178cb736
MS
340<h1 class='title'>Introduction to the PPD Compiler</h1>
341
28b9d139
MS
342<P>This document describes how to use the CUPS PostScript Printer Description
343(PPD) file compiler. The PPD compiler generates PPD files from simple text files
344that describe the features and capabilities of one or more printers.</P>
345
346<div class='summary'><table summary='General Information'>
347<tbody>
348<tr>
349 <th>See Also</th>
350 <td>Programming: <a href='raster-driver.html'>Developing Raster Printer Drivers</a><br>
351 Programming: <a href='postscript-driver.html'>Developing PostScript Printer Drivers</a><br>
352 Programming: <a href='api-filter.html'>Filter and Backend Programming</a><br>
353 Programming: <a href='api-raster.html'>Raster API</a><br>
354 References: <a href='ref-ppdcfile.html'>PPD Compiler Driver Information File Reference</a><br>
355 Specifications: <a href='spec-ppd.html'>CUPS PPD Extensions</a></td>
356</tr>
357</tbody>
358</table></div>
8b450588
MS
359<h2 class="title">Contents</h2>
360<ul class="contents">
426c6a59 361<ul class="subcontents">
8b450588
MS
362<li><a href="#BASICS">The Basics</a></li>
363<li><a href="#DRV">Driver Information Files</a><ul class="subcontents">
364<li><a href="#SIMPLE">A Simple Example</a></li>
365<li><a href="#GROUPING">Grouping and Inheritance</a></li>
366<li><a href="#COLOR">Color Support</a></li>
367<li><a href="#OPTIONS">Defining Custom Options and Option Groups</a></li>
368<li><a href="#DEFINE">Defining Constants</a></li>
369<li><a href="#CONDITIONAL">Conditional Statements</a></li>
370<li><a href="#CONSTRAINTS">Defining Constraints</a></li>
371</ul></li>
28b9d139
MS
372<h2 class='title'><a name='BASICS'>The Basics</a></h2>
373
374<P>The PPD compiler, <a href='man-ppdc.html'><code>ppdc(1)</code></a>, is a
375simple command-line tool that takes a single <I>driver information file</I>,
376which by convention uses the extension <VAR>.drv</VAR>, and produces one or more
377PPD files that may be distributed with your printer drivers for use with CUPS.
378For example, you would run the following command to create the English language
379PPD files defined by the driver information file <VAR>mydrivers.drv</VAR>:</P>
380
381<pre class='command'>
382ppdc mydrivers.drv
383</pre>
384
385<P>The PPD files are placed in a subdirectory called
386<VAR>ppd</VAR>. The <TT>-d</TT> option is used to put the PPD
387files in a different location, for example:</p>
388
389<pre class='command'>
390ppdc -d myppds mydrivers.drv
391</pre>
392
393<P>places the PPD files in a subdirectory named
394<VAR>myppds</VAR>. Finally, use the <TT>-l</TT> option to
395specify the language localization for the PPD files that are
396created, for example:</P>
397
398<pre class='command'>
399ppdc -d myppds/de -l de mydrivers.drv
400ppdc -d myppds/en -l en mydrivers.drv
401ppdc -d myppds/es -l es mydrivers.drv
402ppdc -d myppds/fr -l fr mydrivers.drv
403ppdc -d myppds/it -l it mydrivers.drv
404</pre>
405
406<P>creates PPD files in German (de), English (en), Spanish (es),
407French (fr), and Italian (it) in the corresponding
408subdirectories. Specify multiple languages (separated by commas) to produce
409"globalized" PPD files:</p>
410
411<pre class='command'>
412ppdc -d myppds -l de,en,es,fr,it mydrivers.drv
413</pre>
414
415
416<h2 class='title'><a name='DRV'>Driver Information Files</a></h2>
417
418<P>The driver information files accepted by the PPD compiler are
419plain text files that define the various attributes and options
420that are included in the PPD files that are generated. A driver
421information file can define the information for one or more printers and
422their corresponding PPD files.</P>
423
424<p class='example'><a name="LISTING1">Listing 1: "examples/minimum.drv"</a></p>
425
426<pre class='example'>
427<I>// Include standard font and media definitions</I>
428<a href='ref-ppdcfile.html#_include'>#include</a> &lt;font.defs&gt;
429<a href='ref-ppdcfile.html#_include'>#include</a> &lt;media.defs&gt;
430
431<I>// List the fonts that are supported, in this case all standard fonts...</I>
432<a href='ref-ppdcfile.html#Font'>Font</a> *
433
434<I>// Manufacturer, model name, and version</I>
435<a href='ref-ppdcfile.html#Manufacturer'>Manufacturer</a> "Foo"
436<a href='ref-ppdcfile.html#ModelName'>ModelName</a> "FooJet 2000"
437<a href='ref-ppdcfile.html#Version'>Version</a> 1.0
438
439<I>// Each filter provided by the driver...</I>
440<a href='ref-ppdcfile.html#Filter'>Filter</a> application/vnd.cups-raster 100 rastertofoo
441
442<I>// Supported page sizes</I>
443*<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Letter
444<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> A4
445
446<I>// Supported resolutions</I>
447*<a href='ref-ppdcfile.html#Resolution'>Resolution</a> k 8 0 0 0 "600dpi/600 DPI"
448
449<I>// Specify the name of the PPD file we want to generate...</I>
450<a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "foojet2k.ppd"
451</pre>
452
453
454<h3><a name='SIMPLE'>A Simple Example</a></h3>
455
456<P>The example in <A HREF="#LISTING1">Listing 1</A> shows a driver information
457file which defines the minimum required attributes to provide a valid PPD file.
458The first part of the file includes standard definition files for fonts and
459media sizes:</P>
460
461<pre class='example'>
462<a href='ref-ppdcfile.html#_include'>#include</a> &lt;font.defs&gt;
463<a href='ref-ppdcfile.html#_include'>#include</a> &lt;media.defs&gt;
464</pre>
465
466<P>The <TT>#include</TT> directive works just like the C/C++ include directive;
467files included using the angle brackets (<TT>&lt;filename&gt;</TT>) are found
468in any of the standard include directories and files included using quotes
469(<TT>"filename"</TT>) are found in the same directory as the source or include
470file. The <TT>&lt;font.defs&gt;</TT> include file defines the standard fonts
471which are included with GPL Ghostscript and the Apple PDF RIP, while the
472<TT>&lt;media.defs&gt;</TT> include file defines the standard media sizes
473listed in Appendix B of the Adobe PostScript Printer Description File Format
474Specification.</P>
475
476<P>CUPS provides several other standard include files:</P>
477
478<UL>
479
480 <LI><TT>&lt;epson.h&gt;</TT> - Defines all of the rastertoepson driver
481 constants.</LI>
482
483 <LI><TT>&lt;escp.h&gt;</TT> - Defines all of the rastertoescpx driver
484 constants.</LI>
485
486 <LI><TT>&lt;hp.h&gt;</TT> - Defines all of the rastertohp driver
487 constants.</LI>
488
489 <LI><TT>&lt;label.h&gt;</TT> - Defines all of the rastertolabel driver
490 constants.</LI>
491
492 <LI><TT>&lt;pcl.h&gt;</TT> - Defines all of the rastertopclx driver
493 constants.</LI>
494
495 <LI><TT>&lt;raster.defs&gt;</TT> - Defines all of the CUPS raster format
496 constants.</LI>
497
498</UL>
499
500<P>Next we list all of the fonts that are available in the driver; for CUPS
501raster drivers, the following line is all that is usually supplied:</P>
502
503<pre class='example'>
504<a href='ref-ppdcfile.html#Font'>Font</a> *
505</pre>
506
507<P>The <TT>Font</TT> directive specifies the name of a single font or the
508asterisk to specify all fonts. For example, you would use the following line to
509define an additional bar code font that you are supplying with your printer
510driver:</P>
511
512<pre class='example'>
513<I>// name encoding version charset status</I>
514<a href='ref-ppdcfile.html#Font'>Font</a> Barcode-Foo Special "(1.0)" Special ROM
515</pre>
516
517<P>The name of the font is <TT>Barcode-Foo</TT>. Since it is not a standard
518text font, the encoding and charset name <TT>Special</TT> is used. The version
519number is <TT>1.0</TT> and the status (where the font is located) is
520<TT>ROM</TT> to indicate that the font does not need to be embedded in
521documents that use the font for this printer.</P>
522
523<P>Third comes the manufacturer, model name, and version number information
524strings:</P>
525
526<pre class='example'>
527<a href='ref-ppdcfile.html#Manufacturer'>Manufacturer</a> "Foo"
528<a href='ref-ppdcfile.html#ModelName'>ModelName</a> "FooJet 2000"
529<a href='ref-ppdcfile.html#Version'>Version</a> 1.0
530</pre>
531
532<P>These strings are used when the user (or auto-configuration program) selects
533the printer driver for a newly connected device.</p>
534
535<P>The list of filters comes after the information strings; for the example in
536<A HREF="#LISTING1">Listing 1</A>, we have a single filter that takes CUPS
537raster data:</P>
538
539<pre class='example'>
540<a href='ref-ppdcfile.html#Filter'>Filter</a> application/vnd.cups-raster 100 rastertofoo
541</pre>
542
543<P>Each filter specified in the driver information file is the equivalent of a
544printer driver for that format; if a user submits a print job in a different
545format, CUPS figures out the sequence of commands that will produce a supported
546format for the least relative cost.</P>
547
548<P>Once we have defined the driver information we specify the supported options.
549For the example driver we support a single resolution of 600 dots per inch and
550two media sizes, A4 and Letter:</P>
551
552<pre class='example'>
553*<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Letter
554<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> A4
555
556*<a href='ref-ppdcfile.html#Resolution'>Resolution</a> k 8 0 0 0 "600dpi/600 DPI"
557</pre>
558
559<P>The asterisk in front of the <TT>MediaSize</TT> and <TT>Resolution</TT>
560directives specify that those option choices are the default. The
561<TT>MediaSize</TT> directive is followed by a media size name which is normally
562defined in the <TT>&lt;media.defs&gt;</TT> file and corresponds to a standard
563Adobe media size name. If the default media size is <TT>Letter</TT>, the PPD
564compiler will override it to be <TT>A4</TT> for non-English localizations for
565you automatically.</P>
566
567<P>The <TT>Resolution</TT> directive accepts several values after it as
568follows:</P>
569
570<OL>
571
572 <LI>Colorspace for this resolution, if any. In the example file, the
573 colorspace <TT>k</TT> is used which corresponds to black. For printer
574 drivers that support color printing, this field is usually specified as
575 "-" for "no change".</LI>
576
577 <LI>Bits per color. In the example file, we define 8 bits per color, for
578 a continuous-tone grayscale output. All versions of CUPS support 1 and
579 8 bits per color. CUPS 1.2 and higher (Mac OS X 10.5 and higher) also
580 supports 16 bits per color.</LI>
581
582 <LI>Rows per band. In the example file, we define 0 rows per band to
583 indicate that our printer driver does not process the page in
584 bands.</LI>
585
586 <LI>Row feed. In the example, we define the feed value to be 0 to
587 indicate that our printer driver does not interleave the output.</LI>
588
589 <LI>Row step. In the example, we define the step value to be 0 to
590 indicate that our printer driver does not interleave the output. This
591 value normally indicates the spacing between the nozzles of an inkjet
592 printer - when combined with the previous two values, it informs the
593 driver how to stagger the output on the page to produce interleaved
594 lines on the page for higher-resolution output.</LI>
595
596 <LI>Choice name and text. In the example, we define the choice name and
597 text to be <TT>"600dpi/600 DPI"</TT>. The name and text are separated by
598 slash (<TT>/</TT>) character; if no text is specified, then the name is
599 used as the text. The PPD compiler parses the name to determine the
600 actual resolution; the name can be of the form
601 <TT><I>RESOLUTION</I>dpi</TT> for resolutions that are equal
602 horizontally and vertically or <TT><I>HRES</I>x<I>VRES</I>dpi</TT> for
603 isometric resolutions. Only integer resolution values are supported, so
604 a resolution name of <TT>300dpi</TT> is valid while <TT>300.1dpi</TT> is
605 not.</LI>
606
607</OL>
608
609<P>Finally, the <TT>PCFileName</TT> directive specifies that the named PPD file
610should be written for the current driver definitions:</P>
611
612<pre class='example'>
613<a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "foojet2k.ppd"
614</pre>
615
616<P>The filename follows the directive and <I>must</I> conform to the Adobe
617filename requirements in the Adobe Postscript Printer Description File Format
618Specification. Specifically, the filename may not exceed 8 characters followed
619by the extension <VAR>.ppd</VAR>. The <TT>FileName</TT> directive can be used to
620specify longer filenames:</P>
621
622<pre class='example'>
623<a href='ref-ppdcfile.html#FileName'>FileName</a> "FooJet 2000"
624</pre>
625
626
627<h3><a name='GROUPING'>Grouping and Inheritance</a></h3>
628
629<P>The previous example created a single PPD file. Driver information files can
630also define multiple printers by using the PPD compiler grouping functionality.
631Directives are grouped using the curly braces (<TT>{</TT> and <TT>}</TT>) and
632every group that uses the <TT>PCFileName</TT> or <TT>FileName</TT> directives
633produces a PPD file with that name. <A HREF="#LISTING2">Listing 2</A> shows a
634variation of the original example that uses two groups to define two printers
635that share the same printer driver filter but provide two different resolution
636options.</P>
637
638<p class='example'><a name="LISTING2">Listing 2: "examples/grouping.drv"</a></p>
639
640<pre class='example'>
641
642<I>// Include standard font and media definitions</I>
643<a href='ref-ppdcfile.html#_include'>#include</a> &lt;font.defs&gt;
644<a href='ref-ppdcfile.html#_include'>#include</a> &lt;media.defs&gt;
645
646<I>// List the fonts that are supported, in this case all standard fonts...</I>
647<a href='ref-ppdcfile.html#Font'>Font</a> *
648
649<I>// Manufacturer and version</I>
650<a href='ref-ppdcfile.html#Manufacturer'>Manufacturer</a> "Foo"
651<a href='ref-ppdcfile.html#Version'>Version</a> 1.0
652
653<I>// Each filter provided by the driver...</I>
654<a href='ref-ppdcfile.html#Filter'>Filter</a> application/vnd.cups-raster 100 rastertofoo
655
656<I>// Supported page sizes</I>
657*<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Letter
658<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> A4
659
660{
661 <I>// Supported resolutions</I>
662 *<a href='ref-ppdcfile.html#Resolution'>Resolution</a> k 8 0 0 0 "600dpi/600 DPI"
663
664 <I>// Specify the model name and filename...</I>
665 <a href='ref-ppdcfile.html#ModelName'>ModelName</a> "FooJet 2000"
666 <a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "foojet2k.ppd"
667}
668
669{
670 <I>// Supported resolutions</I>
671 *<a href='ref-ppdcfile.html#Resolution'>Resolution</a> k 8 0 0 0 "1200dpi/1200 DPI"
672
673 <I>// Specify the model name and filename...</I>
674 <a href='ref-ppdcfile.html#ModelName'>ModelName</a> "FooJet 2001"
675 <a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "foojt2k1.ppd"
676}
677</pre>
678
679<P>The second example is essentially the same as the first, except that each
680printer model is defined inside of a pair of curly braces. For example, the
681first printer is defined using:</P>
682
683<pre class='example'>
684{
685 // Supported resolutions
686 *<a href='ref-ppdcfile.html#Resolution'>Resolution</a> k 8 0 0 0 "600dpi/600 DPI"
687
688 // Specify the model name and filename...
689 <a href='ref-ppdcfile.html#ModelName'>ModelName</a> "FooJet 2000"
690 <a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "foojet2k.ppd"
691}
692</pre>
693
694<P>The printer <I>inherits</I> all of the definitions from the parent group (the
695top part of the file) and adds the additional definitions inside the curly
696braces for that printer driver. When we define the second group, it also
697inherits the same definitions from the parent group but <I>none</I> of the
698definitions from the first driver. Groups can be nested to any number of levels
699to support variations of similar models without duplication of information.</P>
700
701
702<h3><a name='COLOR'>Color Support</a></h3>
703
704<P>For printer drivers that support color printing, the
705<TT>ColorDevice</TT> and <TT>ColorModel</TT> directives should be
706used to tell the printing system that color output is desired
707and in what formats. <A HREF="#LISTING3">Listing 3</A> shows a
708variation of the previous example which includes a color printer
709that supports printing at 300 and 600 DPI.</P>
710
711<P>The key changes are the addition of the <TT>ColorDevice</TT>
712directive:</P>
713
714<pre class='example'>
715<a href='ref-ppdcfile.html#ColorDevice'>ColorDevice</a> true
716</pre>
717
718<P>which tells the printing system that the printer supports
719color printing, and the <TT>ColorModel</TT> directives:</P>
720
721<pre class='example'>
722<a href='ref-ppdcfile.html#ColorModel'>ColorModel</a> Gray/Grayscale w chunky 0
723*<a href='ref-ppdcfile.html#ColorModel'>ColorModel</a> RGB/Color rgb chunky 0
724</pre>
725
726<P>which tell the printing system which colorspaces are supported by the printer
727driver for color printing. Each of the <TT>ColorModel</TT> directives is
728followed by the option name and text (<TT>Gray/Grayscale</TT> and
729<TT>RGB/Color</TT>), the colorspace name (<TT>w</TT> and <TT>rgb</TT>), the
730color organization (<TT>chunky</TT>), and the compression mode number
731(<TT>0</TT>) to be passed to the driver. The option name can be any of the
732standard Adobe <TT>ColorModel</TT> names:</P>
733
734<UL>
735
736 <LI><TT>Gray</TT> - Grayscale output.
737
738 <LI><TT>RGB</TT> - Color output, typically using the RGB
739 colorspace, but without a separate black channel.
740
741 <LI><TT>CMYK</TT> - Color output with a separate black
742 channel.
743
744</UL>
745
746<P>Custom names can be used, however it is recommended that you use your vendor
747prefix for any custom names, for example "fooName".</P>
748
749<P>The colorspace name can be any of the following universally supported
750colorspaces:</P>
751
752<UL>
753 <LI><TT>w</TT> - Luminance</LI>
754
755 <LI><TT>rgb</TT> - Red, green, blue</LI>
756
757 <LI><TT>k</TT> - Black</LI>
758
759 <LI><TT>cmy</TT> - Cyan, magenta, yellow</LI>
760
761 <LI><TT>cmyk</TT> - Cyan, magenta, yellow, black</LI>
762
763</UL>
764
765<P>The color organization can be any of the following values:</P>
766
767<UL>
768
769 <LI><TT>chunky</TT> - Color values are passed together on a line
770 as RGB RGB RGB RGB</LI>
771
772 <LI><TT>banded</TT> - Color values are passed separately
773 on a line as RRRR GGGG BBBB; not supported by the Apple
774 RIP filters</LI>
775
776 <LI><TT>planar</TT> - Color values are passed separately
777 on a page as RRRR RRRR RRRR ... GGGG GGGG GGGG ... BBBB
778 BBBB BBBB; not supported by the Apple RIP filters</LI>
779
780</UL>
781
782<P>The compression mode value is passed to the driver in the
783<TT>cupsCompression</TT> attribute. It is traditionally used to select an
784appropriate compression mode for the color model but can be used for any
785purpose, such as specifying a photo mode vs. standard mode.</P>
786
787<p class='example'><a name="LISTING3">Listing 3: "examples/color.drv"</a></p>
788
789<pre class='example'>
790
791<I>// Include standard font and media definitions</I>
792<a href='ref-ppdcfile.html#_include'>#include</a> &lt;font.defs&gt;
793<a href='ref-ppdcfile.html#_include'>#include</a> &lt;media.defs&gt;
794
795<I>// List the fonts that are supported, in this case all standard fonts...</I>
796<a href='ref-ppdcfile.html#Font'>Font</a> *
797
798<I>// Manufacturer and version</I>
799<a href='ref-ppdcfile.html#Manufacturer'>Manufacturer</a> "Foo"
800<a href='ref-ppdcfile.html#Version'>Version</a> 1.0
801
802<I>// Each filter provided by the driver...</I>
803<a href='ref-ppdcfile.html#Filter'>Filter</a> application/vnd.cups-raster 100 rastertofoo
804
805<I>// Supported page sizes</I>
806*<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Letter
807<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> A4
808
809{
810 <I>// Supported resolutions</I>
811 *<a href='ref-ppdcfile.html#Resolution'>Resolution</a> k 8 0 0 0 "600dpi/600 DPI"
812
813 <I>// Specify the model name and filename...</I>
814 <a href='ref-ppdcfile.html#ModelName'>ModelName</a> "FooJet 2000"
815 <a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "foojet2k.ppd"
816}
817
818{
819 <I>// Supports color printing</I>
820 <a href='ref-ppdcfile.html#ColorDevice'>ColorDevice</a> true
821
822 <I>// Supported colorspaces</I>
823 <a href='ref-ppdcfile.html#ColorModel'>ColorModel</a> Gray/Grayscale w chunky 0
824 *<a href='ref-ppdcfile.html#ColorModel'>ColorModel</a> RGB/Color rgb chunky 0
825
826 <I>// Supported resolutions</I>
827 *<a href='ref-ppdcfile.html#Resolution'>Resolution</a> - 8 0 0 0 "300dpi/300 DPI"
828 <a href='ref-ppdcfile.html#Resolution'>Resolution</a> - 8 0 0 0 "600dpi/600 DPI"
829
830 <I>// Specify the model name and filename...</I>
831 <a href='ref-ppdcfile.html#ModelName'>ModelName</a> "FooJet Color"
832 <a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "foojetco.ppd"
833}
834</pre>
835
836
837<h3><a name='OPTIONS'>Defining Custom Options and Option Groups</a></h3>
838
839<P>The <TT>Group</TT>, <TT>Option</TT>, and <TT>Choice</TT>
840directives are used to define or select a group, option, or
841choice. <A HREF="#LISTING4">Listing 4</A> shows a variation of
842the first example that provides two custom options in a group
843named "Footasm".</P>
844
845<p class='example'><a name="LISTING4">Listing 4: "examples/custom.drv"</a></p>
846
847<pre class='example'>
848
849<I>// Include standard font and media definitions</I>
850<a href='ref-ppdcfile.html#_include'>#include</a> &lt;font.defs&gt;
851<a href='ref-ppdcfile.html#_include'>#include</a> &lt;media.defs&gt;
852
853<I>// List the fonts that are supported, in this case all standard fonts...</I>
854<a href='ref-ppdcfile.html#Font'>Font</a> *
855
856<I>// Manufacturer, model name, and version</I>
857<a href='ref-ppdcfile.html#Manufacturer'>Manufacturer</a> "Foo"
858<a href='ref-ppdcfile.html#ModelName'>ModelName</a> "FooJet 2000"
859<a href='ref-ppdcfile.html#Version'>Version</a> 1.0
860
861<I>// Each filter provided by the driver...</I>
862<a href='ref-ppdcfile.html#Filter'>Filter</a> application/vnd.cups-raster 100 rastertofoo
863
864<I>// Supported page sizes</I>
865*<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Letter
866<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> A4
867
868<I>// Supported resolutions</I>
869*<a href='ref-ppdcfile.html#Resolution'>Resolution</a> k 8 0 0 0 "600dpi/600 DPI"
870
871<I>// Option Group</I>
872<a href='ref-ppdcfile.html#Group'>Group</a> "Footasm"
873
874 <I>// Boolean option</I>
875 <a href='ref-ppdcfile.html#Option'>Option</a> "fooEnhance/Resolution Enhancement" Boolean AnySetup 10
876 *<a href='ref-ppdcfile.html#Choice'>Choice</a> True/Yes "&lt;&lt;/cupsCompression 1&gt;&gt;setpagedevice"
877 <a href='ref-ppdcfile.html#Choice'>Choice</a> False/No "&lt;&lt;/cupsCompression 0&gt;&gt;setpagedevice"
878
879 <I>// Multiple choice option</I>
880 <a href='ref-ppdcfile.html#Option'>Option</a> "fooOutputType/Output Quality" PickOne AnySetup 10
881 *<a href='ref-ppdcfile.html#Choice'>Choice</a> "Auto/Automatic Selection"
882 "&lt;&lt;/OutputType(Auto)&gt;&gt;setpagedevice""
883 <a href='ref-ppdcfile.html#Choice'>Choice</a> "Text/Optimize for Text"
884 "&lt;&lt;/OutputType(Text)&gt;&gt;setpagedevice""
885 <a href='ref-ppdcfile.html#Choice'>Choice</a> "Graph/Optimize for Graphics"
886 "&lt;&lt;/OutputType(Graph)&gt;&gt;setpagedevice""
887 <a href='ref-ppdcfile.html#Choice'>Choice</a> "Photo/Optimize for Photos"
888 "&lt;&lt;/OutputType(Photo)&gt;&gt;setpagedevice""
889
890<I>// Specify the name of the PPD file we want to generate...</I>
891<a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "foojet2k.ppd"
892</pre>
893
894<P>The custom group is introduced by the <TT>Group</TT>
895directive which is followed by the name and optionally text for
896the user:</P>
897
898<pre class='example'>
899<a href='ref-ppdcfile.html#Group'>Group</a> "Footasm/Footastic Options"
900</pre>
901
902<P>The group name must conform to the PPD specification and
903cannot exceed 40 characters in length. If you specify user text,
904it cannot exceed 80 characters in length. The groups
905<TT>General</TT>, <TT>Extra</TT>, and
906<TT>InstallableOptions</TT> are predefined by CUPS; the general
907and extra groups are filled by the UI options defined by the PPD
908specification. The <TT>InstallableOptions</TT> group is reserved
909for options that define whether accessories for the printer
910(duplexer unit, finisher, stapler, etc.) are installed.</P>
911
912<P>Once the group is specified, the <TT>Option</TT> directive is
913used to introduce a new option:</P>
914
915<pre class='example'>
916<a href='ref-ppdcfile.html#Option'>Option</a> "fooEnhance/Resolution Enhancement" Boolean AnySetup 10
917</pre>
918
919<P>The directive is followed by the name of the option and any
920optional user text, the option type, the PostScript document group, and
921the sort order number. The option name must conform to the PPD specification
922and cannot exceed 40 characters in length. If you specify user text, it
923cannot exceed 80 characters in length.</P>
924
925<P>The option type can be <TT>Boolean</TT> for true/false
926selections, <TT>PickOne</TT> for picking one of many choices, or
927<TT>PickMany</TT> for picking zero or more choices. Boolean
928options can have at most two choices with the names
929<TT>False</TT> and <TT>True</TT>. Pick options can have any
930number of choices, although for Windows compatibility reasons
931the number of choices should not exceed 255.</P>
932
933<P>The PostScript document group is typically <TT>AnySetup</TT>,
934meaning that the option can be introduced at any point in the
935PostScript document. Other values include <TT>PageSetup</TT> to
936include the option before each page and <TT>DocumentSetup</TT>
937to include the option once at the beginning of the document.</P>
938
939<P>The sort order number is used to sort the printer commands
940associated with each option choice within the PostScript
941document. This allows you to setup certain options before others
942as required by the printer. For most CUPS raster printer
943drivers, the value <TT>10</TT> can be used for all options.</P>
944
945<P>Once the option is specified, each option choice can be
946listed using the <TT>Choice</TT> directive:</P>
947
948<pre class='example'>
949*<a href='ref-ppdcfile.html#Choice'>Choice</a> True/Yes "&lt;&lt;/cupsCompression 1&gt;&gt;setpagedevice"
950<a href='ref-ppdcfile.html#Choice'>Choice</a> False/No "&lt;&lt;/cupsCompression 0&gt;&gt;setpagedevice"
951</pre>
952
953<P>The directive is followed by the choice name and optionally
954user text, and the PostScript commands that should be inserted
955when printing a file to this printer. The option name must
956conform to the PPD specification and cannot exceed 40 characters
957in length. If you specify user text, it cannot exceed 80
958characters in length.</P>
959
960<P>The PostScript commands are also interpreted by any RIP
961filters, so these commands typically must be present for all
962option choices. Most commands take the form:</P>
963
964<pre class='example'>
965&lt;&lt;/name value&gt;&gt;setpagedevice
966</pre>
967
968<P>where <TT>name</TT> is the name of the PostScript page device
969attribute and <TT>value</TT> is the numeric or string value for
970that attribute.</P>
971
972
973<h3><a name='DEFINE'>Defining Constants</a></h3>
974
975<P>Sometimes you will want to define constants for your drivers
976so that you can share values in different groups within the same
977driver information file, or to share values between different
978driver information files using the <TT>#include</TT> directive.
979The <TT>#define</TT> directive is used to define constants for
980use in your printer definitions:</P>
981
982<pre class='example'>
983<a href='ref-ppdcfile.html#_define'>#define</a> NAME value
984</pre>
985
986<P>The <TT>NAME</TT> is any sequence of letters, numbers, and
987the underscore. The <TT>value</TT> is a number or string; if the
988value contains spaces you must put double quotes around it, for
989example:</P>
990
991<pre class='example'>
992<a href='ref-ppdcfile.html#_define'>#define</a> FOO "My String Value"
993</pre>
994
995<P>Constants can also be defined on the command-line using the <tt>-D</tt>
996option:</P>
997
998<pre class='command'>
999ppdc -DNAME="value" filename.drv
1000</pre>
1001
1002<P>Once defined, you use the notation <TT>$NAME</TT> to substitute the value of
1003the constant in the file, for example:</P>
1004
1005<pre class='example'>
1006<a href='ref-ppdcfile.html#_define'>#define</a> MANUFACTURER "Foo"
1007<a href='ref-ppdcfile.html#_define'>#define</a> FOO_600 0
1008<a href='ref-ppdcfile.html#_define'>#define</a> FOO_1200 1
1009
1010{
1011 <a href='ref-ppdcfile.html#Manufacturer'>Manufacturer</a> "$MANUFACTURER"
1012 <a href='ref-ppdcfile.html#ModelNumber'>ModelNumber</a> $FOO_600
1013 <a href='ref-ppdcfile.html#ModelName'>ModelName</a> "FooJet 2000"
1014 ...
1015}
1016
1017{
1018 <a href='ref-ppdcfile.html#Manufacturer'>Manufacturer</a> "$MANUFACTURER"
1019 <a href='ref-ppdcfile.html#ModelNumber'>ModelNumber</a> $FOO_1200
1020 <a href='ref-ppdcfile.html#ModelName'>ModelName</a> "FooJet 2001"
1021 ...
1022}
1023</pre>
1024
1025<P>Numeric constants can be bitwise OR'd together by placing the constants
1026inside parenthesis, for example:</P>
1027
1028<pre class='example'>
1029<I>// ModelNumber capability bits</I>
1030<a href='ref-ppdcfile.html#_define'>#define</a> DUPLEX 1
1031<a href='ref-ppdcfile.html#_define'>#define</a> COLOR 2
1032
1033...
1034
1035{
1036 <I>// Define a model number specifying the capabilities of the printer...</I>
1037 <a href='ref-ppdcfile.html#ModelNumber'>ModelNumber</a> ($DUPLEX $COLOR)
1038 ...
1039}
1040</pre>
1041
1042
1043<h3><a name='CONDITIONAL'>Conditional Statements</a></h3>
1044
1045<p>The PPD compiler supports conditional compilation using the <tt>#if</tt>,
1046<tt>#elif</tt>, <tt>#else</tt>, and <tt>#endif</tt> directives. The <tt>#if</tt>
1047and <tt>#elif</tt> directives are followed by a constant name or an expression.
1048For example, to include a group of options when "ADVANCED" is defined:</p>
1049
1050<pre class='example'>
1051<a href='ref-ppdcfile.html#_if'>#if</a> ADVANCED
1052<a href='ref-ppdcfile.html#Group'>Group</a> "Advanced/Advanced Options"
1053 <a href='ref-ppdcfile.html#Option'>Option</a> "fooCyanAdjust/Cyan Adjustment"
1054 <a href='ref-ppdcfile.html#Choice'>Choice</a> "plus10/+10%" ""
1055 <a href='ref-ppdcfile.html#Choice'>Choice</a> "plus5/+5%" ""
1056 *<a href='ref-ppdcfile.html#Choice'>Choice</a> "none/No Adjustment" ""
1057 <a href='ref-ppdcfile.html#Choice'>Choice</a> "minus5/-5%" ""
1058 <a href='ref-ppdcfile.html#Choice'>Choice</a> "minus10/-10%" ""
1059 <a href='ref-ppdcfile.html#Option'>Option</a> "fooMagentaAdjust/Magenta Adjustment"
1060 <a href='ref-ppdcfile.html#Choice'>Choice</a> "plus10/+10%" ""
1061 <a href='ref-ppdcfile.html#Choice'>Choice</a> "plus5/+5%" ""
1062 *<a href='ref-ppdcfile.html#Choice'>Choice</a> "none/No Adjustment" ""
1063 <a href='ref-ppdcfile.html#Choice'>Choice</a> "minus5/-5%" ""
1064 <a href='ref-ppdcfile.html#Choice'>Choice</a> "minus10/-10%" ""
1065 <a href='ref-ppdcfile.html#Option'>Option</a> "fooYellowAdjust/Yellow Adjustment"
1066 <a href='ref-ppdcfile.html#Choice'>Choice</a> "plus10/+10%" ""
1067 <a href='ref-ppdcfile.html#Choice'>Choice</a> "plus5/+5%" ""
1068 *<a href='ref-ppdcfile.html#Choice'>Choice</a> "none/No Adjustment" ""
1069 <a href='ref-ppdcfile.html#Choice'>Choice</a> "minus5/-5%" ""
1070 <a href='ref-ppdcfile.html#Choice'>Choice</a> "minus10/-10%" ""
1071 <a href='ref-ppdcfile.html#Option'>Option</a> "fooBlackAdjust/Black Adjustment"
1072 <a href='ref-ppdcfile.html#Choice'>Choice</a> "plus10/+10%" ""
1073 <a href='ref-ppdcfile.html#Choice'>Choice</a> "plus5/+5%" ""
1074 *<a href='ref-ppdcfile.html#Choice'>Choice</a> "none/No Adjustment" ""
1075 <a href='ref-ppdcfile.html#Choice'>Choice</a> "minus5/-5%" ""
1076 <a href='ref-ppdcfile.html#Choice'>Choice</a> "minus10/-10%" ""
1077<a href='ref-ppdcfile.html#_endif'>#endif</a>
1078</pre>
1079
1080
1081<h3><a name='CONSTRAINTS'>Defining Constraints</a></h3>
1082
1083<P>Constraints are strings that are used to specify that one or more option
1084choices are incompatible, for example two-sided printing on transparency media.
1085Constraints are also used to prevent the use of uninstalled features such as the
1086duplexer unit, additional media trays, and so forth.</P>
1087
1088<P>The <TT>UIConstraints</TT> directive is used to specify a constraint that is
1089placed in the PPD file. The directive is followed by a string using one of the
1090following formats:</P>
1091
1092<pre class='example'>
1093<a href='ref-ppdcfile.html#UIConstraints'>UIConstraints</a> "*Option1 *Option2"
1094<a href='ref-ppdcfile.html#UIConstraints'>UIConstraints</a> "*Option1 Choice1 *Option2"
1095<a href='ref-ppdcfile.html#UIConstraints'>UIConstraints</a> "*Option1 *Option2 Choice2"
1096<a href='ref-ppdcfile.html#UIConstraints'>UIConstraints</a> "*Option1 Choice1 *Option2 Choice2"
1097</pre>
1098
1099<P>Each option name is preceded by the asterisk (<TT>*</TT>). If no choice is
1100given for an option, then all choices <I>except</I> <TT>False</TT> and
1101<TT>None</TT> will conflict with the other option and choice(s). Since the PPD
1102compiler automatically adds reciprocal constraints (option A conflicts with
1103option B, so therefore option B conflicts with option A), you need only specify
1104the constraint once.</P>
1105
1106<p class='example'><a name="LISTING5">Listing 5: "examples/constraint.drv"</a></p>
1107
1108<pre class='example'>
1109
1110<I>// Include standard font and media definitions</I>
1111<a href='ref-ppdcfile.html#_include'>#include</a> &lt;font.defs&gt;
1112<a href='ref-ppdcfile.html#_include'>#include</a> &lt;media.defs&gt;
1113
1114<I>// List the fonts that are supported, in this case all standard fonts...</I>
1115<a href='ref-ppdcfile.html#Font'>Font</a> *
1116
1117<I>// Manufacturer, model name, and version</I>
1118<a href='ref-ppdcfile.html#Manufacturer'>Manufacturer</a> "Foo"
1119<a href='ref-ppdcfile.html#ModelName'>ModelName</a> "FooJet 2000"
1120<a href='ref-ppdcfile.html#Version'>Version</a> 1.0
1121
1122<I>// Each filter provided by the driver...</I>
1123<a href='ref-ppdcfile.html#Filter'>Filter</a> application/vnd.cups-raster 100 rastertofoo
1124
1125<I>// Supported page sizes</I>
1126*<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> Letter
1127<a href='ref-ppdcfile.html#MediaSize'>MediaSize</a> A4
1128
1129<I>// Supported resolutions</I>
1130*<a href='ref-ppdcfile.html#Resolution'>Resolution</a> k 8 0 0 0 "600dpi/600 DPI"
1131
1132<I>// Installable Option Group</I>
1133<a href='ref-ppdcfile.html#Group'>Group</a> "InstallableOptions/Options Installed"
1134
1135 <I>// Duplexing unit option</I>
1136 <a href='ref-ppdcfile.html#Option'>Option</a> "OptionDuplexer/Duplexing Unit" Boolean AnySetup 10
1137 <a href='ref-ppdcfile.html#Choice'>Choice</a> True/Installed ""
1138 *<a href='ref-ppdcfile.html#Choice'>Choice</a> "False/Not Installed" ""
1139
1140<I>// General Option Group</I>
1141<a href='ref-ppdcfile.html#Group'>Group</a> General
1142
1143 <I>// Duplexing option</I>
1144 <a href='ref-ppdcfile.html#Option'>Option</a> "Duplex/Two-Sided Printing" PickOne AnySetup 10
1145 *<a href='ref-ppdcfile.html#Choice'>Choice</a> "None/No" "&lt;&lt;/Duplex false&gt;&gt;setpagedevice""
1146 <a href='ref-ppdcfile.html#Choice'>Choice</a> "DuplexNoTumble/Long Edge Binding"
1147 "&lt;&lt;/Duplex true/Tumble false&gt;&gt;setpagedevice""
1148 <a href='ref-ppdcfile.html#Choice'>Choice</a> "DuplexTumble/Short Edge Binding"
1149 "&lt;&lt;/Duplex true/Tumble true&gt;&gt;setpagedevice""
1150
1151<I>// Only allow duplexing if the duplexer is installed</I>
1152<a href='ref-ppdcfile.html#UIConstraints'>UIConstraints</a> "*Duplex *OptionDuplexer False"
1153
1154<I>// Specify the name of the PPD file we want to generate...</I>
1155<a href='ref-ppdcfile.html#PCFileName'>PCFileName</a> "foojet2k.ppd"
1156</pre>
1157
1158<P><A HREF="#LISTING5">Listing 5</A> shows a variation of the first example with
1159an added <TT>Duplex</TT> option and installable option for the duplexer,
1160<TT>OptionDuplex</TT>. A constraint is added at the end to specify that any
1161choice of the <TT>Duplex</TT> option that is not <TT>None</TT> is incompatible
1162with the "Duplexer Installed" option set to "Not Installed"
1163(<TT>False</TT>):</P>
1164
1165<pre class='example'>
1166<a href='ref-ppdcfile.html#UIConstraints'>UIConstraints</a> "*Duplex *OptionDuplexer False"
1167</pre>
1168
1169<h4>Enhanced Constraints</h4>
1170
1171<p>CUPS 1.4 supports constraints between 2 or more options using the
1172<TT>Attribute</TT> directive. <TT>cupsUIConstraints</TT> attributes define
1173the constraints, while <TT>cupsUIResolver</TT> attributes define option changes
1174to resolve constraints. For example, we can specify the previous duplex
1175constraint with a resolver that turns off duplexing with the following two
1176lines:</p>
1177
1178<pre class='example'>
1179<a href='ref-ppdcfile.html#Attribute'>Attribute</a> cupsUIConstraints DuplexOff "*Duplex *OptionDuplexer False"
1180<a href='ref-ppdcfile.html#Attribute'>Attribute</a> cupsUIResolver DuplexOff "*Duplex None"
1181</pre>
8b450588
MS
1182</div>
1183</body>
1184</html>