2009-06-10 23 views
15

Estoy intentando, sin éxito, utilizar Ghostscript para rasterizar archivos PDF con un fondo transparente a archivos PNG con un fondo transparente. He buscado alta y baja para las preguntas de otros intentando lo mismo y ninguna de las soluciones publicadas, que por lo que yo puedo decir que descendía a especificando -sDEVICE = pngalpha, han trabajado con mis archivos de prueba. En este punto agradecería cualquier consejo o consejos que una mano más experimentada pudiera proporcionar .Convierta un PDF a un PNG transparente con GhostScript

Mi prueba de PDF se encuentra aquí: http://www.kolossus.com/files/test.pdf

Podría ser que el problema es con este archivo, pero lo dudo. Por lo que yo puedo decir , no tiene ningún fondo específico, y cuando abro el archivo con una aplicación transparencia consciente como Photoshop o Illustrator, por supuesto que pantallas con un fondo transparente. Sin embargo, cuando se abre con una aplicación como Adobe Reader, el archivo se representa con un fondo blanco. Creo que esto tiene más que ver con la aplicación que representa el PDF que con el PDF en sí: las aplicaciones como Adobe Reader suponen que quieres ver cómo se verá un documento impreso y mostrar siempre un lienzo blanco detrás del obras de arte, pero no puedo estar seguro.

El comando gs que estoy usando es:

gs -dNOPAUSE -dBATCH -sDEVICE=pngalpha -r72 -sOutputFile=test.png test.pdf 

Esto produce un PNG que tiene píxeles transparentes fuera del cuadro delimitador de la obra en el archivo, pero todos los píxeles que se encuentran dentro de la obra de cuadro delimitador están rasterizados sobre un fondo blanco. Este es un problema para mí, ya que mi obra tiene sombras y bordes antialiased que necesitan ser conservado en la salida final, y no puede ser simplemente posprocesarlo con ImageMagick. Una muestra de mi salida PNG está en la misma ubicación que el pdf anterior, con .png al final (stackoverflow no me permitirá incluir más de una URL en mi publicación).

Curiosamente, no veo efectos al utilizar el indicador -dBackgroundColor, incluso si configuro algo no blanco como -dBackgroundColor = 16 # ff0000. Tal vez mi comprensión de la sintaxis de esta bandera es incorrecta.

También, curiosamente, no veo efectos al utilizar -dTextAlphaBits = 4 -dGraphicsAlphaBits = 4 indicadores para intentar habilitar el antialiasing de subpixel. Me gustaría también agradecería cualquier consejo sobre cómo habilitar el antialiasing subpíxel, especialmente en el texto.

Por último, estoy usando GPL Ghostscript 8.64 en Mac OS 10.5.7 y la representación flujo de trabajo que estoy tratando de ponerse en marcha es generar imágenes PNG transparentes de salida PDFs por PrinceXML. Llamaré a Ghostscript directamente para la rasterización en lugar de utilizar ImageMagick porque ImageMagick delega en Ghostscript para la rasterización de PDF y debería poder controlar mejor la rasterización llamando directamente a GS.

Gracias por su ayuda.

-Jon Wolfe

Respuesta

2

temo que no puedo decir lo que ghostscript puede hacer, pero tengo una sugerencia.Intenta renderizar tu PDF con un fondo negro y otro blanco. Cualquier píxel que salga igual en las dos imágenes claramente debe ser opaco (es decir, alfa == 1.0). Los píxeles que son diferentes tienen un alfa distinto de cero que se puede calcular al restar el píxel de fondo negro del píxel de fondo blanco. Dale o toma cierta precisión, el valor de cualquier componente rojo, verde o azul será el valor alfa.

2

Ghostscript puede manejar la transparencia solo si en el momento de la compilación se seleccionó la opción "transpar". Asumiendo que su Ghostscript es la versión correcta, puede agregar un parámetro en la línea de comandos:

... -c "0 .setopacityalpha" -f c:/path/to/file/to/be/converted.pdf 

