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

ImageMagick convert - Bilderserien konvertieren [gelöst]

Znarf

Member
Hallo Linuxgemeinde,

ich würde gerne automatisiert viele Tifs in einem Ordner in einzelne Pdfs umwandeln.
Convert ist ja ein Super-Werkzeug, leider aber auch sehr komplex.
Frage: Weiß jemand, ob es Befehlsargumente für convert gibt, die mir aus vielen einzelnen Tifs die entsprechenden Pdfs machen.

Mit convert *.tif *.pdf wird aus den vielen Tifs eine einzelne große Pdf erzeugt (sozusagen ein Buch). Mit convert 1.tif 1.pdf lässt sich jedes einzelne tif problemlos konvertieren. Wenn ich aber eine durchnumerierte Bilderserie von z.B. 200 Tifs habe und dann die entsprechenden Pdfs haben möchte also 1.tif --> 1.pdf, 2.tif --> 2.pdf usw. - wie könnte ich das realisieren? Vielleicht hat ja jemand einen Tipp, ggf. auch für ein kleines Skript oder ein anderes Linuxprogramm, mit dem man das bewerkstelligen könnte (bin leider kein Profi).

Danke für jeden Hinweis.


Gruß Z.
 

komma4

Member
Znarf schrieb:
einen Tipp, ggf. auch für ein kleines Skript

Wenn die Bilder durchnummeriert sind, dann kannst Du Dir ein Skript basteln:

Code:
#!/bin/sh
for i in $(seq 200); do
  convert $i.tif $i.pdf
done


Hilft Dir das weiter?
 

Bibaltik

Member
Oder die PDF zum Schluss einfach wieder splitten.

Wobei ich komma4 seinen Ansatz eleganter finde (auch wenn das Script noch Ausbaufähig ist).

mfg
 

komma4

Member
Bibaltik schrieb:
das Script noch Ausbaufähig ist
Gebe ich Dir völlig recht:

Zunächst würde ich mir noch Meldungen einbauen, damit ich sehe, das was passiert.
Dann noch eine Abfrage, ob die Datei auch vorhanden ist, die konvertiert werden soll.

Und weil es mich auch interessieren würde: eine Stoppuhr, welche die Laufzeit misst und am Ende ausgibt.

Gehen Deine Überlegungen in die gleiche Richtung - oder noch weiter?
 

Bibaltik

Member
Ich weiß zwar grad nicht warum du so pampig reagierst, aber ich dachte eher an Verzeichnisinhalt auslesen etc...
 

komma4

Member
Danke für die Rückmeldung.

Ich weiss nun nicht, warum Dir meine Antwort "pampig" erscheint - so war sie auf jeden Fall nicht gedacht.

Wie Du vllt. an meiner geringen Anzahl von Postings hier siehst bin ich neu im Ratgeben bei Linuxfragen und versuche deshalb noch was zu lernen. Deshalb meine Rückfrage.

Alles gut, Kollege?!
Gruss nach HH aus Thailand
 
OP
Z

Znarf

Member
Danke Euch für die Antworten. Das Skript mit den Befehlen von komma4 hab ich etwas anders auch hier http://linuxwiki.de/ImageMagick gefunden und scheint zu funktionieren; was bedeutet seq 200 ? dass nur 200 Bilder konvertiert werden? Kann man das ganz weglassen, wenn manb es bei allen machen möchte (ich hab 200 nur als Beispiel hinschreiben?
Das mit dem Splitten finde ich auch interessant, aber wie geht das? Auch mit convert?

Gruß Z.
 

Bibaltik

Member
ein Tool was scheinbar simpel aussieht ist pdfsam aber pdftk und Konsorten können das auch. Evtl kennt wer ein simples Tool welches in den Repositorys vorkommt...
 

komma4

Member
komma4 schrieb:
würde ich dann vllt.ein find Befehl verwenden.

Moin.

Code:
workDIR=`pwd`
for findfile in $( find . -maxdepth 1 -name "*.tif" );   
	 # für alle gefundenen 
	 do
		# Endung entfernen und durch "pdf" ersetzen
		targetPDF=`basename $findfile .tif`.pdf
		convert "$workDIR/$findfile" "$workDIR/$targetPDF";
	done
 
OP
Z

Znarf

Member
Ok, diese Syntax überfordert mich als Laien allerdings etwas. workDIR= ist das Verzeichnis in dem die zu bearbeitenden Bilder liegen, und pwd ist dieses Verzeichnis, oder steht das für etwas anderes? maxdepth ?
Gruß Z.
 

komma4

Member
Mit der Anweisung
Code:
workDIR=`pwd`
wird der Name des aktuellen Verzeichnisses in die Variable workDIR geschrieben.

Der find Befehl sucht dann in den aktuellen Verzeichnis alle Dateien, die auf *.tif enden.
Dabei werden Unterverzeichnisse nicht durchsucht (-maxdepth 1)

Die gefundenen Dateinamen werden an die do...done Klammer übergeben und bearbeitet

Mit der basename Anweisung wird die Endung .tif der gefundenen Dateienamen durch .pdf ersetzt (also der Zielname des convert festgelegt)

Verständlich?

Die Zeilen in eine Datei (convert2pdf) schreiben, im Pfad speichern, ausführbar machen (chmod +x convert2pdf) und im Quellverzeichnis der TIFs aufrufen.
 
OP
Z

Znarf

Member
Super. Vielen Dank! Konkretes Beispiel ist doch für Greenhorns leichter nachvollziehbar als die Man Page.

Gruß Z.
 
OP
Z

Znarf

