2016-06-29 51 views
0

我真的可以使用一些帮助,这是一个很多人在互联网上询问的问题。我有不同的设置,尝试了不同的测试方式,这非常令人沮丧。打印机假脱机程序api的副本数

首先设置:

  • 本地打印机

  • 本地运行代码

  • 打印从PDF或记事本:SUCCES(拷贝数是2)

  • 打印从word:FAILED(number of copies is 1)

第二设置:被共享

  • 本地打印机

  • 本地运行代码

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

  • 份数isalways 1

Sowhat是否每个人都缺少?打印机仍然应该知道要打印什么时会发生什么情况?从另一台计算机打印时也会发生什么?有人能告诉我为什么窗户上的东西太可怕了吗?万物应该通过假脱机程序,sowhy isthedata错了?

亲切的问候!

+0

此主题也在MSDN上运行:https://social.msdn.microsoft.com/Forums/en-US/d8d07a54-f74a-44c9-a18f-6878782b4961/print-spool-api-number-of-copies ?forum = csharpgeneral – Condra963

回答

2

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

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

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

与臭名昭著的Word复印计数错误......提起dmCopies在 SHD 1。正确的值位于SPL文件 的DEVMODE记录中(如果它是EMF假脱机)。

唯一的其他办法,我发现是监测的 的JOB_INFO_2结构,当作业已发送到打印机, 的PrintedPages场,看看它是否是总页数的倍数。

[...]

会发生什么事是不是一个字错误,但在Windows错误。 Word始终将副本设置为1,并调用startDoc 。之后,调用DocumentProperties和 在dmCopies中进行更改并调用ResetDC进行更新。它 是一种奇怪的印刷方式,但没有错。问题是 shd文件和printer_info没有使用此信息进行更新,只有 将Devmode信息设置在StartDoc调用上。

但是调用ResetDC生成一个新的DevMode保存在 SPL文件中。如果您挂接DocumentProperties API调用,则也可以获取该信息。

+0

我一直在开发Windows打印驱动程序多年,我会证明所有的MS Office产品都是一些表现最差的打印应用程序。他们都使用奇怪的技术几乎没有其他应用程序使用。 –

1

谢谢你的回答。有没有办法在文件属性发生变化时捕获文件属性?

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

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

因此,如果我可以捕捉文档属性而不调用SPL文件,那将是美好的,因为我猜这就是一切都是正确的。不是吗?

+0

无法将您的评论发布为答案,这是您所做的。你试图解决的人可能不知道你发布了这个。如果你仍然需要问,请发表评论他的回答。 –

+1

为了回答你的问题,捕获DocumentProperties调用需要某种代码注入。这些调用从应用程序到GDI到打印驱动程序,您将不得不拦截它们。显然,这是一个昂贵的,高风险的选择。正如Nick Westgate在他的回答中所说的,你最好的数据将是假脱机文件。解析这也不是Cakewalk。 –

+0

是的,如果你可以安装在每个客户端上,你可以尝试使用DLL注入来连接DocumentProperties API,但是IIRC你可能会遇到使用非标准DEVMODE的驱动程序的问题。 Windows GDI打印是一团糟,而新的XPS路径并没有提到太多。 –

相关问题