¿Cómo convertir por lotes una imagen a un PDF?

10

Quiero convertir por lotes imágenes (jpg, png, etc.) a PDF. Convertirlos directamente a PDF es fácil con:

convert in.jpg out.pdf

Sin embargo, necesito algunas opciones más, como configurar el tamaño de página de salida, los márgenes y la rotación entre el formato horizontal y vertical. Después de alguna prueba y error, se me ocurrió:

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

Centra la imagen en una página A4 y rota automáticamente entre horizontal y vertical, sin embargo, solo funciona con imágenes pequeñas por debajo de 595x842. Las imágenes más grandes se rompen, ya que 595x842 parece ser la resolución en píxeles asignada a una página A4. Leer en la red, la -densityopción podría ser una solución potencial para aumentar el recuento de píxeles en una página A4, pero no pude hacerlo funcionar.

Las soluciones fuera de Imagemagick son, por supuesto, bienvenidas también.

Grumbel
fuente

Respuestas:

8

Una solución alternativa es dividir la generación de imágenes y la conversión de PDF. Primero convierta las imágenes converta A4 a 300 ppp (es decir, 3508x2479), luego use sam2p para convertirlas a PDF y luego use sam2p_pdf_scale para convertirlas a 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

Editar: Un guión más completo:

#!/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
fuente
2

Un poco más limpio que la otra respuesta :

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

Véalo en acción en http://convertjpgpdf.net .

jobjol
fuente
Esto funciona muy bien! ¡Gracias! ¿Sería posible también eliminar los archivos PDF "temporales" no concatenados?
Rasmus