[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Probleme beim Ausdrucken von PDF



Jan Kappler <public@jan-kappler.de> wrote:
> Am 10.05.2015 22:04, schrieb Martin Klaiber:

>> Ich benutze kein CUPS, aber vielleicht habe ich dennoch ein paar Ideen.

> Ginge das auch ohne?

Latürnich. Wir sind doch hier bei Unix :-)

Ein zentrales Unix-Prinzip lautet: Alles ist eine Datei. Das gilt auch
für den Drucker. Natürlich ist er keine Datei, aber man kann ihn so
ansprechen, als wäre er eine.

Wenn Du "cat datei" auf der Console eingibst, wird die Ausgabe der
Datei auf den Bildschirm umgeleitet, das ist standardmäßig schon so
eingestellt, im Grunde lautet der Befehl: "cat datei > /dev/stdout".

Auf die gleiche Weise kannst Du Dateien drucken, indem Du bei einem
lokal angeschlossenen Drucker z.B. "cat datei > /dev/lp0" eingibst,
je nachdem, an welchem Device der Drucker hängt. Das funktioniert mit
netcat auch über das Netzwerk: "cat datei | netcat adresse port". Der
Port ist bei JetDirect-Karten bspweise 9100.

Das gilt für einfache Textdateien. Bei einem Postscript-Drucker
funktioniert das aber auch mit PS- und PDF-Dateien, da der Drucker die
Befehle versteht. Bei "normalen" Druckern muss man die Datei erst in
eine Sprache umwandeln, die der Drucker versteht, das ist bei aktuellen
Druckern meist PCL. Diese Umwandlung kann beispielsweise Ghostscript
vornehmen, indem man als Ausgabedevice den passenden Drucker angibt. Um
eine Postscript-Datei auf einem Laserjet-4 zu drucken, könnte man
folgende Befehlskette verwenden (nur grundsätzlich, da fehlen noch ein
paar Optionen bei gs zur Unterdrückung von Statusmeldungen, usw., aber
das würde hier zu unübersichtlich werden):

cat datei.ps | gs -sDEVICE=ljet4 - > /dev/lp0

Oder mit netcat wie oben wieder über das Netzwerk.

Man schickt also die PS-Datei über eine pipe an gs, das übersetzt sie
in die druckereigene Sprache (hier PCL) und dann leitet man das Ganze
an den Drucker um.

Hat man andere Dateientypen, z.B. Grafiken, schickt man sie vorher
durch einen anderen Filter, z.B. so:

cat datei.pdf | pdftops | gs ... > /dev/lp0
cat datei.png | pngtopnm | pnmtops | gs ... > /dev/lp0

Mit dem tool "file" könnte man sich daraus ein kleines Script basteln,
das den Dateityp erkennt und automatisch die richtigen pipes auswählt.

Dieses einfache Konzept hat aber auch ein paar Nachteile: Man muss
schauen, ob der Drucker bereit ist und die Console ist während des
Druckens blockiert. Beides ist speziell in Mehrbenutzersystemen
hinderlich, wenn der einzige Drucker einer Arbeitsgruppe die ganze
Gruppe ausbremst. Aus diesem Grund wurde die Druckerqueue entwickelt,
ein Druckerspooler, der eingehende Druckaufträge entgegennimmt, in
eine Warteschlange einreiht und sie nacheinander ausdruckt, sobald
der Drucker bereit ist. Zusätzlich kann man damit auch den Status des
Druckers abfragen, Druckaufträge löschen, usw.

Das, was da oben steht, ist im Prinzip das traditionelle Druckprinzip
von Unix, meist als lpd- oder lpr-System bezeichnet. Die Scripte, die
die pipes auswählen, heißen Druckerfilter, bei lprng ist das z.B. das
Programm magicfilter (eigentlich eine Sammlung von Programmen).

CUPS kenne ich zuwenig, um Qualifiziertes darüber sagen zu können. Auf
jeden Fall verwendet es ein neues Protokoll, das mehr Statusmeldungen
und die Administration des Druckers über das Netzwerk erlaubt. Neu sind
die PPD-Dateien, das sind Konfigurationsdateien für die Drucker. Ob sie
auch Filterfunktionen übernehmen, weiß ich nicht, vielleicht kann dazu
jemand etwas schreiben, der sich mit CUPS besser auskennt.

> Ich kenne mich mit Drucken unter Linux nur wenig aus und finde die
> zahlreichen Komponenten nur mangelhaft beschrieben. Gibt es irgendwo
> eine halbwegs verständliche Erklärung, wie Drucken unter Linux
> funktioniert?

