Convertir un PDF a PNG
-
19-08-2019 - |
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?
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.
- Afortunadamente, gs puede escribir en stdout (
... -o% stdout ...
). - 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: 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: Da buenos gráficos en fondo transparente, recortado a lo que realmente está en la página. Los parámetros Sugiero verificar si la densidad se puede disminuir para usted. Reducirá el tiempo de conversión. xelatex test.tex
gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png
-density
y -resize
, proporcionan una mejor granularidad y aumentan la resolución general.
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