Отправка файла на печать не работает с помощью System.Drawing.Printing

Я пытаюсь отправить файл на печать, не открывая его через Adobe, как предложено несколькими ответами здесь; вместо этого я использую PrintQueue библиотека (из System.Drawing.Printing).

Что я достиг на данный момент:

У меня есть правильный PrintQueue упоминается как pq:

PrintQueue pq; //Assume it's correct. The way to get here it isn't easy and it is not needed for the question.

// Call AddJob
PrintSystemJobInfo myPrintJob = pq.AddJob();

// Write a Byte buffer to the JobStream and close the stream
Stream myStream = myPrintJob.JobStream;
Byte[] myByteBuffer = ObjectIHave.ToArray(); //Ignore the ObjectIhave, it actually is Linq object which is correct as well.
myStream.Write(myByteBuffer, 0, myByteBuffer.Length);
myStream.Close();

Как я понял из библиотеки Microsoft, все сделано правильно, но не работает. Есть идеи?

РЕДАКТИРОВАТЬ: Отладка кода Я вижу, что что-то отправляется на принтер, но кажется, что файл не отправляется.

2 ответа

Решение

Вам нужно отрендерить PDF на принтере. Вызов оболочки print глагол в файле будет идеальным средством для этого. Если вы настаиваете на выполнении низкоуровневого рендеринга самостоятельно, я рекомендую использовать такую ​​библиотеку, как Ghostscript.NET, и выберите mswinpr2 устройство в качестве выхода.

Устройство mswinpr2 использует драйверы принтеров MS Windows и, следовательно, должно работать с любым принтером с растровыми возможностями DIB. Разрешение принтера не может быть выбрано напрямую с помощью команд PostScript из Ghostscript: вместо этого используйте настройку принтера в панели управления.

Смотрите SendToPrinterSample.cs, например:

        string printerName = "YourPrinterName";
        string inputFile = @"E:\__test_data\test.pdf";

        using (GhostscriptProcessor processor = new GhostscriptProcessor())
        {
            List<string> switches = new List<string>();
            switches.Add("-empty");
            switches.Add("-dPrinted");
            switches.Add("-dBATCH");
            switches.Add("-dNOPAUSE");
            switches.Add("-dNOSAFER");
            switches.Add("-dNumCopies=1");
            switches.Add("-sDEVICE=mswinpr2");
            switches.Add("-sOutputFile=%printer%" + printerName);
            switches.Add("-f");
            switches.Add(inputFile);

            processor.StartProcessing(switches.ToArray(), null);
        }

Если файл должен быть напечатан в обе стороны, вам просто нужно добавить:

switches.Add("-dDuplex");
switches.Add("-dTumble=0");

Вы не можете просто записать байты PDF в задание на печать. Принтер не знает, как с этим справиться. Данные RAW, которые вы отправляете на принтер, должны описывать документ на языке принтера, специфичном для принтера. Вот что делает драйвер принтера.

Вы не можете распечатать PDF, просто отправив его на принтер. Вам нужно какое-то программное обеспечение, которое выполняет рендеринг PDF и затем отправляет отрендеренное изображение на принтер.

Как указано в документации:

Используйте этот метод для записи специфической информации об устройстве в файл спула, который не включается автоматически спулером Microsoft Windows.

Я усилил важную часть этой информации.

Другие вопросы по тегам