Как напечатать PDF файл на сетевой принтер по умолчанию с помощью Ghostscript (gswin32c.exe) командной оболочки


Я хотел бы распечатать PDF-файл(ы) на сетевом принтере windows через GhostScript.
(Я не хочу использовать Adobe Reader)

Я читал gswin32c.exe который может сделать эту работу.
Я экспериментировал со многими командами и не мог найти способ, как заставить gs печатать PDF на моем сетевом диске (Windows default).

Мне не нужен точечный сетевой принтер - можно использовать по умолчанию. Но если такой возможности нет, я с удовольствием передам и имя принтера. (Я пробовал с param - SDevice= "server_IPprinter_name", но это не сработало...)

Команда, работающая под управлением Windows cmd:

gswin32c -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=ljet4 -sOutputFile="\spool\Server_NamePrinter_name" "C:test.pdf"

Метод, созданный на базе вышеописанного-не работает и торчит исключение. (Код ошибки = 1)

    /// <summary>
    /// Prints the PDF.
    /// </summary>
    /// <param name="ghostScriptPath">The ghost script path. Eg "C:Program Filesgsgs8.71bingswin32c.exe"</param>
    /// <param name="numberOfCopies">The number of copies.</param>
    /// <param name="printerName">Name of the printer. Eg \server_nameprinter_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#?

3 10

3 ответа:

Я наконец - то сделал его рабочим и легким для отладки.
Мой окончательный код метода для тех, кто заинтересован:

    /// <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, напечатанного в формате письма.

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 для настройки пользовательских размеров страниц.

Не уверен, что это кому-то поможет, но чтобы добавить печатные документы в очередь вместо немедленной печати, внесите изменения в вышеуказанный раздел с помощью

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

Предварительные условия: настройте тип задания вашего принтера на "удержание печати": в нашем случае у нас есть принтерRico Aficio MP 4000 , и мы используем его для выполнения еженощного задания для печати множества PDF-файлов, генерируемых через SSRS.