Ian*_*oyd 13 windows printing xps
我需要告诉打印机驱动程序发出换页.
我使用以下方法直接打印到打印机:
一组API调用.
很多灵感来自KB138594 - HOWTO:使用Win32 API将原始数据发送到打印机.知识库文章中需要注意的一点是,它们(以及我复制的代码)以RAW模式启动文档:
// Fill in the structure with info about this "document."
docInfo.pDocName = "My Document";
docInfo.pOutputFile = NULL;
docInfo.pDatatype = "RAW";
StartDocPrinter(hPrinter, 1, docInfo);
Run Code Online (Sandbox Code Playgroud)
注意:
RAW模式(与模式相反TEXT)意味着我们向打印机驱动程序发出原始字节.我们承诺用它理解的语言进行交谈.
然后我们可以WritePrinter用来写我们想要的一切:
WritePrinter(hPrinter, "Hello, world!"); //note, extra parameters removed for clarity
WritePrinter(hPrinter, 0x0c); //form-feed
Run Code Online (Sandbox Code Playgroud)
这里的问题是0x0c换页字符.因为我们已经在RAW模式下打开了打印机,我们承诺我们将发送它可以处理的打印机驱动程序字节.大多数打印机的驱动程序0x0C意味着您要发布换页.
问题是其他打印机(PDF打印机,Microsoft XPS打印机)希望RAW打印作业使用他们自己的打印机语言.如果您使用上述内容打印到XPS或PDF打印机:没有任何反应(即没有保存对话框,没有打印).
我刚才要求解决这个问题,并且回复是你必须改变文档模式RAW:
docInfo.pDatatype = "RAW";
Run Code Online (Sandbox Code Playgroud)
到TEXT:
docInfo.pDataType = "TEXT";
Run Code Online (Sandbox Code Playgroud)
那么这可能是因为您将"RAW"数据直接发送到打印机,而RAW可以是任何PDL.但是XPS驱动程序可能只会理解XPS,它可能会忽略你的"未知:Hello,world!0xFF"PDL.如果有的话,XPS驱动程序可能只在您直接写入时接受XPS数据.
如果要在XPS驱动程序上呈现文本,则应使用GDI.如果指定"TEXT"作为数据类型,则可以将纯文本发送到驱动程序.然后,连接到驱动程序的打印处理器将通过GDI将作业呈现给驱动程序,从而为您"转换"明文.
所以这很有效,我改变了我的代码,将打印文档声明为TEXT:
// Fill in the structure with info about this "document."
docInfo.pDocName = "My Document";
docInfo.pOutputFile = NULL;
docInfo.pDatatype = "TEXT";
StartDocPrinter(hPrinter, 1, docInfo);
WritePrinter(hPrinter, "Hello, world!");
WritePrinter(hPrinter, 0x0c); //form-feed
Run Code Online (Sandbox Code Playgroud)
然后出现XPS和PDF打印机的" 另存为"对话框,并正确保存.我认为一切都已修复.
除了几个月之后,当我试图打印到<quote>真正的</ quote>打印机时:不会发生换页 - 可能是因为我不再以"原始打印机命令"模式打印.
所以我需要的是Windows-ish发布表单的方式.我需要API调用,告诉打印机驱动程序我希望打印机执行换页.
我的问题:如何告诉打印机在打印过程中发出Form-Feed?
打印处理器告诉假脱机程序根据文档数据类型更改作业.它与打印机驱动程序配合使用,将假脱机打印作业从硬盘驱动器发送到打印机.
软件供应商偶尔会开发自己的打印处理器以支持自定义数据类型.通常,打印处理器不需要管理员进行任何设置或干预.
数据类型
Windows打印过程通常支持五种数据类型.两种最常用的数据类型,增强型图元文件(EMF)和准备打印(RAW),会在客户端计算机和打印服务器计算机上以不同方式影响性能.
RAW是基于Windows的程序以外的客户端的默认数据类型.RAW数据类型告诉假脱机程序在打印之前根本不要改变打印作业.使用此数据类型,准备打印作业的整个过程在客户端计算机上完成.
EMF或增强型图元文件,是大多数基于Windows的程序的默认数据类型.使用EMF,打印文档被更改为元文件格式,比RAW文件更便携,通常可以在任何打印机上打印.EMF文件往往小于包含相同打印作业的RAW文件.关于性能,仅在客户端计算机上更改或呈现打印作业的第一部分,但是大部分影响在打印服务器计算机上,这也有助于客户端计算机上的应用程序更快地将控制返回给用户.
下表(摘自MSDN)显示默认Windows打印处理器支持的五种不同数据类型:
数据类型:RAW
假脱机程序的方向:打印文档而不做任何更改.
使用:这是不基于Windows的所有客户端的数据类型.
数据类型:RAW [FF appended]
假脱机程序的方向:附加换页符(0x0C),但不进行其他更改.(如果没有尾随换页,PCL打印机将省略文档的最后一页.)
使用:某些应用程序需要.Windows不会分配它,但可以在"打印处理器"对话框中将其设置为默认值.
数据类型:RAW [FF auto]
假脱机程序的方向:检查尾随换页符,如果尚未添加,则添加一个,但不进行其他更改.
使用:某些应用程序需要.Windows不会分配它,但可以在"打印处理器"对话框中将其设置为默认值.
数据类型:NT EMF 1.00x
假脱机程序的方向:将文档视为增强型图元文件(EMF),而不是打印机驱动程序输出的RAW数据.
使用:EMF文档由Windows创建.
数据类型:TEXT
假脱机程序的方向:将整个作业视为ANSI文本,并使用打印设备的出厂默认值添加打印规范.
使用:当打印作业是简单文本且目标打印设备无法解释简单文本时,此功能非常有用.
您可以通过控制面板中的打印机属性查看打印机可用的打印处理器以及每个处理器支持的数据类型:

是的,那行不通。您故意绕过打印机驱动程序,即为任何打印机提供通用接口的代码块。这让您需要处理每种特定打印机型号的特殊性。
有一些通用的接口,您在代码中使用的接口是旧点阵打印机使用的接口。PCL 在惠普激光打印机上很常见。Postscript 在高端打印机上很常见。后两者有自己的换页符。
然后是廉价激光和喷墨打印机的海洋。他们通常根本没有明确定义的界面。它们没有在打印机内部安装处理器将打印机命令转换为纸张上的点,而是让打印机驱动程序完成所有艰苦的工作。你永远不会得到其中之一,该接口是专有的且没有文档记录。
打印机驱动程序是您的朋友。 PrintDocument类来使用它。获取换页很简单,只需设置e.HasMorePages = true并退出PrintPage事件处理程序即可。您已经看到了我链接的 StreamPrinter 类。