ubuntuusers.de

Mehrseitiges Dokument scannen und in ein PDF umwandeln

Status: Gelöst | Ubuntu-Version: Ubuntu
Antworten |

Lausi

Avatar von Lausi

Anmeldungsdatum:
26. Februar 2005

Beiträge: 209

Wohnort: Biel, Schweizlein

Hallihallo

Vornewech: Ich bin (noch?) kein Skriptexperte, habe selber noch nie eins geschrieben, nur in denen von anderen rumgefummelt 🙄 So auch jetzt.

Aaalso: Ich möchte mehrseitige Dokumente scannen und in pdf's umwandeln. Dazu habe ich von hier das Skript kopiert und etwas angepasst:

#! /bin/bash

# Scan Images Device-Einstellungen
scanimage --device=epson:libusb:001:003 --batch=out%d.pnm --batch-start=11 --wait-for-button --resolution=360
#Nach Scannen der letzten Seite zwei Mal CTRL-C druecken

# Delete last image as it is invalid
ls out*.pnm | sort | tail -1 | xargs rm

# Create TIFFs pnmrotate=Rotation im Uhrzeigersinn
echo "Creating TIFF images..." 
ls out*.pnm | while read p; do echo $p; q=`echo $p | sed 's/out\(.*\)\.pnm/tiff\1.tif/'`; echo $q; cat $p | pnmrotate -noantialias -00 | pnmtotiff -lzw > $q; done

# Create one big TIFF
echo "Combining TIFF images..." 
tiffcp -c lzw tiff* document.tif

# Create PDF: Autor (-a) und Titel (-t)
echo "Creating PDF document..." 
tiff2pdf -z document.tif -o document.pdf -a "Niklaus Haehlen" -t "Titelname"

# Name des optimierten Dokuments
echo "Optimizing PDF..."
pdfopt document.pdf NAME.pdf

echo "Cleaning up..."
rm *.pnm
rm tiff*
rm document.tif
rm document.pdf

Funzt wunderbar, hat aber noch Optimierungspotential 😉

Ich benutze einen USB-Scanner (Epson Stylus CX 6400 All-in-one) und der sucht jedesmal wenn ich ihn neu unter Strom setze einen neuen Port, wie so üblich bei USB.

klaus@Kubuntu:~/ori_sw$ scanimage --list-devices
device epson:libusb:001:003' is a Epson Unknown model flatbed scanner

Dabei ändert sich :003 in :004 oder :005 etc, je nachdem, wie oft ich den Scanner starte. Das "Unknown Epson model" ist irrelevant, der Scanner scannt wunderbar.

Frage: Wie kann ich das automatisieren, dass das Skript jedesmal zuerst die Abfrage macht und anschliessend die erste Zeile korrekt abfüllt?

Weiter: Wie kann ich das Skript dazu bringen, dass es nach der Auflösung, der Rotation, dem Titel und dem Name mit Pfad frägt und dann durchrattert? Allenfalls sogar eine einfache GUI erstellen?

Ich denke, das wäre eine enorme Steigerung der Usability und ist sicher nicht nur für mich interessant!

Danke für alle Antworten.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Ist die Frage noch aktuell?
Mit sed kann man Muster suchen und ersetzen.
Mit $(commando) spezifiziert man die Ausgabe des Kommandos.

PORT=$(scanimage --list-devices | sed 's/.*libusb://g;s/. is a Epson.*//g')
# Scan Images Device-Einstellungen
scanimage --device=epson:libusb:$PORT --batch=out%d.pnm --batch-start=11 --wait-for-button --resolution=360
#Nach Scannen der letzten Seite zwei Mal CTRL-C druecken

Eine grafische Abfrage kann man mit zenity einfach realisieren:

GRADZAHL=$(zenity --entry --text "Wieviel Grad drehen?" --entry-text "90")
Aber für 3 Eingaben braucht man 3 Dialoge.

Lausi

(Themenstarter)
Avatar von Lausi

Anmeldungsdatum:
26. Februar 2005

Beiträge: 209

Wohnort: Biel, Schweizlein

Hiho

