PDF-Destillerie unter Linux

23.08.2005 von STEFAN RUBNER 
Ein Linux-System als zentraler PDF-Server für Windows- und Linux-Nutzer spart Kosten und vereinfacht den Administrationsaufwand. Die vorgestellte Schritt-für-Schritt-Lösung funktioniert in vernetzten Umgebungen und über verschiedene Plattformen hinweg.

Einer der Gründe dafür, weshalb das papierlose Büro noch immer eine Utopie darstellt, ist die reine Verzweiflung seitens der Anwender. Oft würden diese gern auf Ausdrucke verzichten – hätten sie denn die Möglichkeit dazu. Neidvoll blickt so mancher Windows-Nutzer auf den Kollegen am Mac. Der kann nämlich aus jedem Druckdialog heraus statt einer Ausgabe auf Papier auch eine PDF-Datei der Vorlage erzeugen. Webseiten, E-Mails und andere Dokumente sind auf diese Weise nicht nur Platz sparend und umweltschonend archivierbar. Dank moderner Technik lässt sich in der elektronischen Ablage auch wesentlich schneller und komfortabler suchen als in der abgehefteten Variante.

Wer Ähnliches für Windows realisieren möchte, erleichtert entweder seinen Geldbeutel um mindestens 350 Euro und kauft Adobe Acrobat – oder verwendet einfach einen alten Rechner mit Linux und zahlt nichts. Das funktioniert sogar in vernetzten Umgebungen sowie über verschiedene Rechnerplattformen hinweg. Windows- und Linux-Nutzer teilen sich einen zentralen PDF-Server. Allerdings soll nicht verschwiegen werden, dass kleinere Abstriche beim Komfort gemacht werden müssen, die nach einer kurzen Eingewöhnungsphase jedoch nicht weiter ins Gewicht fallen sollten.

Im Folgenden beschreiben wir, wie Sie einen PDF-Netzwerkdrucker mit dem Namen PDF-Test unter Linux einrichten, die für Windows-Clients notwendigen Treiber zentral auf dem Server hinterlegen und Clients mit dem PDF-Drucker verbinden. Dabei werden die notwendigen Treiber automatisch auf dem Client-Rechner installiert, ohne dass der Anwender eingreifen muss. Damit fällt auch eine weitere potenzielle Fehlerquelle weg. Müsste man dem Anwender nämlich erklären, welchen Treiber er installieren soll und wie das zu erfolgen hat, ist ein Anruf beim Benutzer-Support quasi vorprogrammiert.

Komponenten vorbereiten

Grundvoraussetzung für die Ausgabe von Druckjobs in eine PDF-Datei ist eine Software, die die notwendige Umwandlung der Daten übernimmt. Unter Linux bietet sich für diese Aufgabe das Paket Ghostscript an.

Dieser universelle Übersetzer für Postscript-Dateien bietet neben vielen anderen Optionen auch den Export in das PDF-Format an. Zudem ist Ghostscript in quasi jeder aktuellen Linux-Distribution verfügbar und per Default bereits eingerichtet, was den Installationsaufwand deutlich minimiert.

Es stellt sich gleich die Frage, woher Ghostscript die umzuwandelnde Postscript-Datei erhält und es aufgerufen wird, am besten automatisiert ohne weiteres Eingreifen des Anwenders. Da das endgültige Ziel ein über das Netz ansprechbarer, virtueller Drucker sein soll, bietet es sich an, gleich eines der unter Linux verfügbaren Drucksysteme für diese Aufgabe heranzuziehen.

Mittlerweile hat sich auch bei den vielfältigen Lösungen zur Verwaltung von Druckern unter Linux das Common Unix Printing System (CUPS) als das von den meisten Distributionen favorisierte Verfahren herauskristallisiert.

Eine der Funktionen von CUPS ist es, empfangene Druckaufträge nicht an einen physikalischen Drucker zu leiten, sondern die Rohdaten stattdessen an ein Script zu senden. Dieses erhält die volle Verantwortung für die weitere Verarbeitung.

