Konvertieren mehrerer Bilddateien von JPEG in das PDF-Format

Antworten:

62

In der Bash:

for f in *.jpg; do
  convert ./"$f" ./"${f%.jpg}.pdf"
done
Enzotib
quelle
1
Gibt es einen bestimmten Grund, warum Sie den Argumenten von convert "./" voranstellen? Ist es eine allgemeine gute Praxis?
Rahmu
4
@rahmu: ja, es ist eine gute übung, da dateinamen mit -problemen anfangen , ansonsten.
Enzotib
3
Das funktioniert, ist aber mogrifyviel weniger tippend. Siehe meine Antwort.
cjm
+1, weil dies technisch korrekt ist und Bash-Fallen vermeidet, -1, weil Mogrify die Imagemagick-Methode zum Batch-Konvertieren von Bildern ist. Also keine Abstimmung von mir.
Benoit
@aculich: Vielen Dank für Ihre Ablehnung, aber Sie haben eine falsche Überlegung angestellt. Sehen Sie, warum for loop den Fehler "argument too long" nicht auslöst . .
Enzotib
56

Hierfür können Sie den mogrifyBefehl verwenden. Normalerweise werden Dateien direkt geändert, aber beim Konvertieren von Formaten wird eine neue Datei geschrieben (nur die Erweiterung wird an das neue Format angepasst). Somit:

mogrify -format pdf -- *.jpg

