85 votes

Fusionner plusieurs jpg en un seul pdf sous Linux

J'ai utilisé la commande suivante pour convertir et fusionner tous les fichiers jpg d'un répertoire en un seul fichier pdf.

convert *.jpg file.pdf

Les fichiers du répertoire sont numérotés de 1.jpg a 123.jpg . La conversion s'est bien déroulée mais après la conversion, les pages étaient toutes mélangées. Je voulais que le pdf contienne les pages de 1.jpg a 123.jpg dans le même ordre que leur nom. J'ai également essayé avec la commande suivante :

cd 1 
FILES=$( find . -type f -name "*jpg" | cut -d/ -f 2)
mkdir temp && cd temp 
for file in $FILES; do 
    BASE=$(echo $file | sed 's/.jpg//g');
    convert ../$BASE.jpg $BASE.pdf; 
    done && 
pdftk *pdf cat output ../1.pdf && 
cd .. 
rm -rf temp

Mais rien n'y fait. Plate-forme d'exploitation Linux.

141voto

Felix Defrance Points 1411

Ou lisez simplement le ls et voir :

-v tri naturel des numéros (de version) dans le texte

Ainsi, nous faisons ce dont nous avons besoin en une seule commande.

convert `ls -v *.jpg` foobar.pdf

Amusez-vous bien ;) F.

23voto

Delan Azabani Points 33013

Le problème vient du fait que votre shell développe les caractères génériques dans un ordre purement alphabétique, et comme les longueurs des nombres sont différentes, l'ordre sera incorrect :

$ echo *.jpg
1.jpg 10.jpg 100.jpg 101.jpg 102.jpg ...

La solution consiste à ajouter des zéros aux noms de fichiers afin qu'ils aient la même longueur avant d'exécuter la commande de conversion :

$ for i in *.jpg; do num=`expr match "$i" '\([0-9]\+\).*'`;
> padded=`printf "%03d" $num`; mv -v "$i" "${i/$num/$padded}"; done

Les fichiers seront désormais associés au caractère générique dans l'ordre correct, prêts pour la commande de conversion :

$ echo *.jpg
001.jpg 002.jpg 003.jpg 004.jpg 005.jpg 006.jpg 007.jpg 008.jpg ...

7voto

Lukas Points 71

Vous pouvez utiliser

convert '%d.jpg[1-132]' file.pdf

via https://www.imagemagick.org/script/command-line-processing.php :

Une autre méthode pour faire référence à d'autres fichiers d'images consiste à incorporer un dans le nom de fichier avec une plage de scènes. Prenons l'exemple du caractère nom de fichier image-%d.jpg[1-5] . La commande

magick image-%d.jpg[1-5] provoque une tentative de lecture d'images par ImageMagick avec ces noms de fichiers :

image-1.jpg image-2.jpg image-3.jpg image-4.jpg image-5.jpg

Voir aussi https://www.imagemagick.org/script/convert.php

5voto

Gregor Sturm Points 758

Toutes les réponses ci-dessus ont échoué lorsque j'ai voulu fusionner plusieurs images jpeg haute résolution (provenant d'un livre scanné).

Imagemagick a essayé de charger tous les fichiers dans la RAM, j'ai donc utilisé l'approche suivante en deux étapes :

find -iname "*.JPG" | xargs -I'{}' convert {} {}.pdf
pdfunite *.pdf merged_file.pdf

Notez qu'avec cette approche, vous pouvez également utiliser GNU parallel pour accélérer la conversion :

find -iname "*.JPG" | parallel -I'{}' convert {} {}.pdf

3voto

Martian Points 39

Voici comment je procède :
La première ligne convertit tous les fichiers jpg en pdf à l'aide de la commande convert.
La deuxième ligne consiste à fusionner tous les fichiers pdf en un seul fichier pdf par page. Cette opération est réalisée à l'aide de gs ((interpréteur et prévisualisateur des langages PostScript et PDF)).

for i in $(find . -maxdepth 1 -name "*.jpg" -print); do convert $i ${i//jpg/pdf}; done
gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=merged_file.pdf -dBATCH `find . -maxdepth 1 -name "*.pdf" -print"`

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X