Auf den ersten Blick scheint das eine gute Lösung für die Datenübergabe an Ghostscript zu sein. Tatsächlich wäre das Verfahren durchaus geeignet, gäbe es da nicht ein kleines Problem namens Anwender. Der will nämlich in aller Regel mehr Komfort, als sich mit einem Script auf einfache Weise realisieren lässt. Außerdem gibt es ein paar Klippen, die mit Hilfe des Scripts umschifft werden müssten und die dessen Umfang und Komplexität erheblich steigern würden.

CUPS-PDF: PDF-Treiber für CUPS

Zum Glück müssen Sie sich die Arbeit, ein entsprechend komplexes Script zu schreiben, nicht machen. Volker Behr von der Uni Würzburg hat einen Treiber für CUPS entwickelt, der zum einen die Übergabe der Daten an Ghostscript übernimmt und zum anderen über diverse Konfigurationsoptionen die Fallstricke bei der PDF-Erstellung im Netzwerk entschärft.

Der einzige Nachteil bei dieser Herangehensweise: CUPS-PDF, so der Name des Treibers, muss manuell kompiliert werden. Dazu ist ein auf dem Zielrechner eingerichteter C-Compiler samt den zugehörigen Tools notwendig.

Nachdem Sie sich den CUPS-PDF-Treiber herunter geladen haben, ist vor dem Kompilieren noch ein Anpassen der Konfigurationsdatei erforderlich, denn leider stellt der Programmautor kein Configure-Script zur Verfügung, das sich die relevanten Informationen wie beispielsweise den Pfad zu Ghostscript selbst beschafft.

Entpacken Sie also das Archiv mit dem Treiberquelltext und wechseln Sie anschließend in das dabei erzeugte Verzeichnis. In einem weiteren Unterverzeichnis namens src finden Sie in der dort abgelegten Datei cups-pdf.h die Optionen, mit deren Hilfe Sie die Arbeitsweise des PDF-Treibers auf Ihre Bedürfnisse anpassen können und auch sollten.

CUPS-PDF konfigurieren

Die einzelnen Einstellungen legen Sie dabei über Konstanten fest, die mittels der C-Präposition #define einen Wert zugewiesen bekommen. Sechs der Settings sind hier von besonderer Bedeutung:

CPGHOSTSCRIPT: Über diesen Parameter legen Sie fest, welcher Ghostscript-Interpreter von CUPS-PDF aufgerufen wird. Hierbei ist der komplette Pfad anzugeben. Die Voreinstellung ist für die meisten Distributionen zwar richtig, dennoch sollten Sie über den Befehl which gs prüfen, unter welchem Pfad Ghostscript auf Ihrem Rechner abgelegt ist und den Parameter gegebenenfalls anpassen.

CPGSTMP: Diese Einstellung legt fest, in welchem Verzeichnis CUPS-PDF seine temporären Dateien ablegt. Voreingestellt ist hier /var/tmp. Um Probleme mit anderen Anwendungen auszuschließen, die ebenfalls dieses Verzeichnis nutzen, sollten Sie hier besser einen eigenen Pfad wie beispielsweise /var/tmp/cupd-pdf angeben. Vergessen Sie nicht, das verwendete Verzeichnis anzulegen und mit globalen Schreibrechten zu versehen. Für das angegebene Beispiel lautet der dazu notwendige Befehl

mkdir -p /var/tmp/cups-pdf; chmod 777 /var/tmp/cups-pdf

CPPDFVER: Voreingestellt ist hier der Wert „1.4“. CUPS-PDF erzeugt also Dateien, deren Format mit Adobe Acrobat 5 oder neueren Versionen kompatibel ist. Verwenden Sie oder die geplanten Empfänger der PDF-Dokumente ältere Acrobat-Versionen, sollten Sie hier besser „1.3“ oder sogar „1.2“ angeben.

CPOUT: In dem hinter dieser Konstante angegebenen Verzeichnis legt CUPS-PDF die erzeugten PDF-Dateien ab. Voreingestellt ist hier das zentrale Verzeichnis /var/spool/cups-pdf auf dem lokalen Rechner. Gerade im Netz ist es aber nicht sinnvoll, alle PDFs zentral abzulegen. Zum einen wären die Dokumente dann für alle Anwender zugänglich und zum anderen müssten sich die Benutzer ihre eigenen Dateien aus einem riesigen Wust heraussuchen.