(Wie bei Enzotibs ./*.jpgwird --verhindert, dass fremde Dateinamen als Schalter interpretiert werden. Die meisten Befehle --bedeuten, dass an diesem Punkt nicht mehr nach Optionen gesucht wird.)

cjm
quelle
+1, meine Antwort betraf nur Bash, weiß nicht genau, ImageMagick.
Enzotib
Gute Idee, mogrifyanstatt zu verwenden convert. Dies funktioniert für 100 Dateien, aber die Verwendung von Globbing mit *.jpgwird nicht auf Tausende von Dateien skaliert. Dies kann erreicht werden, indem der Befehl in einem einfachen Einzeiler mitfind kombiniert wird .
ACULICH
Wie konvertiert man beide *.jpg und *.pngDateien in eine einzige *.pdf? Beachten Sie, dass es sich um nummerierte Dateien handelt (z. B. 1.jpg 2.png 3.png 4.jpg) und dass die Reihenfolge in der PDF-Ausgabe beibehalten werden sollte.
verrückt nach natty
Als Workaround: Konvertieren Sie alle *.jpgin *.png's in Schritt 1 und führen Sie das Äquivalent Ihrer Antwort in Schritt 2 durch ...
verrückt nach natty
siehe auch stackoverflow.com/questions/15315770/…
nach natty 21.07.13
24

schnellere aber ungewöhnliche Syntax:

parallel convert '{} {.}.pdf' ::: *.jpg

Läuft parallel (mit https://www.gnu.org/software/parallel/ ). Ich habe noch kein Multithreading bemerkt convert, das die effektive Parallelisierung einschränken würde. Wenn dies Ihr Anliegen ist, finden Sie im Kommentar unten eine Methode, um sicherzustellen, dass kein Multithreading auftritt.

Sebastian
quelle
1
Dieser Weg ist voller Siege. Es bewertet automatisch die Anzahl der Kerne und führt so viele Aufgaben aus!
Meawoppl
1
Diese Methode ist die schnellste von allen.
Shivams
1
parallel ist macht, parallel kombiniert mit imagemagick ist supermacht. Ich mag Supermacht.
CousinCocaine
2
Ein bisschen zu spät für die Party hier, aber neue (möglicherweise nicht, als diese Antwort geschrieben wurde) Versionen von ImageMagick sind Multithread-Versionen und interagieren schlecht, wenn sie parallel ausgeführt werden. Dies kann deaktiviert werden (wenn Parallelisierung auf Anwendungsebene wie bei GNU verwendet wird parallel), indem die Umgebungsvariable festgelegt wird MAGICK_THREAD_LIMIT=1.
Zebediah49
Die Verwendung von ImageMagick führt zu Generationsverlust und schlechter Leistung. img2pdf an anderer Stelle auf dieser Seite vermeidet diese Probleme.
Robert Fleming
16

https://gitlab.mister-muffin.de/josch/img2pdf

Bei allen vorgeschlagenen Lösungen mit ImageMagick werden die JPEG-Daten vollständig dekodiert und neu kodiert. Dies führt zu einem Generationsverlust und einer zehn- bis hundertmal schlechteren Leistung img2pdf.

Kann mit installiert werden, pip img2pdfvorausgesetzt, Sie haben Abhängigkeiten (zB apt-get install python python-pil python-setuptools libjpeg-devoder yum install python python-pillow python-setuptools).

Robert Fleming
quelle
3
ist richtig. Mit Befehlen wie können Sie testen, ob eine Rundreise eine JPEG-Datei ändert convert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpg. IMHO verdient diese Antwort mehr Gegenstimmen. In der Tat convertscheitert hier, besteht einen img2pdfsolchen Test und enthält sogar viele Optionen zum Festlegen der Bildgröße, Seitengröße usw., um das erzeugte PDF an Ihre Bedürfnisse anzupassen.
Stéphane Gourichon
3
img2pdfist in den regulären Ubuntu 16.04-Repositories verfügbar, ohne dass manuelle Vorgänge erforderlich pipsind, und Sie behalten den Vorteil von Updates.
Stéphane Gourichon
1
Zu dem Zeitpunkt, als die Frage gestellt (und die Antwort angenommen) wurde, existierte img2pdf nicht. Aber heutzutage ist img2pdf eindeutig eine bessere Antwort.
kmkaplan
13

Hier ist eine Möglichkeit, die die besten der oben genannten Vorschläge in einer einfachen, effizienten und robusten Befehlszeile kombiniert:

find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +

Es funktioniert gut mit Dateinamen, die mit einem -oder Leerzeichen beginnen. Beachten Sie die Verwendung von -inamedenen die Groß- und Kleinschreibung - Version , -nameso dass es arbeiten wird .JPGgenauso gut wie .jpg.

Dies wird verwendet find, um die Dateiliste abzurufen, anstatt ein Shell-Globbing mit dem *.jpgPlatzhalter durchzuführen, was auf einigen Systemen zu einem Fehler führen kann, dass die Argumentliste zu lang ist. Obwohl @enzotib in einem Kommentar verweist, unterscheidet sich das Verhalten der Verwendung von Globbing in einer for-Schleife von dem für die Argumente eines Befehls .

Auch findUnterverzeichnisse handhaben , während Shell Globbing nicht , wenn Sie Shell-spezifische Funktionen wie die haben passieren **/*jpgrekursive Globbing Syntax in zsh.

BEARBEITEN: Ich dachte, ich würde eine weitere nützliche Funktion hinzufügen, an finddie ich dachte, nachdem ich einen Kommentar von @IlmariKaronen gelesen hatte, in dem es darum ging, den Befehl erneut auszuführen und nur Dateien zu konvertieren, die sich seit der ersten Ausführung geändert haben.

Beim ersten Durchlauf können Sie toucheine Zeitstempeldatei erstellen, nachdem die Konvertierung abgeschlossen ist.

find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp

Fügen Sie -newer timestampdann den findAusdruck hinzu, um die Teilmenge der Dateien zu bearbeiten, deren letzte Änderungszeit neuer ist als die Zeitstempeldatei. Aktualisieren Sie die Zeitstempeldatei nach jedem Lauf.

find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp

Dies ist ein einfacher Weg, um zu vermeiden, dass Sie auf ein Makefile zurückgreifen müssen (es sei denn, Sie verwenden bereits eines), und ein weiterer guter Grund, warum es sich lohnt, es zu verwenden, findwann immer es möglich ist.

aculich
quelle
Die Verwendung von ImageMagick führt zu Generationsverlust und schlechter Leistung. img2pdf an anderer Stelle auf dieser Seite vermeidet diese Probleme.
Robert Fleming
8

Sie können dies convertdirekt mit tun . Dies finden Sie am Ende der ImageMagicks-Site über die Befehlszeilenverarbeitung .

convert *.jpg +adjoin page-%d.pdf
Frank Zalkow
quelle
4
oder convert *.jpg -adjoin output.pdffür eine kombinierte pdf
ninjagecko
2
Die Verwendung von ImageMagick führt zu Generationsverlust und schlechter Leistung. img2pdf an anderer Stelle auf dieser Seite vermeidet diese Probleme.
Robert Fleming
7

Ich habe das folgende Makefile für etwas Ähnliches verwendet:

SVG = $(wildcard origs/*.svg)
PNG = $(patsubst origs/%.svg,%.png,$(SVG))

all: $(PNG)

%.png: origs/%.svg
    convert -resize "64x" $< $@


clean: 
    rm $(PNG)

Jetzt kann ich einfach laufen makeund ich bekomme PNG-Dateien für jede SVG-Datei, die herumliegt.

Bearbeiten

Wie gewünscht:

  • Wildcards erzeugt eine Liste aller SVGs in Origs /
  • pathsubst nimmt diese Liste und erstellt eine Liste mit PNG-Dateinamen (unterschiedlicher Ordner und Erweiterung. Beispiel: origs/foo.svgwird foo.png)
  • Regel 1: all: $(PNG)definiert, dass das Ziel "all" von allen PNGs abhängt
  • Regel 2: %.png: origs/%.svgDefiniert, dass die Datei $ X.png von origs / $ X.svg abhängt und durch Aufruf generiert werden kann convert ... $< $@.
    • $< ist die Abhängigkeit und und
    • $@ ist der Zielname
  • REGEL 3: Dient nur zum Aufräumen
reto
quelle
2
Bei einer einmaligen Aufgabe ist das Erstellen eines Makefiles wahrscheinlich zu viel des Guten, aber wenn Sie jemals vorhaben, einige der PDF-Dateien zu ändern, werden durch erneutes Eingeben makediese und nur die geänderten PDF-Dateien wiederhergestellt.
Ilmari Karonen
Würde es Ihnen etwas ausmachen zu erklären, was Wildcard, Origs und Patsubst sind, wie $ und% interpretiert werden und $ <$ @? Der Rest ist leicht zu verstehen. :)
Benutzer unbekannt
Das Zurückgreifen auf makescheint etwas zu kompliziert, wenn ein einfacher Einzeiler den Trick macht.
Aculich
@IlmariKaronen Ich bin damit einverstanden, dass ein Makefile übertrieben ist, aber es ist schön, eine Möglichkeit zu haben, nur die Teilmenge der modifizierten Dateien in nachfolgenden Läufen wiederherzustellen. Ich habe meine Antwort so aktualisiert , dass findSie nicht auf ein Makefile zurückgreifen müssen.
Aculich
0

Ein winziges Skript würde den Trick machen. (getestet mit ksh88 unter Solaris 10)

script.ksh

#!/bin/ksh

[[ $# != 1 ]] && exit 255 # test for nr of args

pdfname=$(sed -e 's/\(.*\)\.jpg/\1\.pdf/' <(echo $"1")) #replace *.jpg with *.pdf
convert "$1" $pdfname

Dann können Sie ausführen find, um das Skript auszuführen:

find dir -name image\*.jpg -exec /bin/ksh script.ksh {} \;

Beachten Sie, dass beide script.kshund der findBefehl, den ich Ihnen gegeben habe, je nach Betriebssystem und verwendeter Shell unterschiedliche Syntaxen haben können.

rahmu
quelle
pdfname=${1%.*}.pdfersetzt die Dateierweiterung durch pdf. Diese Methode ist viel einfacher und funktioniert auch dann, wenn der Dateiname Sonderzeichen enthält. Fügen Sie in einem verwandten Hinweis doppelte Anführungszeichen um Variablenersetzungen ein.
Gilles 'SO- hör auf böse zu sein'
Es gibt keinen Grund, ein separates Skript zu schreiben, wenn dies alles mit einer einfachen Befehlszeile erledigt werden kann .
ACULICH
0

Das MacOS-DienstprogrammSIPS   Unter MacOS (Sierra) bietet das integrierte Apple-Befehlszeilendienstprogramm sipsumfassenden Zugriff auf alle Apple-Dienstprogramme für Rasterbilder. Dies schließt die Konvertierung von jpgnach mit ein pdf.

Beispielsweise wird aus einem vorhandenen jpgImage mit niedriger Auflösung / kleiner Größe 'cat.jpg'(mit einer Größe von 8401 Byte) die folgende Befehlszeile erstellt 'cat.pdf', ohne dass sich die Rasterauflösung ändert und die Dateigröße minimal erweitert wird:

$ sips -s format pdf cat.jpg --out 'cat.pdf' 1>/dev/null 2>&1
$ ls -l cat.*
-rw-r--r--@ 1 <user redacted> <group redacted>  8401 Jun 18 07:06 cat.jpg
-rw-r--r--+ 1 <user redacted> <group redacted> 10193 Jun 18 07:22 cat.pdf

Konvertierung in das Adobe- PSDRasterbildformat   Eine ähnliche sipsRedewendung erstellt Adobe-kompatible *.psdDateien

$ sips -s format psd cat.jpg --out 'cat.psd' 1>/dev/null 2>&1
$ ls -l cat.jpg cat.psd
-rw-r--r--@ 1 Administration  staff    8401 Jun 18 07:06 cat.jpg
-rw-r--r--+ 1 Administration  staff  350252 Jun 18 07:37 cat.psd

Beachten Sie jedoch die 30-fache Dateigrößenerweiterung, die mit der Verwendung des Adope- psdRasterformats einhergeht .

Buchproduktion   in Großbuchproduktion zu tun, Hunderte von Bildern beteiligt, die in verschiedenen Formaten geliefert werden, für mich ein bequemen Befehlszeilen Idiom hat Einsatz ImageMagickDienstprogramme reine Rasterbilddateien erstellen pngFormat (mit allen Meta-Daten und Farbprofile stripped-out), dann verwenden Sie sipseinen einheitlichen Satz von Farbprofilen und / oder Kommentare zu restaurieren und verwenden sipsauch die endgültige Ausgabe - Dateien (am häufigsten zu erzeugen *.png, *.psdoder *.pdfDateien).

John Sidles
quelle
0

Leider convertändert sich das Bild vorher, so dass der Qualitätsverlust des Originals, das jpgSie verwenden müssen, minimal img2pdfist. Ich verwende diese Befehle:

1) So pdferstellen Sie aus jedem jpgBild eine Datei, ohne die Auflösung oder Qualität zu beeinträchtigen:

ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf

2) So verknüpfen Sie die pdfSeiten zu einer:

pdftk *.pdf cat output combined.pdf

3) Und zuletzt füge ich eine OCR-Textebene hinzu, die die Qualität des Scans in den PDFs nicht ändert, damit sie durchsuchbar sind:

pypdfocr combined.pdf  
Eduard Florinescu
quelle
0

Ich habe es mit imagemagick für die Konvertierung gelöst und parallel, um meinen Konvertierungsprozess zu beschleunigen:

ls *.JPEG |parallel convert -density 200 -resize 496X646 -quality 100 {}  ../{.}.PDF
Giovanny Canasto
quelle
0

Eine der einfachsten Möglichkeiten zum Konvertieren mehrerer Dateien besteht darin, in das Dateiverzeichnis im Linux-Terminal zu wechseln und Folgendes einzugeben:

$ convert *.png mypdf.pdf
Ajeet Yadav
quelle
-1

Wenn Sie nur Bilddateien verwenden, möchten Sie möglicherweise das Comic-Archiv (.cbr, .cbz, .cbt, .cba, .cb7) verwenden.

  • Wenn Sie 7Z verwenden, benennen Sie die Dateierweiterung (Suffix) in .cb7 um
  • Wenn Sie ACE verwenden, benennen Sie die Dateierweiterung (Suffix) in .cba um
  • Wenn Sie RAR verwenden, benennen Sie die Dateierweiterung (Suffix) in .cbr um
  • Wenn Sie TAR verwenden, benennen Sie die Dateierweiterung (Suffix) in .cbt um
  • Wenn Sie ZIP verwenden, benennen Sie die Dateierweiterung (Suffix) in .cbz um

Dies ist viel flexibler als PDF.

Under Linux you can use software like Comix, Evince, Okular and QComicBook.

https://secure.wikimedia.org/wikipedia/en/wiki/Comic_book_archive

jojo
quelle
1
abgelehnt, weil es nichts mit der Frage des OP zu tun hat.
Googley