摘自微软的技术文章

如何:以编程方式打印 XPS 文件

可以使用 AddJob 方法的一个重载来打印 XML 纸张规范 (XPS) 文件,而不必打开PrintDialog,或者从原则上来说,根本不必打开任何用户界面 (UI)。

您还可以使用 XpsDocumentWriter 的许多Write 和WriteAsync 方法来打印 XML 纸张规范 (XPS) 文件。有关更多信息,请参见Printing an XPS Document。

打印 XML 纸张规范 (XPS) 的另一种方法是使用 PrintDialog 控件的PrintDocument 或PrintVisual 方法。请参见如何:调用打印对话框。

示例


使用三参数 AddJob(String, String, Boolean) 方法的主要步骤如下。下面的示例给出了详细信息。

  1. 确定打印机是否是 XPSDrv 打印机 (有关 XPSDrv 的更多信息,请参见打印概述)。

  2. 如果打印机不是 XPSDrv 打印机,将线程的单元设置为单线程。

  3. 实例化一个打印服务器和打印队列对象。

  4. 调用该方法,并指定作业名称、要打印的文件以及指示打印机是否是 XPSDrv 打印机的 Boolean 标志。

下面的示例演示如何以批处理方式打印一个目录中的所有 XPS 文件。 尽管应用程序提示用户指定目录,但是三参数的 AddJob(String, String, Boolean) 方法不需要用户界面 (UI)。它可以用在可传递给它的 XPS 文件名和路径所在的任何代码路径中。

只要 Boolean 参数是false(当使用的不是 XPSDrv 打印机时,该参数必须为此值),AddJob 的三参数AddJob(String, String, Boolean) 重载就必须运行在单个线程单元中。但是,Microsoft .NET 的默认单元状态是多线程。 必须将此默认设置反过来,因为本示例采用的不是 XPSDrv 打印机。

有两种方法来更改默认设置。 一种方法是在应用程序的 Main 方法的第一行(通常是“static void Main(string[] args)”)的紧上方添加STAThreadAttribute(即“[System.STAThreadAttribute()]”)。但是,许多应用程序都要求 Main 方法有多线程单元状态,因此存在第二种方法,即:在一个单独的线程中放置对AddJob(String, String, Boolean) 的调用,该线程的单元状态通过SetApartmentState 设置为STA。下面的示例使用第二种方法。

因此,示例的开头实例化一个 Thread 对象,并将一个PrintXPS 方法作为 ThreadStart 参数传递给它(PrintXPS 方法在本示例的稍后部分定义)。接下来,线程设置为单线程单元。Main 方法的剩余代码启动新线程。

该示例的主要内容在 staticBatchXPSPrinter.PrintXPS 方法中。在创建打印服务器和队列后,该方法会提示用户输入包含 XPS 文件的目录。 在确认该目录存在并且其中存在 *.xps 文件后,该方法将每个这样的文件添加到打印队列中。 该示例假定打印机不是 XPSDrv,因此我们将 false 传递给 AddJob(String, String, Boolean) 方法的最后一个参数。为此,该方法在尝试将文件转换为打印机的页面描述语言之前,会先验证文件中的 XPS 标记。如果验证失败,将引发一个异常。 代码示例将捕捉此异常,将有关此异常的信息通知给用户,然后继续处理下一个 XPS 文件。

