Converter um PDF para PNG
-
19-08-2019 - |
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?
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.
- Felizmente, gs pode escrever para stdout (
... -o %stdout ...
). - 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