2

我在 ASP.NET MVC 项目中尝试了 MSDN 中的这个示例:

public void Print(string printQueueName, string printData)
    {
        PrintQueue printerQueue = new LocalPrintServer().GetPrintQueue(printQueueName);

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

        // Write a Byte buffer to the JobStream and close the stream
        Stream myStream = myPrintJob.JobStream;
        Byte[] myByteBuffer = UnicodeEncoding.Unicode.GetBytes(printData);
        myStream.Write(myByteBuffer, 0, myByteBuffer.Length);
        myStream.Close();
    }

我尝试打印到 PDF、XPS 和 OneNote 虚拟打印机。确认打印对话框后,打印作业出现在打印机队列中然后消失,打印文件被创建,但为 0 字节大小!!!

我不知道我的错在哪里,希望在这里得到帮助。

提前致谢。

4

1 回答 1

2

这里接近MSDN的示例也不适用于我的打印机。这无关紧要,因为此示例不足以打印 PDF 或 XPS,因为不能简单地将这些类型的字节流作为流输出到打印机。你至少有几个选择:

  • 使用PrintDocument。将 PDF/TIFF/可能的 onenote 文件转换为图像(EG tiff 文件),您可以使用事件PrintDocument.PrintPageGraphics.DrawImage.
  • 使用/购买用于 PDF的3rd 方打印 API 。您可以使用直接 XPS 打印,但存在一些问题(请参阅下面的详细信息)。OneNote我不知道。
  • 使用Process通过命令行打印文件
  • 编写自己的打印驱动程序

更多细节
我不熟悉 OneNote 打印。XPS 打印可能非常棘手。需要在代码中计算边距,因为它们取决于可以在PrintTicket中找到的打印机设置。使用 WPF(与 XPS 密切相关)时,我在 XPS 序列化过程中的某处发现了一个错误。XpsDocument不保留计算的可打印区域。文档将使用可能导致截断的默认可打印区域打印。我在 Microsoft Connect 上确认了这个错误。请参阅下面的回复。

最后,如果您恰好在运行 SSRS,那么您可以轻松地将输出类型从 PDF/XPS 更改为图像。

Microsoft Connect 上 XPS 错误的反馈(链接是私有的):

标题:XpsDocument 不保留 WPF 的 >FixedPage.Arrange() 的计算排列

WPF 团队最近审查了此问题,并且不会解决此问题,因为此时团队正在关注影响最多 WPF 开发人员的错误。如果您认为这是错误解决的,请使用任何必要的支持详细信息重新激活此错误。

我们感谢您的反馈。但是,这个问题将不会在 WPF 的下一版本中得到解决。谢谢你。——WPF 团队

.

于 2013-11-25T17:46:03.053 回答