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

Posted

技术标签:

【中文标题】使用 Ghostscript 和 .NET 将 PDF 打印到灰度打印机【英文标题】:Print a PDF to Printer in Grayscale Using Ghostscript and .NET 【发布时间】:2016-10-22 02:46:42 【问题描述】:

我有这个代码:

 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;
    

【问题讨论】:

【参考方案1】:

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

我相信 mswinpr2 设备并不关心您设置为 ProcessColorModel 的内容,它始终在 RGB 中工作。如果打印机是单色或灰度打印机,则 Windows 打印系统会负责转换(就像 CMYK 一样)。

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

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

【讨论】:

呃,那么这将是一个两步的过程,但有可能吗?我很害怕,但至少这是可能的,谢谢。 我担心的是,如果中间始终是 RGB,那么彩色打印机(尤其是 CMYK 彩色打印机)可能仍会以“彩色”打印。那是因为灰度->RGB->CMYK 的转换通常不会产生 100% 黑色,它会产生 CMY 和 K 的混合。但它很大程度上取决于色彩管理,因此无法确定。最好只是试试看。 我知道你的意思,在 SO 上有类似的问题,他们报告打印机仍在使用彩色墨水进行灰度打印。我现在正在编写代码,让我们看看。 成功了,据我所知,它仍然使用 CMYK 来产生灰色,但现在应该没问题。谢谢。

以上是关于使用 Ghostscript 和 .NET 将 PDF 打印到灰度打印机的主要内容,如果未能解决你的问题,请参考以下文章

打印时出现 GhostScript 图像质量问题

如何使用 Ghostscript 和 Ghostscript .NET 通过嵌入 IIC 配置文件生成正确的 PDF/A

Ghostscript.NET 图片文字质量问题

使用 dot net 或任何其他语言在内存中进行 ghostscript 转换

Ghostscript.NET 多线程问题

使用 Ghostscript 指定 PDF 页面大小