Pregunta

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

convert cover.pdf cover.png

Esto funciona, pero desafortunadamente el cover.png se muestra 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 prefiero usar la biblioteca de conversión 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 forma de pasar los argumentos a través de la conversión a GhostScript o ¿tengo que llamar directamente a GhostScript?

¿Fue útil?

Solución

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

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

Problema resuelto:

  • GS usado para el canal alfa manejando una imagen especial,
  • convertir utilizado para crear fondo transparente,
  • tubería utilizada 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 PNG separado por página PDF, puede usar la sintaxis % 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 -contar es cero - file-000.png corresponde a la página 1 del PDF, 001 a la 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

Otros consejos

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

Este es el comando que uso:

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

Y aquí se implementa 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 archivos de imagen, 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 al nombre % 03d gs -o a% 03d.jpg a.pdf

Qué significa cada opción:

  • sDEVICE = {jpeg, pngalpha, png16m ...} - tipo de archivo
  • -o - archivo de salida (% stdout a stdout)
  • -dTextAlphaBits = 4 - antialiasing de fuentes.
  • -r300 - 300 ppp

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

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

Ejemplo:

pdftocairo -png mypage.pdf mypage.png

No se pudo obtener la respuesta aceptada para trabajar. Luego descubrí que en realidad la solución es mucho más simple de todos modos, ya que Ghostscript no solo admite PNG de forma nativa, sino que incluso múltiple diferentes "codificaciones" :

  • 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

Guardará la página 2 de test.pdf en test.png usando la codificación pnggray y 500 DPI.

Aquí hay un

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

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

xelatex test.tex

Ahora, ImageMagick y GraphicMagic ambos parámetros de análisis 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

Da buenos gráficos en fondo transparente, recortado a lo que realmente está en la página. Los parámetros -density y -resize , proporcionan una mejor granularidad y aumentan la resolución general.

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

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 más 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.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features: OpenMP

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

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

Como esta página también enumera herramientas alternativas, mencionaré xpdf que tiene herramientas de línea de comandos listas para compilar para Linux / Windows / Mac. Apoya la transparencia. Es gratuito para uso comercial, a diferencia de Ghostscript, que tiene precios realmente escandalosos .

En una prueba en un gran archivo PDF, fue un 7,5% más rápido que Ghostscript.

(También tiene convertidores de PDF a texto y HTML)

Intenta extraer una sola página.

$ page = 4

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

Puede usar ImageMagick sin separar la primera página del PDF con otras herramientas. Solo hazlo

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


Aquí aumento la densidad nominal en un 400% (72 * 4 = 288) y luego redimensiono en 1/4 (25%). Esto proporciona una calidad mucho mejor para el png resultante.

Sin embargo, si el PDF es CMYK, PNG no lo admite. Tendría que convertirse a sRGB, especialmente si tiene transparencia, ya que Ghostscript no puede manejar CMYK con alfa.

convert -density 288 -colorspace sRGB -resize 25% cover.pdf[0] cover.png
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top