Я хотел бы распечатать файл (файлы) PDF на сетевом принтере окон через GhostScript.
(Я не хочу использовать Adobe Reader),
Я прочитал gswin32c.exe, который может сделать задание.
Я экспериментировал со многими командами, и coudn't находят путь, как вынудить gs распечатать PDF на моем (значение по умолчанию окон) сетевой диск.
Я не должен указывать на точный сетевой принтер - значение по умолчанию может использоваться. Но если нет такой опции, я рад передать название принтера также. (Я попробовал параметрическим усилителем-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;
}
Вы должны сначала проверить свои опции из командной строки, а затем перенести успехи в код.
Файл PDF обычно уже включает поля страницы. Вы "часто обрезаете" содержимое страницы в результате того, что PDF, предназначенный для страницы формата A4, печатается на формате Letter.
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
для установки пользовательских размеров страницы.