Dieses Repository enthält eine Druckeranwendung für PostScript-Drucker, die PAPPL verwendet, um IPP-Druck von mehreren Betriebssystemen aus zu unterstützen. Darüber hinaus nutzt es die Ressourcen von cups-filters 2.x (Filterfunktionen in libcupsfilters, libppd) und pappl-retrofit (Kapselung klassischer CUPS-Treiber in Druckeranwendungen). Dieses Werk (oder jetzt der Code von pappl-retrofit) ist von der HP-Printer-App abgeleitet.
Ihre Beiträge sind willkommen. Bitte posten Sie Probleme und Pull-Requests.
Eine Nicht-Raster-Druckeranwendung: Das Zielformat ist PostScript, ein High-Level-/Vektorformat. Eingabedaten in PostScript oder PDF werden akzeptiert und die erforderliche Konvertierung erfolgt ohne dazwischenliegende Rasterschritte.
Eine Druckeranwendung, die die neuen Filterfunktionen von cups-filters 2.x nutzt. Filterfunktionen sind Bibliotheksfunktionen, die von den CUPS-Filtern abgeleitet sind und seit der Einführung von CUPS im Jahr 2000 jahrzehntelange Entwicklung und Verfeinerung beinhalten.
Eine nachrüstbare Druckeranwendung für klassische CUPS-Treiber, in diesem Fall die einfachste Form von reinen PPD-Dateien für PostScript-Drucker. Es listet PPD-Dateien aus im Snap enthaltenen Repositorys auf, lädt die für den eigentlichen Drucker benötigte PPD, extrahiert Optionen aus der PPD, um sie in der Weboberfläche anzuzeigen, akzeptiert Auftragseinstellungen als IPP-Attribute und fügt den von der PPD bereitgestellten PostScript-Code korrekt ein in den Ausgabedatenstrom.
Eine Druckeranwendung, die keine Rohaufträge (Eingabeformat ist das native Format des Druckers) durchläuft. Um sicherzustellen, dass immer der PostScript-Code der PPD-Datei in den Ausgabestream eingefügt wird, nennen wir das native Format des Druckers „application/vnd.printer-spezifisch“, das nicht als Eingabeformat existiert, sodass die Eingabe „application/postscript“ erzwungen wird durch die Filterfunktion pstops().
Eine erweiterbare Druckeranwendung: Der Benutzer kann PPD-Dateien über die Administrations-Weboberfläche hinzufügen, um zusätzliche Druckermodelle zu unterstützen.
Weitere Eigenschaften sind:
Um die Notwendigkeit zu vermeiden, den Code für die Aufteilung in Unterprozesse neu zu erfinden, damit wir Daten durch eine Folge von Filtern leiten können, erstellen wir eine Filterfunktion, um die Daten an den Drucker zu senden und eine Kette des tatsächlich konvertierenden Filters zu bilden Funktion (eines von pstops() und pdftops()) mit dieser Filterfunktion unter Verwendung der Filterfunktion filterChain().
Für die PWG/Apple-Raster-Eingabe verwenden wir Raster-Callbacks, sodass die Verarbeitung gestreamt wird, was große und sogar unendlich lange Jobs ermöglicht. Wir verwenden libppd-Funktionen, um den PostScript-Code der PPD-Option in den Ausgabestream einzufügen, und die Funktion filterPOpen(), um einen Dateideskriptor für die libppd-Funktionen zu erstellen, um Daten an das Gerät zu senden.
In der PostScript-Druckeranwendung Snap sind alle PostScript-PPD-Dateien der foomatic-db- und HPLIP-Projekte integriert, also die meisten PostScript-Drucker-PPDs, die normalerweise mit Linux-Distributionen geliefert werden. Um zu vermeiden, dass diese große Anzahl an PPDs die Größe des Snaps in die Höhe treibt, komprimieren wir sie stark mit pyppd. Beachten Sie, dass einige PPDs bestimmte CUPS-Filter für zusätzliche Funktionalität verwenden. Diese Filter sind im Snap enthalten, sodass die zusätzliche Funktionalität unterstützt wird (in den meisten Fällen PIN-geschütztes Drucken). Der Benutzer kann zusätzliche PPDs hinzufügen, ohne den Snap neu erstellen zu müssen (siehe unten).
Anhand der IEEE-1284-Geräte-ID des Druckers erkennen wir zunächst, dass es sich um einen PostScript-Drucker handelt (über das CMD:-Feld), um zu sehen, ob er überhaupt unterstützt wird, und prüfen erst dann über Marke und Modell, ob wir ihn explizit mit einer PPD unterstützen. PostScript-Druckern, für die es keine PPD gibt, wird eine generische PPD zugewiesen. Durch die Prüfung des CMD:-Feldes vor der Make/Model-Suche stellen wir sicher, dass das Modul tatsächlich installiert ist, wenn PostScript von einem Zusatzmodul bereitgestellt wird.
IPP-Standardattribute für Aufträge werden den für sie am besten geeigneten PPD-Optionseinstellungen zugeordnet, sodass Benutzer von jedem Clienttyp (z. B. einem Telefon oder IoT-Gerät) aus drucken können, der nur Standard-IPP-Attribute unterstützt und die PPD-Optionen nicht abrufen kann. Fächer, Medienformate, Medientypen und Duplex lassen sich leicht zuordnen, aber wenn es um Farbe und Qualität geht, wird es komplexer, da sich die relevanten Optionen in den PPD-Dateien stark unterscheiden. Hier verwenden wir einen Algorithmus, der automatisch (wer möchte etwa 10.000 PPDs für die Aufgaben von Hand bearbeiten) den richtigen Satz an Optionseinstellungen für jede Kombination aus print-color-mode
( color
/ monochrome
), print-quality
( draft
/ normal
/ high
) und print-content-optimize
( auto
/ photo
/ graphics
/ text
/ text-and-graphics
) in der PPD des aktuellen Druckers. So haben Sie einfachen Zugriff auf die volle Qualität oder Geschwindigkeit Ihres Druckers, ohne sich mit druckerspezifischen Optionseinstellungen auseinandersetzen zu müssen (die ursprünglichen Optionen sind weiterhin über die Web-Administratoroberfläche zugänglich).
Die Druckerfunktionen für ein bestimmtes Druckermodell (ein „Treiber“ in der Druckeranwendung) sind während der gesamten Lebensdauer der in der Druckeranwendung eingerichteten Druckwarteschlange nicht statisch. Der Benutzer kann über eine Seite in der Webadministrationsoberfläche konfigurieren, welches Hardwarezubehör (zusätzliche Papierfächer, Duplexeinheit, Finisher usw.) auf dem Drucker installiert ist, und die Druckeranwendung aktualisiert die Treiberdatenstruktur und damit die Druckerfunktionen. Die Antwort auf eine IPP-Anfrage „get-printer-attributes“ wird entsprechend aktualisiert.
PostScript ist eine vollwertige Programmiersprache und viele PostScript-Drucker ermöglichen die Abfrage von Optionseinstellungen und das Vorhandensein installierbarer Hardware-Zubehörteile, die entsprechenden PostScript-Code ausführen. Wenn eine Einstellung abgefragt werden kann, fügt der Hersteller den erforderlichen PostScript-Code zusammen mit der abfragbaren Option in die PPD-Datei ein. Diese Abfragen werden von der Weboberfläche der Druckeranwendung unterstützt.
Verfügbare Druckergeräte werden mit den Backends von CUPS erkannt (und verwendet) und nicht mit den eigenen Backends von PAPPL. Auf diese Weise werden spezielle Problemumgehungen für USB-Drucker mit Kompatibilitätsproblemen verwendet (und können bearbeitet werden) und PostScript-Ausgaben können zusätzlich zum Socket (normalerweise Port 9100) über IPP, IPPS (verschlüsselt!) und LPD an den Drucker gesendet werden. Das SNMP-Backend kann konfiguriert werden (Community, Adressbereich).
Wenn Sie eine ungewöhnliche Systemkonfiguration oder eine persönliche Firewall haben, wird Ihr Drucker möglicherweise nicht erkannt. In dieser Situation kann der vollständig manuelle Eintrag „Netzwerkdrucker“ in Kombination mit dem Hostnamen/IP-Feld hilfreich sein.
Markieren Sie auf der Seite „PPD-Dateien hinzufügen“ in der Liste der bereits hinzugefügten Benutzer-PPD-Dateien, welche tatsächlich von einem Drucker verwendet werden, der in der Druckeranwendung eingerichtet wurde, um zu vermeiden, dass der Benutzer diese Dateien entfernt.
Für Menschen lesbare Zeichenfolgen für Anbieteroptionen (Benötigt Unterstützung durch PAPPL: Problem Nr. 58: Lokalisierungsunterstützung)
Internationalisierung/Lokalisierung (Benötigt Unterstützung durch PAPPL: Problem Nr. 58: Lokalisierungsunterstützung)
SNMP-Tintenstandprüfung über die Funktion ps_status() (Benötigt Unterstützung durch PAPPL: Problem Nr. 83: CUPS führt IPP- und SNMP-Tintenstandabfragen über Backends durch, PAPPL sollte hierfür Funktionen haben)
Build-Optionen für Cups-Filter zum Erstellen ohne libqpdf und/oder ohne libppd. Ersteres ermöglicht das Erstellen des Snaps dieser Druckeranwendung, ohne QPDF herunterladen und erstellen zu müssen
Um diese Druckeranwendung einfach auszuführen und zu verwenden, installieren Sie sie einfach aus dem Snap Store:
sudo snap install --edge ps-printer-app
Befolgen Sie dann die nachstehenden Anweisungen zur Einrichtung.
Um den Snap selbst zu erstellen, führen Sie ihn im Hauptverzeichnis dieses Repositorys aus
snapcraft snap
Dadurch werden alle benötigten Pakete heruntergeladen und die PostScript-Druckeranwendung erstellt. Beachten Sie, dass PAPPL (bevorstehende Version 1.0) und cups-filter (bevorstehende Version 2.0) direkt aus ihren GIT-Repositorys abgerufen werden, da es noch keine entsprechenden Versionen gibt. Dies kann auch dazu führen, dass diese Druckeranwendung plötzlich nicht mehr aufgebaut wird.
HINWEIS: Es gibt einen Fehler in Ubuntu Groovy (20.10), der die Erstellung von Snaps verhindert, siehe diese Diskussion im Snapcraft-Forum. Das Problem ist bereits gelöst, hat es aber noch nicht in Groovy geschafft.
Jede ältere (wie 20.04) oder neuere (wie 21.04) Ubuntu-Version sollte funktionieren.
Um den resultierenden Snap zu installieren, führen Sie ihn aus
sudo snap install --dangerous ps-printer-app_1.0_amd64.snap
Die Druckeranwendung wird automatisch als Server-Daemon gestartet.
Rufen Sie die Weboberfläche auf
http://localhost:8000/
Verwenden Sie die Weboberfläche, um einen Drucker hinzuzufügen. Geben Sie einen Namen ein, wählen Sie den erkannten Drucker und dann Marke und Modell aus. Legen Sie außerdem das installierte Zubehör, die geladenen Medien und die Standardeinstellungen fest. Standardeinstellungen für Zubehörkonfiguration und Optionen können ebenfalls vom Drucker abgefragt werden.
Drucken Sie dann PDF-, PostScript-, JPEG-, Apple Raster- oder PWG Raster-Dateien mit
ps-printer-app FILE
oder mit CUPS drucken, CUPS (und auch cups-browsed) erkennen und behandeln die mit dieser Druckeranwendung eingerichteten Drucker als treiberlose IPP-Drucker (IPP Everywhere und AirPrint).
Sie können PPD-Dateien auch hinzufügen, ohne den Snap neu zu erstellen, indem Sie entweder die Schaltfläche „PPD-Dateien hinzufügen“ in der Weboberfläche verwenden oder PPD-Dateien manuell kopieren:
sudo cp PPDFILE /var/snap/ps-printer-app/common/ppd/
Nach dem manuellen Kopieren (oder Entfernen) von PPD-Dateien müssen Sie den Server neu starten oder in der Weboberfläche auf der Seite „PPD-Dateien hinzufügen“ unten auf die Schaltfläche „Aktualisieren“ klicken. Dadurch werden die Änderungen zur internen Treiberliste hinzugefügt.
Auf der Seite „Drucker hinzufügen“ im Dropdown-Menü zur Auswahl des Treibers sind vom Benutzer hinzugefügte PPD-Dateien mit „VOM BENUTZER HINZUGEFÜGT“ gekennzeichnet. Beim Einrichten eines Druckers mit automatischer Treiberauswahl werden vom Benutzer hinzugefügte PPD-Dateien bevorzugt.
PPDFILE
in der Befehlszeile oben kann nicht nur eine einzelne PPD-Datei sein, sondern eine beliebige Anzahl einzelner PPD-Dateien, .tar.gz
Dateien mit PPDs (in beliebiger Verzeichnisstruktur) und PPD-generierenden ausführbaren Dateien, die normalerweise in /usr/lib/cups/driver
abgelegt werden /usr/lib/cups/driver
. Sie können auch beliebige Unterverzeichnisstrukturen in /var/snap/ps-printer-app/current/ppd/
erstellen, die die genannten Dateitypen enthalten. Stellen Sie nur sicher, dass Sie dort keine ausführbaren Dateien ablegen, die etwas anderes tun, als PPD-Dateien aufzulisten und zu generieren.
Beachten Sie, dass Sie mit der Weboberfläche einzelne PPDs (unkomprimiert oder mit gzip
komprimiert) nur im /var/snap/ps-printer-app/current/ppd/
selbst verwalten können. Archive, ausführbare Dateien oder Unterverzeichnisse werden nicht angezeigt und entsprechende Uploads werden nicht akzeptiert. Dies verhindert insbesondere das Hinzufügen ausführbarer Dateien ohne Root-Rechte.
Jede hinzugefügte PPD-Datei muss für PostScript-Drucker bestimmt sein, da Nicht-PostScript-PPD-Dateien für CUPS-Treiber bestimmt sind und daher zusätzliche Dateien benötigen, um zu funktionieren. Solche Dateien werden von dieser Druckeranwendung nicht unterstützt. Auf der Seite „PPD-Dateien hinzufügen“ werden Warnungen angezeigt, wenn solche Dateien hochgeladen werden.
Sehen
ps-printer-app --help
für weitere Optionen.
Verwenden Sie das Argument „-o log-level=debug“ für eine ausführliche Protokollierung in Ihrem Terminalfenster.
Sie können Dateien zu /var/snap/ps-printer-app/common/usb/
hinzufügen, um zusätzliche USB-Eigenregeln zu erhalten. Bearbeiten Sie die vorhandenen Dateien nur für schnelle Tests, da sie bei jedem Update des Snap ersetzt werden (um neue Regeln einzuführen).
Sie können die Datei /var/snap/ps-printer-app/common/cups/snmp.conf
bearbeiten, um die SNMP-Netzwerkdruckererkennung zu konfigurieren.
Sie können auch einen „Quick-and-Dirty“-Build ohne Snapping durchführen und ohne die Notwendigkeit, PAPPL, cups-filters 2.x und pappl-retrofit in Ihrem System zu installieren. Sie benötigen ein Verzeichnis mit dem neuesten GIT-Snapshot von PAPPL, dem neuesten GIT-Snapshot von cups-filters und dem neuesten GIT-Snapshot von pappl-retrofit (jeweils die Hauptzweige). Sie müssen alle kompiliert werden ( ./autogen.sh; ./configure; make
), eine Installation ist nicht erforderlich. Installieren Sie außerdem die Header-Dateien aller benötigten Bibliotheken (die Installation von „libcups2-dev“ sollte reichen).
Führen Sie im Verzeichnis mit ps-printer-app.c die Befehlszeile aus
gcc -o ps-printer-app ps-printer-app.c $PAPPL_SRC/pappl/libpappl.a $CUPS_FILTERS_SRC/.libs/libppd.a $CUPS_FILTERS_SRC/.libs/libcupsfilters.a $PAPPL_RETROFIT_SRC/.libs/libpappl-retrofit.a -ldl -lpthread -lppd -lcups -lavahi-common -lavahi-client -lgnutls -ljpeg -lpng16 -ltiff -lz -lm -lusb-1.0 -lpam -lqpdf -lstdc++ -I. -I$PAPPL_SRC/pappl -I$CUPS_FILTERS_SRC/ppd -I$CUPS_FILTERS_SRC/cupsfilters -I$PAPPL_RETROFIT_SRC/pappl/retrofit -L$CUPS_FILTERS_SRC/.libs/ -L$PAPPL_RETROFIT_SRC/.libs/
Es gibt auch ein Makefile, aber dafür müssen PAPPL, cups-filters 2.x und pappl-retrofit auf Ihrem System installiert sein.
Laufen
./ps-printer-app --help
Beim Ausführen der nicht geschnappten Version wird standardmäßig nach PPD-Dateien gesucht
/usr/share/ppd/
/usr/lib/cups/driver/
/var/lib/ps-printer-app/ppd/
Der letzte Pfad wird beim Hinzufügen von PPD-Dateien über die Seite „PPD-Dateien hinzufügen“ in der Weboberfläche verwendet.
Sie können die Umgebungsvariable PPD_PATHS
so festlegen, dass stattdessen auch andere Orte durchsucht werden:
PPD_PATHS=/path/to/my/ppds:/my/second/place ./ps-printer-app server
Fügen Sie einfach eine durch Doppelpunkte getrennte Liste beliebig vieler Pfade in die Variable ein, wobei immer der letzte von der Seite „PPD-Dateien hinzufügen“ verwendet wird. Es wird empfohlen, ein Wrapper-Skript zu erstellen.
Diese Druckeranwendung verwendet die Backends von CUPS und nicht die von PAPPL. Das bedeutet, dass für USB-Drucker die USB-Quirk-Workarounds von CUPS für Kompatibilitätsprobleme verwendet werden, Netzwerkdrucker auch mit IPP-, IPPS- und LPD-Protokollen verwendet werden können und die SNMP-Druckererkennung konfigurierbar ist.
USB-Quirk-Regeln in /usr/share/cups/usb
und der Datei /etc/cups/snmp.conf
können bei Bedarf bearbeitet werden.
Stellen Sie sicher, dass CUPS (zumindest die Backends) installiert ist.
Zum Drucken von PDF-Aufträgen benötigen Sie außerdem Ghostscript.
Für den Zugriff auf die Testseite testpage.ps
verwenden Sie die Umgebungsvariable TESTPAGE_DIR:
TESTPAGE_DIR=`pwd` PPD_PATHS=/path/to/my/ppds:/my/second/place ./ps-printer-app server
oder zur eigenen Erstellung einer Testseite (PostScript, PDF, PNG, JPEG, Apple Raster, PWG Raster):
TESTPAGE=/path/to/my/testpage/my_testpage.ps PPD_PATHS=/path/to/my/ppds:/my/second/place ./ps-printer-app server
Das Copyright © 2020 der PostScript-Druckeranwendung liegt bei Till Kamppeter.
Es ist von der HP PCL-Druckeranwendung abgeleitet, einem ersten Arbeitsmodell einer Rasterdruckeranwendung, die PAPPL verwendet. Es ist hier erhältlich:
https://github.com/michaelrsweet/hp-printer-app
Die HP PCL-Druckeranwendung unterliegt dem Urheberrecht © 2019–2020 von Michael R. Sweet.
Diese Software ist unter der Apache-Lizenz Version 2.0 lizenziert, mit einer Ausnahme, um die Verknüpfung mit GPL2/LGPL2-Software (wie ältere Versionen von CUPS) zu ermöglichen. Weitere Informationen finden Sie in den Dateien „LICENSE“ und „NOTICE“.