Information für Druckerhersteller bzgl. Linux-Unterstüzung

Dieses Dokument ist eine Vorabversion. Die eigentliche Version wird in Kürze über unsere Support-Datenbank http://portal.suse.com/sdb/de/index.html verfügbar sein.

Anliegen

Sie sind Druckerhersteller oder bieten Software an, die auf spezielle Druckerunterstützung angewiesen ist und Sie möchten grundlegende oder optimale Linux-Unterstützung erreichen.

Allgemeine Vorbemerkungen

Dieser Artikel richtet sich auch an Nicht-Techniker.
Es liegt aber in der Natur der Sache, dass das Thema ohne technischen Hintergrund weder ordentlich zu beschreiben noch zu verstehen ist. Ohne technische Exaktheit kann die Vielschichtigkeit des Themas zu babylonischer Sprachverwirrung führen.

Der Artikel ist in einen allgemeinen und einen technischen Teil gegliedert:
Zuerst kommt der allgemeine Teil, der mit einem Überblick und Index endet, in dem die einzelnen Fälle stichpunktartig zusammengefasst sind, die dann im technischen Teil nacheinander behandelt werden. Die "schlimmsten" technischen Details sind in dementsprechend gekennzeichneten Unterabschnitten behandelt. Gerade die technischen Details liefern Hintergrundinformationen zur Lizenzproblematik, so dass diese auch für Nicht-Techniker interessant sein können.

Öffenlich verfügbare Information

Am wichtigsten ist öffenlich verfügbare Information Wichtig sind Angaben, ab welcher Versionsnummer welche Linux-Treiber das jeweilige Druckermodell wie gut unterstützen.

Informationen zur Kompatibilität sind notwendig, um in die ständig wachsende Vielzahl von Druckermodellen und Modellvarianten Struktur zu bekommen und den Überblick zu behalten. Am günstigsten ist eine Einteilung in Kompatibilitätsklassen, wobei jede Kompatibilitätsklasse die Druckermodelle enthält, die softwareseitig kompatibel zueinander sind, die also dieselbe Druckersprache unterstützen und daher mit denselben Linux-Treibern bzw. mit denselben Linux-Treibereinstellungen funktionieren (siehe den Artikel "Drucker-Kauf und Kompatibilität" ). Druckertreiber sind normalerweise nicht für jedes einzelne Modell verschieden, sondern nur für jede Kompatibilitätsklasse. Beispielsweise der HPIJS Treiber von HP basiert auf diesem Prinzip (siehe http://hpinkjet.sourceforge.net/printmodedescr.php ) und auch in der Liste des Gimp-Print Treibers werden Kompatibilitätsklassen bei den "pcl-xxx" Klassen und bei einigen "bjc-xxx" Klassen deutlich (siehe http://gimp-print.sourceforge.net/p_Supported_Printers.php3 ).

Jeder Druckerhersteller sollte zumindest diese Informationen öffentlich zur Verfügung stellen damit die Kunden sich für geeignete Druckermodelle entscheiden können, denn die mit Abstand wichtigste Vorausssetzung für einen problemlosen Druckerbetrieb ist, das passende Druckermodell zu verwenden.

Welches Drucksystem (CUPS oder LPRng/lpdfilter) eingesetzt wird, ist zweitrangig, denn beide Drucksysteme funktionieren problemlos. Probleme beim Drucksystem lassen sich fast immer durch entsprechende Konfiguration in den Griff bekommen. Es ist zwar nicht jeder Wunsch konfigurierbar, aber für fast jede Problemstellung gibt es eine ausreichende Lösung. Probleme, deren Ursache ein ungeeigneter Drucker ist, können meist nicht durch Anpassungen der Konfiguration des Drucksystems behoben werden.

Bei http://www.linuxprinting.org/ gibt es DIE Linux Druckerdatenbank. Unter http://www.linuxprinting.org/contribute.html ist beschrieben, welche Informationen genau benötigt werden.

Natürlich kann dieselbe Information auch auf Web-Seiten des Druckerherstellers öffentlich verfügbar gemacht werden, wie z.B bei http://hpinkjet.sourceforge.net/productssupported.php

Nicht notwendig, aber sehr nützlich ist die Information, welche exakte Identifkation das jeweilige Modell liefert, wenn es via Parallelport (IEEE-1284), via USB oder via SNMP abgefragt wird. Damit ist es möglich, das Druckermodell automatisch zu erkennen und wenn ein Treiber dafür vorhanden ist, auch automatisch zu konfigurieren.

Bedingungen

Keinesfalls sollte zur Linux-Unterstützung von Druckern ein komplettes eigenes Drucksystem implementiert werden. Es kann nicht funktionieren, wenn verschiedene Drucksysteme auf demselben Rechner benötigt werden, um den Rechner als Druckserver für verschiedene Drucker betreiben zu können.

Egal wie die Linux-Unterstützung implementiert wird, sie muss sich reibungslos in die bestehenden Strukturen integrieren, d.h. sie muss kompatibel zu den Verarbeitungsstufen der bestehenden Drucksysteme sein. Das Hauptanliegen dieses Artikels ist, die dazu notwendigen grundlegenden Informationen zu liefern.

Das bedeutet nicht, dass nicht zusätzlich zu den unten genannten Möglichkeiten zur Linux-Unterstützung ein eigenes neues Drucksystem entwickelt werden darf. Es bedeutet aber, dass die Linux-Unterstützung von Druckern nicht von einem solchen Drucksystem abhängen darf.

Linux-Treiber und PPD-Dateien für Drucker müssen

damit wir sie standardmässig in unsere Produkte integrieren können, denn die Standardsoftware für unsere Produkte wird für die verschiedenen Hardwareplatformen immer aus dem Quellcode komplett neu compiliert.

Das bedeutet nicht, dass wir keine proprietäre Software in unsere Produkte integrieren können, aber es bedeutet, dass wir das nicht standardmässig machen können, sondern nur, falls es für uns interessant sein sollte. Da es Hunderte Druckermodelle gibt, die sehr gut mit freien Open-Source Linux-Treibern funktionieren, ist es eher unwahrscheinlich, dass proprietäre Linux-Treiber für uns interessant sind.

Auch für Anwender sollten proprietäre Linux-Treiber normalerweise uninteressant sein, denn es dürfte sich nur in Ausnahmefällen lohnen, Arbeitszeit für einen proprietären Linux-Treiber aufzuwenden, wenn man für vergleichbare Kosten einen neuen ordentlichen Drucker anschaffen kann. Insbesondere deswegen nicht, weil mit einem ordentlichen Drucker das Treiberproblem ein für alle Mal gelöst ist. Ein ordentlicher Drucker wird immer "out of the Box" funktionieren. Nie wieder ist proprietäre Treibersoftware einzuspielen und ggf. speziell zu konfigurieren. Nie wieder müssen Treiber-Updates beschafft werden, damit dieser zu neueren Entwicklungen im Drucksystem passt (siehe z.B. den Artikel "Probleme mit den Lexmark Treibern ab der SuSE Linux 8.1" ).

Linux-Treiber von Druckerherstellern, die obigen Bedingungen genügen, können standardmässig in unsere Produkte integriert werden.

Der Vorteil für den Druckerhersteller ist, dass er damit umfassende Linux-Unterstützung für seine Geräte bekommt

ohne dass es dem Druckerhersteller zusätzlichen Aufwand kostet.

Ein gutes Beispiel, wie ein Linux-Treiber von einem Druckerhersteller auf vorbildliche Weise gemacht sein kann, liefert der HPIJS Treiber von HP, siehe das "hp linux inkjet project" unter http://hpinkjet.sourceforge.net/

Es ist wichtig, zwischen dem eigentlichen Linux-Treiber und evtl. angebotener zusätzlicher Software (z.B. Drucker-Fernwartungs-Tools etc.) zu unterscheiden. Nur der eigentliche Linux-Treiber muss obigen Bedingungen genügen.

Zusammenfassung:
Wir wollen keine Linux-Treiber für Drucker unterstützen, die sich nicht reibungslos in die bestehenden Drucksysteme integrieren. Vergl. dazu den Abschnitt "Hinweise" im Artikel "GDI-Drucker".

Ein anderer Fall ist, wenn ein Hersteller für eine schon vorhandene proprietäre Software (z.B. ein proprietäres Drucksystem) ein Betriebssystem sucht, um eine komplette Server-Lösung anbieten zu können. Das kann mit einer OEM-Version eines SUSE LINUX Server Produkts erreicht werden.

Details

Warum müssen bei Linux-Treibern und PPD-Dateien Änderungen am Quellcode erlaubt sein? Durch Rückmeldung an die Autoren des Linux-Treibers oder der PPD-Datei fliesst die Information über Probleme und mögliche Lösungen wieder zurück und dient der langfristigen Perfektionierung von Treibern und PPD-Dateien.

Warum muss bei Linux-Treibern und PPD-Dateien sowohl Distribution als auch Re-Distribution erlaubt sein?

Überblick und Index

PostScript Drucker PCL+JCL Drucker Drucker mit Ghostscript Unterstützung Drucker mit CUPS "rasterto..." Unterstützung Drucker mit "Postfilter" Unterstützung Drucker ohne Linux-Unterstützung (GDI-Drucker)

Allgemeines zum technischen Teil

Der technische Teil schreitet vom bzgl. Linux-Unterstützung einfachsten Fall (PostScript Drucker) zu immer schwierigeren Fällen fort, wobei bei den schwierigeren Fällen das Wissen der einfacheren Fälle vorausgesetzt wird.

Jeder Fall beginnt mit einer Definition, welche Art Drucker gemeint ist und mit einer grundlegenden Erklärung der notwendigen Begriffe.

Es folgt eine grundlegende Darstellung welche Verarbeitungsstufen durchlaufen werden, damit die korrekten Daten beim Drucker ankommen. Das ist Voraussetzung, um zu verstehen, wie die Linux-Unterstützung im jeweiligen Fall aussehen muss und was für eine grundlegende Linux-Unterstützung notwendig ist und was für eine optimale Linux-Unterstützung hinreichend ist.

Die Verarbeitungsstufen können je nach Drucksystem (CUPS oder LPRng/lpdfilter) verschieden sein und dementsprechend kann die Linux-Unterstützung verschieden sein.

Um den Artikel in seiner Struktur nicht zu komplex werden zu lassen, wird hier schwerpunktmässig das CUPS Drucksystem betrachtet und ggf. auf Einschränkungen der Linux-Unterstützung bei LPRng/lpdfilter hingewiesen. Für CUPS siehe http://www.cups.org/ und für LPRng siehe http://www.lprng.com/


PostScript Drucker

Mit "PostScript Drucker" ist hier ein Drucker gemeint, der "PostScript Level 2" oder "PostScript Level 3" unterstützt.

PostScript wurde von Adobe entwickelt und ist die Standarddruckersprache unter Linux.

Verarbeitungsstufen

  1. Wenn die zu druckenden Daten nicht PostScript sind, werden sie in PostScript umgewandelt.
  2. Den PostScript Daten werden ggf. die passenden Steuerkommandos hinzugefügt, die der Drucker braucht, damit spezielle Druckerfunktionen wie z.B. Papierschachtwahl, Duplex-Modus oder Tonerspar-Modus aktiviert werden. Bei einem PostScript Drucker sind alle Druckerfunktionen und die dazu nötigen Steuerkommandos in der zum Drucker gehörenden PPD-Datei hinterlegt.
  3. Die PostScript Daten plus Steuerkommandos werden zum Drucker geschickt.

Grundlegende Linux-Unterstützung

Da ein PostScript Drucker die PostScript Daten direkt zu Papier bringen kann, ist die grundlegende Linux-Unterstützung für einen PostScript Level 2 oder Level 3 Drucker unabhängig vom Drucksystem immer gegeben.

Die grundlegende Linux-Unterstützung für einen PostScript Level 1 Drucker ist mit einem zusätzlichen Verarbeitungsschritt, der PostScript Level 1 erzeugt, auch immer möglich.

Optimale Linux-Unterstützung

Dazu muss in diesem Fall folgendes unter Linux zur Verfügung stehen: Solche PPD-Dateien sind alle schon vorhanden, denn jeder Hersteller legt einem PostScript Drucker eine genau passende PPD-Datei bei.

Allerdings bieten Druckerhersteller die PPD-Datei oft nur in seltsamen Formaten für Fremdbetriebssysteme an (z.B. selbstentpackende EXE-Archive). PPD-Dateien sind aber ganz normaler ASCII-Text und auch nicht derart gross, dass eine Komprimierung wirklich notwendig wäre.

Auch restiriktive Lizenzen für die PPD-Datei können die Verwendung für Linux verhindern.

Siehe dazu auch den Artikel "Drucker einrichten ab SuSE Linux 8.2".

Technische Details

Was ist eine PPD-Datei und wozu ist sie da?

Eine PPD Datei enthält die modellspezifischen Druckerfunktionen mit ihren Auswahlmöglichkeiten und den zugehörigen PostScript Code Schnipseln, die an den PostScript Drucker geschickt werden müssen, damit die ausgewählte Funktion aktiviert wird.

Der Aufbau der Einträge für eine Druckerfunktion (hier als Beispiel die Auswahl der Auflösung) ist gemäß der "Adobe PostScript Printer Description File Format Specification, Version 4.3" wie folgt:

* main keyword option keyword / translation string : " PostScript invocation value "
*Resolution 300x300dpi/300 dots per inch: "<</HWResolution[300 300]>>setpagedevice"
*Resolution 600x600dpi/600 dots per inch: "<</HWResolution[600 600]>>setpagedevice"
Das einzige, was bei freien PPD-Dateien Lizenzfragen aufwerfen könnte, sind die PostScript Code Schnipsel (PostScript Invocation Values). Diese Code Schnipsel dienen aber nur der Aktivierung von Druckerfunktionen und legen nicht offen, wie die Druckfunktion im Drucker implementiert ist. Hier ist z.B. aus den Code Schnipseln unmöglich zu ermitteln, wie der Drucker intern die 300 DPI bzw. 600 DPI tatsächlich zu Papier bringt.

Mit dem CUPS Programm "cupstestppd", was auch via http://www.cups.org/testppd.php zur Verfügung steht, sollte jede PPD-Datei getestet werden, ob sie der "Adobe PostScript Printer Description File Format Specification, Version 4.3" genügt.

Wird "FAIL" ausgegeben, dann sind die Fehler in der PPD-Datei so schwerwiegend, dass grössere Probleme bei der Verwendung der PPD-Datei zu erwarten sind. Die von "cupstestppd" angegebenen Problemstellen sollten beseitigt werden.

Wird "PASS" mit "WARN"-Meldungen ausgegeben, dann sollte die PPD-Datei verwendbar sein, aber die von "cupstestppd" angegebenen Problemstellen entsprechen nicht obiger PPD Spezifikation.

PPD-Dateien, die nicht der PPD Spezifikation entsprechen, können beliebige Fehler verursachen. Auch wenn CUPS mit der PPD-Datei zurecht kommt, heisst das nicht, dass dann auch andere Programme mit der PPD-Datei zurecht kommen. Z.B. Druckdialog-Tools (wie z.B. der KDE Druckdialog "kprinter", "xpp" oder "gtklp") oder die Druckaufbereitung in Anwendungsprogrammen könnten beliebige Probleme mit PPD-Dateien haben, die nicht der PPD Spezifikation entsprechen. Auch kann ein normaler Ausdruck unter Verwendung der Defaulteinstellungen in der PPD-Datei problemlos funktionieren, aber bei anderen Einstellungen scheitert es.

Wenn "PASS" ohne Warnmeldungen ausgegeben wird, kann man davon ausgehen, dass die PPD-Datei der PPD Spezifikation genügt, aber auch nicht mehr. Die PPD-Datei kann dennoch schwerwiegende Fehler enthalten, die eine Verwendung unmöglich machen, z.B.:

Das alles überprüfen kann nur der Druckerhersteller, denn nur hier ist das notwendige Wissen vorhanden über die Internas des Druckers (insbesondere die Internas des PostScript-Interpreters im Drucker).

PCL+JCL Drucker

Mit "PCL+JCL Drucker" ist ein Drucker gemeint, der die Druckersprache PCL unterstützt und zusätzlich eine Job-Control Sprache (JCL).

PCL steht für Printer Control Language und ist eine Druckersprache von HP. Aber auch viele Druckermodelle anderer Hersteller unterstützen PCL. Ähnlich wie bei PostScript gibt es auch bei PCL verschiedene Level: PCL3, PCL4, PCL5, PCL5e, PCL6, PCLXL

Eine Job-Control Sprache ist PJL (Printer Job Language) von HP. Viele Druckerhersteller haben ihre eigene Job-Control Sprache.

PCL ist die Seitenbeschreibungssprache (Page Description Language = PDL), in der dem Drucker mitgeteilt wird, wie der Ausdruck aussehen soll. Z.B. dass das Wort "Hallo" gedruckt werden soll.

Im Unterschied dazu wird mittels einer Job-Control Sprache dem Drucker mitgeteilt, wie der Ausdruck erfolgen soll. Z.B. aus welchem Papierschacht das Paier genommen werden soll und ob der Duplex-Modus oder der Tonerspar-Modus aktiviert werden soll.

Verarbeitungsstufen

  1. Wenn die zu druckenden Daten nicht PostScript sind, werden sie in PostScript umgewandelt.
  2. Den PostScript Daten werden ggf. die passenden JCL-Steuerkommandos hinzugefügt, die der Drucker braucht, damit spezielle Druckerfunktionen wie z.B. Papierschachtwahl, Duplex-Modus oder Tonerspar-Modus aktiviert werden. Bei einem Drucker, der eine Job-Control Sprache unterstützt, können die Druckerfunktionen und die dazu nötigen JCL-Steuerkommandos in einer zum Drucker passenden PPD-Datei hinterlegt werden.
  3. Die PostScript Daten plus JCL-Steuerkommandos müssen in einem zusätzlichen Verarbeitungsschritt wie folgt umgewandelt werden:
    1. Die JCL-Steuerkommandos werden extrahiert.
    2. Die PostScript Daten werden in PCL umgewandelt. Diese Umwandlung ist mit dem Programm Ghostscript möglich. Vergl. den Abschnitt "Drucker mit Ghostscript Unterstützung".
    3. PCL-Daten und JCL-Steuerkommandos werden wieder zusammengefügt.
  4. Die PCL-Daten plus JCL-Steuerkommandos werden zum Drucker geschickt.

Grundlegende Linux-Unterstützung

Für alle oben angegebenen PCL-Level stehen geeignete Ghostscript-Treiber zur Verfügung mit denen PostScript Daten in PCL umgewandelt werden können. Damit ist die grundlegende Linux-Unterstützung für einen PCL-Drucker unabhängig vom Drucksystem immer gegeben.

Optimale Linux-Unterstützung

Dazu muss in diesem Fall folgendes unter Linux zur Verfügung stehen: Für sehr viele PCL-Drucker stehen Foomatic-PPD-Dateien bei Linuxprinting.org (http://www.linuxprinting.org/) zur Verfügung. Der obige zusätzliche Verarbeitungsschritt wird für gewisse PCL-Ghostscript-Treiber vom Foomatic Filterscript "foomatic-rip" ab der Foomatic Version 3.0.1 erledigt. Im günstigsten Fall liefert schon Foomatic die optimale Linux-Unterstützung.

In vielen Fällen wird aber der Druckerhersteller sowohl für die passende PPD-Datei als auch für den passenden zusätzlichen Verarbeitungsschritt selbst sorgen müssen. Letzteres ist nicht nötig, wenn eine zu "foomatic-rip" kompatible PPD-Datei erstellt wird.

Daher sollte es in enger Anlehnung an Foomatic erfolgen, denn hier sind schon alle Grundlagen dafür geschaffen und Foomatic läuft zuverlässig auf Hunderttausenden von Linux-Installationen. Ideal für alle Beteiligten ist die direkte Unterstützung und Hilfe bei der Weiterentwicklung von Foomatic durch Druckerhersteller.

Technische Details

Wie können JCL-Druckerfunktionen in einer PPD-Datei festgelegt werden?

Hier als Beispiel die Auswahl der Auflösung via Job-Control Sprache PJL:
*JCLResolution 300x300dpi/300 dots per inch: "@PJL SET RESOLUTION = 300"
*JCLResolution 600x600dpi/600 dots per inch: "@PJL SET RESOLUTION = 600"
Das einzige, was bei freien PPD-Dateien Lizenzfragen aufwerfen könnte, sind die JCL-Steuerkommandos, die hier an Stelle der PostScript Code Schnipsel stehen. Diese JCL-Steuerkommandos dienen aber nur der Aktivierung von Druckerfunktionen und legen nicht offen, wie die Druckfunktion im Drucker implementiert ist. Hier ist z.B. aus den JCL-Steuerkommandos unmöglich zu ermitteln, wie der Drucker intern die 300 DPI bzw. 600 DPI tatsächlich zu Papier bringt.

Beim CUPS Drucksystem wird der obige zusätzliche Verarbeitungsschritt in der PPD-Datei wie folgt festgelegt:

Hier als Beispiel das Foomatic Filterscript "foomatic-rip":
*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
Für detaillierte Informationen zu Filterscripten siehe auch den Artikel "Selbst erstellte Filter zum Ausdruck mit CUPS".


Drucker mit Ghostscript Unterstützung

Ghostscript (http://www.cs.wisc.edu/~ghost/) ist ein umfangreiches Programmpaket zur Umwandlung von PostScript Daten in andere Formate, insbesondere in diverse Druckersprachen. Dazu beinhaltet Ghostscript eine Vielzahl von Ghostscript-Treibern, siehe z.B. http://www.cs.wisc.edu/~ghost/doc/printer.htm

Ein Drucker hat Ghostscript Unterstützung, wenn es für dessen Druckersprache einen Ghostscript-Treiber gibt.

Vom jeweiligen Ghostscript-Treiber hängt es ab, wie weit die Unterstützung für ein bestimmtes Druckermodell geht:

Bei Ghostscript werden über eine Vielzahl von Kommandozeilenoptionen die Parameter (insbesondere der jeweilige Ghostscript-Treiber) eingestellt, die für eine bestimmte Druckausgabe nötig sind.

Im folgenden wird davon ausgegangen, dass der Drucker keine Job-Control Sprache unterstützt. Ein Drucker mit existierender Ghostscript Unterstützung, der zusätzlich eine Job-Control Sprache unterstützt, kann analog zum Fall "PCL+JCL Drucker" behandelt werden.

Grundlegende Verarbeitungsstufen

  1. Wenn die zu druckenden Daten nicht PostScript sind, werden sie in PostScript umgewandelt.
  2. Die PostScript Daten werden mit einem zum jeweiligen Druckermodell passenden Ghostscript-Treiber in die Druckersprache umgewandelt.
  3. Die druckerspezifischen Daten werden zum Drucker geschickt.

Grundlegende Linux-Unterstützung

Für einen Drucker mit existierender grundlegender Ghostscript Unterstützung ist grundlegende Linux-Unterstützung unabhängig vom Drucksystem immer möglich.

Für einen Drucker ohne Ghostscript Unterstützung muss ein passender Ghostscript-Treiber entwickelt werden, um Linux-Unterstützung unabhängig vom Drucksystem zu bekommen. Eine Alternative speziell für CUPS ist im Abschnitt "Drucker mit CUPS 'rasterto...' Unterstützung" beschrieben.

Verarbeitungsstufen für eine optimale Linux-Unterstützung

  1. Wenn die zu druckenden Daten nicht PostScript sind, werden sie in PostScript umgewandelt.
  2. Den PostScript Daten werden ggf. Pseudo-Steuerkommandos hinzugefügt, die im nachfolgenden Verarbeitungsschritt in die eigentlichen Ghostscript-Parameter umgewandelt werden. Dabei geht es insbesondere um solche Parameter, die der jeweilige Ghostscript-Treiber braucht, damit spezielle Druckerfunktionen aktiviert werden. Die Druckerfunktionen und die dazu nötigen Pseudo-Steuerkommandos können in einer zum Drucker passenden PPD-Datei hinterlegt werden.
  3. Die PostScript Daten plus Pseudo-Steuerkommandos müssen in einem zusätzlichen Verarbeitungsschritt wie folgt umgewandelt werden:
    1. Mit Hilfe der Pseudo-Steuerkommandos wird ein Ghostscript-Aufruf erzeugt, der die passenden Ghostscript-Parameter enthält.
    2. Durch den Ghostscript-Aufruf werden die PostScript Daten in die entsprechenden druckerspezifischen Daten umgewandelt.
  4. Die druckerspezifischen Daten werden zum Drucker geschickt.

Optimale Linux-Unterstützung

Dazu muss in diesem Fall folgendes unter Linux zur Verfügung stehen:

Für sehr viele Drucker stehen Foomatic-PPD-Dateien bei Linuxprinting.org (http://www.linuxprinting.org/) zur Verfügung. Der obige zusätzliche Verarbeitungsschritt wird vom Foomatic Filterscript "foomatic-rip" ab der Foomatic Version 3.0.0 erledigt. Im günstigsten Fall liefert schon Foomatic die optimale Linux-Unterstützung.

In etlichen Fällen fehlt zur optimalen Linux-Unterstützung nur eine Feinjustierung der Ghostscript-Parameter in den Foomatic-PPD-Dateien (z.B. um optimale Farbtöne zu bekommen).

In vielen Fällen wird aber der Druckerhersteller sowohl für den Ghostscript-Treiber als auch für die passende PPD-Datei und das passende Script oder Programm für den zusätzlichen Verarbeitungsschritt selbst sorgen müssen. Letzteres ist nicht nötig, wenn eine zu "foomatic-rip" kompatible PPD-Datei erstellt wird.

Daher sollte es in enger Anlehnung an bestehende Ghostscript-Treiber und an Foomatic erfolgen, denn hier sind schon alle Grundlagen dafür geschaffen. Ideal für alle Beteiligten ist die direkte Unterstützung und Hilfe bei der Weiterentwicklung von Ghostscript-Treibern und Foomatic durch Druckerhersteller.

Eine Alternative speziell für CUPS ist im Abschnitt "Drucker mit CUPS 'rasterto...' Unterstützung" beschrieben.

Technische Details

Wie können Ghostscript-Parameter via Pseudo-Steuerkommandos in einer PPD-Datei festgelegt werden?

Beispielsweise für PCL5e-Drucker, die kompatibel zum HP LaserJet 4 sind, kann der Ghostscript-Treiber "ljet4" mit dem Kommandozeilenparameter "-sDEVICE=ljet4" aufgerufen werden. Die Auflösungen 300x300 DPI bzw. 600x600 DPI können als Kommandozeilenparameter "-r300x300" bzw. "-r600x600" angegeben werden. Mit einem Ghostscript Aufruf der Art "gs -sDEVICE=ljet4 -r300x300 ..." können also PCL5e-Druckerdaten in einer Auflösung von 300 DPI erzeugt werden.

Hier als Beispiel die Auswahl dieser Ghostscript-Parameter via Pseudo-Steuerkommandos für das Foomatic Filterscript "foomatic-rip" in einer Foomatic-PPD-Datei:

*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
...
*FoomaticRIPCommandLine: "gs ... -sDEVICE=ljet4 %B ..."
...
*FoomaticRIPOption Resolution: enum CmdLine B
*DefaultResolution: 300x300dpi
*Resolution 300x300dpi/300 DPI: "%% FoomaticRIPOptionSetting: Resolution=300x300dpi"
*FoomaticRIPOptionSetting Resolution=300x300dpi: " -r300x300 "
*Resolution 600x600dpi/600 DPI: "%% FoomaticRIPOptionSetting: Resolution=600x600dpi"
*FoomaticRIPOptionSetting Resolution=600x600dpi: " -r600x600 "
Mit "FoomaticRIPOption ... B" wird festgelegt, dass der Platzhalter "%B" in der "FoomaticRIPCommandLine" durch den Ghostscript-Parameter ersetzt wird.

Die indirekte Referenzierung auf die eigentlichen Ghostscript-Parameter via "Resolution=300x300dpi" und "Resolution=600x600dpi" geschieht aus Sicherheitsgründen, denn eine direkte Angabe der Ghostscript-Parameter z.B. mit etwas in der Art

*Resolution 300x300dpi/300 DPI: "%% FoomaticRIPOptionSetting: -r300x300 "
würde im PostScript Datenstrom die folgende Zeile erzeugen:
%% FoomaticRIPOptionSetting: -r300x300
Würde das Filterscript den Ghostscript-Parameter hieraus entnehmen, dann könnte ein böswilliger Benutzer diese Zeile verändern in
%% FoomaticRIPOptionSetting: $( rm -rf /* )
und heraus käme dabei folgender Ghostscript Aufruf
gs ... -sDEVICE=ljet4 $( rm -rf /* ) ...
der alle Dateien löschen würde, die der Benutzer löschen kann unter dem das Filterscript läuft.

Die indirekte Referenzierung erzeugt aber die Zeile

%% FoomaticRIPOptionSetting: Resolution=300x300dpi
und das Filterscript nimmt den Ghostscript-Parameter aus der passenden "*FoomaticRIPOptionSetting"-Zeile in der PPD-Datei, sofern es eine passenden Zeile findet. Wenn nicht wird der Default genommen. Die PPD-Datei selbst ist sicher, denn sie kann nur vom Systemverwalter verändert werden.

Dies soll nur als ein Beispiel dienen, warum es sinnvoll ist, eigene Entwicklungen in enger Anlehnung an bestehende Ghostscript-Treiber und an Foomatic zu machen, denn hierin steckt die Erfahrungen vieler Entwickler und das Feedback aus Hunderttausenden Linux-Installationen.

Was ist bei der Entwicklung eines neuen Ghostscript-Treibers zu beachten?

Lizenzfragen bei Open Source Ghostscript-Treibern:

Ein Druckerhersteller könnte befürchten, durch einen Open Source Ghostscript-Treiber die kompletten Internas seiner Modelle offenlegen zu müssen. Das ist aber nicht so, denn ein Ghostscript-Treiber dient nur zur Umwandlung von Ghostscript-Rastergrafikdaten in druckerspezifische Rastergrafikdaten. Durch einen Open Source Ghostscript-Treiber muss also nur das Datenformat offengelegt werden, um dem Drucker Rastergrafikdaten übermitteln zu können. Normalerweise kann daraus nicht ermittelt werden, wie der Drucker intern die Rastergrafikdaten tatsächlich zu Papier bringt.

Zumindest für grundlegende Linux-Unterstützung müssen auch keine Algorithmen zum Dithering (Digital Halftoning bzw. Halbtonverfahren) offengelegt werden, denn ein grundlegendes Ghostscript-Dithering kann schon im ersten Schritt erfolgen. Für optimale Druckergebnisse kann es allerdings notwendig sein, dass im Ghostscript-Treiber ein speziell auf das jeweilige Druckermodell abgestimmtes Dithering erfolgt, wie es z.B. im Gimp-Print Ghostscript-Treiber implementiert ist (http://gimp-print.sourceforge.net/). Gewisse Druckermodelle verfügen über ein internes Dithering (z.B. die zum HP DeskJet 990C kompatiblen Modelle), so dass hier der Ghostscript-Treiber nur das Drucker-interne Dithering einschalten muss.


Drucker mit CUPS "rasterto..." Unterstützung

Hier geht es nur um die direkte CUPS Unterstützung von Nicht-PostScript-Druckern. PostScript-Drucker werden von CUPS wie oben beschrieben unterstützt.

Ein Drucker hat CUPS "rasterto..." Unterstützung, wenn es für dessen Druckersprache einen "rasterto..." Druckertreiber gibt. Der derzeit wichtigste "rasterto..."-Treiber ist "rastertoprinter" von Gimp-Print (http://gimp-print.sourceforge.net/).

Vom jeweiligen "rasterto..."-Treiber hängt es ab, wie weit die Unterstützung für ein bestimmtes Druckermodell geht. Speziell für "rastertoprinter" siehe die "Gimp-Print Supported_Printers" Liste unter http://gimp-print.sourceforge.net/p_Supported_Printers.php3

Verarbeitungsstufen

  1. Umwandlung der zu druckenden Daten in CUPS Rasterdaten. Dabei werden auch ggf. passende Parameter hinzugefügt über die der "rasterto..." Druckertreiber spezielle Druckerfunktionen aktivieren kann. Die Druckerfunktionen sind in einer zum "rasterto..." Druckertreiber und zum jeweiligen Drucker gehörenden PPD-Datei hinterlegt.
  2. Die CUPS Rasterdaten und die Parameter werden von einem CUPS "rasterto..." Druckertreiber in die druckerspezifischen Daten umgewandelt.
  3. Die druckerspezifischen Daten werden zum Drucker geschickt.

Grundlegende Linux-Unterstützung

Für einen Drucker mit existierender grundlegender CUPS "rasterto..." Unterstützung ist grundlegende Linux-Unterstützung für das CUPS Drucksystem immer möglich.

Für einen Drucker ohne grundlegende CUPS "rasterto..." Unterstützung muss ein passender "rasterto..."-Treiber und eine passende PPD-Datei entwickelt werden, um Linux-Unterstützung für das CUPS Drucksystem zu bekommen.

Das LPRng/lpdfilter Drucksystem unterstützt "rasterto..."-Treiber nicht direkt. Aber mit dem zusätzlichen Filter "foomatic-rip" ab Version 3.0.1 können auch "rasterto..."-Treiber für das LPRng/lpdfilter Drucksystem verwendet werden. Ausserdem kann bei betriebssystemunabhängigem Quellcode ein "rasterto..."-Treiber auch für das Mac OS X Betriebssystem verwendet werden, weil Mac OS X das CUPS Drucksystem hat.

Optimale Linux-Unterstützung

Optimale Linux-Unterstützung ist analog zur grundlegenden Linux-Unterstützung. Der einzige Unterschied ist, ob der "rasterto..."-Treiber und die zugehörige PPD-Datei alle Druckerfunktionen unterstützt oder nicht.

Technische Details

Was ist bei der Entwicklung eines neuen CUPS "rasterto..."-Treibers zu beachten?

Lizenzfragen bei Open Source "rasterto..."-Treibern:

Die Lizenzfragen bei Open Source "rasterto..."-Treibern sind analog zu obigen Lizenzfragen bei Open Source Ghostscript-Treibern:

Ein Druckerhersteller könnte befürchten, durch einen Open Source "rasterto..."-Treiber die kompletten Internas seiner Modelle offenlegen zu müssen. Das ist aber nicht so, denn durch einen Open Source "rasterto..."-Treiber muss nur das Datenformat offengelegt werden, um dem Drucker Rastergrafikdaten übermitteln zu können. Zumindest für grundlegende Linux-Unterstützung müssen auch keine Algorithmen zum Dithering offengelegt werden, aber für optimale Druckergebnisse kann es notwendig sein, dass im "rasterto..."-Treiber ein speziell auf das jeweilige Druckermodell abgestimmtes Dithering erfolgt, wie es z.B. im Gimp-Print "rastertoprinter"-Treiber implementiert ist.


Drucker mit "Postfilter" Unterstützung

Für manche Drucker gibt es derzeit Linux-Unterstützung nur mit einem sog. "Postfilter".

Mit "Postfilter" ist ein Programm gemeint, das einem existierenden Ghostscript-Treiber nachgeschaltet wird.

Ghostscript (siehe http://www.cs.wisc.edu/~ghost/) ist ein umfangreiches Programmpaket zur Umwandlung von PostScript Daten in andere Formate, insbesondere in diverse Rastergrafik-Formate. Dazu beinhaltet Ghostscript eine Vielzahl von Ghostscript-Treibern insbesondere für "Image file formats" (siehe z.B. http://www.cs.wisc.edu/~ghost/doc/cvs/Devices.htm#File_formats).

Der "Postfilter" wandelt die Rasterdaten, die der Ghostscript-Treiber produziert hat, in druckerspezifische Daten um - also in ein Datenformat, in dem der Drucker Rastergrafikdaten zu Papier bringen kann.

Insbesondere für Drucker, die keine ordentliche Standarddruckersprache verstehen (sog. GDI-Drucker), gibt es in einigen Fällen Linux-Unterstützung, die als "Postfilter" implementiert ist.

Mehr als grundlegende Linux-Unterstützung ist nur in Einzelfällen vorhanden.

Grundlegende Verarbeitungsstufen

Die Verarbeitungsstufen entsprechen denen bei Ghostscript Unterstützung mit einem weiteren zusätzlichen Verarbeitungsschritt, in dem der "Postfilter" aufgerufen wird.
  1. Wenn die zu druckenden Daten nicht PostScript sind, werden sie in PostScript umgewandelt.
  2. Die PostScript Daten werden mit einem zum jeweiligen "Postfilter" passenden Ghostscript-Treiber in Rasterdaten umgewandelt.
  3. Diese Rasterdaten werden mit einem zum jeweiligen Drucker passenden "Postfilter" in druckerspezifische Daten umgewandelt.
  4. Die druckerspezifischen Daten werden zum Drucker geschickt.

Grundlegende Linux-Unterstützung

Für einen Drucker mit existierender grundlegender "Postfilter" Unterstützung ist grundlegende Linux-Unterstützung unabhängig vom Drucksystem möglich.

Für einen Drucker ohne grundlegende "Postfilter" Unterstützung müsste eigentlich nur ein passender "Postfilter" für einen existierenden Ghostscript-Treiber entwickelt werden.

Heutzutage sollte aber stattdessen ein Ghostscript-Treiber als IJS-Modul entwickelt werden, denn IJS-Module haben genau wie "Postfilter" seperaten Quellcode und können seperat compiliert werden. Siehe dazu den Teil "Technische Details" im Abschnitt "Drucker mit Ghostscript Unterstützung".

Eine Alternative speziell für CUPS ist im Abschnitt "Drucker mit CUPS 'rasterto...' Unterstützung" beschrieben.

Optimale Linux-Unterstützung

Dazu muss in diesem Fall folgendes unter Linux zur Verfügung stehen:

Für optimale Linux-Unterstützung müssen die im Teil "Drucker mit Ghostscript Unterstützung" genannten "Verarbeitungsstufen für eine optimale Linux-Unterstützung" um einen zusätzlichen Verarbeitungsschritt erweitert werden, in dem der "Postfilter" aufgerufen wird und ausserdem müssen die Pseudo-Steuerkommandos passend an den Ghostscript-Treiber und an den "Postfilter" weitergegeben werden:

  1. Wenn die zu druckenden Daten nicht PostScript sind, werden sie in PostScript umgewandelt.
  2. Den PostScript Daten werden ggf. Pseudo-Steuerkommandos hinzugefügt, die in den nachfolgenden Verarbeitungsschritten in die eigentlichen Ghostscript-Parameter und "Postfilter"-Parameter umgewandelt werden. Dabei geht es insbesondere um solche Parameter, die der jeweilige Ghostscript-Treiber und der "Postfilter" braucht, damit spezielle Druckerfunktionen aktiviert werden. Die Druckerfunktionen und die dazu nötigen Pseudo-Steuerkommandos können in einer zum Drucker passenden PPD-Datei hinterlegt werden.
  3. Die PostScript Daten plus Pseudo-Steuerkommandos müssen in einem zusätzlichen Verarbeitungsschritt wie folgt umgewandelt werden:
    1. Mit Hilfe der Pseudo-Steuerkommandos wird ein Ghostscript-Aufruf und ein nachgeschalteter "Postfilter"-Aufruf erzeugt, die die passenden Ghostscript-Parameter und die passenden Parameter für den "Postfilter" enthalten.
    2. Durch den Ghostscript-Aufruf und den nachgeschalteten "Postfilter" werden die PostScript Daten in druckerspezifische Daten umgewandelt.
  4. Die druckerspezifischen Daten werden zum Drucker geschickt.
Für einige Drucker mit "Postfilter" Unterstützung stehen Foomatic-PPD-Dateien bei Linuxprinting.org (http://www.linuxprinting.org/) zur Verfügung. Der obige zusätzliche Verarbeitungsschritt wird dann vom Foomatic Filterscript "foomatic-rip" ab der Foomatic Version 3.0.0 erledigt. Im günstigsten Fall liefert Foomatic nahezu optimale Linux-Unterstützung. Evtl. fehlt lediglich eine Feinjustierung der Ghostscript- und "Posfilter" Parameter in den Foomatic-PPD-Dateien.

Statt einen optimalen "Postfilter" zu entwickeln, sollte heutzutage ein Ghostscript-Treiber als IJS-Modul entwickelt werden (siehe oben), um eine einheitliche Schnittstelle (die IJS-Schnittstelle) zu Ghostscript zu haben.


Drucker ohne Linux-Unterstützung (GDI-Drucker)

Hier geht es um Drucker, die nicht über eine veröffentlichte Standarddruckersprache wie z.B. PostScript oder PCL angesprochen werden können, sondern nur über eine vom jeweiligen Druckermodell abhängige proprietäre Druckersprache. Es ist üblich, solche Drucker als "GDI-Drucker" zu bezeichnen, aber da es keine allgemeine "GDI"-Druckersprache gibt, wäre eigentlich die Bezeichnung "Drucker, der nur über ein proprietäres Protokoll angesprochen werden kann" korrekt. Siehe dazu auch den Artikel "GDI-Drucker".

Für grundlegende bzw. optimale Linux-Unterstützung muss der Druckerhersteller folgendes bereitstellen:

  1. Einen freien Open-Source Linux-Treiber.
  2. Eine dazu passende PPD-Datei.
  3. In bestimmten Fällen ein passendes Script oder Programm, was den je nach Fall oben beschriebenen zusätzlichen Verarbeitungsschritt durchführt.
Hierbei sind nur die folgenden beiden Möglichkeiten sinnvoll:

Feedback willkommen:

Send Mail to jsmeix@suse.de (Geben Sie bitte folgendes Stichwort an: SDB-2003/11/jsmeix_print-info-for-manufacturers)