簡體   English   中英

如何使用 GhostScript (gswin32c.exe) shell 命令在默認網絡打印機上打印 PDF

[英]How to print PDF on default network printer using GhostScript (gswin32c.exe) shell command

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

我終於使它工作並且易於調試。
我為感興趣的人提供的最終方法代碼:

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

不確定它是否對任何人有幫助,但是要將打印文檔添加到隊列而不是立即打印,請使用以下命令對上述部分進行更改

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

您應該首先從命令行測試您的選項,然后將成功轉換為您的代碼。

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設置自定義頁面大小來額外控制輸出的整體大小。

僅在我的參數中添加 -dPDFFitPage 解決了“首頁內容經常被剪切”的相同問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM