【问题标题】:Printer spooler api number of copies打印后台处理程序 api 份数
【发布时间】:2016-06-29 13:32:51
【问题描述】:

我真的需要一些帮助,这是很多人在互联网上提出的问题。我有不同的设置,尝试了不同的测试方式,这非常令人沮丧。

第一次设置:

  • 本地打印机

  • 本地运行代码

  • 从 pdf 或记事本打印:SUCCES(份数为 2)

  • 从 word 打印:失败(份数为 1)

第二次设置:

  • 共享的本地打印机

  • 本地运行代码

  • 从其他计算机打印到共享打印机

  • 副本数始终为 1

那么每个人都缺少什么?在打印机仍然应该知道要打印什么的情况下缺少某些字段会发生什么?当您从另一台计算机打印时,也会出现什么单词?有人能告诉我为什么窗户里的东西这么可怕吗?一切都应该通过spooler,为什么数据有误?

问候!

【问题讨论】:

标签: c# printing print-spooler-api dev-mode


【解决方案1】:

打印机打印纸张和页面,因此副本在某个阶段会转换为页面。

您获得的通知数据取决于正在打印的应用程序以及处理假脱机和呈现的系统和驱动程序组件。根据我的经验,不能依赖数据,最好的数据是通过解析假脱机文件获得的。这可能包含也可能不包含副本数。

Word has had the "copies problem" for a long time。有一个patch to supposedly fix this,但另一种意见是因为它使用了unusual way of printing。我将在这里引用一些链接内容:

由于臭名昭著的 Word Copy Count 错误……提交的 dmCopies 在 SHD。在 SPL 文件的 DEVMODE 记录中找到正确的值 (如果它是 EMF 线轴)。

我发现的唯一其他方法是监视 PrintedPages 字段 JOB_INFO_2 结构,当作业被发送到打印机时, 看看它是否是 TotalPages 的倍数。

[...]

发生的不是 Word 错误,而是 Windows 错误。 Word 调用 startDoc 总是将副本设置为 1。之后调用 DocumentProperties 和 在 dmCopies 中进行更改并调用 ResetDC 进行更新。它 是一种奇怪的打印方式,但没有错。问题是, shd 文件和printer_info 没有用这个信息更新,只是 保留在 StartDoc 调用中设置的 Devmode 信息。

但是生成新 DevMode 的 ResetDC 调用仍保留在 SPL 文件。如果您挂钩 DocumentProperties,您也​​可以获得该信息 API 调用。

【讨论】:

  • 我多年来一直在开发 Windows 打印驱动程序,我将证明所有 MS Office 产品都是一些表现最差的打印应用程序。它们都使用了几乎没有其他应用程序使用的奇怪技术。
【解决方案2】:

感谢您的回答。有没有办法在文档属性发生变化时捕获它们?

JOB_INFO_2 结构确实具有与 pages_printed 相同的 total_pages。所以这不是一个解决方案。

SPL 文件确实包含我测试过的打印机的正确数量。但是我们在很多打印机上进行了测试,我们发现数量并不总是设置。所以不是100%的解决方案。但已经是一个很好的后备方案了。

因此,如果我可以在不调用 SPL 文件的情况下捕获文档属性,那就太好了,因为我猜这就是一切正确的地方。不是吗?

【讨论】:

  • 将您的 cmets 作为答案发布是行不通的,这就是您所做的。您要联系的人可能不知道您发布了此内容。如果您仍然需要询问,请对他的回答发表评论。
  • 要回答您的问题,捕获 DocumentProperties 调用将需要某种代码注入。这些调用从应用程序到 GDI 再到打印驱动程序,您必须拦截它们。显然,这是一种昂贵、高风险的选择。正如尼克韦斯特盖特在他的回答中所说,您最好的数据将是假脱机文件。解析也不是小菜一碟。
  • 是的,如果您可以在每个客户端上安装,您可以尝试使用 DLL 注入挂钩 DocumentProperties API,但 IIRC 您可能仍然会遇到使用非标准 DEVMODE 的驱动程序的问题。 Windows GDI 打印乱七八糟,新的 XPS 路径也不多谈了。
  • 你能给我一个例子,说明如何从 SPL 文件中的 DEVMODE 记录中获取此信息(Word 文件中的实际副本数)。现在我从 Jobinfo_2 的 DEVMODE 得到了 dmCopies,但是你这样说我不知道​​这样做。
  • @karelp90:这看起来像是个问题。你在问谁? Condra963 谁从六月就没有登录过?这应该作为自己的问题发布,并带有与上述问题相似的标签,然后将通知那些关注标签的人。他们是否回答将取决于他们是否愿意在生命中的宝贵时刻输入一个可能永远不会被接受甚至被赞成的答案。明智地使用。您的问题与this 有关吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 2019-12-26
  • 2011-10-11
  • 1970-01-01
相关资源
最近更新 更多