如何打印 XML 纸张规范 (XPS) 文件 您所在的位置:网站首页 wps打印出现文件另存为xps 如何打印 XML 纸张规范 (XPS) 文件

如何打印 XML 纸张规范 (XPS) 文件

2024-07-11 11:35| 来源: 网络整理| 查看: 265

如何打印 XPS 文件 (WPF .NET) 项目10/13/2023

有时你希望无需打开打印对话框即可向打印队列添加新的打印作业。 可以使用其中一种 PrintQueue.AddJob 方法执行此操作。 操作方法如下。

重要

面向 .NET 7 和 .NET 6 的桌面指南文档正在撰写中。

在以下示例中,我们使用 AddJob 的几种重载之一的 AddJob(String, String, Boolean) 方法:

将 XML 纸张规范 (XPS) 文档的新打印作业添加到默认打印队列中。 命名新作业。 指定是否应验证 XPS 文档(通过使用 fastCopy 参数)。

使用 AddJob(String, String, Boolean) 方法时,参数 fastCopy 的值是个关键考虑因素:

如果将 fastCopy 参数设置为 true,则跳过 XPS 验证,打印作业将快速在后台处理,而无需逐页进度反馈。 如果将 fastCopy 参数设置为 false,则调用 AddJob 方法的线程必须具有单线程单元状态,否则将引发异常。 有关详细信息,请参阅“备注”部分了解 AddJob(String, String, Boolean)。 向队列添加新打印作业

本示例将一个或多个 XPS 文档添加到默认队列。 代码将执行以下操作:

使用 Task.Run 来避免阻碍 UI 线程,因为没有异步版本的 AddJob。 如果 fastCopy 参数值为 false,则以单线程单元状态在线程上运行 AddJob(String, String, Boolean)。 获取对 LocalPrintServer 的默认 PrintQueue 的引用。 对打印队列引用调用 AddJob(String, String, Boolean),传入作业名称、XPS 文档路径和 fastCopy 参数。

如果队列未暂停且打印机正在运行,则在打印作业到达打印队列的顶部时,打印作业将自动开始打印。

提示

若要避免在将打印作业添加到默认队列时出现“将输出文件另存为”对话框,请确保默认打印机不是“Microsoft XPS 文档编写器”、“Microsoft 打印到 PDF”或其他“打印到文件”选项。

