Pergunta

Eu estou tentando converter um PDF para uma imagem PNG (pelo menos a tampa de um). Eu estou extraindo com sucesso a primeira página do PDF com pdftk. Estou usando imagemagick para fazer a conversão:

convert cover.pdf cover.png

Isso funciona, mas infelizmente o cover.png vem através prestados de forma incorreta (alguns do objeto alfa no PDF não são processados ??corretamente). Eu sei ImageMagick usa GhostScript para fazer a conversão e se eu fizer isso diretamente com gs posso obter os resultados desejados, mas eu prefiro usar a biblioteca de conversão, pois tem outras ferramentas que eu gostaria de alavancagem.

Este comando em GhostScript realiza a imagem desejada:

gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf

Eu estou me perguntando se existe alguma maneira de passar argumentos através convertido ao GhostScript ou eu estou preso com a chamada GhostScript diretamente?

Foi útil?

Solução

Você pode usar uma linha de comando com dois comandos (gs, convert) conectados através de um tubo, se o primeiro comando pode escrever sua saída para stdout, e se o segundo pode ler sua entrada na entrada padrão.

  1. Felizmente, gs pode escrever para stdout (... -o %stdout ...).
  2. Felizmente, convertido pode ler de stdin (convert -background transparent - output.png).

Problema resolvido:

  • GS utilizado para alfa do canal de manuseamento de uma imagem especial,
  • converso usado para a criação de fundo transparente,
  • tubo utilizado para evitar escrever um arquivo temporário no disco.

Solução completa:

gs -sDEVICE=pngalpha       \
   -o %stdout              \
   -r144 cover.pdf         \
   |                       \
convert                    \
   -background transparent \
   -                       \
    cover.png

Atualização

Se você quiser ter um PNG separado por página PDF, você pode usar a sintaxe %d:

gs -sDEVICE=pngalpha -o file-%03d.png -r144 cover.pdf

Isto irá criar arquivos PNG page-000.png nomeado, page-001.png, ... (Note que o %d contagem é baseado em zero - corresponde file-000.png a página 1 do PDF, 001 para a página 2 ...

Ou, se você quiser manter o seu fundo transparente, para uma de 100 páginas PDF, faça

for i in {1..100}; do        \
                             \
  gs -sDEVICE=pngalpha       \
     -dFirstPage="${i}"      \
     -dLastPage="${i}"       \
     -o %stdout              \
     -r144 input.pdf         \
     |                       \
  convert                    \
     -background transparent \
     -                       \
      page-${i}.png ;        \
                             \
done

Outras dicas

Fora de todas as alternativas disponíveis I encontrados Inkscape para produzir os resultados mais precisos ao converter PDFs para PNG. Especialmente quando o arquivo de origem tinha camadas transparentes, Inkscape sucesso onde Imagemagick e outras ferramentas falhou.

Este é o uso de comando I:

inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"

E aqui ele é implementado em um script:

#!/bin/bash

while [ $# -gt 0 ]; do

pdf=$1
echo "Converting "$pdf" ..."
pngfile=`echo "$pdf" | sed 's/\.\w*$/.png/'`
inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"
echo "Converted to "$pngfile""
shift

done

echo "All jobs done. Exiting."

Para converter pdf para arquivos de imagem usar os seguintes comandos:

Para PNG gs -sDEVICE=png16m -dTextAlphaBits=4 -r300 -o a.png a.pdf

Para JPG gs -sDEVICE=jpeg -dTextAlphaBits=4 -r300 -o a.jpg a.pdf

Se você tiver várias páginas acrescentar ao nome % 03d gs -o a%03d.jpg a.pdf

O que significa cada opção:

  • sDEVICE = {jpeg, pngalpha, png16m ...} - filetype
  • -o - arquivo de saída (% stdout para stdout)
  • -dTextAlphaBits = 4 -. Suavização da fonte
  • -r300 - 300 dpi

Pode-se também utilizar os utilitários de linha de comando incluída no pacote poppler-utils:

sudo apt-get install poppler-utils
pdftoppm --help
pdftocairo --help

Exemplo:

pdftocairo -png mypage.pdf mypage.png

Não foi possível obter a resposta aceita ao trabalho. Então descobri que, na verdade, a solução é muito mais simples de qualquer maneira como Ghostscript não apenas suporta nativamente PNG mas mesmo diferentes "codificações" :

  • png256
  • png16
  • pnggray
  • pngmono
  • ...

O comando shell que funciona para mim é:

gs -dNOPAUSE -q -sDEVICE=pnggray -r500 -dBATCH -dFirstPage=2 -dLastPage=2 -sOutputFile=test.png test.pdf

Ele vai salvar página 2 do test.pdf para test.png usando a codificação pnggray e 500 DPI.

Aqui é um alemão discussão sobre um problema como este para arquivos SVG onde é resolvido usando

convert -background transparent

Talvez isso funciona para você, também.

Vou acrescentar a minha solução, mesmo pensou que sua linha é velho. Talvez isto ajude alguém de qualquer maneira.

Em primeiro lugar, eu preciso gerar o PDF. Eu uso XeLaTeX para isso:

xelatex test.tex

Agora, ImageMagick e GraphicMagic ambos os parâmetros de análise da esquerda para a direita, de modo que o parâmetro mais à esquerda, será executado em primeiro lugar. Acabei usando essa seqüência para processamento ideal:

gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png

Ela dá gráficos agradáveis ??no fundo transparente, aparado para o que está realmente na página. Os parâmetros -density e -resize, dar uma granularidade melhor, e aumentar a resolução em geral.

sugiro verificar se a densidade pode ser diminuída para você. Ele vai reduzir o tempo de conversão.

Para um PDF que ImageMagick estava dando cores imprecisas eu achei que GraphicsMagick fez um trabalho melhor:

$ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg

A minha solução é muito mais simples e mais direta. Pelo menos é assim que funciona no meu PC (com as seguintes especificações):

me@home: my.folder$ uname -a
Linux home 3.2.0-54-generic-pae #82-Ubuntu SMP Tue Sep 10 20:29:22 UTC 2013 i686 i686 i386 GNU/Linux

com

me@home: my.folder$ convert --version
Version: ImageMagick 6.6.9-7 2012-08-17 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features: OpenMP

Então, aqui está o que eu corro no meu file.pdf:

me@home: my.folder$ convert -density 300 -quality 100 file.pdf file.png

Como esta página também lista as ferramentas alternativas vou mencionar xpdf que tem ferramentas de linha de comando pronto compilado para Linux / Windows / Mac. transparência suportes. É livre para uso comercial -. Oposição ao Ghostscript que tem realmente ultrajante preço

Em um teste em um grande arquivo PDF que foi 7,5% mais rápido do que Ghostscript.

(Ele também tem PDF para texto e HTML conversores)

Tente extrair uma única página.

$ page = 4

gs -sDEVICE=pngalpha -dFirstPage="$page" -dLastPage="$page" -o thumb.png -r144 input.pdf

Você pode usar ImageMagick sem separar a primeira página do PDF com outras ferramentas. Basta fazer

convert -density 288 cover.pdf[0] -resize 25% cover.png


Aqui eu aumentar a densidade nominal de 400% (72 * 4 = 288) e, em seguida, redimensionar por 1/4 (25%). Isto dá uma muito melhor qualidade para o png resultante.

No entanto, se o PDF é CMYK, PNG não suporta isso. Seria precisam ser convertidos para sRGB, especialmente se ela tem transparência, uma vez Ghostscript não pode lidar com CMYK com alfa.

convert -density 288 -colorspace sRGB -resize 25% cover.pdf[0] cover.png
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top