0

我正在尝试发送要打印的文件,而无需按照此处的几个答案的建议通过 Adob​​e 打开它;相反,我正在使用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库中了解到的那样,它已正确完成,但无法正常工作。有任何想法吗?

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

4

2 回答 2

2

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

您不能通过将 PDF 发送到打印机来打印它。您需要一些软件来渲染 PDF,然后将渲染的图像发送到打印机。

正如文档所述:

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

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

于 2015-06-16T11:22:41.127 回答
2

您需要将 PDF 呈现给打印机。在文件上调用 shellprint动词将是执行此操作的理想方法。如果您坚持自己进行低级渲染,那么我建议使用Ghostscript.NET之类的库并选择mswinpr2设备作为输出

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");
于 2015-06-16T11:34:21.097 回答