web-dev-qa-db-ja.com

GhostScript(gswin32c.exe)シェルコマンドを使用してデフォルトネットワークプリンターでPDFを印刷する方法

GhostScriptを介してWindowsのネットワークプリンターでPDFファイルを印刷したいのですが。
(Adobe Readerを使いたくない)

私は読んだgswin32c.exeこれは仕事をすることができます。
多くのコマンドを試しましたが、gsに強制的にPDF(Windowsのデフォルト)ネットワークドライブに印刷させる方法が見つかりませんでした。

ポイント正確なネットワークプリンタは必要ありません-デフォルトを使用できます。しかし、そのようなオプションがない場合は、プリンター名も喜んで渡します。 (param -SDevice = "\ server_IP\printer_name"で試しましたが、これも機能しませんでした...)

Windowsコマンドで動作するコマンド:

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#で動作させる方法はありますか?

11
Maciej

私はついにそれを動作させ、デバッグしやすくしました。
興味のある人のための私の最終的なメソッドコード:

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

誰かに役立つかどうかはわかりませんが、すぐに印刷するのではなく、印刷ドキュメントをキューに追加するには、上記のセクションに変更を加えます。

startInfo.Arguments = " -dPrinted -dNoCancel=true -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=" + Convert.ToString(numberOfCopies) + " -sDEVICE=mswinpr2 -sOutputFile=%printer%" + printerName + " \"" + pdfFullFileName + "\"";

前提条件:プリンタのジョブタイプを「HoldPrint」に設定します:この場合、Rico Aficio MP 4000 Printerと私たちの使用法は、SSRSを介して生成された一連のPDFファイルを印刷するために毎晩ジョブを実行することです。

4
Kiran Xyz

最初にコマンドラインからオプションをテストしてから、成功したものをコードに変換する必要があります。

A PDFファイルには通常、すでにページ余白が含まれています。「多くの場合、カット」されたページコンテンツは、レターに印刷された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
Kurt Pfeifle