Convertir un PDF a PNG

Estoy tratando de convertir un PDF a una imagen PNG (al menos la portada de uno). Estoy extrayendo con éxito la primera página del PDF con pdftk. Estoy usando imagemgick para hacer la conversión:

convert cover.pdf cover.png 

Esto funciona, pero desafortunadamente el cover.png aparece incorrectamente (algunos de los objetos alfa en el PDF no se representan correctamente). Sé que ImageMagick usa GhostScript para hacer la conversión y si lo hago directamente con gs puedo obtener los resultados deseados, pero preferiría usar la biblioteca de conversiones ya que tiene otras herramientas que me gustaría aprovechar.

Este comando en GhostScript logra la imagen deseada:

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

Me pregunto si hay alguna manera de pasar argumentos a través de convertir a GhostScript o me veo obligado a llamar a GhostScript directamente?

Puede usar una línea de comando con dos comandos ( gs , convert ) conectados a través de un conducto, si el primer comando puede escribir su salida a stdout, y si el segundo puede leer su entrada desde stdin.

  1. Afortunadamente, gs puede escribir en stdout ( ... -o %stdout ... ).
  2. Afortunadamente, convert puede leer de stdin ( convert -background transparent - output.png ).

Problema resuelto:

  • GS utilizado para el manejo de canales alfa de una imagen especial,
  • conversión utilizada para crear fondo transparente,
  • pipa usada para evitar escribir un archivo temporal en el disco.

Solución completa:

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

Actualizar

Si desea tener un archivo PNG separado por página PDF, puede usar la syntax %d :

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

Esto creará archivos PNG llamados page-000.png , page-001.png , … (Tenga en cuenta que el %d -counting está basado en cero – file-000.png corresponde a la página 1 del PDF, 001 a página 2…

O, si desea mantener su fondo transparente, para un PDF de 100 páginas, haga

 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 

De todas las alternativas disponibles, encontré a Inkscape para producir los resultados más precisos al convertir archivos PDF a PNG. Especialmente cuando el archivo fuente tenía capas transparentes, Inkscape tuvo éxito donde Imagemgick y otras herramientas fallaron.

Este es el comando que uso:

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

Y aquí está implementado en un 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 convertir archivos PDF a imágenes, use los siguientes 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

Si tiene varias páginas, agregue el nombre % 03d gs -oa%03d.jpg a.pdf

Qué significa cada opción:

  • sDEVICE = {jpeg, pngalpha, png16m …} – filetype
  • -o – archivo de salida (% stdout a stdout)
  • -dTextAlphaBits = 4 – antialiasing de fuente.
  • -r300 – 300 dpi

También se pueden usar las utilidades de línea de comando incluidas en el paquete poppler-utils :

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

Ejemplo:

 pdftocairo -png mypage.pdf mypage.png 

Aquí hay una discusión alemana sobre un problema como este para archivos SVG donde se resuelve mediante el uso de

 convert -background transparent 

Quizás esto también funcione para ti.

Agregaré mi solución, incluso si su hilo es viejo. Quizás esto ayude a alguien de todos modos.

Primero, necesito generar el PDF. Yo uso XeLaTeX para eso:

 xelatex test.tex 

Ahora, ImageMagick y GraphicMagic analizan parámetros de izquierda a derecha, por lo que el parámetro más a la izquierda se ejecutará primero. Terminé usando esta secuencia para un procesamiento óptimo:

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

Ofrece buenos gráficos en un fondo transparente, recortados a lo que realmente está en la página. Los parámetros de -density y -resize dan una granularidad mejorada y aumentan la resolución general.

Sugiero verificar si la densidad puede disminuirse para usted. Reducirá el tiempo de conversión.

No se pudo lograr que la respuesta aceptada funcione. Luego descubrió que en realidad la solución es mucho más simple de todos modos, ya que Ghostscript no solo es compatible nativamente con PNG, sino incluso con múltiples “codificaciones” diferentes :

  • png256
  • png16
  • pnggray
  • pngmono

El comando de shell que funciona para mí es:

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

Salvará la página 2 de test.pdf a test.png usando la encoding pnggray y 500 DPI.

Para un PDF que ImageMagick estaba dando colores inexactos descubrí que GraphicsMagick hizo un mejor trabajo:

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

Mi solución es mucho más simple y directa. Al menos funciona de esa manera en mi PC (con las siguientes especificaciones):

 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 

con

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

Entonces, esto es lo que corro en mi file.pdf :

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