2010-04-08 374 views
9

我想通过GhostScript在Windows的网络打印机上打印PDF文件。
(我不想用Adobe Reader)如何使用GhostScript(gswin32c.exe)shell命令在默认网络打印机上打印PDF

我读过gswin32c.exe可以做的工作。
我尝试了很多命令,并没有找到如何强制gs在我的(windows默认)网络驱动器上打印PDF的方式。

我不需要准确的网络打印机 - 默认可以使用。但是,如果没有这样的选项,我很高兴通过打印机名称。 (我试过用PARAM -sDEVICE = “\ SERVER_IP \打印机名称”,但这种没有工作,以及...)

命令在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#下工作?

+1

对不起,只是因为你打算从你的C#应用​​程序调用这个不会让它成为一个编程问题,我会建议超级用户为这个Ghostscript问题,并已投票支持将此问题提交给你。 – Lazarus 2010-04-08 12:55:37

+0

我编辑的帖子现在更具体的C# – Maciej 2010-04-08 13:17:56

回答

12

我终于使其工作和调试容易。
对于那些有兴趣我的最终方法代码:

/// <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

你应该调用process.Close()以及获取退出代码后。 – 2010-04-08 14:21:38

+0

你是对的 - 谢谢 – Maciej 2010-04-09 10:16:13

+0

只有问题我有以上的方法是页边距。我coudnt找到解决方案如何设置它们。所以我的首页内容经常被削减。我想知道是否有人知道如何解决这个问题? – Maciej 2010-04-19 12:02:34

3

您应该测试命令行的首选项,然后将成功转换成你的代码。

PDF文件通常已包含页边距。您“经常剪切”的页面内容可能来自PDF格式,该格式意味着以Letter格式打印的A4页面尺寸。

PDF也使用其组织的页面(或对象)的内容部分内框:MediaBoxTrimBoxCropBoxBleedbox

有多种方案,以控制其“纸张大小” Ghostscript的呈现给定的输入:

-dPDFFitPage 
-dUseTrimBox 
-dUseCropBox 

随着PDFFitPage的Ghostscript将呈现当前页面设备尺寸(通常是默认页面大小)。

使用UseTrimBox它将使用TrimBox(并且它将同时将PageSize设置为该值)。

使用UseCropBox它将使用CropBox(并且它将同时将PageSize设置为该值)。

默认情况下(不提供参数),Ghostscript将使用MediaBox进行渲染。

注意,您还可以通过使用-sPAPERSIZE控制输出的总体规模(选择在所有预先定义的值Ghostscript的都知道)或(更灵活)使用-dDEVICEWIDTHPOINTS=NNN -dDEVICEHEIGHTPOINTS=NNN设置自定义页面大小。

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文件。

+0

它在命令行中的外观如何?我无法让网络打印机部分工作。我正在执行批处理作业 – user3015739 2016-03-02 04:48:39