Conversion de plusieurs fichiers image du format JPEG au format PDF

50

Je veux convertir des fichiers de jpeg en pdf. J'utilise la commande suivante.

$ convert image1.jpg image1.pdf 

Mais j'ai 100 images. Comment devrais-je les convertir tous en fichiers PDF correspondants?

j'ai essayé

$ convert image*.jpg image*.pdf 

Ça ne marche pas

Pratik Deoghare
la source
Connexes: Comment générer un fichier PDF à partir d'une série d'images? au super-utilisateur SE
kenorb le

Réponses:

62

En bash:

for f in *.jpg; do
  convert ./"$f" ./"${f%.jpg}.pdf"
done
enzotib
la source
1
Une raison particulière pour laquelle vous ajoutez "./" aux arguments de convert? Est-ce une bonne pratique générale?
Rahmu
4
@rahmu: oui, c'est une bonne pratique, car le nom de fichier commençant par -donne donne des problèmes, sinon.
enzotib
3
Cela fonctionne, mais la mogrifysaisie est beaucoup moins fréquente. Voir ma réponse.
cjm
+1 parce que c'est techniquement correct et évite les pièges bash, mais -1 parce que mogrify est le moyen le plus simple pour convertir des images par lots. Donc pas de vote de ma part.
Benoit
@aculich: merci pour votre vote négatif, mais vous avez mal pris en compte, voyez pourquoi la boucle ne déclenche pas l'erreur «argument too long»? .
enzotib
56

Vous pouvez utiliser la mogrifycommande pour cela. Normalement, il modifie les fichiers sur place, mais lors de la conversion de formats, il écrit un nouveau fichier (il suffit de changer l'extension pour l'adapter au nouveau format). Ainsi:

mogrify -format pdf -- *.jpg

