[英]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);
}
我从这个问题中得到了据说用于灰度打印的开关,但是它们不起作用。 是否可以使用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文件创建灰度表示,然后再进行打印。
或者,如果您的打印机支持被告知以灰度打印,则可以从“打印”对话框中进行设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.