web-dev-qa-db-fra.com

Conversion de plusieurs fichiers image de JPG au format PDF

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

$ convert image1.jpg image1.pdf 

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

J'ai essayé

$ convert image*.jpg image*.pdf 

Ça ne marche pas.

55
Pratik Deoghare

En bash:

for f in *.jpg; do
  convert ./"$f" ./"${f%.jpg}.pdf"
done
63
enzotib

Vous pouvez utiliser la commande mogrify pour cela. Normalement, il modifie les fichiers sur place, mais lors de la conversion des formats, il écrit un nouveau fichier (il suffit de changer l'extension pour qu'elle corresponde au nouveau format). Donc:

mogrify -format pdf -- *.jpg

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

60
cjm

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 dans convert, ce qui limiterait la parallélisation effective. Si tel est votre problème, consultez dans le commentaire ci-dessous une méthode pour vous assurer qu'aucun multithread ne se produit.

24
Sebastian

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 perte de génération , ainsi que des performances "dix à cent" fois moins bonnes que img2pdf.

Peut être installé avec pip img2pdf à condition d'avoir des dépendances (par exemple apt-get install python python-pil python-setuptools libjpeg-dev ou yum install python python-pillow python-setuptools).

16
Robert Fleming

Voici un moyen qui combine 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 commençant par - ou contenir des espaces. Notez l'utilisation de -iname qui est la insensible à la casse version de -name donc ça marchera sur .JPG tout aussi bien que .jpg.

Cela utilise find pour obtenir la liste des fichiers au lieu de la globalisation du shell avec le *.jpg caractère générique pouvant entraîner une erreur 'Argument list too long' sur certains systèmes. Bien que @enzotib pointe dans un commentaire, le comportement de l'utilisation de la globalisation dans une boucle for est différent de celui des arguments d'une commande .

De plus, find gérera les sous-répertoires, contrairement à la globalisation de Shell, sauf si vous avez des fonctionnalités spécifiques à Shell comme **/*jpg syntaxe de globbing récursive dans zsh.

EDIT: Je pensais que j'allais ajouter une autre fonctionnalité utile de find à laquelle j'ai pensé après avoir lu un commentaire par @ IlmariKaronen à propos de la réexécution de la commande et uniquement de la conversion des fichiers modifiés depuis la première exécution.

Lors de la première passe, vous pouvez touch un fichier d'horodatage une fois la conversion terminée.

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

Puis ajouter -newer timestamp à l'expression find pour opérer 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 d'avoir à 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'utiliser find chaque fois que possible ... il a une expressivité polyvalente tout en restant concis.

13
aculich

Vous pouvez le faire directement avec convert. Cela se trouve au bas du site ImageMagicks à propos de Traitement en ligne de commande .

convert *.jpg +adjoin page-%d.pdf
9
Frank Zalkow

J'ai utilisé le makefile 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 simplement exécuter make et j'obtiens des fichiers png pour chaque fichier svg qui traîne.

Modifier

Comme demandé:

  • les caractères génériques génèrent une liste de tous les svgs dans origs /
  • cheminsubst prend cette liste et produit une liste de noms de fichiers png (dossier et extension différents. Exemple: origs/foo.svg devient foo.png)
  • Règle 1: all: $(PNG) définit que la cible "all" dépend de tous les PNG
  • Règle 2: %.png: origs/%.svg Définit, le fichier $ X.png dépend de origs/$ X.svg et peut être généré en appelant convert ... $< $@.
    • $< Est la dépendance et et
    • $@ Est le nom cible
  • RULE 3: est juste pour le nettoyage
7
reto

Malheureusement convert change l'image avant afin d'avoir une perte minimale de qualité de l'original jpg vous devez utiliser img2pdf, J'utilise ces commandes:

1) Ceci pour créer un fichier pdf à partir de chaque image jpg sans perte de résolution ou 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) Et enfin, j'ajoute un calque de texte OCRed qui ne change pas la qualité de la numérisation dans les fichiers PDF afin qu'ils puissent être recherchés:

pypdfocr combined.pdf  
1
Eduard Florinescu

L'utilitaire MacOS SIPS Sous MacOS (Sierra), l'utilitaire de ligne de commande d'Apple sips offre un accès complet à tous les utilitaires d'image raster d'Apple; cela inclut la conversion de jpg en pdf.

Par exemple, à partir d'une image jpg basse résolution/petite taille existante 'cat.jpg' (De taille 8401 octets), la ligne de commande suivante crée 'cat.pdf', Sans modification de résolution raster et expansion 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 format d'image raster PSD d'Adobe Un idiome sips similaire crée des fichiers *.psd Compatibles 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 cependant l'extension de taille de fichier de 30 fois qui accompagne l'utilisation du format raster Adope psd.

Production de livres Lors de la production de livres à grande échelle, impliquant des centaines d'images, qui sont fournies dans plusieurs formats, pour moi, un idiome de ligne de commande pratique a été d'utiliser les utilitaires ImageMagick pour créer des images pures fichiers d'image raster au format png (avec tous les métadonnées et profils de couleurs supprimés), puis utilisez sips pour restaurer un ensemble uniforme de profils de couleurs et/ou de commentaires, et utilisez sips également pour générer les fichiers de sortie finaux (le plus souvent *.png, *.psd Ou *.pdf Fichiers).

1
John Sidles

L'un des moyens les plus simples de convertir plusieurs fichiers est d'aller dans le répertoire de fichiers du terminal Linux et de taper:

$ convert *.png mypdf.pdf
1
Ajeet Yadav

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 find pour exécuter le script:

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

Notez que les deux script.ksh et la commande find que je vous ai donnée peuvent avoir des syntaxes différentes dépendant du système d'exploitation et du shell que vous utilisez.

1
rahmu

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

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