[英]How to print PDF on default network printer using GhostScript (gswin32c.exe) shell command
我想通過 GhostScript 在 Windows 的網絡打印機上打印 PDF 文件。
(我不想使用 Adobe 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 還使用一些組織頁面(和對象)內容的內部框: MediaBox
、 TrimBox
、 CropBox
、 Bleedbox
。
有多種選項可以控制 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.