web-dev-qa-db-fra.com

convertir des images en pdf: Comment faire PDF Pages de même taille

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?

47
Jiew Meng

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.

( manuel ImageMagick )

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)).

Images Lineart

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
63
maxschlepzig

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.

25
caugner

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 ")

9
antiplex

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.

2
rindPHI

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
2
Adam Erickson

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."
2
user173283

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."
1
Mikher

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
0
Martin Thoma

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

0
Harry