(Puede utilizar variantes de la opacidad en el rango [0..1]).

Además, has de convertir su .png creado-Ghostscript (en caso de que los antecedentes de hecho es blanco en vez de transparente) a un fondo transparente usando gm convert comandos de ImageMagick GraphicMagick convert o de? Aquí está un ejemplo:

convert -background transparent test.png test_transp.png 

Por cierto, en caso de Acrobat o AcroReader muestran todos los orígenes de páginas como blanco: Este es el ajuste, incluso para los fondos realmente transparente por defecto. Puede cambiarlo en las opciones de configuración de la aplicación: IIRC la configuración estaba dentro de las opciones de 'Página de visualización' y se llamaba s.th. como 'Mostrar rásteres de transparencia'. (Si lo busqué en detalle, posiblemente no ayude demasiado, Adobe sigue cambiando todas las opciones en cada lanzamiento nuevo. Solo hazlo por ti mismo, lo encontrarás ahora que sabes que está allí).

18

Compartí tu experiencia con las marcas -dTextAlphaBits=4 y -dGraphicsAlphaBits=4. Parece que no funcionan en todos los textos. El "arreglo" que se me ocurrió fue simplemente renderizar la imagen a 4 veces el tamaño deseado, y luego escalar la imagen. Afortunadamente, ghostscript no tiene problemas para procesar archivos gigapixel PNG.

actualización

Ghostscript (hasta la versión 9) también parece disfrutar de los principales problemas cuando se representa transparente PNG con un número de píxeles por encima de 2.500.000 (es decir, 10 MB de memoria intermedia de píxeles). El fondo transparente de repente se vuelve blanco.

Al profundizar en la fuente de ghostscript, encontré que cuando el tamaño del búfer de píxeles supera los 10 mb, cambia a un esquema de asignación de memoria diferente. Más específicamente, la imagen se procesa usando el dispositivo image32 en lugar de pngalpha. Dada la forma en que se implementa el controlador pngalpha, su propósito general se desvanece cuando gs decide no usar su pngalpha_fill_rectangle().

Afortunadamente, hay un interruptor llamado -dMaxBitmap=N para configurar este parámetro en el tiempo de ejecución. Esto se menciona en una solución para un error totalmente diferente que data de 1999-01-15, ver http://pages.cs.wisc.edu/~ghost/doc/AFPL/5.50/relnotes/index.htm.

Agregar -dMaxBitmap=2147483647 me ha solucionado muchos problemas. En sistemas de 64 bits, este número puede ser mayor.

Una verdadera solución sería volver a trabajar el controlador pngalpha para que establezca el color de fondo en 0x7f000000 independientemente de la ruta del código real, pero la mayoría de los sistemas tienen suficiente memoria ram para que el truco anterior funcione.

+0

Solo quiero decir gracias por esta respuesta. Estoy tratando de rasterizar un PDF con 'gs 9.02', que es una superposición de dos archivos PDF con rellenos transparentes (hecho con' pdftk'); cuando rasterize con '-r 150', obtengo solo la capa superior visible, mientras que la parte inferior es casi invisible. Después de leer esto, probé '-dMaxBitmap = 2147483647', desafortunadamente no funcionó para mí, pero luego comencé a reducir la resolución, hasta que encontré eso en' -r80' (para mi caso), finalmente los colores son renderizados correctamente, lo que probablemente significa que es el mismo error de memoria. Afortunadamente, 'gimp' funcionó para mí. ¡Aclamaciones! – sdaau

+1

Solo quería decir que PNG transparente funciona bien para mí. Estoy usando GhostScript 9.19 en Windows y 9.06 en Linux. Estoy usando estas opciones: '-q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap = 500000000 -dAlignToPixels = 0 -dGridFitTT = 2 -sDEVICE = pngalpha -dTextAlphaBits = 4 -dGraphicsAlphaBits = 4 -r150'. No sé si alguno de ellos hace alguna diferencia, solo funcionó de la caja para mí, así que no jugué con eso. – TheStoryCoder

Cuestiones relacionadas