使用System.Drawing.Printing发送要打印的文件不起作用

时间:2015-06-16 10:51:57

标签: c# asp.net printing system.drawing printqueue

我正在尝试发送一个文件进行打印,而不是通过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();

正如我从微软Library所理解的那样,它已经正确完成但它无效。有什么想法吗?

编辑:调试代码我可以看到正在向打印机发送内容,但似乎文件没有发送。

2 个答案:

答案 0 :(得分:2)

您不能只将PDF字节写入打印作业。打印机不知道如何处理它。您发送到打印机的RAW数据必须以打印机特定的打印机语言描述文档。这就是打印机驱动程序的功能。

只需将PDF发送到打印机即可打印。您需要一些软件来渲染PDF,然后将渲染的图像发送到打印机。

正如documentation所述:

  

使用此方法将特定于设备的信息写入假脱机文件,该文件不会自动包含在Microsoft Windows假脱机程序中。

我增强了这些信息的重要部分。

答案 1 :(得分:2)

您需要将PDF渲染到打印机。在文件上调用shell print动词将是执行此操作的理想方法。如果您坚持自己进行低级渲染,那么我建议您使用Ghostscript.NETchoose the mswinpr2 device as output这样的库。

  

mswinpr2设备使用MS Windows打印机驱动程序,因此可以与任何具有设备无关位图(DIB)栅格功能的打印机配合使用。无法使用Ghostscript中的PostScript命令直接选择打印机分辨率:请改用控制面板中的打印机设置。

例如见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");