(Comme enzotib ./*.jpg, cela --empêche tout nom de fichier étrange d'être interprété comme un commutateur. La plupart des commandes reconnaissent --le fait "arrêtez de chercher des options à ce stade".)

cjm
la source
+1, ma réponse portait uniquement sur bash, je ne connais pas bien ImageMagick.
enzotib
Bonne idée d'utiliser mogrifyau lieu de convert. Cela fonctionnera pour 100 fichiers, mais l'utilisation de la sélection avec *.jpgne permet pas de gérer des milliers de fichiers. cela peut être fait en combinant la commande dans une simple ligne avecfind .
Aculich
Comment convertir les deux *.jpg et les *.pngfichiers à un seul *.pdf? Notez qu'il s'agit de fichiers numérotés (par exemple, 1.jpg 2.png 3.png 4.jpg) et que cet ordre doit être maintenu / préservé dans la sortie pdf.
noisette sur natty
comme solution de contournement: convertir tout *.jpgen *.pngs à la première étape et exécuter l'équivalent de votre réponse à l'étape 2 ...
noisette à propos de natty
voir aussi stackoverflow.com/questions/15315770/…
noisette à propos de natty
24

syntaxe plus rapide mais inhabituelle:

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

Fonctionne en parallèle (en utilisant https://www.gnu.org/software/parallel/ ). Je n'ai pas encore remarqué de multi-threading convert, ce qui limiterait l'efficacité de la parallélisation. Si cela vous préoccupe, voir dans le commentaire ci-dessous une méthode permettant d'éviter tout multi-threading.

Sébastien
la source
1
Cette voie est pleine de victoire. Il évalue automatiquement le nombre de cœurs et exécute autant de tâches!
Meawoppl
1
Cette méthode est la plus rapide de toutes.
Shivams
1
Parallèle est le pouvoir, parallèle combiné avec imagemagick est superpuissance. J'aime la superpuissance.
CousinCocaine
2
Un peu tard pour le parti ici, mais les nouvelles versions (peut-être pas lorsque cette réponse a été écrite) d'ImageMagick sont multi-threadées et interagiront mal si elles sont exécutées en parallèle. Cela peut être désactivé (si vous utilisez la parallélisation au niveau de l'application, par exemple avec GNU parallel) en définissant la variable d'environnement MAGICK_THREAD_LIMIT=1.
Zebediah49
Utiliser ImageMagick à cette fin entraîne une perte de génération et de mauvaises performances. img2pdf ailleurs sur cette page évite ces problèmes.
Robert Fleming
16

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

Dans toutes les solutions proposées impliquant ImageMagick, les données JPEG sont entièrement décodées et recodées. Il en résulte une perte de génération , ainsi que des performances "dix à cent" fois pires que img2pdf.

Peut être installé à pip img2pdfcondition d'avoir des dépendances (par exemple apt-get install python python-pil python-setuptools libjpeg-devou yum install python python-pillow python-setuptools).

Robert Fleming
la source
3
est vrai. Vous pouvez vérifier qu’un aller-retour modifie un fichier JPEG avec des commandes telles que convert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpg. IMHO cette réponse mérite plus de votes positifs. En effet, convertici , échoue, img2pdfréussit un tel test et inclut même de nombreuses options pour définir la taille de l’image, la taille de la page, etc. afin d’ajuster le fichier PDF généré à vos besoins.
Stéphane Gourichon
3
img2pdfest disponible dans les dépôts réguliers d'Ubuntu 16.04, vous n'avez pas besoin d'opérations manuelles pip, et vous conservez l'avantage des mises à jour.
Stéphane Gourichon
1
Au moment où la question a été posée (et la réponse acceptée), img2pdf n’existait pas. Mais de nos jours, img2pdf est clairement une meilleure réponse.
kmkaplan
13

Voici un moyen de combiner le meilleur des suggestions ci-dessus en une ligne de commande simple, efficace et robuste:

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

Cela fonctionne très bien avec les noms de fichiers qui commencent par un -ou contiennent des espaces. Notez l'utilisation -inamequi est insensible à la casse version de -namesorte qu'il fonctionne sur .JPGtout aussi bien que .jpg.

Cela permet findd’obtenir la liste de fichiers au lieu de parcourir le shell avec le *.jpgcaractère générique, ce qui peut entraîner une erreur «Liste d’arguments trop longue» sur certains systèmes. Bien que @enzotib pointe dans un commentaire, l'utilisation de la suppression dans une boucle for diffère de celle utilisée pour les arguments d'une commande .

De plus, findgérera les sous-répertoires, alors que l'éclatement du shell ne le sera pas, à moins que vous n'ayez des fonctionnalités spécifiques à celui-ci, comme la **/*jpgsyntaxe récursive de l'échantillonnage dans zsh.

EDIT: J'ai pensé ajouter une autre fonctionnalité utile à findlaquelle j'avais pensé après avoir lu un commentaire de @IlmariKaronen à propos de la réexécution de la commande et de la conversion uniquement des fichiers modifiés depuis la première exécution.

Au premier passage, vous pouvez touchcréer un fichier d’horodatage une fois la conversion terminée.

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

Ajoutez ensuite -newer timestampà l' findexpression pour agir sur le sous-ensemble de fichiers dont l'heure de dernière modification est plus récente que le fichier d'horodatage. Continuez à mettre à jour le fichier d'horodatage après chaque exécution.

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

C'est un moyen facile d'éviter de devoir recourir à un Makefile (sauf si vous en utilisez déjà un) et c'est une autre bonne raison pour laquelle il vaut la peine d'être utilisé findchaque fois que cela est possible ... il a une expressivité polyvalente tout en restant concis.

aculich
la source
Utiliser ImageMagick à cette fin entraîne une perte de génération et de mauvaises performances. img2pdf ailleurs sur cette page évite ces problèmes.
Robert Fleming
8

Vous pouvez le faire convertdirectement. Ceci se trouve au bas du site ImageMagicks à propos du traitement en ligne de commande .

convert *.jpg +adjoin page-%d.pdf
Frank Zalkow
la source
4
ou convert *.jpg -adjoin output.pdfpour un pdf combiné
ninjagecko
2
Utiliser ImageMagick à cette fin entraîne une perte de génération et de mauvaises performances. img2pdf ailleurs sur cette page évite ces problèmes.
Robert Fleming
7

J'ai utilisé le fichier Make suivant pour quelque chose de similaire:

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

all: $(PNG)

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


clean: 
    rm $(PNG)

Maintenant, je peux juste courir makeet obtenir des fichiers png pour chaque fichier svg qui se trouve autour.

Modifier

Comme demandé:

  • wildcards génère une liste de tous les svgs dans origs /
  • pathubst prend cette liste et produit une liste de noms de fichiers png (dossier et extension différents. Exemple: origs/foo.svgdevient foo.png)
  • Règle 1: all: $(PNG)définit que la cible "tout" dépend de tous les PNG
  • Règle 2: %.png: origs/%.svgdéfinit, le fichier $ X.png dépend de origs / $ X.svg et peut être généré par appel convert ... $< $@.
    • $< est la dépendance et et
    • $@ est le nom de la cible
  • RUle 3: est juste pour nettoyer
reto
la source
2
La création d'un fichier Makefile est probablement une tâche excessive, mais si vous envisagez de modifier certains fichiers PDF, le fait de taper à makenouveau reconvertira ceux, et uniquement ceux, qui ont été modifiés.
Ilmari Karonen le
Cela vous dérangerait-il d'expliquer ce qu'est le joker, l'origine, le patsubst, comment $ et% sont interprétés et $ <$ @? Le reste est facile à comprendre. :)
utilisateur inconnu le
Recourir à makesemble un peu compliqué quand un simple paquebot fera l'affaire.
Aculich
@IlmariKaronen Je suis d'accord pour dire qu'un Makefile est excessif, mais il est agréable de pouvoir reconvertir uniquement le sous-ensemble de fichiers modifiés lors d'exécutions ultérieures. J'ai mis à jour ma réponse avec un moyen de faire cela avec juste findpour ne pas avoir à recourir à un Makefile.
Aculich
0

Un petit script ferait l'affaire. (testé avec ksh88 sur 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

Ensuite, vous pouvez exécuter findpour exécuter le script:

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

Notez que les deux script.kshet la findcommande que je vous ai donnée peuvent avoir des syntaxes différentes selon le système d'exploitation et le shell que vous utilisez.

Rahmu
la source
pdfname=${1%.*}.pdfremplace l'extension du fichier par pdf. Cette méthode est beaucoup plus simple et fonctionne même si le nom du fichier contient des caractères spéciaux. Sur une note associée, ajoutez des guillemets autour des substitutions de variables.
Gilles 'SO- arrête d'être méchant'
Il n'y a aucune raison d'écrire un script séparé quand tout peut être fait avec une simple ligne de commande .
Aculich
0

L'utilitaire MacOSSIPS   Sous MacOS (Sierra), l'utilitaire de ligne de commande intégré d'Apple sipsfournit un accès complet à tous les utilitaires d'image raster d'Apple. cela s'avère inclure la conversion de jpgen pdf.

Par exemple, à partir d' une basse résolution / de petite taille actuelle l' jpgimage 'cat.jpg'(de la taille 8401 octets), la ligne de commande suivante crée 'cat.pdf', sans changement de trame résolution et extension minimale de la taille du fichier:

$ 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

Conversion au PSDformat d'image raster d'Adobe   Un sipsidiome similaire crée des *.psdfichiers compatibles avec Adobe

$ 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

Notez toutefois l'extension de 30 fois la taille du fichier associée à l'utilisation du psdformat raster Adope .

Production de livres   Dans le cadre de la production de livres à grande échelle, comprenant des centaines d’images, fournies dans de nombreux formats, un idiome pratique en ligne de commande consiste à utiliser des ImageMagickutilitaires pour créer des fichiers d’images raster pures au pngformat (avec toutes les métadonnées et les les profils de couleur dépouillé-out), puis utilisez sipspour restaurer un ensemble uniforme de profils de couleurs et / ou des commentaires, et utiliser sipsaussi pour générer des fichiers de sortie ( le plus souvent *.png, *.psdou des *.pdffichiers).

John Sidles
la source
0

Malheureusement , convertmodifie l'image avant donc d'avoir une perte minimale de qualité de l'original , jpgvous devez utiliser img2pdf, j'utiliser cette commande:

1) Ceci pour créer un pdffichier à partir de chaque jpgimage sans perte de résolution ni de qualité:

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