VB
C#
C++
F#
JScript
PowerShell

  Friend Class Program<System.MTAThreadAttribute()>Shared Sub Main(ByVal args() As String) ' Added for clarity, but this line is redundant because MTA is the default.' Create the secondary thread and pass the printing method for ' the constructor's ThreadStart delegate parameter. The BatchXPSPrinter' class is defined below.Dim printingThread As New Thread(AddressOf BatchXPSPrinter.PrintXPS)' Set the thread that will use PrintQueue.AddJob to single threading.printingThread.SetApartmentState(ApartmentState.STA)' Start the printing thread. The method passed to the Thread ' constructor will execute.printingThread.Start()End Sub 'end MainEnd Class 'end Program classPublic Class BatchXPSPrinterPublic Shared Sub PrintXPS()' Create print server and print queue.Dim localPrintServer As New LocalPrintServer()Dim defaultPrintQueue As PrintQueue = LocalPrintServer.GetDefaultPrintQueue()' Prompt user to identify the directory, and then create the directory object.Console.Write("Enter the directory containing the XPS files: ")Dim directoryPath As String = Console.ReadLine()Dim dir As New DirectoryInfo(directoryPath)' If the user mistyped, end the thread and return to the Main thread.If Not dir.Exists ThenConsole.WriteLine("There is no such directory.")Else' If there are no XPS files in the directory, end the thread ' and return to the Main thread.If dir.GetFiles("*.xps").Length = 0 ThenConsole.WriteLine("There are no XPS files in the directory.")ElseConsole.WriteLine(vbLf & "Jobs will now be added to the print queue.")Console.WriteLine("If the queue is not paused and the printer is working, jobs will begin printing.")' Batch process all XPS files in the directory.For Each f As FileInfo In dir.GetFiles("*.xps")Dim nextFile As String = directoryPath & "\" & f.NameConsole.WriteLine("Adding {0} to queue.", nextFile)Try' Print the Xps file while providing XPS validation and progress notifications.Dim xpsPrintJob As PrintSystemJobInfo = defaultPrintQueue.AddJob(f.Name, nextFile, False)Catch e As PrintJobExceptionConsole.WriteLine(vbLf & vbTab & "{0} could not be added to the print queue.", f.Name)If e.InnerException.Message = "File contains corrupted data." ThenConsole.WriteLine(vbTab & "It is not a valid XPS file. Use the isXPS Conformance Tool to debug it.")End IfConsole.WriteLine(vbTab & "Continuing with next XPS file." & vbLf)End TryNext f ' end for each XPS fileEnd If 'end if there are no XPS files in the directoryEnd If 'end if the directory does not existConsole.WriteLine("Press Enter to end program.")Console.ReadLine()End Sub ' end PrintXPS methodEnd Class ' end BatchXPSPrinter class

如果您使用的是 XPSDrv 打印机,则可以将最后一个参数设置为 true。在这种情况下,因为 XPS 是打印机的页面描述语言,所以此方法会将文件发送到打印机,而不对它进行验证或将它转换为另一种页面描述语言。如果您在设计时不确定应用程序是否将使用 XPSDrv 打印机,则可以修改应用程序,使它读取 IsXpsDevice 属性,并根据它找到的内容进行分支。

因为在 Windows Vista 和 Microsoft .NET Framework 发行之后,最初几乎没有 XPSDrv 打印机可以立即投入使用,因此,可能需要将非 XPSDrv 打印机假装成 XPSDrv 打印机。为此,应将 Pipelineconfig.xml 添加到运行您的应用程序的计算机的以下注册表项中的文件列表:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows NT x86\Drivers\Version-3\<PseudoXPSPrinter>\DependentFiles

其中 <PseudoXPSPrinter> 是任一打印队列。然后必须重新启动计算机。

这种假装使您可以将 true 作为AddJob(String, String, Boolean) 的最后一个参数来传递,而不会导致异常,但因为<PseudoXPSPrinter> 并不是真正的 XPSDrv 打印机,因此打印出来的将仅仅是乱码。

注意   为简单起见,上面的示例通过检查是否存在扩展名 *.xps 来检测文件是否是 XPS。但是,XPS 文件不一定有此扩展名。 isXPS.exe(isXPS 合规性工具)也是一种测试文件是否是 XPS 的方法。

请参见


参考

PrintQueue
AddJob
ApartmentState
STAThreadAttribute

概念

托管和非托管线程处理
isXPS.exe(isXPS 合规性工具)
WPF 中的文档
打印概述

其他资源

XPS
Printing an XPS Document
http://msdn.microsoft.com/en-us/windows/hardware/gg463408

