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#で動作させる方法はありますか?
私はついにそれを動作させ、デバッグしやすくしました。
興味のある人のための私の最終的なメソッドコード:
/// <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 + "\"";
前提条件:プリンタのジョブタイプを「HoldPrint」に設定します:この場合、Rico Aficio MP 4000 Printerと私たちの使用法は、SSRSを介して生成された一連のPDFファイルを印刷するために毎晩ジョブを実行することです。
最初にコマンドラインからオプションをテストしてから、成功したものをコードに変換する必要があります。
A PDFファイルには通常、すでにページ余白が含まれています。「多くの場合、カット」されたページコンテンツは、レターに印刷されたA4ページサイズを意味するPDFフォーマット。
PDFは、ページ(およびオブジェクト)のコンテンツを整理するいくつかの内部ボックスも使用します:MediaBox
、TrimBox
、CropBox
、Bleedbox
。
Ghostscriptが特定の入力をレンダリングする「メディアサイズ」を制御するためのさまざまなオプションがあります。
-dPDFFitPage
-dUseTrimBox
-dUseCropBox
PDFFitPage
を使用すると、Ghostscriptは現在のページデバイスサイズ(通常はデフォルトのページサイズ)にレンダリングされます。
UseTrimBox
を使用すると、TrimBox
が使用されます(同時に、PageSize
がその値に設定されます)。
UseCropBox
を使用すると、CropBox
が使用されます(同時に、PageSize
がその値に設定されます)。
デフォルト(パラメータなし)では、GhostscriptはMediaBox
を使用してレンダリングします。
-sPAPERSIZE
(Ghostscriptが認識しているすべての事前定義値から選択)を使用するか、(柔軟性を高めるために)-dDEVICEWIDTHPOINTS=NNN -dDEVICEHEIGHTPOINTS=NNN
を使用してカスタムページサイズを設定することにより、出力の全体的なサイズをさらに制御できます。