3

在我的一个 Windows 应用程序中,我需要一个模块来检测正在打印的页面的覆盖率。

现在,我正在使用Print Queue Watch库来检测打印作业事件。

但是有没有办法检测打印的页面有多少部分。?

提前致谢。

4

2 回答 2

2

由于您使用 WinForms 在 C# 中对应用程序进行了编程,因此我假设您使用了 PrintDocument 并且您的打印发生在PrintPage使用PrintPageEventArgs.Graphics.

如果是这种情况,应该可以将打印的代码重构为单独的方法,该方法采用Graphicsas 参数的实例(可能还有其他参数,如页面大小等)。

然后,您可以创建一个Bitmap具有足够大小(并且与纸张的纵横比相同)的(白色)对象,并将其提供给上述方法。然后,您可以去计算已着色的像素,从而计算打印机将打印的页面的百分比。

请记住,您可能必须尊重打印区域周围的边距和不同的纸张尺寸才能进行计算。

如果代码的重构被证明很重,您可以为Graphics对象创建一个包装器,它将所有绘制调用“复制”到一段Bitmap时间打印,然后继续计算像素。

(此答案假设您要监视您的应用程序,而不是系统上的其他应用程序)

于 2013-09-13T18:48:10.960 回答
2

我知道一种方法可以做到这一点。您需要创建一个打印处理器。打印处理器是一个驱动程序,可以在将数据发送到打印监视器之前更改或读取数据(这是以专有格式向打印机端口发出内容的驱动程序)。

在此处查看打印架构的全局视图http://technet.microsoft.com/en-us/library/cc976755.aspx。以下是打印机处理器功能的描述:https ://serverfault.com/questions/304536/what-is-the-reason-for-choosing-a-different-print-processor 。

如何使用 PowerShell 更改打印处理器:http: //blogs.technet.com/b/chad/archive/2012/10/31/tip-52-mixing-the-old-and-new-setting-a-打印机-s-打印处理器-使用-powershell-wmi-and-setprinter-exe.aspx

这里是一个关于如何做的示例(即,创建一个打印处理器):http ://code.msdn.microsoft.com/windowshardware/Genprint-4a71134f 。

要使其工作,您需要将 GdiPlayPageEMF 重定向到内存上的位图,然后您可以在将其发送到打印机句柄之前计算其像素。你可以在 Google 上搜索 GdiPlayPageEMF,关于如何做这种事情会有有趣的结果。

此外,这里有很多关于打印的好信息http://www.undocprint.org/winspool/spool_files#reading_job_data

我希望这有帮助。

于 2013-09-23T17:38:20.700 回答