【问题标题】:How to print PDF on default network printer using GhostScript (gswin32c.exe) shell command如何使用 GhostScript (gswin32c.exe) shell 命令在默认网络打印机上打印 PDF
【发布时间】:2011-02-05 16:40:25
【问题描述】:

我想通过 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# 下工作吗?

【问题讨论】:

  • 抱歉,只是因为您打算从 C# 应用程序调用它并不会使其成为编程问题,我建议 SuperUser 解决这个 Ghostscript 问题,并投票支持将这个问题移到那里给你。
  • 我已经编辑了帖子,现在更加具体化 C#
  • @Lazarus,再次,您根据命令的格式误解了编程。调用函数是基本的编程概念。语法和方式根本不重要,因为它们与实现有关。这个概念基于一个模块、它的功能和传递的参数。 gswin32c -dPrinted ... 完全满足这个概念。使用的基本概念被众多用例所继承。并且请停止错误地将任何程序或软件的使用视为超出 SOF 范围。 编程的线索和珍珠在于使用可用操作作为 API 的方式。
  • @AlekseyF。我绝不不同意调用函数是一种基本的编程结构,我也没有在我所做的评论中暗示这一点。我怀疑您的评论很大程度上是基于我的评论之后修改的编辑问题,该评论现在包含一些 C# 代码,但完全错过了问题的上下文,即如何将 GhostScript 输出到网络位置并且实际上与它的名称无关。即使从命令行,它也不适用于 OP。

标签: c# pdf printing ghostscript


【解决方案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;

        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;
    }

【讨论】:

  • 在获得退出代码后,您也应该调用 process.Close()。
  • 我对上述方法的唯一问题是页边距。我找不到解决方案如何设置它们。所以我的首页内容经常被删减。我想知道是否有人知道如何解决这个问题?
  • 通过外部 cfg 文件传递​​选项,我已将页面调整为指定的纸张大小。
  • 此代码在本地机器上工作正常,当我在服务器 2008 上部署时,它没有打印 pdf 文件?这是你(@Maciej)能看到我怎么做的任何方式吗?我正在使用 asp.net mvc
  • 至于调用process.Close(),如果我把进程包裹在一个“using”语句中呢?:“using(Process process = Process.Start(startInfo))”
【解决方案2】:

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

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

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

    【讨论】:

    • 它在命令行中的样子?我无法让网络打印机部分工作。我正在批处理作业中执行它
    • -sDEVICEljet3 更改为 mswinpr2 为我做到了。我在 Windows 上打印。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2014-02-10
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 2017-11-24
      相关资源
      最近更新 更多