Converting a PDF to black & white with ghostscript

21

18

Similarly to this question:

Convert a PDF to greyscale on the command line in FLOSS?

I have a PDF-document and want to convert it to pure black and white. So I want to discard halftones. To convert to grayscale with ghostscript I can use this command:

gs \
 -sOutputFile=output.PDF \
 -sDEVICE=pdfwrite \
 -sColorConversionStrategy=Gray \
 -dProcessColorModel=/DeviceGray \
 -dCompatibilityLevel=1.4 \
  input.PDF < /dev/null

What do I have to change to get monochrome e.g. only the colors black and white and no halftones?

niklasfi

Posted 2010-10-17T14:50:36.393

Reputation: 491

Answers

6

The last suggestion indeed only converts to grayscale and then only works if the underlying doc uses setrgbcolor. This did not work for me, since I had a doc, that used setcolor.

I had success with redefining setcolor to always set the color to 0,0,0:

gs -o <output-file.pdf> -sDEVICE=pdfwrite \
-c "/osetcolor {/setcolor} bind def /setcolor {pop [0 0 0] osetcolor} def" \
-f <input-file.ps>

It has been 15+ years since I did any PostScript hacking, so the above may be lame, incorrect or even accidental - if you know how to do better, please suggest.

Surge

Posted 2010-10-17T14:50:36.393

Reputation: 76

3

I am not sure if the following suggestion will work... but it may be worth to try out:

  1. convert the PDF to PostScript using the simple pdf2ps utility
  2. convert that PostScript back to PDF while using a re-defined /setrgbcolor PostScript operator

These are the commands:

First

  pdf2ps color.pdf color.ps

This gives you color.ps as output.

Second

gs \
-o bw-from-color.pdf \
-sDEVICE=pdfwrite \
-c "/setrgbcolor{0 mul 3 1 roll 0 mul 3 1 roll 0 mul 3 1 roll 0 mul add add setgray}def" \
-f color.ps

Kurt Pfeifle

Posted 2010-10-17T14:50:36.393

Reputation: 10 024

I tried this and was still left with shades of gray. niklasfi wants monochrome. – frabjous – 2011-01-23T15:57:37.630

3

It's not ghostscript, but with imagemagick this is quite simple:

 convert -monochrome input.pdf output.pdf

o-town

Posted 2010-10-17T14:50:36.393

Reputation: 55

convert -monochrome -denisty 600 ? – Ilia w495 Nikitin – 2018-01-06T06:42:46.873

This seems to do halftoning; I want all colors (but white) to be converted to black, regardless of darkness. – Gavin S. Yancey – 2018-10-11T06:00:23.840

10The resulting pdf quality is much much worse than original. – Hindol – 2013-07-01T07:52:43.507

2

for gray scale PDF:

By using GhostScript

IN PHP code, use this script

exec("'gs' '-sOutputFile=outputfilename.pdf' '-sDEVICE=pdfwrite' '-sColorConversionStrategy=Gray' '-dProcessColorModel=/DeviceGray' '-dCompatibilityLevel=1.4'  'inputfilename.pdf'",$output);

usefull url
http://www.linuxjournal.com/content/tech-tip-using-ghostscript-convert-and-combine-files

Tarun Kumar

Posted 2010-10-17T14:50:36.393

Reputation: 21

1

This looks like it would work:

1) Convert the file to monochrome with gs

gs -sDEVICE=psmono \
  -dNOPAUSE -dBATCH -dSAFER \
  -sOutputFile=combined.ps \
  first.pdf \
  second.ps \
  third.eps [...]

3) Convert the Postscript file back to a PDF with ps2pdf or gs

(credit to: http://www.linuxjournal.com/content/tech-tip-using-ghostscript-convert-and-combine-files)

Ed L

Posted 2010-10-17T14:50:36.393

Reputation: 141

0

For pure black and white PDF, you need to convert it into ps format then into PDF for postscript:

exec(" gs -sDEVICE=psmono  -dNOPAUSE -dBATCH -dSAFER  -sOutputFile=combined.ps  $pdf");

postscript to PDF -> black and white

exec(" gs -sDEVICE=pdfwrite   -dNOPAUSE -dBATCH -dSAFER  -sOutputFile=file_pdf.pdf  filename.ps");

Tarun Kumar

Posted 2010-10-17T14:50:36.393

Reputation: 21

Ghostscript 9.50 complains "Unknown device: psmono" – Massimo – 2020-02-06T17:15:15.813