2012-09-06 7 views
10

Non riesco a trovare se Ghostscript è in grado di rilevare semplicemente se il lavoro è a colori o in scala di grigi. Uso Ghostscript per convertire i lavori di stampa in PNG, ma devo anche avere informazioni sul colore del lavoro, quindi non devo cercarlo di nuovo pixel per pixel.Rilevazione colore Ghostscript

risposta

16

Un dispositivo Ghostscript (relativamente nuovo) chiamato inkcov (è necessario Ghostscript v9.05 o successivo) in grado di rilevare in modo affidabile se una pagina PDF utilizza il colore o meno.

Visualizza la copertura dell'inchiostro per gli inchiostri CMYK, separatamente per ogni singola pagina (per i colori RGB, esegue una conversione invisibile allo spazio colore CMYK internamente).

Per studiare e dimostrare le sue funzioni, in primo luogo generare un esempio PDF con l'aiuto di 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" 

Mentre tutte le pagine appaiono per l'occhio umano non utilizzare qualsiasi colore a tutti, pagine 2 e 3 effettivamente mischiano i loro valori di grigio apparenti dal colore. Ma nessuno dei colori è direttamente visibile (a meno che il tuo monitor non sia regolato male).

Guardate le pagine PDF risultanti (convertito in PNG per la visualizzazione più facile via web):

4 PDF pages without directly visible color

nel settore della prestampa, 'ricco' neri o sfumature di grigio sono spesso utilizzati. L'espressione "ricca", nera o grigia, è usata per esprimere il fatto che queste sfumature non sono realizzate con toner o inchiostro puramente neri, ma hanno componenti di colore mescolati per farle apparire più brillanti e più sature.

Ora verificare la copertura di inchiostro di ogni pagina:.

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 valore pari a 1.00000 mappe a copertura di inchiostro del 100% per il rispettivo canale di colore Così 0.05040 nella prima riga del risultato significa 5.04 % dell'area della pagina è coperto da inchiostro nero) Quindi il risultato in Ghostscript di inkcov è esattamente quello atteso.

  • pagine 1 + 4 non usare qualsiasi C (ciano), M (magenta), Y (giallo) colori, ma solo K (nero).
  • Le pagine 2 + 3 utilizzano inchiostro di colori C (ciano), M (magenta), Y (giallo), ma non K (nero).

Ora cerchiamo di convertire tutte le pagine del PDF originale per utilizzare il DeviceGray spazio colore:

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

...e verificare la copertura di inchiostro ancora:

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 

Anche in questo caso, esattamente il risultato atteso in caso di conversioni dei colori succesful!

+0

Questo è anche un modo rapido se è necessario stimare la copertura del toner per un file di stampa. –

+0

Nel caso qualcuno abbia bisogno di farlo in ruby, ecco un gioiello https://rubygems.org/gems/pdf_colored_pages che emette un array contenente i numeri di pagina (es. 1,3,4) o una stringa di intervallo come '1,3 -4 ', analizzando l'output inkcov di ghostscript. – RedRoosterMobile

1

Un nuovo dispositivo di output ha reso questa risposta obsoleta, vedere la risposta accettata.


Fino al 2011, il file doveva essere rasterizzato per vedere un'uscita. Dal momento che il PDF/PS è una descrizione di come appare il file che viene visualizzato durante la rasterizzazione. Anche se potessi farlo con ghostscipt sono sicuro che sarebbe necessario rasterizzare/interpretare il file prima di guardare l'output, quindi se hai il png potresti farlo tu stesso, che sarà meno intensivo della CPU rispetto all'elaborazione del file di nuovo con GS.

+0

... e sono abbastanza sicuro che la tua dichiarazione * "non puoi farlo" * era corretta fino a circa un anno fa, ma non è più :-) - Per favore cancella (o modifica) la tua risposta, prima che venga downvoted ... :-) –