Viel praktischer ist es, CUPS-PDF über die Angabe der speziellen Variable „$HOME“ anzuweisen, die PDF-Dateien im Heimatverzeichnis des Anwenders abzulegen, der den Druckjob erzeugt hat. Achten Sie darauf, auch diese Variable in Anführungszeichen zu setzen.

CPHOMESUB: Haben Sie als Zielverzeichnis der PDF-Dateien das Stammverzeichnis des Auftraggebers gewählt, können Sie mit Hilfe dieser Konstante festlegen, wie der Name des PDF-Unterverzeichnisses lauten soll, das CUPS-PDF zur Speicherung der PDF-Dateien verwendet. CUPS-PDF legt das Subdirectory bei Bedarf selbstständig an.

CPLABEL: Setzen Sie diese Konstante auf den Wert 1, damit CUPS-PDF jede PDF-Datei mit einer eindeutigen ID versieht. Das verhindert, dass aus Versehen bereits vorhandene Dateien überschrieben werden. Die ID wird dabei einem eventuell vom Druckertreiber übergebenen Jobnamen vorangestellt.

So wird beispielsweise aus einer von Paintshop Pro gedruckten Datei, die normalerweise immer den Namen PSP_PRINT.PDF trägt und damit stets alte Versionen überschreiben würde, die Datei jobXX_PSP_PRINT.pdf. Die Zeichenfolge XX ersetzt CUPS-PDF dabei durch die Anzahl der vom Anwender bislang in Auftrag gegebenen Druckjobs. Ein ungewünschtes Überschreiben wichtiger Dateien ist damit nicht mehr möglich.

CUPS-PDF übersetzen

Haben Sie alle Einstellungen vorgenommen und die Datei gespeichert, kann es an das Übersetzen gehen. Die dazu notwendige Kommandozeile lautet:

gcc -O9 -o cups-pdf cups-pdf.c

Als Ergebnis dieses Aufrufs erhalten Sie ein ausführbares Modul namens cups-pdf im aktuellen Verzeichnis. An dieser Stelle hilft es allerdings wenig, weshalb Sie es nun in das Verzeichnis mit den Back-End-Treibern von CUPS kopieren müssen. Unter SUSE Linux befindet sich dieses beispielsweise in /usr/lib/cups/backend. Bei CentOS ist das auch der Fall.

Zusätzlich sollten Sie den CUPS-PDF beiliegenden modifizierten Postscript-Treiber PostscriptColor.ppd.gz im Verzeichnis der druckerspezifischen Treiber von CUPS einrichten. Die dazu notwendigen Befehle lauten wie folgt:

cp cups-pdf /usr/lib/cups/backend/

cp ../extra/PostscriptColor.ppd.gz /usr/share/cups/model

Beachten Sie, dass auch das Verzeichnis für die druckerspezifischen Treiber zwischen einzelnen Linux-Distributionen variieren kann. Damit CUPS den neuen Back-End-Treiber auch erkennt und zur Verfügung stellt, ist ein Neustart des CUPS-Systems notwendig. Diesen führen Sie über den Befehl /etc/init.d/cups restart durch.

PDF-Drucker unter CUPS einrichten

Um einen neuen Drucker einzurichten, der den CUPS-PDF-Treiber verwendet, gibt es prinzipiell zwei Möglichkeiten: über das Webinterface von CUPS oder über die Kommandozeile. Viele Server werden zur Schonung der Speicher- und CPU-Ressourcen ohne die X-Window-GUI betrieben. Zudem ist die Bedienung des Webinterface weit gehend selbsterklärend. Daher beschreiben wir nachfolgend die Einrichtung per Befehlszeile.

Stellen Sie zunächst sicher, dass CUPS den Back-End-Treiber auch erkannt hat und verwendet. Dazu dient der folgende Aufruf des Hilfsprogramms lpinfo:

lpinfo -v | grep cups-pdf

In der Ausgabe des Befehls sollte die Zeile file cups-pdf:/ erscheinen. Ist das der Fall, kann es an das Einrichten des Druckers gehen. Für diese Aufgabe ist bei CUPS das Hilfsprogramm lpadmin zuständig:

