我正在尝试发送一个文件进行打印,而不是通过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所理解的那样,它已经正确完成但它无效。有什么想法吗?
编辑:调试代码我可以看到正在向打印机发送内容,但似乎文件没有发送。
答案 0 :(得分:2)
您不能只将PDF字节写入打印作业。打印机不知道如何处理它。您发送到打印机的RAW数据必须以打印机特定的打印机语言描述文档。这就是打印机驱动程序的功能。
只需将PDF发送到打印机即可打印。您需要一些软件来渲染PDF,然后将渲染的图像发送到打印机。
正如documentation所述:
使用此方法将特定于设备的信息写入假脱机文件,该文件不会自动包含在Microsoft Windows假脱机程序中。
我增强了这些信息的重要部分。
答案 1 :(得分:2)
您需要将PDF渲染到打印机。在文件上调用shell print
动词将是执行此操作的理想方法。如果您坚持自己进行低级渲染,那么我建议您使用Ghostscript.NET和choose the mswinpr2
device as output这样的库。
mswinpr2设备使用MS Windows打印机驱动程序,因此可以与任何具有设备无关位图(DIB)栅格功能的打印机配合使用。无法使用Ghostscript中的PostScript命令直接选择打印机分辨率:请改用控制面板中的打印机设置。
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");