(19. November 2003 — tk)

Wie funktioniert CUPS am Mac?

Verkürzt gesagt gibt es unter MacOS X schon immer den Printjob Manager des Systems und seit 10.2 eben auch noch CUPS. Das ist insofern von Bedeutung als Apple nicht alle Funktionalitäten von CUPS nutzt, sondern teilweise vom eigenen /System/Library/Printers/Libraries/PrintJobMgr erledigen läßt und andererseits der Umfang der Standardfilter, die Apple mitliefert sich von einer CUPS-Standardinstallation unterscheidet (bspw. keine GhostScript-basierten Filter aber dafür welche, die auf keinen anderen Systemen existieren, bspw. pictwpstops)

An der Schnittstelle zwischen dem Printjob Manager und CUPS wird entweder PDF übergeben oder die Spezialform »PICT with embedded PostScript« — in Ausnahmefällen (bspw. RagTime) auch reines PostScript.

Was danach passiert ist dann nur noch Sache von CUPS bzw. dem immanenten Prinzip von

  1. MIME-Types, um die Art und Weise eines Dokuments zu charakterisieren (bspw. »application/pdf« oder »image/jpeg«)
  2. Filtern, um Dateien von einem Format ins andere zu wandeln (bspw. von PDF in PostScript oder vom »CUPS-Raster«-Format in irgendeine Lowlevel-Druckersprache wie bspw. PCL)
  3. Regeln, die – zur Not per Prioritäten-Vergabe sehr fein granulierbar – basierend auf MIME-Types steuern, welche Filter zum Einsatz kommen sollen, wenn von Format A nach B konvertiert werden muß
  4. PPDs, die neben ihrem Nutzen für den Printing Manager, um etwas über die physischen Fähigkeiten des Druckers herauszufinden auch Steuerinformationen bzgl. dem zu erzeugenden Endformat bzw. dem anzuwendenden letzten Filter enthalten können
    Schön theoretisch, das Ganze? :-)