lpadmin -p PDF-Test -v cups-pdf:/ -P /usr/share/cups/model/PostscriptColor.ppd.gz -E

Dieser Befehl richtet eine Druckerwarteschlange mit dem Namen PDF-Test ein, die auf das von CUPS-PDF bereitgestellte virtuelle Interface cups-pdf: druckt und dabei den modifizierten Treiber PostscriptColor.ppd.gz zur Aufbereitung der Druckdaten verwendet. Hat alles geklappt, gibt das Kommando keinerlei Rückmeldung aus. Jedwede Ausgabe von Informationen auf dem Bildschirm entspricht hingegen einem aufgetretenen Fehler.

Wurde die Druckerwarteschlange erfolgreich eingerichtet, steht der PDF-Drucker bereits allen Nutzern des lokalen Rechners zur Verfügung. Zusätzlich können auch die Anwender im Netzwerk auf den Drucker zugreifen, deren Betriebssystem selbst CUPS verwendet. Neben der Bereitstellung lokaler Drucker ist CUPS nämlich zusätzlich in der Lage, auf im Netz vorhandene CUPS-Drucker zuzugreifen. Somit könnten prinzipiell schon alle Nutzer von Linux oder Mac OS X auf dem PDF-Printer drucken.

Da die Mehrheit der Netzbenutzer aber wahrscheinlich unter Windows arbeitet, muss ihnen gesondert Zugang zum PDF-Drucker gegeben werden. Das Mittel der Wahl heißt, wie in den meisten Fällen, wenn es um das Zusammenspiel zwischen Linux und Windows geht, Samba. Wie Sie Samba grundsätzlich einrichten und es als Server für Datei- und Druckfreigaben einsetzen, können Sie in verschiedenen tecCHANNEL-Artikeln online nachlesen. Die entsprechenden Webcodes finden Sie am Ende dieses Artikels aufgelistet.

Samba als Druck-Server vorbereiten

Zusätzlich zum Bereitstellen von Laufwerksfreigaben im lokalen Netz ist Samba auch in der Lage, Netzwerkdrucker für den allgemeinen Zugriff zur Verfügung zu stellen. Dazu sind lediglich einige kleine Änderungen in der zentralen Konfigurationsdatei smb.conf notwendig, die sich bei den meisten Linux-Distributionen im Verzeichnis /etc/samba befindet.

[global]

load printers = yes

printing = cups

printcap name = cups

[printers]

comment = Alle Drucker

path = /var/spool/samba

browseable = no

writable = no

printable = yes

printer admin = root

Nach einem mittels /etc/init.d/smb restart durchgeführten Neustart der Samba-Dienste finden jetzt auch alle Windows-Clients den PDF-Drucker in ihrer Netzwerkumgebung aufgelistet.

Das Problem mit dem Treiber

Allerdings ergibt sich daraus gleich ein weiteres Problem: Damit ein Windows-Nutzer den so bereitgestellten Netzwerkdrucker auch tatsächlich zum Erstellen von PDF-Dokumenten nutzen kann, muss er einen entsprechenden Treiber auf seinem Rechner installieren. Hier hat jeder Anwender die Möglichkeit, einen beliebigen Treiber aus der umfangreichen Liste der von Windows unterstützten Drucker zu wählen – und damit natürlich auch einen, der nicht oder nicht optimal mit CUPS-PDF zusammenarbeitet.

Es wäre daher wünschenswert, den Windows-Anwendern automatisch den richtigen Treiber auf dem Rechner einzurichten. Und tatsächlich bietet Samba auch dafür eine Lösung. Sie basiert darauf, dass Windows-Rechner den Server mit der Druckfreigabe fragen, ob dieser einen passenden Treiber anbietet.

Bejaht der Server diese Anfrage, installiert der Client automatisch den vom Server vorgehaltenen Treiber. Da stellt sich sofort die Frage, wie das unter Samba aussieht. Dazu bedient Samba sich einer weiteren speziellen Freigabe, die in der Konfigurationsdatei smb.conf einzutragen ist:

[print$]

comment = Druckertreiber

path = /etc/samba/drivers

browseable = yes

guest ok = no

read only = yes

write list = root

