Conversão rápida de pdf para jpg no Linux desejado [fechado]

11

Atualmente, estou usando o ImageMagick para converter PDFs em imagens raster JPEG. É dolorosamente lento e consome muita memória.

O comando que eu usei foi:

convert -geometry 1024x768 -density 200 -colorspace RGB foo.pdf bar%02d.jpg

Eu acho que é lento porque usa Ghostscript. Mas deve haver uma maneira mais rápida de fazer isso em uma caixa Linux.

Alguém encontrou uma solução melhor?

mat3001
fonte
Quanto tempo, quanta memória?
Zoredache

Respostas:

18

Usar o Ghostscript diretamente (em vez de usar o convertcomando ImageMagick , que chama Ghostscript indiretamente) é realmente mais rápido. E oferece mais controle sobre os parâmetros de conversão. Experimentar

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d.jpg \
   -dJPEGQ=95      \
   -r600x600       \
   -g4960x7016     \
   foo.pdf

Onde

  • -o: determina o caminho de saída + nome do arquivo (e economiza o uso de -dBATCH -dNOPAUSE)
  • -dJPEGQ: define a qualidade JPEG para 95%
  • -r: define a resolução para 600 dpi
  • -g: define o tamanho da imagem para 4960x7016px
  • -sDEVICE: define a saída como JPEG

Este comando provavelmente ainda será lento para você e criará arquivos maiores que o esperado. Para tamanhos de arquivos menores e execução mais rápida, tente isso (o que provavelmente se aproxima da qualidade de saída da sua convertlinha de comando):

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d_200dpi_q80.jpg \
   -dJPEGQ=80      \
   -r200x200       \
   -g1653x2339     \
   foo.pdf

ou mesmo

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d_default_a4.jpg \
   -sPAPERSIZE=a4 \
   foo.pdf

(com resolução de 72 dpi, geralmente boa o suficiente para a maioria das telas e para a maioria dos aplicativos da web).

Kurt Pfeifle
fonte
1
Você está certo. Eu realmente não achei que o Imagemagick seria o gargalo. Mas eu provavelmente deveria ter tentado. Obrigado também pelos ótimos exemplos!
mat3001
10

Aliás, uma das razões pelas quais o ImageMagick é muito mais lento é que ele chama Ghostscript duas vezes. Ele não converte PDF => PNG de uma só vez, mas usa 2 etapas diferentes:

  • primeiro usa o Ghostscript para PDF => PostScriptconversão;
  • ele usa o Ghostscript para PostScript => PNGconversão.

Você pode aprender sobre as configurações detalhadas "delegados" do ImageMagick (os programas externos que o ImageMagick usa, como o Ghostscript), digitando

convert -list delegate

(No meu sistema, há uma lista de 32 comandos diferentes.) Agora, para ver quais comandos são usados ​​para converter em PNG, use o seguinte:

convert -list delegate | grep -i png

Ok, isso foi para Linux. Se você estiver no Windows, tente o seguinte:

convert -list delegate | findstr /i png

Você descobrirá que o MI produz PNG apenas a partir da entrada PS ou EPS. Então, como o IM obtém (E) PS do seu PDF? Fácil:

convert -list delegate | findstr /i PDF
convert -list delegate | grep -i PDF

Ah! Ele usa o Ghostscript para fazer uma conversão em PDF => PS e, em seguida, usa o Ghostscript novamente para fazer uma conversão em PS => PNG. Funciona, mas não é a maneira mais eficiente se você souber que o Ghostscript pode fazer PDF => PNG de uma só vez. E mais rápido. E com qualidade muito melhor.

Sobre o manuseio de mensagens instantâneas pela conversão de PDF em imagens via delegado Ghostscript, você deve saber duas coisas antes de tudo:

  1. Por padrão, se você não der um parâmetro extra, o Ghostscript produzirá imagens com uma resolução de 72 dpi. É por isso que às vezes as pessoas aqui sugerem adicionar -density 600como um convertparâmetro que diz ao Ghostscript para usar uma resolução de 600 dpi para a saída da imagem.
  2. O desvio do IM para chamar o Ghostscript duas vezes para converter primeiro PDF => PSe depois PS => PNGé um verdadeiro erro. Porque você nunca ganha e mantém a qualidade no primeiro passo, mas muitas vezes perde alguns. Razões:
    • O PDF pode lidar com transparências, o que o PostScript não pode.
    • O PDF pode incorporar fontes TrueType, que o PostScript não pode. etc.pp.
      (Conversão na direção oposta PS => PDF, portanto não é tão crítico ....)

É por isso que sugeri que você converta seus PDFs de uma só vez para PNG (ou JPEG) usando o Ghostscript diretamente. E use a versão mais recente 8.71 (a ser lançada em breve: 9.00) do Ghostscript ...

Kurt Pfeifle
fonte
6

O programa pdftoppmdo pacote poppler também é capaz de criar JPEGs e, para mim, é duas vezes mais rápido do gsque o descrito acima:

pdftoppm -jpeg -r 300 foo.pdf foo.jpg
user177876
fonte
Que ótima sugestão. Corrigido um erro grave que trava o aplicativo quando mudei para pdftoppm graças a esta resposta - nunca soube disso antes!
Danmactough 29/08/2015
Você, senhor, merece uma medalha por isso :) #
9997 Todorovic Milan
2
não é mais rápido do que gs
Ghilas Belhadj
6

Na minha experiência, o MuPDF é muito mais rápido que o Ghostscript. É um projeto muito mais recente, sem grande parte do lixo em gs. Experimente se ele se encaixa no seu caso!

mudraw -w 1024 -h 768 -r 200 -c rgb -o bar%d.png foo.pdf

Se você possui uma distribuição Linux mais antiga e instalou o mupdf-tools a partir do repositório, mudrawainda poderá ser chamadopdfdraw

Você precisa converter o png para jpeg usando, por exemplo, imagemagick. Mas ainda será mais rápido que o Ghostscript.

Josef diz Restabelecer Monica
fonte
2
No meu teste, a conversão de PDF para PNG do MuPDF é cerca de 5-6 vezes mais rápida que o Ghostscript. Obrigado pela solução!
Dmitry Akinin
1
Isso é incrivelmente útil. Leva alguns segundos para que o Ghostscript leve alguns minutos, além da linha de comando ser fácil! Muito obrigado por trazer isso à minha atenção!
#