This is the simple implementation which will print solid black or anything that is not black. Depending on your needs, it may need to get more complex. Without knowing more, I took the brute force approach of using exitserver. exitserver allows the default operation of the RIP to be redefined. To restore the RIP to its normal operation, you need to reboot the rip or write another exit server routine to undefine the server modification.
The routine is installed in the rip by sending the exitserver postscript code. For a PC, this can be done with a DOS copy command to the printers share. There are also sendps programs which can be found on the web to sent the file to the device.
copy redef1.ps \\127.0.0.1\psprinter
This exitserver routine defines a /setcmykcolor function in the userdict, which will take precedence over the setcmykcolor in the system dict. there will 4 numbers on the stack where the last in will be the black. The back value is duplicated and compared to zero. If the black is not zero, the black block will be performed, otherwise the not black will execute. 0 setgray=black and 1 setgray=white, so as the block exists below, black will print as black and everything else will print as white.
%!
serverdict begin 0 exitserver
userdict begin /setcmykcolor
{
dup 0 ne
{
%black
0 setgray
pop pop pop pop
}
{
%not black
1 setgray
pop pop pop pop
}ifelse
} def end
By reversing the value of setgray, the black will not print and everything else "not black" would print.
%!
serverdict begin 0 exitserver
userdict begin /setcmykcolor
{
dup 0 ne
{
%black
1 setgray
pop pop pop pop
}
{
%not black
0 setgray
pop pop pop pop
}ifelse
} def end
It won't matter what program you print from. whichever version of the exitserver is last loaded, will be the way the output will print.
Here is a simple .ps example
%!PS-Adobe-3.0
%%Title: mwe.ps
%%Pages: 001
%%BoundingBox: 0 0 595 842
%%EndComments
%%Page: 1 1
%%PageBoundingBox: 0 0 595 842
/Times-Roman findfont 72 scalefont setfont
0 0 0 1 setcmykcolor
0 20 moveto (black) show
0 1 0 0 setcmykcolor
0 40 moveto (not black) show
0 0 0 1 setcmykcolor
0 60 moveto (black) show
1 0 0 0 setcmykcolor
0 80 moveto (not black) show
0 0 0 1 setcmykcolor
0 100 moveto (black) show
0 1 1 0 setcmykcolor
0 120 moveto (not black) show
showpage
The output will display only "black" or "not black", but the text overprints, so you will see a ghost image of whichever color is not printing.
This is an exitserver to restore the RIP to use the normal setcmykcolor
%!
serverdict begin 0 exitserver
userdict /setcmykcolor undef
As stated at the beginning, this is a simple implementation, such as allowing tints of black and not black There could also be variations of colors where small amounts of black mixed with color could fool the simple routine to where a dark red 0 .87 .75 .1 setcmykcolor would be defined as black, where it probably should be not-black.