Comment convertir par lots une image en PDF?

10

Je souhaite convertir par lots des images (jpg, png, etc.) en PDF. Les convertir directement en PDF est facile avec:

convert in.jpg out.pdf

Cependant, j'ai besoin de plus d'options, telles que la définition de la taille de la page de sortie, des marges et de la rotation entre le format paysage et portrait. Après quelques essais et erreurs, j'ai trouvé:

convert -rotate "90>" -page A4+0+0  -gravity center in.jpg  out.pdf

Cela centre l'image sur une page A4 et pivote automatiquement entre paysage et portrait, mais cela ne fonctionne qu'avec de petites images en dessous de 595x842. Les images plus grandes se brisent, car 595x842 semble être la résolution en pixels attribuée à une page A4. En lisant sur le net, l' -densityoption pourrait être une solution potentielle pour augmenter le nombre de pixels sur une page A4, mais je n'ai pas pu le faire fonctionner.

Les solutions en dehors d'Imagemagick sont bien entendu également les bienvenues.

Grumbel
la source

Réponses:

8

Une solution de contournement consiste à diviser la génération d'images et la conversion PDF. Convertissez d'abord les images converten A4 @ 300 dpi (ie 3508x2479), puis utilisez sam2p pour les convertir en PDF puis utilisez sam2p_pdf_scale pour les convertir en A4.

convert -rotate "90>" -scale 3508x2479 -border 64x64 -bordercolor white in.png out.png
sam2p out.png out.pdf
sam2p_pdf_scale 595 842 out.pdf

Edit: Un script plus complet:

#!/bin/sh

A4_WIDTH=2479
A4_HEIGHT=3508

H_MARGIN=64
V_MARGIN=64
WIDTH=$((${A4_WIDTH} - ${H_MARGIN} * 2))
HEIGHT=$((${A4_HEIGHT} - ${V_MARGIN} * 2))

for i in "$@"; do
    TMP="/tmp/$(uuidgen).png"
    echo "$i"
    convert \
        -rotate "90>" \
        -scale "${WIDTH}x${HEIGHT}" \
        -border "${H_MARGIN}x${V_MARGIN}" -bordercolor white \
        -gravity center \
        -extent "${A4_WIDTH}x${A4_HEIGHT}" \
        -gravity center \
        -font helvetica -pointsize 80 \
        -fill white -draw \
        "push graphic-context
         translate $((${A4_WIDTH}/2 - 160)), 0
         rotate 90
         text -2,-2 '$i'
         text -2,2 '$i'
         text 2,-2 '$i'
         text 2,2 '$i'
         pop graphic-context
    " \
        -fill black -draw \
        "push graphic-context
         translate $((${A4_WIDTH}/2 - 160)), 0
         rotate 90
         text 0,0 '$i'
         pop graphic-context
    " \
        "$i" "$TMP"
    sam2p "$TMP" "${i}.pdf"
    sam2p_pdf_scale 595 842 "${i}.pdf"
done

# EOF #
Grumbel
la source
2

Un peu plus propre que l' autre réponse :

ls *.jpg | sed -r 's/(.*)\.(\w{3,4})/\1.\2 \1.pdf/' | xargs -n2 sam2p 2>&1 | grep OutputFile | perl -pe 's/.*: //' | xargs pdfjoin --outfile out.pdf

Voyez-le en action sur http://convertjpgpdf.net .

jobjol
la source
Cela fonctionne à merveille! Merci! Serait-il possible de l'obtenir également pour supprimer les fichiers PDF "temporaires", non concaténés?
Rasmus