我想通过GhostScript在Windows网络打印机上打印PDF文件 (我不想使用Adobe Reader)
我已经阅读了 gswin32c.exe ,可以完成这项工作 我尝试了许多命令,并且找不到如何强制gs在我的(Windows默认)网络驱动器上打印PDF的方法。
我不需要点精确网络打印机 - 可以使用默认值。但如果没有这样的选择,我也很高兴通过打印机名称。 (我尝试过使用param -SDevice =“\ server_IP \ printer_name”,但这也不起作用......)
在Windows cmd下运行的命令:
gswin32c -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=ljet4 -sOutputFile="\\spool\\\Server_Name\Printer_name" "C:\test.pdf"
基于上面创建的方法 - 没有工作和thorws异常。 (错误代码= 1)
/// <summary>
/// Prints the PDF.
/// </summary>
/// <param name="ghostScriptPath">The ghost script path. Eg "C:\Program Files\gs\gs8.71\bin\gswin32c.exe"</param>
/// <param name="numberOfCopies">The number of copies.</param>
/// <param name="printerName">Name of the printer. Eg \\server_name\printer_name</param>
/// <param name="pdfFileName">Name of the PDF file.</param>
/// <returns></returns>
public bool PrintPDF (string ghostScriptPath, int numberOfCopies, string printerName, string pdfFileName) {
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.Arguments = " -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=" + Convert.ToString(numberOfCopies) + " -sDEVICE=ljet4 -sOutputFile=\"\\\\spool\\" + printerName + "\" \"" + pdfFileName + "\"";
startInfo.FileName = ghostScriptPath;
startInfo.UseShellExecute = false;
Process process = Process.Start(startInfo);
return process.ExitCode == 0;
}
知道如何让它在C#下工作吗?
答案 0 :(得分:13)
我终于使其工作且易于调试 我感兴趣的最终方法代码:
/// <summary>
/// Prints the PDF.
/// </summary>
/// <param name="ghostScriptPath">The ghost script path. Eg "C:\Program Files\gs\gs8.71\bin\gswin32c.exe"</param>
/// <param name="numberOfCopies">The number of copies.</param>
/// <param name="printerName">Name of the printer. Eg \\server_name\printer_name</param>
/// <param name="pdfFileName">Name of the PDF file.</param>
/// <returns></returns>
public bool PrintPDF (string ghostScriptPath, int numberOfCopies, string printerName, string pdfFileName) {
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.Arguments = " -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=" + Convert.ToString(numberOfCopies) + " -sDEVICE=ljet4 -sOutputFile=\"\\\\spool\\" + printerName + "\" \"" + pdfFileName + "\" ";
startInfo.FileName = ghostScriptPath;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
Process process = Process.Start(startInfo);
Console.WriteLine( process.StandardError.ReadToEnd() + process.StandardOutput.ReadToEnd() );
process.WaitForExit(30000);
if (process.HasExited == false) process.Kill();
return process.ExitCode == 0;
}
答案 1 :(得分:3)
您应首先从命令行测试您的选项,然后将成功转换为您的代码。
PDF文件通常已包含页边距。您“经常剪切”页面内容可能来自PDF格式,该格式适用于以Letter格式打印的A4页面尺寸。
PDF还使用一些内部框来整理页面(和对象)内容:MediaBox
,TrimBox
,CropBox
,Bleedbox
。
有多种选项可以控制“媒体大小”Ghostscript呈现给定输入:
-dPDFFitPage
-dUseTrimBox
-dUseCropBox
使用PDFFitPage
Ghostscript将呈现当前页面设备大小(通常是默认页面大小)。
使用UseTrimBox
,它将使用TrimBox
(同时将PageSize
设置为该值)。
使用UseCropBox
,它将使用CropBox
(同时将PageSize
设置为该值)。
默认情况下(不提供参数),Ghostscript将使用MediaBox
进行渲染。
注意,您还可以使用-sPAPERSIZE
(在Ghostscript知道的所有预定义值中选择)或(为了更加灵活)使用-dDEVICEWIDTHPOINTS=NNN -dDEVICEHEIGHTPOINTS=NNN
来设置自定义页面来控制输出的整体大小尺寸。
答案 2 :(得分:3)
不确定它是否对任何人有帮助,但是将打印文档添加到队列而不是立即打印使用
对上一部分进行更改startInfo.Arguments = " -dPrinted -dNoCancel=true -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=" + Convert.ToString(numberOfCopies) + " -sDEVICE=mswinpr2 -sOutputFile=%printer%" + printerName + " \"" + pdfFullFileName + "\"";
先决条件:将打印机的作业类型配置为“保留打印”:在我们的示例中,我们有 Rico Aficio MP 4000打印机,我们的用途是运行每晚工作打印一堆通过SSRS生成的PDF文件。
答案 3 :(得分:1)
仅向我的参数添加 -dPDFFitPage 解决了“首页内容经常被剪切”的相同问题。