Member
So, das klappt wunderbar, sowohl mit der Befehlskette von komma4 wie auch mit einer etwas anderen Befehlsfolge
Code:
for i in *.bmp; do convert "$i" "${i%.bmp}.png" ; done
.
Nun wage ich, unsere Spezialisten zur Perfektionierung eines kleinen Skriptes noch etwas weiter zu befragen: Ich habe das Problem, dass aus unerklärlichen Gründen seit 4 Wochen auf meiner openSUSE 11.2 die Postfix-Zustellung von Systemmails in das lokale Postfach (kmail) bzw. Maildir-Fach nicht mehr klappt, obwohl die Faxe sauber verschickt und empfangen werden (capisuite-Fax). Deshalb liegen die Faxdateien nunmehr als sff's wenig benutzerfreundlich in /var/spool/capisuite/done bzw. /var/spool/capisuite/users/user/received.

Als Workaround habe ich mir eher unelegant diese Befehlsfolge in einem Skript gebastelt
Code:
cp /var/spool/capisuite/users/user/received/fax-*.sff /home/user/Faxempfang/
sfftobmp -T /home/user/Faxempfang/fax-*.sff -o /home/user/Faxempfang/
rm /home/user/Faxempfang/fax-*.sff
. Das funktioniert und ich erhalte Tiffs. Nachteil ist, dass dabei immer alle sff's im Ursprungsverzeichnis erneut umgewandelt und verschoben werden, und es durch das nicht erfolgende Übershcreiben der alten Dateien zu Fehlermeldungen kommt. Eigentlich bräuchte ich ja immer nur die "neudazugekommenen" sff's, die bereits verschobenen könnte man ja unangetastet lassen. Wenn mir da noch jemand weiterhelfen könnte, wäre ich wirklich sehr dankbar. Dann könnte ich in einem einzigen Skript erst die ssftobmp-Anweisung laufen lassen, dannn nach z.B. einem sleep 5 die convert-Anweisungen durchführen, fertig.

Falls ich es in einem neuen Thread machen soll, bitte kurzen Hinweis.

Gruß Z.

P.S. Das Postscript-Problem konnte ich leider auch über ein Forum nicht lösen, kann ich aber damit leben, falls der Workaround geht.
 

komma4

Member
Znarf schrieb:
Falls ich es in einem neuen Thread machen soll, bitte kurzen Hinweis.
Hätte ich besser gefunden, aber was soll's...


Bin schon wieder mit dem find Befehl unterwegs...

der hat einen Schalter -anewer file, der nur die Ergebnisse anzeigt, die jünger sind als der Zeitstempel von file

also:

1. Schritt:
Vergleichsdatei erzeugen, auf einer Kommandozeile
Code:
touch /home/user/Faxempfang/letzterLauf
Erzeugt eine leere Datei, dessen Zeitstempel wir nutzen können


2. Schritt: nach Faxempfang, suchen aller neuen Dateien; alle Zeilen in eine Datei schreiben, die mit chmod +x Datei ausführbar machen

Code:
#!/bin/bash
for findfile in $( find /var/spool/capisuite/users/user/received -maxdepth 1 -type f -name "fax-*.sff" -anewer /home/user/Faxempfang/letzterLauf );   
    # für alle gefundenen 
    do
       # Deine Befehle hier
       cp $findfile /home/user/Faxempfang
       sfftobmp -T /home/user/Faxempfang/fax-*.sff -o /home/user/Faxempfang/
       rm /home/user/Faxempfang/fax-*.sff
    done

# Zeitstempel erneuern
touch /home/user/Faxempfang/letzterLauf

# reguläres Ende
exit 0

Hilft Dir das?
 
OP
Z

Znarf

Member
Ganz herzlichen Dank, das ist super. Ich würde nach dem touch-Befehl dann gerne innerhalb eines Skriptes noch die Convert-Befehlserie anschließen, etwa so:

...

Code:
sleep 5
workDIR=`pwd`
for findfile in $( find . -maxdepth 1 -name "*.tif" );   
    # für alle gefundenen
    do
      # Endung entfernen und durch "pdf" ersetzen
      targetPDF=`basename $findfile .tif`.pdf
      convert "$workDIR/$findfile" "$workDIR/$targetPDF";
   done
#Ende
exit 0

um mir in einem Zug die gewünschten pdf-s zu erzeugen. Ist das okay ? Na ja, werde es einfach mal probieren.

Viele Grüße Z.
 
OP
Z

Znarf

Member
So, ich habe das nach Komma4 s Anleitung jetzt einmal versucht und bekomme
Code:
for findfile in $( find /var/spool/capisuite/users/~/received -maxdepth 1 -type f -name "fax-*.sff" );                                                                       
>     do                                                                                        
>        # sff s in tif s umwandeln                                                             
>        cp $findfile /home/~/Faxempfang                                                    
>        sfftobmp -T /home/~/Faxempfang/fax-*.sff -o /home/~/Faxempfang/                
>        rm /home/~/Faxempfang/fax-*.sff                                                    
>     done                                                                                      
ERROR: Given output file is directory.                                                          
ERROR: Given output file is directory.        usw.

Irgendwas stimmt in der Syntax noch nicht, vielleicht habe ich es falsch übernommen ?? Sieht jemand den Fehler ?


Gruß Z.
 
OP
Z

Znarf

Member
Das Skript funktioniert, nur der anewer- Zusatz wollte nicht, aber das macht nichts, weil sfftobmp die bereits vorhandenen tif s nicht überschreibt, sondern auslässt, wenn man es ohne -f laufen lässt.

Danke an alle, besonders komma4, hab wieder gut dazugelernt.

Gruß Z,.
 
Oben