Beachten Sie, dass bei SUSE Linux der Pfad /var/lib/samba/drivers lauten muss. Nach dem obligatorischen Neustart der Samba-Dienste per /etc/init.d/smb restart sieht alles aus wie zuvor, die neue Freigabe ist von den Clients aus nicht sichtbar. Das ist auch nicht notwendig, da sie nur für den Bezug der Treiber vom Server und nicht als ständig verfügbare Verbindung benötigt wird.

Treiber auf dem Samba-Server einrichten

Um die gewünschten Treiber auf dem Samba-Server einzurichten, können Sie zwischen mehreren Verfahren wählen. Angefangen von der komplett manuellen Installation, die sehr aufwendig und fehleranfällig ist, über den Einsatz von Hilfsprogrammen bis hin zur Verwendung eines Windows-Rechners reicht die Palette der verfügbaren Methoden, mit denen Sie einen Druckertreiber auf dem Samba-Server installieren können.

Obwohl alle Varianten letztlich zum Ziel führen, ist der Weg über den Windows-Rechner die bei weitem komfortabelste und einfachste Lösung. Allerdings weist auch sie einen kleinen Fallstrick auf, der sich allerdings nicht weiter auswirkt, wenn man weiß, was zu tun ist.

Um die Windows-Treiber für den PDF-Drucker auf dem Samba-Server zu installieren, starten Sie zunächst einen Rechner unter Windows 2000 oder XP und melden sich an diesem als Benutzer mit administrativen Rechten auf dem Samba-Server an. Eine gute Wahl ist die Anmeldung als Benutzer „Administrator“, da viele Linux-Distributionen dieses Konto intern auf den Superuser root verweisen lassen, der die entsprechenden Rechte auf dem Samba-Server hat.

Installation per Windows-Rechner

Öffnen Sie nun den Windows-Explorer – keinesfalls die Druckereinrichtung – und lassen sich da über den Punkt „Netzwerkumgebung“ die verfügbaren Server anzeigen. Dort wählen Sie den Samba-Server aus, auf dem Sie den PDF-Drucker eingerichtet haben, und lassen sich die auf diesem Server verfügbaren Drucker über den Menüpunkt „Drucker und Faxgeräte“ anzeigen.

Dort sollte sich auch die Warteschlange des PDF-Druckers befinden. Rufen Sie nun für diese mit Hilfe der rechten Maustaste das Kontextmenü ab und wählen Sie da die Option „Einstellungen“.

Weil für diesen Drucker noch kein Treiber hinterlegt ist und seine Eigenschaften daher leer sind, quittiert Windows diese Aktion zunächst mit einer Fehlermeldung. Sie werden gefragt, ob Sie den fehlenden Druckertreiber nun einrichten wollen. Beantworten Sie diese Frage allerdings keinesfalls mit einem Klick auf „Ja“. In diesem Fall würde Windows den Treiber nämlich lokal installieren und nicht wie gewünscht auf dem Server.

Klicken Sie also auf „Nein“, womit Sie zu einer relativ leeren Anzeige der Druckereigenschaften gelangen. Wechseln Sie dort auf den Reiter mit dem Titel „Erweitert“. Hier starten Sie über die Schaltfläche „Neuer Treiber“ die Installation des Druckertreibers auf dem Samba-Server.

Assistent zur Installation

Dazu startet Windows den Assistenten zur Installation von Druckertreibern. Dieser fordert Sie zunächst dazu auf, einen passenden Treiber für den Drucker aus der Liste der verfügbaren Modelle auszuwählen. Hier sollten Sie sich entweder für den „Apple Color Laserwriter 12/600“ oder für den „Minolta Color Pageworks/Pro PS“ entscheiden, da deren Treiber saubere, von Ghostscript einwandfrei zu verarbeitende Postscript-Dokumente erzeugen.

Der Assistent überträgt nun die Treiber so auf den Server, dass sie von dort installiert werden können. Zudem ändert er dabei gleich den angezeigten Druckernamen auf den des Treibers. Um den Benutzern die Auswahl des PDF-Druckers zu erleichtern, sollten Sie diese Änderung ganz einfach über die Option „Eigenschaften“ im Kontextmenü rückgängig machen.

Windows-Client einrichten

