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

Re: Probleme beim Ausdrucken von PDF



Hallo Leute,

zunächst mal vielen Dank an Martin und Christian für die Erklärungen!
Einige Sachen dachte ich mir schon so.

Am 12.05.2015 21:00, schrieb Martin Klaiber:
> 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.
>   

Das leuchtet ein. Unter Windows brauchte man sich eher keine Gedanken zu
machen, da gab es praktisch nur "Druckertreiber". Deren Einrichtung ließ
(bzw. lässt, wenn ich auf Arbeit sehe, welchen "Spaß" mitunter unser
Admin damit hat) den Anwender mitunter aber verzweifeln.

Praktisch verfügt der Drucker also über Interpreter für PS und PCL. Laut
Konfiguration geht bei "Standardemulation" Automatisch (default), PS,
PCL5, PCL XL und Hex Dump auszuwählen, bei "Standard Autoerkennung" PCL5
(default) und PS. Für PS kann ich die Fehlerseite ein/ausschalten, das
ist die bereits erwähnte, die der Drucker eben in einigen Fällen
ausspuckt. Außerdem kann man beim Ethernet PS-Protokoll zwischen "Binär"
(default) und "Qbinär" wählen. Für PCL gibt es paar Einstellungen zu
CR/LF und Fonts.

Kippe ich dem Drucker reinen Text rein, druckt er den. PS-Dateien
interpretiert er ebenfalls, also sollte er die drucken. Für alle anderen
Sachen wird er also PCL verwenden, okay.

> 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.
>   

Laut Wikipedia scheint der Unterschied nicht so groß zu sein, CUPS ist
modular aufgebaut und daher flexibler, scheint mir. Das Konvertieren
übernehmen offenbar auch diese "Filter".

> 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 ;-)
>   

Gut, mir stellt sich dann die Frage, wie das Drucksystem entscheidet, ob
es den Kram direkt an den Drucker schickt oder erst durch z.B.
GhostScript jagt. Ich nehme mal an, das hierin mein Problem liegt:
Neuere PDF-Versionen kann der Drucker nicht direkt verarbeiten, also
kommt da nur Mist raus. Eigentlich müsste CUPS das durch GS übersetzen
lassen, das natürlich die neueren Versionen versteht, aber genau das
klappt nicht.

Foomatic scheinen die Filter zu sein, deren Prinzip Martin erklärt hat.
Hier ist foomatic-filters installiert.

>> 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.
>   

Korrekt, er druckt diese Seite aus. Das Problem ist, wie man den ganzen
Kram unter "Execution Stack" als Fehlermeldungen interpretieren soll.
Das sieht z.B. so aus:

{
//def
}
{
//end
$error
/_length
//undef
$error
/init
//get
{
handleerror
}
usw.

Wie Fehlemeldungen sieht mir das nicht aus, eher was er macht (oder
gemacht hat), wenn was auftritt. In diesem Fall scheint er bei einem
Fehler zu stoppen (und druckt dann die Fehlerseite aus), was ja der Fall
ist. Vom eigentlichen Dokument wird nicht eine einzige Seite gedruckt.

> Ü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.
>   

Squeeze hat GS 8.71 und gibt die Release Notes von Squeeze (PDF-1.4)
auch ordentlich aus (jede Seite erscheint in einem grafischen Fenster,
interessant...). Die Release Notes von Wheezy (PDF-1.5) werden ebenfalls
ordentlich angezeigt.

> 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.
>   

Die Frage ist "nur", wie geht das? Für CUPS gibt es ja die zwei
PPD-Dateien vom Hersteller. Leider geht daraus nicht hervor, wie damit
der Drucker eingerichtet wird.
Ich hab mal in der Online-Hilfe von CUPS gestöbert und probiert:

jan@enterprise:/mnt/public/Dokumente/Linux/Debian Squeeze$ lp -d
"1650EN_normal" release-notes.de.pdf
Anfrage-ID ist 1650EN_normal–210 (1 Datei(en))

Dann fängt der Drucker an zu drucken - ohne Fehler! Komisch...
Ein weiterer Versuch: Release Notes von Wheezy ausdrucken mit Evince -
geht schief, wieder nur die Fehlerseite. Interessant ist die Angabe in
der Info von Evince: Verwendet poppler/cairo (0.12.4)
Ob es damit ein Problem gibt? Also noch ein Versuch:

jan@enterprise:/mnt/public/Dokumente/Linux/Debian 7 Wheezy$ lp -d
"1650EN_normal" release-notes.de.pdf
Anfrage-ID ist 1650EN_normal–212 (1 Datei(en))

Das funktioniert nicht! Wieder gibt der Drucker nur die Fehlerseite aus.
Das verstehe, wer will.

> 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
>   

Er kann ja beides, PS und PCL. Wie könnte ich herausfinden, welches
Protokoll CUPS benutzt?

Wahrscheinlich sollte ich eher versuchen, das PDF aus der
Test-Installation heraus auszudrucken und dann schauen, ob der Kram nach
dem System-Upgrade funktioniert...

-- 


Mit freundlichem Gruß
Jan Kappler


Attachment: signature.asc
Description: OpenPGP digital signature


Reply to: