以编程方式将 XPS 文件打印到物理打印机

Posted

技术标签:

【中文标题】以编程方式将 XPS 文件打印到物理打印机【英文标题】:Programmatically print an XPS file to a physical printer 【发布时间】:2017-12-31 21:19:09 【问题描述】:

我有一个 C# WinForms 应用程序。用户上传 .XPS 文件并指定一些打印机设置(份数、纸盘等)。 程序需要使用这些设置以编程方式打印文档。也就是说,不能有用户交互来打印。

我可以使用 System.Printing AddJob 方法。 (https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/how-to-programmatically-print-xps-files)。但是,这里我无法定义具体的设置,比如纸张来源、份数等。

我更喜欢使用 PrintDocument 方法,但我不知道如何让 PrintDocument 呈现/打印 XPS 文档。

我查看了此资源https://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.printpage(v=vs.110).aspx,但看不到如何让 PrintPageEventHandler 呈现 XPS 文档。

关于如何继续进行的任何想法?非常感谢您的帮助!

C# .NET 4.5

更新:

根据以下答案,我可以在添加作业时发送 PrintTicket,如下所示:

 PrintTicket pt = printQueue.DefaultPrintTicket;
 pt.CopyCount = 2;
 // pt.InputBin = [ InputBin enum option ]
 printQueue.AddJob("name", "file", false, pt);

我看不到为 PrintTicket 设置 InputBin 的任何简单方法。 InputBin 是一个枚举,没有一个选项来设置为可用垃圾箱之一的名称。

【问题讨论】:

【参考方案1】:

AddJob 是正确的,但是您需要version that accepts a PrintTicket。您需要使用用户的设置创建一个新的 PrintTicket - 任何设置为 null 的值最终都将使用为该 PrintQueue 设置的默认值。

【讨论】:

谢谢。我没有意识到我可以这样添加 PrintTicket。这真的很容易让我指定副本计数,但看起来设置“输入箱”(托盘)更具挑战性。关于如何设置输入箱的任何建议? 虽然有 PrintTicket.InputBin 属性,但对 inputbin 的控制是有限的,这主要是由于不同制造商以截然不同的方式实现它。使用 XPS,您通常需要选择输入 PageMediaSize 和 PageMediaType,然后让打印机决定从哪个 bin 中提取。

以上是关于以编程方式将 XPS 文件打印到物理打印机的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将本地报告呈现给XPS

使用 VBA 将 MS Access 报告打印到 .xps 文件

您可以使用 Microsoft Print to PDF 打印机将 XPS 转换为 PDF 文件吗?

静默使用 Microsoft XPS Document Writer 打印机创建 XPS

将 PrintDialog 拦截到 XPS 文档编写器

C# - 如何使用 PrintDocument 以编程方式打印现有 PDF 文件