Linux – einfache Print Option für Nemo

Das habe ich schon lange vermisst: Im Filemanager, egal ob Nemo oder Nautilus, eine Print Option zu haben. Die Jahre zogen ins Land und die Option blieb in weiter ferne. Bis heute … \o/

… und so zogen sie los, und machten es selbst …

Wir brauchen :

  • – einen Texteditor nach Wahl
  • – ein Druckprogramm
    – eine Nemo Action

Hintergrundwissen

Eine Nemo Action ist eine Datei, die einen Eintrag im Context-Menü von Nemo erzeugt. Analog gibt es das auch für Nautilus, da die das beide von Gnome-Files mitgeforkt haben. Entweder kann ein Benutzer eine eigene Action unter ~/.local/share/nemo/actions  ablegen oder systemweit kann man das unter /usr/share/nemo/actions machen, dazu braucht man dann aber auch die nötigen Root-Rechte.

In der Datei kann ich sagen, welches Tool aufgerufen werden soll, wie die Files dem Tool übergeben werden, wie das Icon aussehen soll usw. Alle Änderungen funktionieren zur Laufzeit von Nemo, so daß wir es nicht laufend neustarten müssen, was extrem praktisch ist.

Die Nemo Action

Wir nehmen für unsere Action das lokale Verzeichnis ~/.local/share/nemo/actions und erzeugen eine Datei namens print.nemo_action

[Nemo Action]
Name=Print
Comment=Printing from Nemo

#Exec=gnome-terminal -x sh -c "echo %F | less"
Exec=<print.sh %F>
Icon-Name=document-print
Selection=Any
Separator=;
Extensions=txt;pdf;jpg;gif;png

Wie man sieht, ähnelt die Datei von Aufbau einer Desktopdatei, was kein Zufall sein dürfte 😉

Wir können also beliebige Experimente machen, was man oben im #Exec Kommentar sehen kann.  Die Auskommentierte Anweisung öffnet ein Terminal, gibt per Echo die Files aus, die selektiert wurden und piped das an Less, so daß man das sehen kann. Ohne Less würde das Fenster sofort wieder zu gehen.

Die Anweisung „Exec=<print.sh %F>“ bezieht sich auf einen Befehl, hier ein Bashscript, im Actionsverzeichnis selbst, statt auf absolute Pfade zurück zugreifen.

Mit „Extensions=txt;pdf;jpg;gif;png“ legen wir fest, daß wir nur im Context von diesen Endungen angezeigt und ausgeführt werden wollen. Sinnvoll, denn MP3 Files kann man zwar drucken, aber das Ergebnis dürfte ernüchternd sein.

Der Separator „;“ ist wichtig, weil sich sonst Filelisten mit „Leerzeichen“ im Dateipfad oder -namen  nicht parsen liessen.
Wer das ohne versucht, wird todsicher scheitern, sobald ein “ “ irgendwo auftaucht.

„document-print“ ist ein Theme übergreifender Symbolname, so daß Hoffnung besteht, das neben Adwaita auch andere Themes ein Symbol parat haben werden.

Wer alle Optionen kennenlernen will, die in so einer Action benutzbar sind, kann sich das hier ansehen:

https://github.com/linuxmint/nemo/blob/master/files/usr/share/nemo/actions/sample.nemo_action

Das Print-Bash-Script

Das Bashscript ist für unsere Zwecke ausreichend, die keine besonderen Anforderungen an das Drucken stellen:

#!/bin/bash

IN=$*
date -R > ~/.local/share/nemo/actions/print.log
IFS=";" read -ra FILES <<< "$IN"
for i in "${FILES[@]}"; do
 echo "processing $i" >> ~/.local/share/nemo/actions/print.log
 lp -o fit-to-page "$i"
done

nochmal im Einzelnen :

IN=$*

Liest alle Argument in die Variable IN ein.

date -R > ~/.local/share/nemo/actions/print.log

Initialisiert unser Logfile, damit wir etwaige Fehler erkennen können.

IFS=“;“ read -ra FILES <<< „$IN“

Splittet die Argumentenliste am „;“ auf, so daß wir wissen, was zum Filenamen gehört und was nicht. Das Ergebnis kommt in einen Array, der in der For-Schleife durchgeackert wird:

for i in „${FILES[@]}“; do
      echo „processing $i“ >> ~/.local/share/nemo/actions/print.log
      lp -o fit-to-page „$i“ >> ~/.local/share/nemo/actions/print.log
done

lp ist unser Druckbefehl. Der kann PDF, Txt und alle gängigen Grafiken drucken. die Option „-o fit-to-page“ passt das Printgut an die maximal Größe der Seite an aka. wir drucken immer mit 100%. Sollte es ein ganz kleines Bild sein, wird es später stark vergrößert sein.

Den jeweils letzten Printjob kann man sich dann im Logfile ansehen, wo hoffentlich keine Fehlermeldung stehen wird 🙂

