Setting Chromaticity.MONOCHROME print request attribute on macOS

Philip Race philip.race at oracle.com
Thu Mar 21 04:48:03 UTC 2024


Noted. I don't see a JDK-maintained property file as viable.
It would never be complete, never be up to date, of questionable 
supported status,
undocumented as far as end-users are concerned - no chance Oracle would 
document it.
We have history here with fonts so I am as sure of this as I can be.

So regardless of the lack of solutions elsewhere, that won't work.

To say more I need to look into the code and think about things.
It is superficially surprising not to have printers / Apple CUPS support 
a standard IPP attribute.
I'll put this on my to-do list along with lots of other things.

If you can get Apple to come up with a better answer that would be good.

-phil.

On 3/13/24 7:20 AM, Alexander Scherbatiy wrote:
> Hello,
>
> There is a known issue that a PrinterJob does not take 
> Chromaticity.MONOCHROME print request attribute into account on macOS 
> (JDK-8315113 [1])
>
> The possible ways for solving the issue with black & white printing on 
> macOS could be:
>
> 1. Setting black & white printing with macOS API.
>
>    There is the deprecated PMSetColorMode [2] function:
>    "There is no replacement; this function was included to facilitate 
> porting legacy applications to macOS, but it serves no useful purpose."
>    and I was not able to find another one.
>
> 2. Using a predefined printer.properties file with black & white 
> key/value pairs for known printers.
>     It needs to maintain the property file to keep list with black & 
> white key/value pairs.
>     Or just leave only one default  ColorModel=Gray key/value in the 
> property file so users will need to add another ones for their needs.
>
> 3. Using a PPD API to get the corresponding black & white value for 
> the given key.
>     In this way the black & white keys are printer specific and there 
> should be a way to provide these keys to the program.
>     Another way is parsing a ppd file to find the black & white 
> key/value pair in question. It still requires some search criteria to 
> find the printer specific key.
>
> 4. Adding a custom PrintRequestAttribute which allows for a user to 
> add a printer specific key values to PrintRequestAttributeSet.
>      These key/value pairs are then added to the NSPrintInfo 
> printSettings on macOS.
>
> 5. Providing other ways like a jvm option which allows a user to pass 
> black & white key/value pairs to the program.
>
>
> Are there better solutions for the black & white printing issue on macOS?
> What is the best option to start solving the issue with?
>
> Thanks,
> Alexander.
>
> [1] https://bugs.openjdk.org/browse/JDK-8315113
>
> [2] 
> https://developer.apple.com/documentation/applicationservices/core_printing/1805783-pmsetcolormode
>
>
> On 8/28/23 18:00, Alexander Scherbatiy wrote:
>> Hello,
>>
>> I am working on issue "8315113 Print request Chromaticity.MONOCHROME 
>> attribute does not work on macOS" [1].
>>
>> There is PMSetColorMode function in the Apple Developer documentation 
>> [2] but it is marked as deprecated
>>   "There is no replacement; this function was included to facilitate 
>> porting legacy applications to macOS, but it serves no useful purpose."
>> and really does nothing.
>>
>>
>> Using native print dialog and selecting Black & White box allows to 
>> print black and white pages on macOS.
>> I dumped NSPrintInfo print settings dictionary for two printers when 
>> the Black & White box is selected and the logs contain
>> ColorModel key, Gray value for HP ColorLaserJet MFP 
>> M178-M181-AirPrint printer and
>> HPColorMode key, grayscale value for HP Ink Tank 115.
>> It looks like each printer can have each own key/value for Black & 
>> White settings.
>>
>> I tried to print key/values for all presets available for NSPrintInfo 
>> without using the native print dialog:
>> ----------
>>     PMPrinter pr;
>>     PMPrintSession printSession = (PMPrintSession)[printInfo 
>> PMPrintSession];
>>     OSStatus status = PMSessionGetCurrentPrinter(printSession, &pr);
>>     CFArrayRef presetsList = nil;
>>     status = PMPrinterCopyPresets(pr, &presetsList);
>>     CFIndex arrayCount = CFArrayGetCount(presetsList);
>>
>>     for (CFIndex index = 0; index < arrayCount; index++) {
>>         PMPreset preset = 
>> (PMPreset)CFArrayGetValueAtIndex(presetsList, index);
>>         CFStringRef presetName = nil;
>>         if (PMPresetCopyName(preset, &presetName) == noErr && 
>> CFStringGetLength(presetName) > 0) {
>>             NSLog(@"  presetName: '%@'", presetName);
>>             NSDictionary* dict = nil;
>>             if (PMPresetGetAttributes(preset, 
>> (CFDictionaryRef*)(&dict)) == noErr) {
>>                    // print preset dict
>>
>> ----------
>> The printers which I tested do contain "Black and White" preset but 
>> they do not include key/values related to black and white printing.
>>
>>
>> What is the right way to use different key/values (ColorModel: Gray, 
>> HPColorMode: grayscale, ...) in code to set Black & White settings 
>> for NSPrintInfo?
>> Could it be a configuration file which contains all color model 
>> key/values for all known printers?
>>
>> Thanks,
>> Alexander.
>>
>> [1] https://bugs.openjdk.org/browse/JDK-8315113
>>
>> [2] 
>> https://developer.apple.com/documentation/applicationservices/core_printing/1805783-pmsetcolormode
>>
>>



More information about the client-libs-dev mailing list