Um den Drucker auf dem Windows-Client nutzen zu können, starten Sie einfach den Assistenten zur Druckerinstallation über die Menüfolge „Start“, „Drucker und Faxgeräte“, „Drucker hinzufügen“. Selektieren Sie im ersten Auswahlfenster die Option „Netzwerkdrucker oder Drucker, der an einem anderen Rechner angeschlossen ist“ und in der nachfolgenden Maske die Option „Drucker suchen“.

Aus der nun angezeigten Liste der verfügbaren Server wählen Sie denjenigen, auf dem Sie den PDF-Drucker eingerichtet haben und rufen per Doppelklick auf dessen Namen die Liste der Drucker ab, die er bereitstellt. Dort markieren Sie den PDF-Drucker. Nach einem Klick auf „Weiter“ präsentiert Windows eine Warnung, die Sie darauf hinweist, dass der Treiber für diesen Drucker vom Server installiert wird. Bestätigen Sie diese mit einem Klick auf „Ja“ und stellen die Installation des Druckers fertig.

Testlauf

Im Folgenden können Sie den neuen Drucker auch gleich ausprobieren, indem Sie die Testseite drucken lassen. Das Ergebnis finden Sie dann im Unterverzeichnis cups-pdf Ihres Heimatverzeichnisses auf dem Server unter dem Namen job1-Test seite.pdf. Von nun an können Sie aus jeder Anwendung heraus PDF-Dokumente über den Druckdialog erstellen lassen.

Zu beachten ist allerdings, dass der Dateiname immer von der Anwendung abhängig ist, mit der Sie drucken. So erstellt Paintshop Pro beispielsweise Dokumente mit dem Namen PSP_PRINT.pdf, der dann auf Grund unserer Konfiguration in jobXX_PSP_PRINT.pdf geändert wird. Wenn Sie nicht genau wissen, wie Ihre Anwendung das Dokument nennen wird, können Sie sich im Datei-Browser das Verzeichnis cups-pdf nach Datum der Erstellung sortieren lassen. Das Dokument mit dem jüngsten Datum ist dann mit großer Wahrscheinlichkeit das gesuchte.

Einschränkungen des PDF-Druckers

Dabei zeigt sich auch schon die wesentliche Einschränkung des vorgestellten PDF-Druckers: Während zum Beispiel beim Einsatz von Adobe Acrobat die Angabe eines Dateinamens vor dem Erstellen des PDF-Files möglich ist, bietet der PDF-Drucker via CUPS diese Option nicht, da ja auf dem Client ein anderer Druckertreiber zum Einsatz kommt. Es bleibt also dem Anwender überlassen, die Dokumentnamen später so anzupassen, dass ein einfaches Wiederauffinden der Unterlagen möglich ist.

Außerdem ist die Leistungsfähigkeit direkt von der Rechenleistung des Servers abhängig, da im Gegensatz zu Acrobat dieser und nicht der Client die Umwandlung der Druckdaten in das PDF-Format übernehmen muss. Da Ghostscript sehr rechenintensiv ist, können schon wenige parallel auf den PDF-Drucker zugreifende Clients einen ungenügend dimensionierten Server in die Knie zwingen oder die Zeit zwischen dem Abschicken des Druckjobs und der Erstellung der PDF-Dateien zumindest erheblich in die Länge ziehen.

Auch für sensible Dokumente eignet sich das vorgestellte Verfahren nur bedingt, da damit weder ein Kennwortschutz noch das Signieren eines Dokuments möglich ist. Gleiches gilt für jede Art der nachträglichen Bearbeitung. Diese Aufgaben müssen Sie nach wie vor mit Acrobat oder einer kompatiblen Lösung erledigen. Hier können sich beispielsweise die PDF-Tools als hilfreich erweisen, die Sie von der Site www.pdf-tools.com als Demoversion herunterladen können.

Ein letztes Manko besteht darin, dass sich die Einstellungen von CUPS-PDF nur durch ein erneutes Übersetzen des Treibers und nur global für alle Anwender, nicht aber durch einfache Änderungen an einer Konfigurationsdatei und auf Benutzerbasis erledigen lassen. Dennoch stellt der PDF-Drucker via CUPS für viele Bereiche eine attraktive Alternative dar. (mje)