Ich hatte es mir damals mit Hilfe eines HOWTO erarbeitet. Es gibt dazu
ein paar Printing-HOWTOs, ob sie noch aktuell sind, weiß ich nicht. Sie
werden mit Debian mitgeliefert, ansonsten findest Du sie bei tldp.org.

> Ehrlich gesagt wird die Unverständlichkeit der Dokumentation nur noch
> vom Sound-System unter Linux übertroffen ;-)

Ja, das finde ich auch ziemlich undurchsichtig :-)

>> Ist das ein Postscript-Drucker? Wenn nicht, dann ist für das Drucken
>> von PDF gs (Ghostscript) verantwortlich. Zumindest traditionell, also
>> bei lpr plus Druckerfilter ist/war das so, weiß nicht, ob CUPS die
>> Postscript-Übersetzung selbst macht.

> Die Dokumentation des Druckers ist nicht sehr ergiebig, aber er
> unterstützt PS und PCL6. Für nähere Infos müsste ich mal die Kiste
> einschalten und gucken, was die Infoseiten des Druckers anzeigen, aber
> jetzt ist mir das zu laut :-)

> Bezüglich PS-Übersetzung siehe meine Bemerkung oben: CUPS, Foomatic,
> Ghostscript - was braucht man alles? Dabei den Durchblick zu behalten
> ist nicht einfach, finde ich.

Wenn es ein Postscript-Drucker ist, brauchst Du nichts zusätzlich. Es
könnte nur sein, dass der eingebaute Interpreter fehlerhaft oder nicht
mehr aktuell ist, das weiß ich nicht. Für die Übersetzung von PS nach
PCL auf dem Rechner brauchst Du Ghostscript. Foomatic kenne ich nicht.
Es gibt auch noch andere Druck-Projekte wie Gutenprint, usw. Dazu kann
ich leider auch nichts sagen, ich bin sozusagen oldschool unterwegs ;-)

>> Hast Du keine genauen Fehlermeldungen?

> Wie sähen die denn aus? Mal ein Beispiel:

> Error name: stackunderflow
> Offending operator: index
> Error info string: index out of range
> VM Remaining: 10178434
> blabla...

Das sagt jetzt nicht viel, außer dass der PS-Interpreter etwas vom
Stack holen wollte und da nichts ist.

> Recht umfangreich ist der Inhalt des Execution Stack, falls gewünscht
> kann ich das mal abtippen.

Gib die Fehlermeldungen mal bei google ein und schau, ob Du eine
Beschreibung Deines Problems findest. Interessant wäre noch, ob die
Fehlermeldungen vom gs Deines Rechners oder vom eingebauten Interpreter
des Druckers stammen. Du hattest in der vorherigen Mail geschrieben,
dass die Fehler auf einer Fehlerseite des Druckers erscheinen. Heißt
das, dass er eine Seite mit Fehlern ausdruckt? Dann würde ich vermuten,
dass das Fehler des internen PS-Interpreters des Druckers sind. Du
könntest dann versuchen, ihn als PCL-Drucker einzurichten und die
PS-Übersetzung auf dem Rechner zu machen.

> Hmm, hier ist Ghostscript 8.71~dfsg2-9+squeeze1 installiert.

Übersetze doch mal eine der PDF-Dateien, die Probleme machen, direkt
mit gs und schaue, ob es funktioniert. Also in einer xterm eingeben:
"gs datei.pdf". Dann öffnet sich ein Fenster und zeigt den übersetzten
Text an, wenn es funktioniert. Bei wheezy funktioniert es mit PDF-1.4.
Wheezy verwendet die gs-Version 9.05.

> Ich frag mich halt, warum es schon mal funktioniert hat und nun nicht
> mehr...

Du müsstest erstmal rausfinden, wo der Fehler auftritt, ob im Drucker
oder auf dem Rechner. Wenn der Drucker sowohl PS als auch PCL-6 kann,
kann man ihn ja sowohl als PS-Drucker, wie auch als PCL-Drucker
einrichten. Vielleicht hattest Du das mal so und mal so gemacht, und
entweder der interne PS-Interpreter oder gs hatte mit PDF-1.4-Dateien
Probleme oder nicht.

Wie gesagt, das gilt alles unter der Voraussetzung, dass CUPS ebenfalls
Ghostscript für die PS-Übersetzung verwendet (was ich nicht weiß). Wenn
CUPS einen eigenen Übersetzer mitbringt, käme natürlich auch der noch
als Fehlerursache in Betracht.

Wenn die Fehlermeldungen nicht auf dem Monitor erscheinen, sondern vom
Drucker selbst ausgegeben werden, vermute ich jedoch stark, dass er als
PS-Drucker eingerichtet ist und Probleme mit neueren PDF-Dateien hat.

HTH und Gruß, Martin


Reply to: