Как напечатать PDF на сетевом принтере по умолчанию с помощью команды оболочки GhostScript (gswin32c.exe) - PullRequest
10 голосов
/ 08 апреля 2010

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

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

Мне не нужен точный сетевой принтер - можно использовать значение по умолчанию. Но если такой опции нет, я с удовольствием передам имя принтера. (Я попытался с параметром -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 #?

Ответы [ 3 ]

13 голосов
/ 08 апреля 2010

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

    /// <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;
    }
3 голосов
/ 25 января 2014

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

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.

3 голосов
/ 05 июня 2010

Сначала вы должны проверить свои параметры из командной строки, а затем преобразовать успехи в свой код.

Файл PDF обычно уже содержит поля страницы.Содержимое страницы, которое вы часто вырезаете, может быть получено из PDF-файла, предназначенного для формата страницы А4, напечатанного в формате Letter.

PDF также использует некоторые внутренние блоки, которые организуют содержимое страницы (и объекта): MediaBoxTrimBox, CropBox, Bleedbox.

Существуют различные варианты управления тем, для какого размера носителя Ghostscript отображает заданный вход:отобразит текущий размер страницы устройства (обычно размер страницы по умолчанию).

С UseTrimBox он будет использовать TrimBox (и в то же время установит PageSize в это значение).

При UseCropBox он будет использовать CropBox (и в то же время установит PageSize в это значение).

По умолчанию (без указания параметра) Ghostscript будет отображать с помощью MediaBox.

Обратите внимание, что вы можете дополнительно контролировать общий размер вашего вывода с помощью -sPAPERSIZE (выберите среди всехпредопределенные значения, которые Ghostscript знает) или (для большей гибкости) используйте -dDEVICEWIDTHPOINTS=NNN -dDEVICEHEIGHTPOINTS=NNN для настройки пользовательских размеров страницы.

...