Dann eben praktisch:

  1. Wenn eine PDF-Datei bei CUPS aufschlägt, dann beginnt diese zwangsweise mit den 4 Zeichen »%PDF«. Wie kommt nun CUPS auf die Idee, diese Datei als »application/pdf« zu erkennen? Ganz simpel: es parsed alle Dateien in /etc/cups/, die auf ».types« enden auf Definitionen dieser Zeichenkette (einfach mal in die mime.types reingucken, um das Muster zu verstehen)
  2. Die Filter liegen bei MacOS X in /usr/libexec/cups/filter. Dort kommen von Haus aus eine ganze Reihe Filter mit (bei 10.3 deutlich mehr als bei 10.2), man kann aber noch zus. eigene installieren (bspw. indem man ESP GhostScript auf den Rechner holt).
    Standardfilter bei 10.3 wären bspw.:
    1. pstocupsraster —> Wandelt PostScript-Dateien in CUPS-Raster
    2. rastertoepson —> Wandelt CUPS-Raster in ESC/P2
    3. rastertohp —> Wandelt CUPS-Raster in PCL
    4. rastertoprinter —> Bereitet CUPS-Raster für Gimp-Print auf
      Welche Filter letzten Endes zum Zug kommen, entscheidet sich erst durch die Regeln in 3)
  3. Die anzuwendenden Regeln werden einerseits aus den Regeldefinitionen (Dateien, die auf ».convs« enden und in /etc/cups/ liegen) hergeleitet und andererseits aus den Definitionen in der PPD (siehe nächster Punkt)
    Angenommen das Ausgangsformat ist PDF und soll auf einem HP LaserJet 4 Plus ausgegeben werden, der kein PostScript spricht.Wird dieser Drucker mit einer »Standard-PPD« konfiguriert, dann nehmen CUPS und Printing Manager an, daß das Zielformat PostScript sein soll. Es erfolgt also ein Lookup in den ».convs«-Dateien innerhalb /etc/cups/ nach der Regel zur Konvertierung von PDF nach PS, die die höchste Priorität hat. Im Normalfall wird diese so aussehen, daß nur der cgpdftops Filter (aus der von Apple beigesteuerten apple.convs Datei) das Rennen macht.Wird dagegen eine PPD verwendet, die als letzten CUPS-Filter bspw. »rastertohp« erfordert, so steht fest, daß ein Zwischenformat verwendet werden muß. Es hat in diesem Fall eine Konvertierung von PDF in das CUPS-Rasterformat zu erfolgen (dazu wird in diesem Fall anhand der Regeln in den *.convs Dateien »cgpdftoraster« auserkoren), welches dann in einem zweiten Schritt vom »rastertohp« Filter in PCL umgewandelt wird.Noch etwas komplizierter wird es mit Gimp-Print. Hier kommt nun analog der »cgpdftoraster« Filter zum Einsatz aber das CUPS-Rasterformat wird diesmal nicht direkt von einem Filter in eine Druckersprache übersetzt, sondern durch den »rastertoprinter«-Filter in ein Format übersetzt, mit dem Gimp-Print etwas anfangen kann. Die Umwandlung in die eigentliche Druckersprache geschieht dann noch eine Stufe später mittels des entsprechenden Gimp-Print Moduls bzw. »Treibers«.Ach ja: Das Filterkonzept ist natürlich beliebig erweiterbar. Sollte die Anwendung nämlich bspw. als Spoolformat »PICT with embedded PostScript« (pictwps) erzeugen, so würde als erster Schritt nun nicht mehr nur ein Filter (»cgpdftoraster« im vorigen Beispiel) aufgerufen werden müssen sondern gleich zwei: Zuerst mal pictwpstops, um »normales« PostScript zu erzeugen und dann entweder »pstoraster« (GhostScript — nicht Teil der MacOS X Standarddistribution) oder seit 10.3 auch möglich »pstocupsraster« (mit Umweg über das PSNormalizer Framework, d.h. Adobe Distiller). Danach ginge es wie oben weiter.
  4. Welche Rolle spielen dabei die PPDs, die Verwendung finden? Eine ganz und gar elementare, denn sie bestimmen letzten Endes, welchen Weg die einkommenden Druckdaten durch den durchaus komplexen Filterapparat nehmen werden, also mithin auch, ob am Ende etwas herauskommt, mit dem der Drucker irgendwas anfangen kann)
    Eine Zeile im Header der PPD, die mit »*cupsFilter:« startet, bestimmt welches der letzte Filter in der »CUPS Filter Chain« sein soll und hat damit unmittelbar Einfluß auf die Druckersprache, mit der der Drucker letzten Endes angesprochen werden soll (eine Epson-PPD für einen HP- Drucker führt dazu, daß ESC/P2 anstatt PCL beim Drucker landen)Im Fall von Gimp-Print werden in der PPD noch weitere Informationen kodiert, damit in Gimp-Print der richtige Treiber die Druckdaten aufbereitet (bspw. »*cupsModelNumber:«Apple selbst nutzt Kommentare in der PPD, damit die richtigen »Printer PlugIns« im Druckdialog angezeigt werden (»*APDialogExtension:«), die richtigen ICC-Profile zugeordnet werden (»*cupsICCProfile RGB../sRGB Matching Profile:«) und schließlich auch so Spielereien wie das richtige Druckersymbol im Druckdialog und im PrintCenter Verwendung findet (»*APPrinterIconPath:«)

Copyright © Thomas Kaiser, 2008 (erstellt 19. November 2003 — tk)

Dieser Beitrag kann durch jedermann gemäß den Bestimmungen der Lizenz für die freie Nutzung unveränderter Inhalte genutzt werden. Die Lizenzbedingungen können unter http://www.uvm.nrw.de/opencontent abgerufen oder bei der Geschäftsstelle des Kompetenznetzwerkes Universitätsverbund MultiMedia NRW, Universitätsstraße 11, D-58097 Hagen, schriftlich angefordert werden.