PostScript Printer Description
PostScript Printer Description (PPD) is a standardized file format developed by Adobe Systems to describe the features, options, and capabilities of PostScript-compatible printers and other output devices, such as imagesetters.[1] It consists of a plain text file containing structured keywords that allow applications, printer drivers, and print managers to generate consistent user interfaces and execute device-specific PostScript code for functions like paper handling, resolution selection, color rendering, and finishing operations.[1] Introduced in the mid-1990s, the format was first specified in version 4.3 on February 9, 1996, to promote interoperability across PostScript Level 1 and Level 2 devices without requiring applications to understand the underlying semantics of each printer's features.[1] PPD files are created and maintained by printer manufacturers to provide detailed metadata about their devices, including required elements like the manufacturer name, model, supported page sizes (e.g., Letter, A4), input slots, media types, imageable areas, and installable options such as additional memory or duplex units.[1][2] The structure relies on a syntax of case-sensitive keywords—limited to 40 characters each—grouped into sections for general information, user interface definitions (using*OpenUI and *CloseUI for options like PickOne or Boolean), order dependencies for code execution, and constraints to prevent incompatible settings.[1] For instance, keywords such as *PageSize, *Resolution, *ColorModel (e.g., Gray, RGB, CMYK), and *Duplex enable precise control over output, while custom page sizes and color rendering dictionaries support advanced customization.[1] Files are capped at 64 KB and use ASCII encoding, typically ISOLatin1, to ensure portability across operating systems.[1]
In practice, PPD files integrate with software like Adobe applications (e.g., Illustrator, InDesign) and operating system drivers, such as those in macOS and earlier Mac OS versions, where they were introduced alongside the LaserWriter 8 driver to handle printer-specific behaviors like font substitution and halftone patterns.[3][2] On macOS, they support printing dialog extensions (PDEs) for localized user interfaces and are installed in designated system directories, while in cross-platform environments, they facilitate PostScript file generation for high-quality output in publishing and design workflows.[2] This format remains essential for ensuring reliable, device-tailored printing in professional settings, bridging the gap between generic PostScript interpreters and hardware-specific requirements.[1]
Overview
Definition and Purpose
A PostScript Printer Description (PPD) file is a text-based file format developed by Adobe Systems Incorporated to describe the capabilities and features of PostScript-compatible devices, such as printers and imagesetters, for use by print spoolers and drivers.[1] This format enables applications to query and utilize device-specific information without embedding custom printer logic directly into software.[1] Originating in the late 1980s with the initial version released in 1989, PPD files have become a standard in the PostScript ecosystem.[1] The primary purpose of a PPD file is to allow users and applications to select and configure printer options, including paper sizes, resolutions, input trays, color models, and finishing features like duplexing, thereby generating tailored PostScript output without requiring application-specific modifications.[1] By providing a structured description of available features and their invocation sequences, PPD files facilitate seamless integration between diverse printers and host systems, ensuring that print jobs are processed accurately across varying hardware.[1] In the broader PostScript ecosystem, PPD files serve as an intermediary between applications and PostScript interpreters, enabling the production of device-specific PostScript code while adhering to Document Structuring Conventions (DSC) for output redirection and job management.[1] This role promotes standardization across printers from different manufacturers, supports the automatic generation of user interfaces in print dialogs, and ensures compatibility with both Level 1 and Level 2 PostScript devices, enhancing overall workflow efficiency and cross-platform reliability.[1]Key Components
A PostScript Printer Description (PPD) file is structured around several core components that collectively describe a printer's capabilities, enabling seamless integration with PostScript drivers. These include sections for general information, installed options, and code fragments, which form the foundational building blocks for conveying essential printer attributes and behaviors.[1] General information provides basic identification details, such as the printer's manufacturer (via the Manufacturer keyword, e.g., "Adobe" or "Acme") and model name (ModelName, e.g., "Acme SuperPrinter Turbo v2011.108"), which are required for accurate device recognition. An optional NickName keyword offers a user-friendly alias for the model. Installed options detail configurable features, including paper handling like PageSize (required, specifying sizes such as Letter at [612 792] points or A4, with qualifiers like Transverse) and InputSlot (e.g., Upper, Lower, or Cassette trays). Code fragments embed executable PostScript snippets: the Prolog section runs once per print job for global initialization (e.g., device setup), while PageSetup executes per page to apply settings like page size via commands such assetpagedevice.[1]
User interface (UI) organization structures how options are presented in driver software, using OpenUI and CloseUI directives to bracket groups of choices, such as *OpenUI PageSize: PickOne for radio-button selections or PickMany for multi-select checkboxes (e.g., multiple folding options). Additional grouping mechanisms include OpenGroup/CloseGroup for broader categories like Finishing and OpenSubGroup/CloseSubGroup for nested subgroups, alongside Boolean for simple on/off toggles. Constraints enforce compatibility by limiting invalid combinations: UIConstraints apply user-visible restrictions (e.g., prohibiting MediaType: Transparent with OutputBin: Upper or PageSize: Env10 with Duplex), while NonUIConstraints handle backend-only rules (e.g., conflicts with CustomPageSize).[1]
Query keywords facilitate dynamic runtime inquiries into printer status, such as ?PageSize (which might return the current setting via PostScript code like save [(Letter)(Legal)] papertray get = flush restore), ?Resolution for device resolution, or ?OutputBin for available output bins. Translation support ensures internationalization of UI elements through the Strings keyword, which defines localized labels (e.g., PageSize Ledger/Papier Ledger: 'code' for English/French), governed by LanguageEncoding (e.g., ISOLatin1) and LanguageVersion (e.g., English) directives that apply to defaults and parsing rules.[1]
History and Development
Origins
PostScript Printer Description (PPD) files were developed by Adobe Systems starting in the late 1980s as an integral component of the PostScript page description language ecosystem. The initial copyright for PPD files was issued in 1987 by Adobe Systems Incorporated, marking the formal beginning of this standardization effort. This development occurred alongside the rapid expansion of PostScript technology, which had been introduced in 1984 and quickly became essential for high-quality digital printing.[1] The primary motivation for creating PPD files stemmed from the need to provide a consistent, device-independent method for describing the varied capabilities of PostScript printers, including features such as page sizes, media handling, resolution options, color separations, and font management. In the late 1980s, desktop publishing was experiencing explosive growth, driven by affordable laser printers and software like Adobe's own tools, which demanded reliable ways to communicate printer-specific details without fragmented, vendor-proprietary solutions. PPD files addressed this by enabling applications and drivers to query and utilize printer features uniformly, reducing compatibility issues across the burgeoning ecosystem of PostScript hardware.[1][4] From the outset, PPD files were closely integrated with foundational PostScript documentation, particularly the PostScript Language Reference Manual (Second Edition) and the Document Structuring Conventions (DSC) version 3.0 outlined in its Appendix G. This integration allowed PPDs to leverage DSC comments for embedding printer queries and job setup instructions directly into PostScript output streams, facilitating structured document handling and feature invocation in a standardized manner.[1][5] Early adoption of PPD files occurred within Adobe's software suite and initial printer driver implementations, where they enabled sophisticated printing workflows. This early use in Adobe tools and drivers helped establish PPDs as a cornerstone for feature-rich, cross-device printing in the PostScript environment.[1]Specification Versions
The PostScript Printer Description (PPD) specification originated from Adobe Systems' efforts in the late 1980s to standardize printer capability descriptions for PostScript devices.[6] The specification's development began with version 3.0, released on March 8, 1989, which was tied to Document Structuring Conventions (DSC) version 3.0 but was incompatible with later symbolic references. Version 4.0 followed on October 14, 1992, introducing further standardization for PostScript devices.[7] Version 4.1, released on April 9, 1993, introduced the core syntax for PPD files, including required keywords such as*PPD-Adobe to identify the file format and *ModelName to specify the printer model, along with basic mechanisms for handling printer options like page sizes and resolutions. This version established mechanisms for describing PostScript printer features in a human-readable text format, enabling applications to query and configure printers dynamically, and added updates like new keywords for character encodings.[7]
Version 4.2, published on March 29, 1994, built on the initial framework by adding support for symbolic references to manage large data blocks efficiently within PPD files and enhancing user interface constraints to better control option dependencies and ordering in driver dialogs. These updates improved the flexibility of PPD files for complex printer configurations without significantly altering the core syntax.[6]
The most substantial revision came with Version 4.3 on February 9, 1996 (with an index dated December 7, 1995), which incorporated new required keywords including *ShortNickName for a concise printer identifier and *Manufacturer for the vendor name, while expanding support for bidirectional communication in line with the IEEE 1284-1994 standard through keywords like *1284DeviceID and *1284Modes*. It also introduced enhancements for color management, such as the *RenderingIntentkeyword for specifying color rendering behaviors, and finishing options like*StapleLocationand*FoldType` to describe post-processing capabilities.[6]
Following Version 4.3, Adobe issued minor supplements rather than major revisions, including Technical Note #5645 in April 1997 to accommodate later PostScript language versions like 2017 and 3010 with additions such as *FastImage for optimized image processing and resource management keywords.[8]
All PPD specification versions are designed to be backward-compatible, allowing files compliant with later releases to function with software expecting earlier ones, and they collectively support PostScript Levels 1 and 2 interpreters for broad device applicability.[6]
File Format
Syntax and Structure
PostScript Printer Description (PPD) files are text-based documents encoded primarily in 8-bit ASCII, utilizing byte codes from decimal 32 to 255, along with tab (decimal 9), line feed (decimal 10), and carriage return (decimal 13).[1] Each line in a PPD file must not exceed 255 characters, including the line termination characters, which can be a carriage return (CR, decimal 13), line feed (LF, decimal 10), or a combination of both (CRLF).[1] This format ensures compatibility with standard text editors and parsers, restricting characters to printable ASCII values (decimal 33–126) while excluding colons (decimal 58) and slashes (decimal 47) within keyword names themselves, though slashes appear in translation strings.[1] Keywords in PPD files follow a precise syntax: they begin with an asterisk (*) in the first column, followed by the keyword name, a colon (:), and the associated value, as in the general form*Keyword: value.[1] This structure is case-sensitive, meaning variations like *PageSize and *pagesize are treated as distinct.[1] Option names within keywords are limited to a maximum of 40 characters, promoting concise and unambiguous definitions.[1]
The organization of a PPD file is sequential, lacking formal section headers, and typically commences with global attributes such as *PPD-Adobe: "4.3" to indicate the specification version.[1] The format was further updated in April 1997 via Adobe Technical Note #5645, introducing extensions such as additional UI options and query mechanisms while maintaining backward compatibility with version 4.3.[8] This is followed by definitions for options, logical groups, and executable code sections, arranged in a linear flow that reflects the printer's operational hierarchy.[1] Global attributes establish device-wide properties early in the file, while subsequent sections delineate user-selectable features and PostScript code fragments.[1]
Grouping mechanisms enhance the logical structuring of content: *OpenGroup and *CloseGroup delimit sections for related user interface elements, such as media handling options, allowing for nested organization where appropriate.[1] Similarly, *OrderDependency directives specify the sequence of code execution across sections, ensuring dependencies like job control language setup precede page-specific configurations.[1]
Parsing rules in PPD files prioritize robustness: print spoolers and interpreters ignore unrecognized keywords, particularly those outside defined user interface structures, to maintain forward compatibility.[1] The *Include keyword enables modular inclusion of external PPD files, supporting nested references for reusable components.[1] Comments are denoted by lines beginning with *% (for PPD-specific annotations) or % (in code sections), which are skipped during processing and must start in the first column.[1]
By default, PPD files employ 7-bit printable ASCII encoding, with ISOLatin1 serving as a common extension for English-language support when specified via *LanguageEncoding.[1] Alternative encodings, such as WindowsANSI for Western European languages or MacStandard for Macintosh compatibility, can be declared to accommodate international character sets, ensuring proper rendering of text in diverse environments.[1]
Keywords and Options
PostScript Printer Description (PPD) files use keywords prefixed with an asterisk (*) to define printer capabilities, with options specifying configurable features such as media handling, resolution, and color processing. These keywords are case-sensitive and follow a structured syntax to ensure compatibility across applications and drivers.[1]Required Keywords
Certain keywords are mandatory to identify the PPD file and the associated printer model. The*PPD-Adobe keyword must appear first, indicating conformance to the specification version, such as "4.3".[1] The *FileVersion keyword specifies the PPD file's revision, for example, "1.0", while *FormatVersion confirms the overall format adherence, also typically "4.3".[1] Identification details include *Manufacturer for the vendor name, like "Acme", and *ModelName for the specific device, such as "Acme SuperPrinter Turbo v2011.108".[1] Additional required entries are *Product to denote the product type in parentheses, e.g., "(LaserPrinter)"; *PSVersion for the supported PostScript interpreter level, like "(2011) 108"; *NickName for a user-friendly device name, such as "Acme SuperPrinter"; and *ShortNickName for a compact version limited to 31 characters, e.g., "Acme Super".[1]
Installed Options
Installed options describe the printer's supported features, allowing applications to select appropriate settings. The*PageSize keyword lists available media sizes, such as Letter defined by dimensions [612 792] points or A4 at [595 842] points, including invocation code for PostScript setup.[1] *InputSlot specifies paper sources like Auto, Tray1, or Upper, often with priority values for selection.[1] Resolution is handled by *Resolution, with examples including 300dpi or 600dpi to set output quality.[1] Color capabilities are defined via *ColorModel, supporting modes like RGB, CMYK, or Gray.[1] Halftoning parameters include *ScreenFreq for frequency in lines per inch, e.g., "60.0", and *ScreenAngle for angle in degrees, such as "45.0".[1]
Defaults and Queries
Defaults establish initial settings for options, while queries enable runtime checks of printer state. The*DefaultPageSize keyword sets the starting media, for instance, Letter.[1] Similarly, *DefaultInputSlot might default to Auto or Tray1, and *DefaultResolution to 300dpi.[1] Query keywords, prefixed with ?, report current values; *?InputSlot returns the active tray like Tray1 or Unknown if unavailable, and *?PageSize indicates the loaded media such as A4.[1]
UI Options
User interface options control how features are presented to users in driver dialogs. ThePickOne type allows single selections, as in *PageSize PickOne for choosing one size from a list.[1] PickMany supports multiple choices, suitable for options like duplexing modes, while Boolean provides toggles for yes/no features, e.g., *Duplex Boolean.[1] Custom options extend this with user-defined parameters via keywords like *CustomPageSize True, which includes sub-options such as Width: 1 points 1 1008 and Height: 1 points 1 1008 for arbitrary dimensions in points, enabling flexible media beyond predefined sizes.[1]
Advanced Keywords
Advanced keywords address specialized printer functions. The*Font keyword catalogs available fonts with attributes like charset and encoding, for example, [Courier](/page/Courier): Standard "(002.002)" Standard ROM.[1] Finishing options include *StapleLocation for positions such as UpperLeft or TopLeft.[1] Color management uses *ColorRenderDict to invoke rendering dictionaries, like Saturated.Bond.Dot for specific halftone and transparency handling.[1] Registered options, detailed in Appendix B of the specification, standardize features such as ISO and JIS paper sizes (e.g., JIS B5: [516 729]) and media types for consistent implementation across vendors.[1]
Constraints
Constraints prevent invalid combinations of options through*UIConstraints, which block incompatible selections. For example, *UIConstraints: PickOne PageSize/[Letter](/page/Letter) * PickOne InputSlot/Tray3 disables Tray3 when Letter size is chosen, ensuring hardware compatibility.[1]
Usage in Systems
In Unix-like Systems
In Unix-like systems, PostScript Printer Description (PPD) files play a central role in printer configuration, particularly within the Common Unix Printing System (CUPS), the dominant printing subsystem in modern Linux and BSD distributions. PPD files are stored in the/etc/cups/ppd/ directory, where each file corresponds to a specific print queue and enables the selection of printer features such as paper size, resolution, and duplexing during job submission. This setup allows CUPS to manage print queues spooler-agnostically, translating user options into printer-specific commands without requiring custom drivers for each application.[9][10] While PPDs remain central to PostScript printing as of 2025, they are deprecated in CUPS in favor of driverless printing using IPP Everywhere, with support planned for removal in future versions.[11]
CUPS integrates PPD files by parsing standard Adobe PPDs to process PostScript jobs, applying defined options to generate device-specific PostScript code via commands like setpagedevice for features such as color modes or media handling. This parsing occurs during job filtering, ensuring compatibility with PostScript printers while supporting tools like system-config-printer for automated setup and configuration of queues, including option defaults and URI detection. Historically, CUPS—developed starting in 1997 with its first beta release in 1999—has centered PPDs in its architecture to provide a unified, extensible printing framework across Unix-like environments, replacing fragmented legacy spoolers with a standards-based approach.[10][12][13]
While CUPS predominates in contemporary Linux distributions like Ubuntu and Fedora, as well as BSD variants such as FreeBSD, PPD usage extends to legacy Unix systems including LPRng and Solaris print services. In LPRng, PPDs are supported through front-end tools like GPR for handling PostScript options in networked environments, and in Solaris, the lpadmin command uses the -n option to associate PPD files with queues for feature description. However, these older systems have largely been supplanted by CUPS in active deployments. A key limitation is that PPDs are strictly designed for PostScript printers, requiring CUPS to rely on Ghostscript for converting PostScript to raster formats when supporting non-PostScript devices, though the PPD itself remains focused on PostScript capability description.[14][15][16][17]
In Windows
In Windows, PostScript Printer Description (PPD) files integrate with the printing architecture primarily through the Microsoft PostScript printer driver (Pscript), implemented via PScript5.dll for versions 5.x, which parses PPDs to populate print dialogs and generate PostScript output.[18] Earlier Adobe PostScript drivers, such as AdobePS 4.x, also rely on PPD parsing for similar functionality, with installation typically handled via INF files that reference the PPD for vendor-specific configurations.[1] This setup allows the spooler, managed by winspool.drv, to interpret PPD keywords and constraints during job processing.[19] PPD features map directly to Windows device mode (DEVMODE) structures, enabling seamless UI and output control; for instance, input slots specified via *InputSlot keywords correspond to DMBIN constants like DMBIN_LOWER for the lower tray, while media sizes use *PageSize or *MediaType mapped to DMPAPER IDs such as DMPAPER_A4 or DMPAPER_LETTER.[1] Color management supports Image Color Management (ICM) through keywords like *Manufacturer and *ModelName, which align with ICC profile headers to facilitate device-specific color matching in applications.[1] Additional color keywords, such as *ColorModel (e.g., CMYK) and *RenderingIntent, further enable ICM handling by the driver.[1] Several constraints apply to PPD files in Windows to ensure compatibility with PScript5.dll and AdobePS 4.x: the total file size, including code, keywords, options, and strings, must not exceed 64 KB, and the number of *OpenUI or *JCLOpenUI entries is limited to 100 to avoid UI overload.[1] Encoding adheres to Windows ANSI standards, with line lengths capped at 255 characters and keyword lengths at 40 characters maximum.[1] These limits stem from the driver's parsing capabilities, where temporary binary PPD (.bpd) files are generated from the text-based input.[20] PPD support has been integral to Windows since version 95, forming the basis for PostScript printing in professional applications like Adobe Acrobat and Illustrator, where selecting the appropriate PPD ensures accurate feature exposure and output generation.[1][3] Vendor-supplied PPDs are commonly bundled in driver packages, referenced via INF directives like *PCFileName, to enable model-specific installations without modifying core driver binaries.[19] For customization, PPD files support local overrides using the *Include directive to reference external files, allowing modular extensions while the spooler handles overall parsing and dependency resolution via *OrderDependency keywords.[1] This approach maintains compatibility with the Windows print subsystem, ensuring features like media constraints (UIConstraints) and font queries (?FontList) are processed efficiently during spooling.[1]In macOS
macOS integrates PostScript Printer Description (PPD) files into its printing architecture primarily through the Common UNIX Printing System (CUPS), which has served as the underlying backend since Mac OS X 10.2 Jaguar in 2002.[21] PPD files are stored in the directory /System/Library/Printers/PPDs/Contents/Resources/, where they describe printer capabilities and enable features such as AirPrint compatibility and customizable print dialogs in applications. This integration allows macOS to handle PostScript-based printing by parsing PPDs to generate appropriate job options, supporting seamless discovery and configuration of network printers.[13] While PPDs remain central to PostScript printing as of 2025, they are deprecated in CUPS in favor of driverless printing using IPP Everywhere, with support planned for removal in future versions.[11] Apple's development of CUPS has been dormant since 2020, following the departure of its lead developer, though the system continues to function in macOS.[21] Apple's implementation adheres to the Adobe PPD specification, particularly for PostScript printers, by utilizing drivers like LaserWriter 8 and PSPrinter 8, which impose a 32 KB limit on each code fragment to ensure compatibility with the Macintosh environment.[1] The system includes mechanisms for translating PPD content into localized user interfaces, facilitating multilingual support in print settings across macOS applications such as Preview and Pages. Printer vendors play a key role by supplying PPD files compliant with Adobe Technical Note #5003, the official PPD format specification, ensuring that device-specific features like paper sizes, resolutions, and finishing options are accurately represented in the macOS print workflow.[1] Prior to the full adoption of CUPS in 2002, earlier versions of Mac OS X (10.0 Cheetah through 10.1 Puma) relied on Apple's classic printing architecture, which supported PPD parsing but lacked the modular backend of CUPS, limiting advanced network features. Following the 2002 integration, macOS aligned closely with open-source CUPS implementations while incorporating Apple-specific enhancements, such as Bonjour (formerly Rendezvous) for automatic printer discovery starting in 10.3 Panther. This evolution shifted PPD usage toward a more standardized, Unix-like model while prioritizing user-friendly client-side interactions.[21] macOS printing with PPDs emphasizes client-side operations, where the system generates PostScript jobs locally based on the selected PPD without requiring server-side processing for most setups. PPD files are often auto-installed or updated through macOS software updates, ensuring compatibility with new hardware and resolving common issues like missing options in print dialogs.[22] This approach maintains focus on end-user simplicity, with broader Unix-like capabilities accessible via the shared CUPS foundation.[13]Standards and Extensions
MIME Type
The official MIME type for PostScript Printer Description (PPD) files, particularly those extended by the Common UNIX Printing System (CUPS), isapplication/vnd.cups-ppd.[23] This type was registered with the Internet Assigned Numbers Authority (IANA) on June 2, 2006, under the vendor tree by Michael Sweet of Easy Software Products, the developer of CUPS.[23] The registration specifies no required or optional parameters, with files encoded in 8-bit text and typically identified by the .ppd extension (case-insensitive, including compressed variants like .ppd.gz).[23]
This MIME type facilitates the transmission of PPD files in network protocols, such as the Internet Printing Protocol (IPP), where it supports querying and configuring printer capabilities during web-based setup processes.[23] By associating PPD content with this media type, browsers and applications can correctly interpret and handle downloads or attachments, ensuring proper rendering of printer feature mappings without confusion with other formats like PostScript documents, which use application/postscript.[24] In practice, this enables seamless integration in environments like the CUPS web administration interface (accessible at http://localhost:631), where users upload or select PPD files to add and configure printers.[25]
The adoption of application/vnd.cups-ppd emerged alongside CUPS's widespread implementation in the early 2000s, providing a standardized identifier for PPDs that describe both PostScript and non-PostScript printer drivers.[23] It is commonly used in vendor support scenarios, such as emailing PPD files for troubleshooting or driver installation, allowing recipients' software to recognize and process them appropriately.[10] Applications including GNOME, KDE, macOS, Windows, and OpenOffice.org leverage this type for enhanced printing feature support.[23]