以编程方式打印 XPS 文件相关推荐

  1. 如何使用C#以编程方式将MPP文件转换为PDF?

    Microsoft Project文件用于组织和管理项目中的不同任务.您可以使用C#以编程方式将MPP文件转换为PDF.本文将介绍以下内容: 使用C#以编程方式将MPP转换为PDF 在C#中将MPP转 ...

  2. 使用PDF处理控件Aspose.PDF以编程方式打印PDF文档完整攻略

    许多公司在很大程度上减少了纸张的使用.但是,在某些情况下打印很重要.例如,系统可能包含PDF格式的在线订单的详细信息.他们需要在分发在线订单进行交付时打印PDF.他们大规模处理项目,因此手动打印每个文 ...

  3. 利用Aspose.PDF以编程方式打印PDF文档

    使用C#打印PDF文件 可以使用C#或VB.net在.NET应用程序中自动打印PDF文件.您可以按照以下简单步骤打印PDF文件: 创建一个PdfViewer类的对象 加载输入的PDF文档 打印PDF文 ...

  4. 代码示例:使用Java以编程方式拆分PDF文件

    有时需要将一个PDF拆分为多个PDF文件时,可能会有多种情况.例如,可能必须分割包含发票/收据的PDF的每一页,并将它们另存为单独的文件.另一方面,可能要从PDF文件中拆分页面的特定集合.为了解决上述 ...

  5. 生成drl文件_我如何通过编程方式生成.drl文件。任何示例对我都将有所帮助

    我搜索了很多站点,但找不到有关.drl文件生成的任何特定相关示例. .drl文件生成方面的文档也不值得. 解决方案 //- ---- package部分------- PackageDescr pkg ...

  6. java代码生成apk_android – 如何通过java代码以编程方式生成apk文件

    您可以使用ANT jars ant.jar和ant-launcher.jar. 在这种情况下,应完全指定build.xml的路径. 以这种方式从Java类中调用它: public class AntT ...

  7. linux c 获取文件权限,如何在C / C++中以编程方式读取Linux文件权限

    stat(2)系统调用返回包含st_mode成员的struct stat.这是ls -l显示的模式位. 在我的系统上,man 2 stat页面显示: The following flags are d ...

  8. linux给文件夹图标,linux – 如何在GNOME中以编程方式设置自定义文件夹图标?

    我终于想出了如何做到这一点!这是一个在标准Gnome环境中工作的Python脚本: #!/usr/bin/env python import sys from gi.repository import ...

  9. java 打印gc_java – 以编程方式打印启用GC日志记录时通常在JVM出口上打印的堆使用情况...

    MXBeans有什么问题?实施并不那么难. 我用过类似的东西: List gcList = ManagementFactory.getGarbageCollectorMXBeans(); for(Ga ...

  10. java如何jasper_java – 如何以编程方式打印Jasper报告

    我必须编写一个代码来生成包含图像的Jasper报告. 我想将jasper报告发送给打印机. 我试过一个代码: String Report = "C:\\Template\\"+fi ...

最新文章

  1. 接私活福音,validation组件敏捷开发,效率提升5倍!
  2. 目标检测--Training Region-based Object Detectors with Online Hard Example Mining
  3. [转载] 英语科技论文写作——Difference between APAMLA
  4. python批量下载网页文件-Python批量下载网页图片详细教程
  5. C语言 匿名联合体和匿名结构体
  6. 总结获取原生JS(javascript)的父节点、子节点、兄弟节点
  7. php mysql 链表_浅谈PHP链表数据结构(单链表)
  8. Kali Linux 秘籍 第六章 漏洞利用
  9. python反转列表解析_Python语法糖之:列表解析、集合解析和字典解析
  10. python内置类属性_python常用内建属性大全
  11. android开发realm多线程操作,数据库的设计:深入理解 Realm 的多线程处理机制
  12. 使用webpack.require优化vue项目的路由
  13. 基本图像分类与目标检测网络要点总结
  14. 最常用20000英语单词表_家长最值得一看的文章如何培养孩子好的学习习惯!
  15. 大数据毕设选题 - 深度学习植物识别系统(cnn opencv python)
  16. [rust学习笔记]错误处理
  17. 遍历指定jar包中class文件名并输出到文件中
  18. Android零基础入门
  19. CSS 中最后一行中元素如何向左对齐
  20. 佳能推两款全新紧凑型4K激光工程投影机

热门文章

  1. js控制页面只刷新一次
  2. 08.第三章 数字特征与特征函数(1)
  3. 自动化爬虫selenium之键盘操作
  4. 增强 扫描王 源码_java,OpenCV简单实现类似“全能扫描王”功能
  5. 计算机的储存容量1kb等于多少byte,1kb等于多少mb
  6. JAVAFX输入法的实现
  7. 微信公众号开放标签跳转小程序
  8. 2021高考厦门一中成绩查询,2021年厦门中考成绩排名查询,厦门中考个人成绩排名查询...
  9. 微信小程序分享至朋友圈功能
  10. 程序员价值观和网络复杂性-网络不可达排查过程