Como converter em lote uma imagem para um PDF?

10

Quero converter em lote imagens (jpg, png, etc.) em PDF. Convertê-los diretamente em PDF é fácil com:

convert in.jpg out.pdf

No entanto, preciso de mais algumas opções, como definir o tamanho da página de saída, margens e rotação entre o formato paisagem e retrato. Depois de algumas tentativas e erros, descobri:

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

Centraliza a imagem em uma página A4 e gira automaticamente entre paisagem e retrato, no entanto, ela só funciona com imagens pequenas abaixo de 595x842. Imagens maiores quebram, como 595x842 parece ser a resolução em pixels que é atribuída a uma página A4. Ao ler na net, a opção -density pode ser uma solução potencial para aumentar a contagem de pixels em uma página A4, mas não consegui fazer isso funcionar.

Soluções fora do Imagemagick também são bem-vindas.

    
por Grumbel 17.09.2011 / 15:26

2 respostas

8

Uma solução é dividir a geração de imagens e a conversão de PDF. Primeiro converta as imagens via convert para A4 a 300dpi (ou seja, 3508x2479), depois use sam2p para convertê-las em PDF e, em seguida, use sam2p_pdf_scale para convertê-las em 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: um script mais 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 #
    
por Grumbel 17.09.2011 / 15:43
2

Um pouco mais limpo que a outra outra resposta :

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

Veja-o em ação no link .

    
por jobjol 12.08.2012 / 11:58