Vorteile

Der große Vorteil dieser ganzen Action ist, daß die Reihenfolge genau so sortiert ist, wie im Nemo auch angezeigt wird. Damit können wir z.b. einen Stapel Rechnungen nach Rechnungsnummern sauber in der richtigen Reihenfolge drucken.

Files zum Drucken selektieren

Wenn man z.b. alle selektierten PDF Rechnungen mit Evince öffnen würde, könnte man das nicht mehr, bzw. nur mit großen Aufwand. So ist das jetzt ein Klacks! Dateien markieren, Print auswählen und Papiere einsammeln.

Gedruckt wir das Ganze dann an den Standarddrucker.

Heldenapplaus bitte in der Kommentarsektion abgeben, Reklamationen auch. Ich optimiere das gerne weiter 🙂

15 thoughts on “Linux – einfache Print Option für Nemo

  1. Unter Linux Mint Cinnamon muss man die Nemo-Action Dateien mit der Endung *.nemo_action abspeichern. Erst dann funktionierts.

    Natürlich auch der Heldenapplaus für Marius.

    • Das ist auch bei Fedora so, ich habe das mal ergänzt. Danke.

      Was ich mich die ganze Zeit frage ist, wieso die Printfunktion nicht von vorn herein dabei ist ? Offensichtlich ist es ja nicht schwer sowas zu machen.

  2. hey marius, vielen dank für deine kleine erweiterung!
    ich bin leider nur „user“ und habe kaum ahnung vom programmieren.
    ich hab alles nach anleitung gemacht, im actions ordner die action und die batch erstellt und der print befehl wird auch im menue angezeigt. allerdings passiert nichts…. nicht einmal ein log file…
    per lp im terminal drucken funktioniert…. vielleicht kannst du mir ja helfen? wäre toll, denn ich habe genau dieses rechnungen drucken problem! gruß max

    • Klar..

      in dem File „print.nemo_action“ stehen drei EXEC Anweisungen:

      #Exec=echo „%F“ >> /tmp/print.log
      #Exec=gnome-terminal -x sh -c „echo %F | less“
      Exec=

      Mal in :

      #Exec=echo „%F“ >> /tmp/print.log
      Exec=gnome-terminal -x sh -c „echo %F | less“
      #Exec=

      ändern und den Printvorgang starten. Es muß sich ein Terminal mit dem Filenamen drin öffnen.

      Änderung wieder rückgängig machen .

      Wenn das geht, liegt es nicht an der „print.nemo_action“, sondern ..

      a) liegt die print.sh direkt neben der print.nemo_action ? Falls Nein: da hin kopieren.
      b) die Datei „~/.local/share/nemo/actions/print.log“ wird min. mit dem Datum darin erstellt.
      Wenn die Datei NICHT erstellt wird, ist das etwas, was man von hier aus so nicht beheben kann.
      ABER ich TIPPE in dem Fall darauf, daß der Scourcecode per Copy & Paste von der Webseite kopiert und dabei von WordPress ( nicht Dein Fehler) verändert wurde. Ersetze mal alle „-“ mit echten „-„, weil WordPress macht da gern die falsche HTML Entität draus, so daß beim Kopieren Zeichen in das Script kommen, die Bash nicht kann.

      FALLS das Datum in der Datei auftaucht, aber „Processing..“ und die Ausgabe von LP nicht,
      dann könnte es sein, daß Deine Pfade nicht eindeutig sind. Dann einfach absolute Pfade zu den Programmen in das Script schreiben. bekommt man so raus: „which lp“

      Das sieht dann in etwa so aus:
      [ actions]$ which lp
      /usr/bin/lp
      [ actions]$

      Ich hoffe, das hilft.

      • hi marius,
        ich habe nun alles probiert 😉
        also, printbefehl als kommentar gesetzt und die terminal ausgabe aktiviert zeigt tatsächlich den dateipfad an… die print.sh liegt aber im gleichen ordner wie die action! sämtliche sonderzeichen hab ich gegen „echte“ ausgetauscht, bringt auch nichts…
        nur das batch ausführen(inhalt in shell eingefügt) erstellt allerdings die datei mit datum!
        also schafft es die action nicht das shell auszuführen? wäre echt toll wenn du mir helfen kannst. sonst muss ich halt alternativ in der shell immer alle pdfs drucken, was natürlich auch funktioniert, aber für einen nOOb wie mich eher nervig ist 😉 …
        gruß
        max

  3. ahhhhhh ok, einer plötzlichen eingebung folgend das olle batch erstmal auf ausführbar gesetzt…
    jetzt funzt es natürlich! danke für deine mühen und sorry für die blöden fragen… das problem sitzt wie immer vor dem computer 😉
    gruß
    max

  4. Ich habe es unter Debian 9 analog mit /usr/share/nemo/actions versucht. Daher:
    1. Datei print.nemo_action erstellt mit

    [Nemo Action]
    Name=Print
    Comment=Printing from Nemo

    #Exec=gnome-terminal -x sh -c „echo %F | less“
    Exec=
    Icon-Name=document-print
    Selection=Any
    Separator=;
    Extensions=txt;pdf;jpg;gif;png;doc;odt;rft;ott;ods;xls

    2. Datei print.sh erstellt mit

    #!/bin/bash

    IN=$*
    date -R > /usr/share/nemo/actions/print.log
    IFS=“;“ read -ra FILES <<> /usr/share/nemo/actions/print.log
    lp -o fit-to-page „$i“
    done

    3. Die Dateien unter /usr/share/nemo/actions gespeichert.
    4. Die Dateien ausführbar gemacht.

    Folgen: Beim Druck einer .txt kam der Hinweis, der Druck sei unterbrochen worden. Beim Druck einer .odt zieht sich der Drucker statt eines einzigen Blattes ein Blatt nach dem anderen und druckt jeweils nur einige Zeilen wirrer Zeichen. Den Druckvorgang musste ich manuell abbrechen. Es wurde keine print.log unter /usr/share/nemo/actions gespeichert.

    5. Dann das Gleiche noch einmal mit ~/.local/share/nemo/actions

    Folgen: Hinsichtlich der .txt und der .odt dto. Jedoch wurde jetzt wenigstens die print.log unter ~/.local/share/nemo/actions angelegt.

    • Die antworten sind leicht :

      1) unter /usr/share… hat Dein user keine Schreibrechte , ergo kein logfile 🙂

      2) odt ist ein Spezial Format, daß LPR schlicht nicht kennt und die Datei deswegen binär druckt.

      Für PDF gibts Bashtools, die das Umwandeln vorm Drucken für LPR machen, deswegen klappt das.

      • Zu 1: Dachte ich mir.
        Zu 2: Wenn .odt nicht unterstützt wird, ist die Druckfunktion über diese beiden Dateien für mich sinnlos.

        Warum .txt unterbrochen wurde, ist damit noch nicht geklärt. Macht aber nichts, weil .odt eh nicht unterstützt wird.

        Danke für die Antworten!

  5. Vielen Dank für die Anleitung, sie hat mir sehr weitergeholfen. Ich habe sie für mich etwas angepasst:
    1. Wenn in der nemo_action-Datei der Wert von „Selection“ auf any steht, dann erscheint „Print“ auch im Kontextmenü, wenn gar keine Datei angeklickt ist. Ich hatte den Wert daher zunächst auf „m“ (für multiple) geändert, allerdings erscheint „Print“ dann nicht im Kontextmenü, wenn man einen Rechtsklick auf nur eine Datei macht. Nach etwas experimentieren, sah ich dann ein, dass man bei „Selection“ nicht zwei Werte eintragen kann, also habe ich eine komplett neue Nemo-Action für Singele-Selection erstellt. Ich habe die Dateien print_s.nemo_action und print_m.nemo_action genannt. Statt „Selection=any“ steht in der Datei print_s.nemo_action „Selection=s“ und in der Datei print_m.nemo_action „Selection=m“. Beide Dateien greifen auf das gleiche Bash-Skript zu.
    Damit taucht „print“ (bei mir heißt es „Drucken“) nicht mehr im Kontextmenü bei einem Rechtsklick auf, wenn man keine Datei angeklickt hat.
    2. Auch ich wollte die Möglichkeit haben, LibreOffice-Dateien zu drucken. Auch hierfür habe ich zwei Nemo-Action-Dateien, je für single und multiple Auswahl erstellt. Als Dateiendungen habe ich typische Office-Dateitypen angegeben:
    [Nemo Action]
    Name=Drucken
    Comment=Printing LibreOffice files from Nemo
    #Exec=gnome-terminal -x sh -c „echo %F | less“
    Exec=
    Icon-Name=document-print
    Selection=m
    Separator=;
    Extensions=odt;ods;xlsx;docx;xls;doc
    Auch das Bash-Skript habe ich angepasst. Statt „lp“ wird die Druckfunktion von LibreOffice verwendet:
    #!/bin/bash
    IN=$*
    date -R > ~/.local/share/nemo/actions/printlo.log
    IFS=“;“ read -ra FILES <<> ~/.local/share/nemo/actions/print.log
    soffice –invisible -p „$i“
    done
    Ich hatte noch keine Gelegenheit dies alles an einem echten Drucker zu testen, auch konnte ich die Verarbeitung der Microsoft-Formate noch nicht testen. Das Drucken auf einen PDF-Drucker von Textdateien, PDF- und Writer-Dokumenten hat hier aber problemlos funktioniert.
    Ich hoffe dies hilft vielleicht dem ein oder anderen weiter.

Comments are closed.