/// /// Asyncronously, add a batch of XPS documents to the print queue using a PrintQueue.AddJob method. /// Handle the thread apartment state required by the PrintQueue.AddJob method. /// /// A collection of XPS documents. /// Whether to validate the XPS documents. /// Whether all documents were added to the print queue. public static async Task BatchAddToPrintQueueAsync(IEnumerable xpsFilePaths, bool fastCopy = false) { bool allAdded = true; // Queue some work to run on the ThreadPool. // Wait for completion without blocking the calling thread. await Task.Run(() => { if (fastCopy) allAdded = BatchAddToPrintQueue(xpsFilePaths, fastCopy); else { // Create a thread to call the PrintQueue.AddJob method. Thread newThread = new(() => { allAdded = BatchAddToPrintQueue(xpsFilePaths, fastCopy); }); // Set the thread to single-threaded apartment state. newThread.SetApartmentState(ApartmentState.STA); // Start the thread. newThread.Start(); // Wait for thread completion. Blocks the calling thread, // which is a ThreadPool thread. newThread.Join(); } }); return allAdded; } /// /// Add a batch of XPS documents to the print queue using a PrintQueue.AddJob method. /// /// A collection of XPS documents. /// Whether to validate the XPS documents. /// Whether all documents were added to the print queue. public static bool BatchAddToPrintQueue(IEnumerable xpsFilePaths, bool fastCopy) { bool allAdded = true; // To print without getting the "Save Output File As" dialog, ensure // that your default printer is not the Microsoft XPS Document Writer, // Microsoft Print to PDF, or other print-to-file option. // Get a reference to the default print queue. PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue(); // Iterate through the document collection. foreach (string xpsFilePath in xpsFilePaths) { // Get document name. string xpsFileName = Path.GetFileName(xpsFilePath); try { // The AddJob method adds a new print job for an XPS // document into the print queue, and assigns a job name. // Use fastCopy to skip XPS validation and progress notifications. // If fastCopy is false, the thread that calls PrintQueue.AddJob // must have a single-threaded apartment state. PrintSystemJobInfo xpsPrintJob = defaultPrintQueue.AddJob(jobName: xpsFileName, documentPath: xpsFilePath, fastCopy); // If the queue is not paused and the printer is working, then jobs will automatically begin printing. Debug.WriteLine($"Added {xpsFileName} to the print queue."); } catch (PrintJobException e) { allAdded = false; Debug.WriteLine($"Failed to add {xpsFileName} to the print queue: {e.Message}\r\n{e.InnerException}"); } } return allAdded; } ''' ''' Asyncronously, add a batch of XPS documents to the print queue using a PrintQueue.AddJob method. ''' Handle the thread apartment state required by the PrintQueue.AddJob method. ''' ''' A collection of XPS documents. ''' Whether to validate the XPS documents. ''' Whether all documents were added to the print queue. Public Shared Async Function BatchAddToPrintQueueAsync(xpsFilePaths As IEnumerable(Of String), Optional fastCopy As Boolean = False) As Task(Of Boolean) Dim isAllPrinted As Boolean = True ' Queue some work to run on the ThreadPool. ' Wait for completion without blocking the calling thread. Await Task.Run( Sub() If fastCopy Then isAllPrinted = BatchAddToPrintQueue(xpsFilePaths, fastCopy) Else ' Create a thread to call the PrintQueue.AddJob method. Dim newThread As New Thread( Sub() isAllPrinted = BatchAddToPrintQueue(xpsFilePaths, fastCopy) End Sub ) ' Set the thread to single-threaded apartment state. newThread.SetApartmentState(ApartmentState.STA) ' Start the thread. newThread.Start() ' Wait for thread completion. Blocks the calling thread, ' which is a ThreadPool thread. newThread.Join() End If End Sub ) Return isAllPrinted End Function ''' ''' Add a batch of XPS documents to the print queue using a PrintQueue.AddJob method. ''' ''' A collection of XPS documents. ''' Whether to validate the XPS documents. ''' Whether all documents were added to the print queue. Public Shared Function BatchAddToPrintQueue(xpsFilePaths As IEnumerable(Of String), fastCopy As Boolean) As Boolean Dim isAllPrinted As Boolean = True ' To print without getting the "Save Output File As" dialog, ensure ' that your default printer is not the Microsoft XPS Document Writer, ' Microsoft Print to PDF, or other print-to-file option. ' Get a reference to the default print queue. Dim defaultPrintQueue As PrintQueue = LocalPrintServer.GetDefaultPrintQueue() ' Iterate through the document collection. For Each xpsFilePath As String In xpsFilePaths ' Get document name. Dim xpsFileName As String = Path.GetFileName(xpsFilePath) Try ' The AddJob method adds a new print job for an XPS ' document into the print queue, and assigns a job name. ' Use fastCopy to skip XPS validation and progress notifications. ' If fastCopy is false, the thread that calls PrintQueue.AddJob ' must have a single-threaded apartment state. Dim xpsPrintJob As PrintSystemJobInfo = defaultPrintQueue.AddJob(jobName:=xpsFileName, documentPath:=xpsFilePath, fastCopy) ' If the queue is not paused and the printer is working, then jobs will automatically begin printing. Debug.WriteLine($"Added {xpsFileName} to the print queue.") Catch e As PrintJobException isAllPrinted = False Debug.WriteLine($"Failed to add {xpsFileName} to the print queue: {e.Message}\r\n{e.InnerException}") End Try Next Return isAllPrinted End Function

提示

还可以使用以下方法打印 XPS 文件:

PrintDialog.PrintDocument 或 PrintDialog.PrintVisual 方法。 XpsDocumentWriter.Write 和 XpsDocumentWriter.WriteAsync 方法。

有关详细信息,请参阅如何显示打印对话框和打印文档概述。

另请参阅 PrintQueue.AddJob WPF 中的文档 如何显示打印对话框 打印文档概述


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有