2012-09-06 18 views
10

Parece que no puedo encontrar si Ghostscript puede simplemente detectar si el trabajo es en color o en escala de grises. Utilizo Ghostscript para la conversión de trabajos de impresión a PNG, pero también necesito información sobre el color del trabajo, por lo que no tengo que volver a buscarlo píxel por píxel.Detección de color Ghostscript

Respuesta

16

Un (relativamente nuevo) dispositivo Ghostscript llamado inkcov (necesita Ghostscript v9.05 o posterior) puede detectar de forma fiable si una página PDF usa color o no.

Muestra la cobertura de tinta para las tintas CMYK, por separado para cada página (para los colores RGB, realiza una conversión silenciosa al espacio de color CMYK internamente).

Para investigar y demostrar sus funciones, generar primero un ejemplo PDF con la ayuda de Ghostscript:

gs                  \ 
    -o color-or-grayscale-test.pdf          \ 
    -sDEVICE=pdfwrite             \ 
    -g5950x2105               \ 
    -c "/F1 {10 80 moveto /Helvetica findfont 64 scalefont setfont} def" \ 
    -c "F1       (100% 'pure' black) show showpage" \ 
    -c "F1 .5 .5 .5 setrgbcolor (50% 'rich' rgbgray) show showpage" \ 
    -c "F1 .5 .5 .5 0 setcmykcolor (50% 'rich' cmykgray) show showpage" \ 
    -c "F1 .5   setgray  (50% 'pure' gray)  show showpage" 

Mientras todos las páginas aparecen al ojo humano no utilizar ningún color en absoluto, páginas 2 y 3 realmente mezclan sus valores grises aparentes del color. Pero ninguno de los colores es directamente visible (a menos que su monitor esté muy mal ajustado).

vistazo a las páginas PDF resultantes (convertido a PNG para la visualización más fácil a través de la web):

4 PDF pages without directly visible color

En la industria de preimpresión, se utilizan con frecuencia los negros o tonos de gris 'ricos'. La expresión 'rico' negro o gris se usa para expresar el hecho de que estos tonos no están hechos de tóner o tinta puramente negros, sino que tienen componentes de color mezclados para que parezcan más brillantes y saturados.

Ahora compruebe la cobertura de tinta de cada página:.

gs -o - -sDEVICE=inkcov color-or-grayscale-test.pdf 
[...] 
Page 1 
    0.00000 0.00000 0.00000 0.05040 CMYK OK 
Page 2 
    0.05401 0.05401 0.05401 0.05401 CMYK OK 
Page 3 
    0.05799 0.05799 0.05799 0.00000 CMYK OK 
Page 4 
    0.00000 0.00000 0.00000 0.04541 CMYK OK 

(Un valor de 1,00000 mapas de cobertura de tinta del 100% para el canal de color correspondiente Así 0.05040 en la primera línea del resultado significa 5.04 % del área de la página está cubierto por la tinta de negro) por lo tanto el resultado dado por Ghostscript de inkcov es exactamente el esperado:.

  • páginas 1 + 4 no utilice cualquiera de C (cian), M (magenta), Y (amarillo) colores, pero solo K (negro).
  • páginas 2 + 3 utilizan tinta de colores C (cian), M (magenta), Y (amarillo), pero no K (negro) en absoluto.

Ahora vamos a convertir todas las páginas del PDF original para usar el espacio de color DeviceGray:

gs        \ 
    -o only-black-ink.pdf   \ 
    -sDEVICE=pdfwrite    \ 
    -dColorConversionStrategy=/Gray \ 
    -dProcessColorModel=/DeviceGray \ 
    color-or-grayscale-test.pdf 

...y comprobar la cobertura de tinta de nuevo:

gs -q -o - -sDEVICE=inkcov only-black-ink.pdf | grep -v Page 
    0.00000 0.00000 0.00000 0.05040 CMYK OK 
    0.00000 0.00000 0.00000 0.05401 CMYK OK 
    0.00000 0.00000 0.00000 0.05799 CMYK OK 
    0.00000 0.00000 0.00000 0.04541 CMYK OK 

Una vez más, exactamente el resultado esperado en el caso de las conversiones de color exitosos!

+0

Esto también es una manera rápida si necesita estimar la cobertura del tóner para un archivo de impresión. –

+0

En caso de que alguien necesite hacer esto en ruby, aquí hay una gema https://rubygems.org/gems/pdf_colored_pages que genera una matriz que contiene los números de página (por ejemplo, 1,3,4) o una cadena de rango como '1,3 -4 ', al analizar la salida inkcov de ghostscript. – RedRoosterMobile

1

Un nuevo dispositivo de salida ha dejado esta respuesta obsoleta, consulte la respuesta aceptada.


Hasta 2011, el archivo debía ser rasterizado para ver una salida. Dado que el PDF/PS es una descripción de cómo se ve el archivo, que se procesa mientras se rasteriza. Incluso si pudieras hacer esto con ghostscipt, estoy seguro de que necesitaría rasterizar/interpretar el archivo primero y luego mirar el resultado, por lo que si tienes el png, también podrías hacerlo tú mismo, lo que requerirá menos CPU que el procesamiento del archivo. archivo de nuevo con GS.

+0

... y estoy bastante seguro de que su afirmación * "no puede hacer esto" * fue correcta hasta hace aproximadamente un año, pero ya no es así :-) - Por favor, elimine (o edite) su respuesta, antes de que se baje la votación ... :-) –

Cuestiones relacionadas