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.
En bash:
for f in *.jpg; do
convert ./"$f" ./"${f%.jpg}.pdf"
done
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".)
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.
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
).
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.
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
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é:
origs/foo.svg
devient foo.png
)all: $(PNG)
définit que la cible "all" dépend de tous les PNG%.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 cibleMalheureusement 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 pdf
pages 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
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).
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
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.
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