Danke für Deine Antwort, Dich schickt der Himmel ☺ Es war zwischenzeitlich nicht mehr besonders aktuell, aber gerade demnächst habe ich wieder so eine Übung vor mir...

Zenity ist toll, kannte ich nicht. Das gibt was Schönes.

Mit dem PORT-scannen gibt's noch Probleme:

#! /bin/bash

# Port bestimmen
PORT=$(scanimage --list-devices | sed 's/.*libusb://g;s/. is a Epson.*//g')

# Scan Images Device-Einstellungen
scanimage --device=epson:libusb:$Port --batch=out%d.pnm --batch-start=11 --wait-for-button --resolution=180 -y 297 -x 210 --mode Color 
##etcbliblablu


gibt folgende Ausgabe:

family@ubuntu:~/ori_sw$ ./scan2pdf.original
scanimage: open of device epson:libusb: failed: Invalid argument
ls: out*.pnm: Datei oder Verzeichnis nicht gefunden 
## etc, klaro, weil er gar nicht gescannt hat


Wie müsste der sed-Befehl genau aussehen? Mein Programmier-Englisch reicht gerade zum Bier bestellen, aber ist leider echt zu bescheiden, als dass ich aus "man sed" schlau wurde ☹

Danke bereits zum Voraus!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Dann füg mal ein Debug-Statement ein, damit man sieht, was in der 'PORT'-Variablen steht:

# Port bestimmen
PORT=$(scanimage --list-devices | sed 's/.*libusb://g;s/. is a Epson.*//g') 
echo "Port: " $PORT " gefunden."
exit

Lausi

(Themenstarter)
Avatar von Lausi

Anmeldungsdatum:
26. Februar 2005

Beiträge: 209

Wohnort: Biel, Schweizlein

Hmm...

family@ubuntu:~/ori_sw$ ./scan2pdf
Port: 001:003 gefunden.

Ausschalten, einschalten:

family@ubuntu:~/ori_sw$ ./scan2pdf
Port: 001:004 gefunden.

Sollte eigentlich gut sein...
Also das "exit" entfernt, neugestartet:

family@ubuntu:~/ori_sw$ ./scan2pdf
Port: 001:004 gefunden.
scanimage: open of device epson:libusb: failed: Invalid argument
ls: out*.pnm: Datei oder Verzeichnis nicht gefunden
rm: zu wenige Argumente
etcetcetc...

😲

Ratlos.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Lausi hat geschrieben:

# Port bestimmen
PORT=$(scanimage --list-devices | sed 's/.*libusb://g;s/. is a Epson.*//g')

# Scan Images Device-Einstellungen
scanimage --device=epson:libusb:$Port --batch=out%d.pnm --batch-start=11 --wait-for-button --resolution=180 -y 297 -x 210 --mode Color

Die bash ist, wie fast alles unter Linux, 'casesensitiv', sprich: unterscheidet Groß- und Kleinschreibung, so daß Port, port, PORT, pORT und pOrT jeweils unterschiedliche Sachen sind - und per default null, nix, nada, riente, de rien, gar nix, leer, ...

Lausi

(Themenstarter)
Avatar von Lausi

Anmeldungsdatum:
26. Februar 2005

Beiträge: 209

Wohnort: Biel, Schweizlein

Ach klar, LOGO. Hätte ich auch drauf kommen sollen 🙄

Merci biäng, jetzt läufts! Und die zenity-Zeilen baue ich auch noch ein, dann wird ein richtig schönes Skriptli.

Danke!

Lausi

(Themenstarter)
Avatar von Lausi

Anmeldungsdatum:
26. Februar 2005

Beiträge: 209

Wohnort: Biel, Schweizlein

Hallihallo

Ich komme noch mal...

Ich kann die Optionen von tiff2pdf und pdfopt nicht mit den via zenity aufgenommenen Werten abfüllen:

AUTHOR=$(zenity --entry --text "Autor?" --entry-text "Klaus Hählen")
TITLE=$(zenity --entry --text "Titel?")
NAME=$(zenity --entry --text "Dateiname? (XXX.PDF)")

...

