使用 Ghostscript 和 .NET 以灰度方式将 PDF 打印到打印机

Print a PDF to Printer in Grayscale Using Ghostscript and .NET

我有这个代码:

 using (GhostscriptProcessor processor = new GhostscriptProcessor())
                {
                    List<string> switches = new List<string>();
                    if (!printSettings.DefaultPageSettings.Color)
                    {
                        switches.Add("-sProcessColorModel=DeviceGray");
                        switches.Add("-sColorConversionStrategy=Gray");
                        switches.Add("-dOverrideICC");
                    }
                    switches.Add("-empty");
                    switches.Add("-dPrinted");
                    switches.Add("-dBATCH");
                    switches.Add("-dNOPAUSE");
                    switches.Add("-dNOSAFER");
                    switches.Add("-dNumCopies=" + printSettings.Copies.ToString());
                    switches.Add("-sDEVICE=mswinpr2");
                    switches.Add("-dDEVICEWIDTHPOINTS="+printSettings.DefaultPageSettings.PaperSize.Width.ToString());
                    switches.Add("-dDEVICEHEIGHTPOINTS="+printSettings.DefaultPageSettings.PaperSize.Height.ToString());
                    switches.Add("-dPDFFitPage");
                    switches.Add("-sOutputFile=%printer%" + printSettings.PrinterName);
                    switches.Add("-f");
                    switches.Add(filePath);

                    processor.StartProcessing(switches.ToArray(), null);
                }

我从 this question 那里得到的应该用于灰度打印的开关,但它们不起作用。有没有办法使用 Ghostscript 将 PDF 以灰度打印到打印机?


更新

更新代码以写入将 pdf 转换为灰度 发送到打印机之前:

/*Call to print PDF*/
private void pdfPrint(String filePath) {
    try {

        using (GhostscriptProcessor processor = new GhostscriptProcessor())
        {
            List<string> switches = new List<string>();
            if (!printSettings.DefaultPageSettings.Color)
            {
                filePath = pdfRenderBlackWhite(filePath);
                if (!File.Exists(filePath))
                {
                    return;
                }
            }

            switches.Add("-empty");
            switches.Add("-dPrinted");
            switches.Add("-dBATCH");
            switches.Add("-dNOPAUSE");
            switches.Add("-dNOSAFER");
            switches.Add("-dNumCopies=" + printSettings.Copies.ToString());
            switches.Add("-sDEVICE=mswinpr2");
            switches.Add("-dDEVICEWIDTHPOINTS="+printSettings.DefaultPageSettings.PaperSize.Width.ToString());
            switches.Add("-dDEVICEHEIGHTPOINTS="+printSettings.DefaultPageSettings.PaperSize.Height.ToString());
            switches.Add("-dPDFFitPage");
            switches.Add("-sOutputFile=%printer%" + printSettings.PrinterName);
            switches.Add("-f");
            switches.Add(filePath);

            processor.StartProcessing(switches.ToArray(), null);
        }

    } catch(Exception e) {
        MessageBox.Show(e.GetType().ToString() + ' ' + e.StackTrace + '\n' + e.Message);
    }
}

private string pdfRenderBlackWhite(string filePath)
{
    String bwPDFFilePath = tempdir + "\" + Path.GetFileName(filePath) + DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".PDF";

    try
    {
        using (GhostscriptProcessor processor = new GhostscriptProcessor())
        {
            List<string> switches = new List<string>();
            switches.Add("-empty");
            switches.Add("-dPrinted");
            switches.Add("-dBATCH");
            switches.Add("-dNOPAUSE");
            switches.Add("-dNOSAFER");
            switches.Add("-sProcessColorModel=DeviceGray");
            switches.Add("-sColorConversionStrategy=Gray");
            switches.Add("-dOverrideICC");
            switches.Add("-sDEVICE=pdfwrite");
            switches.Add("-o");
            switches.Add(bwPDFFilePath);
            switches.Add("-f");
            switches.Add(filePath);
            processor.StartProcessing(switches.ToArray(), null);
        }

        return bwPDFFilePath;
    }
    catch (Exception e)
    {
        MessageBox.Show(e.GetType().ToString() + ' ' + e.StackTrace + '\n' + e.Message);
        return bwPDFFilePath;
    }
}

您选择了一个问题来复制不合适的答案;该问题特定于 pdfwrite 设备,它不进行任何渲染,您需要渲染输出。 'ColorConversionStrategy' 开关仅适用于 pdfwrite 设备(以及一整套其他 PDF 特定开关)

我相信 mswinpr2 设备不关心您将什么设置为 ProcessColorModel,它始终以 RGB 工作。如果打印机是单色或灰度打印机,则 Windows 打印系统会负责转换(就像它对 CMYK 所做的那样)。

所以您需要做的是先将输入转换为灰度,然后您可以使用您发现的上一个问题中的控件来创建灰度表示您可以打印原始 PDF 文件。

或者,如果您的打印机支持灰度打印,那么您可以在打印对话框中进行设置。