J'ai fait quelque chose comme
convert -page A4 -compress A4 *.png CH00.pdf
Mais la 1ère page est beaucoup plus grande que les pages suivantes. Cela se produit même si les dimensions de l'image sont similaires. Ces images sont numérisées et recadrées peuvent donc avoir de légères différences de dimensions
J'ai pensé -page A4
devrait fixer la taille des pages?
La dernière fois que j'ai utilisé convert
pour une telle tâche, j'ai explicitement spécifié la taille de la destination via le redimensionnement:
$ i=150; convert a.png b.png -compress jpeg -quality 70 \
-density ${i}x${i} -units PixelsPerInch \
-resize $((i*827/100))x$((i*1169/100)) \
-repage $((i*827/100))x$((i*1169/100)) multipage.pdf
La commande convert
n'utilise pas toujours DPI comme unité de densité/format de page par défaut, ainsi nous spécifions explicitement DPI avec le -units
(sinon vous pouvez obtenir des résultats différents avec différentes versions/combinaisons de formats d'entrée). La nouvelle taille (spécifiée via -resize
) Est la dimension d'une page DIN A4 en pixels. L'argument resize spécifie la taille maximale de la page. la résolution et la qualité à choisir dépendent exactement du cas d'utilisation - j'ai sélectionné 150 DPI et de la qualité moyenne pour économiser de l'espace alors qu'il n'a pas l'air trop mal lors de l'impression sur papier.
Notez que convert
par défaut ne change pas le rapport hauteur/largeur avec l'opération de redimensionnement:
Le redimensionnement adaptera l'image à la taille demandée. Il ne remplit PAS, la taille de boîte demandée.
Selon la version d'ImageMagick et les formats d'entrée impliqués, il peut être correct d'omettre l'option -repage
. Mais parfois, il est nécessaire et sans cette option, l'en-tête PDF peut contenir des dimensions trop petites. Dans tous les cas, le -repage
Ne devrait pas faire de mal.
Les calculs utilisent l'arithmétique entière puisque bash
ne supporte que cela. Avec zsh
les expressions peuvent être simplifiées - c'est-à-dire remplacées par $((i*8.27))x$((i*11.69))
.
Si les fichiers PNG sont des images à deux niveaux (noir et blanc a.k.a lineart), alors l'outil img2pdf
donne des résultats supérieurs à ImageMagick convert
. Cela signifie que img2pdf
Est plus rapide et génère des fichiers PDF plus petits.
Exemple:
$ img2pdf -o multipage.pdf a.png b.png
ou:
$ img2pdf --pagesize A4 -o multipage.pdf a.png b.png
Ce que vous voulez vraiment utiliser, c'est:
$ convert a.png b.png -compress jpeg -resize 1240x1753 \
-extent 1240x1753 -gravity center \
-units PixelsPerInch -density 150x150 multipage.pdf
-extent
étend réellement l'image à 1240x1753, tandis que -resize
conserve le rapport de l'image, en l'adaptant dans _ 1240x...
ou ...x1753
.
Le -gravity
Le paramètre est facultatif mais peut être utilisé pour centrer l'image lors de l'extension.
Ajout à réponse du caugner :
après avoir installé IM v6.6.9-7, j'ai découvert le -gravity
le paramètre doit être placé entre -resize
et -extent
pour avoir un effet.
en outre (bien que cela ne fasse pas partie de la question de l'op.), j'ai trouvé la définition d'une couleur de fond différente attrayante qui entraînerait la commande totale de
convert in.jpg -resize 1240x1750 -background black -compose Copy\
-gravity center -extent 1240x1750\
-units PixelsPerInch -density 150 out.pdf
une autre variante utile que j'utilise souvent quand je ne veux pas redimensionner une image qui vient déjà dans le rapport d'aspect correct mais garder sa résolution individuelle est
convert in.jpg -units PixelsPerInch -set density '%[fx:w/8.27]'\
-repage a4 out.pdf
où la densité cible est déterminée dynamiquement en calculant la largeur divisée par 8,27 (qui est la largeur en pouces d'une page A4). le -repage a4
le paramètre peut être omis la plupart du temps mais j'ai eu quelques cas où le .pdf résultant aurait un format différent légèrement des dimensions A4 de 210x297mm (8.27x11.6 ")
Je trouve le script suivant pratique qui combine les réponses répertoriées ici ainsi que certains problèmes que j'ai rencontrés avec le calcul en virgule flottante:
endInputArgs=$(($#-1))
quoted_args="$(printf " %q" "${@:1:$endInputArgs}")"
output_arg="$(printf " %q" "${@:$#:1}")"
ratiox=$(echo "150*8.27" | bc -l)
ratioy=$(echo "150*11.69" | bc -l)
bash -c "convert $quoted_args -compress jpeg -resize 1240x1753 \
-units PixelsPerInch -density 150x150 -repage ${ratiox}x${ratioy} $output_arg"
Le script est appelé (enregistré en tant que fichier images2pdf)
images2pdf file\ 1.jpg file\ 2.jpg file\ 3.jpg output.pdf
/ edit: Ajout du drapeau "-l" selon le commentaire de tanius pour une meilleure précision.
Je recommande fortement le programme CLI Python CLI img2pdf
pour une conversion sans perte:
https://gitlab.mister-muffin.de/josch/img2pdf
Exemple d'utilisation:
img2pdf img1.png img2.png -o out.pdf
J'ai trouvé le code de Mikher très utile, mais il présente le PDF entièrement en mode Portrait ou Paysage, donc je l'ai modifié pour vérifier la disposition de chaque fichier d'entrée et la faire correspondre dans la sortie.
Je n'ai pas inclus le montage de Yotam car il fonctionne sans lui sur ma boîte Ubuntu 15.04.
$#!/bin/bash
# Resizes files to A4 (or other size - change PaperWdthMetr and PaperHghtMetr below) and merges into a PDF
export LOCALE=C
[[ "${2}x" == "x" ]] && \
{ echo "Usage: $( basename $0 ) output.pdf extension"
echo " merges all files (*.extension) into a single PDF"
echo "If files z_merged.pdf, z_temp.pdf or $1 exist, they will be overwritten"
exit 1
} || \
OutName="$1"
ext="$2"
# Set basic variables
unset Debug #; Debug="yes" # print extra messages
IMBackground="white" # what colour for paper
IMQuality="91" # JPEG compression level
PaperHghtMetr="297" # milimeters, 297 for ISO A4
PaperWdthMetr="210" # milimeters, 210 for ISO A4
PaperDens="200" # maximum (wanted) dpi for a page
PaperHInch=$( echo scale=5\; $PaperHghtMetr / 2.54 / 10 | bc -l ) # Inch
PaperWInch=$( echo scale=5\; $PaperWdthMetr / 2.54 / 10 | bc -l ) # Inch
PaperRtio=$( echo scale=5\; $PaperWdthMetr / $PaperHghtMetr | bc -l )
# Remove temporary files from prior run
rm -rf z_merged.pdf z_temp.pdf 2>/dev/null
# Process any $ext file in the current directory
find . -maxdepth 1 -name "*.${ext}" -print0 | sort -z | while read -d '' -r FName
do
echo "Converting $FName"
ImgIdentify=$( identify -format "%w %h" "$FName" )
ImgWdthOrig=$( echo $ImgIdentify | cut -d" " -f1 )
ImgHghtOrig=$( echo $ImgIdentify | cut -d" " -f2 )
ImgRtio=$( echo "scale=5; $ImgWdthOrig / $ImgHghtOrig" | bc -l )
# Match output page layout - Landscape or Portrait - to input file
if (( $(echo "$ImgRtio > 1 && $PaperRtio > 1 || $ImgRtio < 1 && $PaperRtio < 1" |bc -l) )); then
echo "Portrait"
PaperHghtInch=$PaperHInch
PaperWdthInch=$PaperWInch
else
echo "Landscape"
PaperHghtInch=$PaperWInch
PaperWdthInch=$PaperHInch
fi
[[ $( echo $ImgRtio'>'$PaperRtio | bc -l ) == 1 ]] \
&& ImgDens=$( echo scale=0\; $ImgWdthOrig / $PaperWdthInch | bc -l ) \
|| ImgDens=$( echo scale=0\; $ImgHghtOrig / $PaperHghtInch | bc -l )
[[ $Debug ]] && echo "ImgDens1: $ImgDens"
[[ $( echo $ImgDens'>'$PaperDens | bc -l ) == 1 ]] \
&& ImgDens=$PaperDens
[[ $Debug ]] && echo "ImgDens2: $ImgDens"
ImgWdth=$( echo $PaperWdthInch \* $ImgDens | bc -l ) # pixels
ImgHght=$( echo $PaperHghtInch \* $ImgDens | bc -l ) # pixels
[[ $Debug ]] && echo "ImgWdth: $ImgWdth".
[[ $Debug ]] && echo "ImgHght: $ImgHght".
convert "${FName}" \
-resize ${ImgWdth}x${ImgHght} \
-background $IMBackground -gravity center \
-extent ${ImgWdth}x${ImgHght} \
-units PixelsPerInch -set density $ImgDens \
-repage ${ImgWdth}x${ImgHght}+0+0 \
-compress JPEG \
-quality $IMQuality \
"${FName%.$ext}.pdf"
# Merge new PDF page with prior pages
[[ -f z_merged.pdf ]] && \
{ pdftk z_merged.pdf "${FName%.$ext}.pdf" cat output z_temp.pdf
mv z_temp.pdf z_merged.pdf
} || \
cp "${FName%.$ext}.pdf" z_merged.pdf
[[ $Debug ]] || rm -rf "${FName%.$ext}.pdf"
done
[[ -f z_merged.pdf ]] && mv z_merged.pdf "$OutName"
echo "Done."
Je me débattais aussi avec ce truc. Sur la base des informations ci-dessus, j'ai écrit un script qui ajoute des fichiers d'images triés par ordre alphabétique dans un seul PDF.
Certaines variables sont réglables dans le script. Cela dépend d'ImageMagick et de pdftk.
NB: Si l'image d'entrée a une résolution (dpi) supérieure à la résolution souhaitée de output.pdf, l'image est rééchantillonnée à la résolution inférieure. Sinon, l'image n'est pas rééchantillonnée et elle est uniquement étendue pour s'adapter au canevas de page.
#!/bin/bash
export LOCALE=C
[[ "${2}x" == "x" ]] && \
{ echo "Usage: $( basename $0 ) output.pdf extension"
echo " merges all files (*.extension) into a single PDF"
echo "If files z_merged.pdf, z_temp.pdf or $1 exist, they will be overwritten"
exit 1
} || \
OutName="$1"
ext="$2"
# Set basic variables
unset Debug #; Debug="yes" # print extra messages
IMBackground="white" # what colour for paper
IMQuality="91" # JPEG compression level
PaperWdthMetr="210" # milimeters, 210 for ISO A4
PaperHghtMetr="297" # milimeters, 297 for ISO A4
PaperDens="200" # maximum (wanted) dpi for a page
PaperWdthInch=$( echo scale=5\; $PaperWdthMetr / 2.54 / 10 | bc -l ) # Inch
PaperHghtInch=$( echo scale=5\; $PaperHghtMetr / 2.54 / 10 | bc -l ) # Inch
PaperRtio=$( echo scale=5\; $PaperWdthMetr / $PaperHghtMetr | bc -l )
# Remove temporary files from prior run
rm -rf z_merged.pdf z_temp.pdf 2>/dev/null
# Process any $ext file in the current directory
find . -maxdepth 1 -name "*.${ext}" -print0 | sort -z | while read -d '' -r FName
do
echo "Converting $FName"
ImgIdentify=$( identify -format "%w %h" "$FName" )
ImgWdthOrig=$( echo $ImgIdentify | cut -d" " -f1 )
ImgHghtOrig=$( echo $ImgIdentify | cut -d" " -f2 )
ImgRtio=$( echo "scale=5; $ImgWdthOrig / $ImgHghtOrig" | bc -l )
[[ $( echo $ImgRtio'>'$PaperRtio | bc -l ) == 1 ]] \
&& ImgDens=$( echo scale=0\; $ImgWdthOrig / $PaperWdthInch | bc -l ) \
|| ImgDens=$( echo scale=0\; $ImgHghtOrig / $PaperHghtInch | bc -l )
[[ $Debug ]] && echo "ImgDens1: $ImgDens"
[[ $( echo $ImgDens'>'$PaperDens | bc -l ) == 1 ]] \
&& ImgDens=$PaperDens
[[ $Debug ]] && echo "ImgDens2: $ImgDens"
ImgWdth=$( echo $PaperWdthInch \* $ImgDens | bc -l ) # pixels
ImgHght=$( echo $PaperHghtInch \* $ImgDens | bc -l ) # pixels
[[ $Debug ]] && echo "ImgWdth: $ImgWdth".
[[ $Debug ]] && echo "ImgHght: $ImgHght".
convert "${FName}" \
-resize ${ImgWdth}x${ImgHght} \
-background $IMBackground -gravity center \
-extent ${ImgWdth}x${ImgHght} \
-units PixelsPerInch -set density $ImgDens \
-repage ${ImgWdth}x${ImgHght}+0+0 \
-compress JPEG \
-quality $IMQuality \
"${FName%.$ext}.pdf"
# Merge new PDF page with prior pages
[[ -f z_merged.pdf ]] && \
{ pdftk z_merged.pdf "${FName%.$ext}.pdf" cat output z_temp.pdf
mv z_temp.pdf z_merged.pdf
} || \
cp "${FName%.$ext}.pdf" z_merged.pdf
[[ $Debug ]] || rm -rf "${FName%.$ext}.pdf"
done
[[ -f z_merged.pdf ]] && mv z_merged.pdf "$OutName"
echo "Done."
Je viens d'utiliser quelque chose de similaire à la réponse maxschlepzigs sous Ubuntu 16.04/ImageMagick
Cela centre également le résultat
i=300; convert a.png b.png -compress jpeg -quality 100 \
-density ${i}x${i} -units PixelsPerInch \
-resize $((i*827/100))x$((i*1169/100)) \
-gravity center \
-extent $((i*827/100))x$((i*1169/100)) multipage.pdf
Je voulais convertir une image en taille de page de 5,00 x 8,00 pouces (vue depuis Adobe reader) Voici ce que j'ai fait sur Ubuntu 18.04 OS. Tout d'abord, déterminez la taille de la page que je recherche comme ceci:
$ pdfinfo my-input.pdf
Et le retour est: Taille de la page: 360 x 576 pts
Ensuite, l'image est convertie en un PDF de même taille comme ceci:
$ img2pdf --pagesize 360x576 -o outpage.pdf input_pic.jpg
Remarque: pour installer img2pdf
$ Sudo apt install img2pdf