2) Ceci pour concaténer les pdfpages en une seule:

pdftk *.pdf cat output combined.pdf

3) Enfin, j’ajoute un calque de texte OCRed qui ne modifie pas la qualité de la numérisation dans les fichiers PDF, de sorte qu’il peut être interrogé:

pypdfocr combined.pdf  
Eduard Florinescu
la source
0

J'ai eu résoudre avec imagemagick pour la conversion et en parallèle pour accélérer mon processus de conversion:

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

L'un des moyens les plus simples de convertir plusieurs fichiers consiste à accéder au répertoire de fichiers du terminal linux et à taper:

$ convert *.png mypdf.pdf
Ajeet Yadav
la source
-1

Si vous utilisez uniquement des fichiers image, vous voudrez peut-être utiliser Comic Book Archive (.cbr, .cbz, .cbt, .cba, .cb7)

  • Si vous utilisez 7Z, renommez l’extension de fichier (suffixe) en .cb7
  • Si vous utilisez ACE, renommez l'extension de fichier (suffixe) en .cba
  • Si vous utilisez RAR, renommez l'extension de fichier (suffixe) en .cbr
  • Si vous utilisez TAR, renommez l'extension de fichier (suffixe) en .cbt
  • Si vous utilisez ZIP, renommez l'extension de fichier (suffixe) en .cbz

C'est beaucoup plus flexible que PDF.

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

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

jojo
la source
1
voté à la baisse, car cela n’a rien à voir avec la question du PO.
toogley