echo "Baue PDF..."
tiff2pdf -z document.tif -o document.pdf -a $AUTHOR -t $TITLE

# Name des optimierten Dokuments
echo "Optimiere PDF..."
pdfopt document.pdf $NAME

Die Fehlermeldungen sind wortgewandt, klar ist nur, dass er ein Chaos in den Optionen hat:

...
Baue PDF...
tiff2pdf: No support for multiple input files.
LIBTIFF, Version 3.7.3
Copyright (c) 1988-1996 Sam Leffler
Copyright (c) 1991-1996 Silicon Graphics, Inc.

usage: tiff2pdf [options] input.tiff
options:

  • o: output to file name

    • j compress with JPEG

      • z compress with Zip/Deflate

        • q: compression quality

          • n no compressed data passthrough

            • d do not compress (decompress)

              • u: set distance unit, 'i' for inch, 'm' for centimeter

                • x: set x resolution default in dots per unit

                  • y: set y resolution default in dots per unit

                    • w: width in units

                      • l: length in units

                        • r: 'd' for resolution default, 'o' for resolution override

                          • p: paper size, eg "letter", "legal", "A4"

                            • f set PDF "Fit Window" user preference

                              • e: date, overrides image or current date/time default, YYYYMMDDHHMMSS

                                • c: sets document creator, overrides image software default

                                  • a: sets document author, overrides image artist default

                                    • t: sets document title, overrides image document name default

                                      • s: sets document subject, overrides image image description default

                                        • k: sets document keywords

                                          • b set PDF "Interpolate" user preference

                                            • h usage
                                              Optimiere PDF...
                                              Error: /undefinedfilename in --file--
                                              Operand stack:

                                              • -nostringval-- (Name.pdf) (document.pdf) (r)
                                                Execution stack:
                                                %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1 3 %oparray_pop 1 3 %oparray_pop 1 3 %oparray_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- --nostringval--
                                                Dictionary stack:

                                                • -dict:1025/1417(ro)(G)– --dict:0/20(G)– --dict:99/200(L)–
                                                  Current allocation mode is local
                                                  Last OS error: 2
                                                  Current file position is 32000
                                                  ESP Ghostscript 7.07.1: Unrecoverable error, exit code 1
                                                  Räume auf...
                                                  rm: Entfernen von „document.pdf“ nicht möglich: Datei oder Verzeichnis nicht gefunden

Wenn ich hingegen die Optionen -a $AUTHOR -t $TITLE lösche, rennt das Skript bis zum Schluss ☹ Die Variablen in "" zu kleiden bringt auch nix, auch wenn gemäss "man:tiff2pdf" der Text der Optionen in Anführungszeichen stehen soll.
Wie könnte ich die Optionen abfüllen?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Lausi hat geschrieben:

Die Variablen in "" zu kleiden bringt auch nix, auch wenn gemäss "man:tiff2pdf" der Text der Optionen in Anführungszeichen stehen soll.
Wie könnte ich die Optionen abfüllen?

a) Auch wenn es weh tut, würde ich es erstmal ohne Umlaute probieren:

AUTHOR=$(zenity --entry --text "Autor?" --entry-text "Klaus Haehlen")

b) Das hast Du erfolglos probiert:
tiff2pdf -z document.tif -o document.pdf -a "$AUTHOR" -t "$TITLE"

Die Fehlermeldung sieht nämlich so aus, als ob tiff2pdf zu viele Parameter findet, und
-a Klaus Hählen
als Autor: Klaus interpretiert, und 'Hählen' als verbotenen Versuch, eine zweite Datei anzugeben namens Hählen.
Analog mit $TITLE und später mit pdftopt.

Lausi

(Themenstarter)
Avatar von Lausi

Anmeldungsdatum:
26. Februar 2005

Beiträge: 209

Wohnort: Biel, Schweizlein

Mit Deiner Analyse lagst Du goldrichtig.

Henusode, ich muss mal schauen, ob ich einen einigermassen akzeptablen (und v.a. einfachen!) Workaround finde.

Danke schon mal für die Hilfe, der Thread ist schon mal [erledigt]!

Antworten |