13

我想通过 GhostScript 在 Windows 的网络打印机上打印 PDF 文件。
(我不想使用 Adob​​e 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"

基于上述创建的方法 - 不起作用并引发异常。(错误代码 = 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# 下工作吗?

4

4 回答 4

15

我终于使它工作并且易于调试。
我对那些感兴趣的人的最终方法代码:

    /// <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;
    }
于 2010-04-08T13:29:51.910 回答
4

不确定它是否对任何人有帮助,但是要将打印文档添加到队列而不是立即打印,请使用以下部分更改上述部分

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

于 2014-01-24T21:51:00.470 回答
3

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

PDF 文件通常已经包含页边距。您“经常剪切”的页面内容可能来自用于以 Letter 格式打印的 A4 页面大小的 PDF。

PDF 还使用一些内部框来组织页面(和对象)内容:MediaBoxTrimBoxCropBoxBleedbox

有多种选项可以控制 Ghostscript 呈现给定输入的“媒体大小”:

-dPDFFitPage  
-dUseTrimBox  
-dUseCropBox 

PDFFitPageGhostscript 会渲染到当前页面设备大小(通常是默认页面大小)。

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

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

默认情况下(不提供参数),Ghostscript 将使用MediaBox.

请注意,您还可以通过使用-sPAPERSIZE(从 Ghostscript 知道的所有预定义值中选择)或(为了更灵活)使用-dDEVICEWIDTHPOINTS=NNN -dDEVICEHEIGHTPOINTS=NNN来设置自定义页面大小来控制输出的整体大小。

于 2010-06-05T18:03:09.727 回答
2

在我的论点中仅添加 -dPDFFitPage 解决了与“首页内容经常被剪切”相同的问题。

于 2021-02-16T18:13:33.113 回答