• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[geloest] Script-Prorammierung:pipe,Befehlsverkettung klappt

Knappe

Hacker
Hallo,

stelle mich im Moment nur doof an, finde auch keine richtigen Stichwoerter und kann daher hier im Forum nicht richtig nach einer Problemloesung suchen :?

Folgendes :

1. Ich muss in einer Befehlszeile mehrere Programme verknuepfen.
2. Jedes Programm braucht eine Input-Datei und erzeugt auch eine Ausgabe-Datei.

Es handelt sich dabei um das Einscannen von Dokumenten, das Umformatieren in ein bestimmtes Format und anschliessend die entgueltige Abspeicherung via Webbrowser.

Hierzu verwende ich bisher folgenden Befehlssyntax :
Code:
# scanimage -d libusb:1:2 --mode Gray --resolution 150dpi -l 0mm -t 0mm -x 210mm -y 297mm | pnmtojpeg --quality=95
Die von scanimage erzeuge Ausgabe im pnm-Format wird direkt an "pnmtojpeg" weitergeben und dieses uebergibt den konvertierten Inhalt (jpeg-Format) wiederum ueber
header ("Content-Type: image/jpeg");
header ("Content-Disposition: attachment; filename=mytest1.jpg");
an den Browser.

Soweit, so gut.

Anstelle von "pnmtojpeg" muss jetzt aber das Programm "ps2pdf" benutzt werden, da die Library "netpbm" keine Konvertierung nach ".pdf" zulaesst.

"ps2pdf" hat das Format
Usage: ps2pdfwr [options...] (input.[e]ps|-) [output.pdf|-]

Wenn ich jetzt nachfolgende Zeile eingebe
Code:
# scanimage -d libusb:1:2 --mode Gray --resolution 150dpi -l 0mm -t 0mm -x 210mm -y 297mm | /usr/bin/ps2pdf -sPAPERSIZE=a4
erhalte ich im Apache-Log Fehlermeldungen und die Ausgabe(datei) ist leer - der Browseraufruf ist natuerlich wie folgt angepasst :
header ("Content-Type: application/pdf");
header ("Content-Disposition: attachment; filename=mytest1.jpg");

Habe ich "nur" einen Denkfehler oder wo liegt mein Problem. Ich komme einfach drauf.

Ware fuer jeden Denkanstoss dankbar (koennen auch Such-Stichworte sein) :wink:
 

Leviathan

Hacker
Ich versteh nicht ganz welche Schnittstelle du zwischen pnmtojpeg und dem Webbrowser realisierst.

Zwei Punkte fallen mir spontan ein.

1. scanimage wird nicht gefunden, demnach gibts ne Fehlermeldung auf stderr der nicht weitergepipt wird, da nur stdout weitergeleitet wird.

2. userrechte datei nicht ausführebar oder datei nicht schreibbar

scanimage -d libusb:1:2 --mode Gray --resolution 150dpi -l 0mm -t 0mm -x 210mm -y 297mm 2>&1 | pnmtojpeg --quality=95

ggf. mal so starten 2>&1

Gruß Dominik
 
A

Anonymous

Gast
Ich sehe auch nicht das du irgend eine Eingabe dorthinleitest
ps2pdfwr [options...] (input.[e]ps|-) [output.pdf|-]

(input.[e]ps|-) also hier muss entweder das Eingabefile kommen oder der - (Strich) für die Standarteingabe
[output.pdf|-] nach einem Leerzeichen darf hier die Ausgabefile oder der - (Strich) für die Standardausgabe stehen

Keine Ahnung ob deinen andere Optionen stimmen dann sollte das dann in etwas so hier aussehen:
Code:
 ....... | /usr/bin/ps2pdf -sPAPERSIZE=a4 - - | .........
Dann wird in ps2pdf von der Pipe gelesen und wieder in die Pipe geschrieben.

robi
 
OP
K

Knappe

Hacker
Ich versteh nicht ganz welche Schnittstelle du zwischen pnmtojpeg und dem Webbrowser realisierst.

Nachfolgende :
Code:
$CMD = "scanimage --mode ".$_GET['mode']." --format=tiff --resolution ".$_GET['resolution']."dpi -l ".$_GET['geometry_l']."mm -t ".$_GET['geometry_t']."mm -x ".$_GET['geometry_x']."mm -y ".$_GET['geometry_y']."mm | /usr/bin/ps2pdf -sPAPERSIZE=a4";
$CONTENT_TYPE = "application/pdf";
$FILENAME = "phpsane1.pdf";
header ("Content-Type: $CONTENT_TYPE");
header ("Content-Disposition: attachment; filename=$FILENAME");
print `$CMD`;
exit;

Und das funktioniert mit

...| pnmtojpeg --quality=95
einwandfrei, aber eben nicht mit "ps2pdf ".

Das Ganze ist auch nicht meine Erfindung, sondern stammt aus dem Projekt "phpsane" von hier

Scanimage wird gefunden.
Nein das Problem ist "ps2pdf". Irgendetwas stimmt da nicht, aber was ?
 
A

Anonymous

Gast
Knappe schrieb:
Nein das Problem ist "ps2pdf". Irgendetwas stimmt da nicht, aber was ?

pnmtojpeg arbeitet mit den Standardkanälen wenn keinen Dateien angegeben werden bei ps2pdf musst du einen Strich machen, damit er diese nimmt. also probier mal
Code:
.......... -sPAPERSIZE=a4 - ";
in deinem Fall

robi
 
Und weil man viele verrückte Sachen machen kann... gibt es auch :twisted:
Code:
/usr/bin/ps2pdf -sPAPERSIZE=a4 <(scanimage -d libusb:1:2 --mode Gray --resolution 150dpi -l 0mm -t 0mm -x 210mm -y 297mm)
Ganz interessant um "zwei mal STDIN" an Programme zu übergeben -- z.B. kann man ja nicht irgendwie
Code:
ls /tmp/a . . . | ... tmp/b ... | diff -u - -
machen, aber durchaus
Code:
diff -u <(ls /tmp/a) <(ls /tmp/b)


In einer Informatik-Übung gab es mal eine Aufgabe, deren Lösung z.B. so implementieren konnte:
Code:
ls /usr/bin/*sh | tee temp1 | grep -v ssh | tee temp2 | wc -l
Konfizuis macht daraus...:
Code:
wc -l <(grep -v ssh <(l /usr/bin/*sh | tee a) | tee b)
Man fühlt sich wie RPN ;-)
 
OP
K

Knappe

Hacker
/usr/bin/ps2pdf -sPAPERSIZE=a4 <(scanimage -d libusb:1:2 --mode Gray --resolution 150dpi -l 0mm -t 0mm -x 210mm -y 297mm)

Aber das hier funktioniert schon nicht : scanimage wird nicht ausgefuehrt ! :evil:

Schade eigentlich, waere wirklich eine Vereinfachung gewesen :cry:
 
Oben