为啥使用 Win32_PrintJob/C# 得到错误的 N-Up 打印总页数?
Posted
技术标签:
【中文标题】为啥使用 Win32_PrintJob/C# 得到错误的 N-Up 打印总页数?【英文标题】:Why get wrong total page of N-Up printing using Win32_PrintJob/C#?为什么使用 Win32_PrintJob/C# 得到错误的 N-Up 打印总页数? 【发布时间】:2017-11-30 01:51:52 【问题描述】:我正在用 C# 编写一个程序,以便在打印时暂停并获取总页数,这里是主要代码:
string wql = "SELECT * FROM Win32_PrintJob";
ManagementObjectCollection mos;
Dictionary<uint,short> checkedJobs = new Dictionary<uint,short>();
while (true)
Thread.Sleep(SleepTime);
try
mos = new ManagementObjectSearcher(wql).Get();
if (mos != null && mos.Count > 0)
foreach (ManagementObject mo in mos)
if (mo != null)
uint jobId = ProcessJob(mo);
if (!checkedJobs.ContainsKey(jobId))
checkedJobs.Add(jobId, 0);
// ...
它可以正常工作。但是在 N-Up 打印中,当我在一页中打印多张幻灯片(N Slides-In-One Page)时,它出错了,我无法获得正确的总数打印。
有没有人遇到过这个问题~请帮忙,非常感谢
【问题讨论】:
您如何获得页数,什么是“错误”? 结果是错误的意思(只在N-Up打印的模式下),比如我打印的是10页的ppt;但是我打印的是5合1模式的ppt(打印一页5张幻灯片)。总页数应该是2,但它是10。 我使用 JOB_INFO_2.TotalPages 得到总页数 您确实应该在您的问题中提供尽可能多的信息。您没有告诉我们您正在测试的应用程序。它是谷歌幻灯片文档还是其他什么?哪些应用程序有效,哪些会导致问题?结果如何? 【参考方案1】:您的问题与另一个问题相似(请参阅我的 answer there 并点击链接了解更多信息),但也许它的不同足以保证这里有不同的答案。
基本上,并非所有打印驱动程序都支持 NUP。您正在使用的应用程序可能正在检查 DEVMODE(或忽略它)并自行处理 NUP 而不是 letting the Spooler handle it。
正如我在另一个答案中所说,Windows 页面计数不能依赖于所有应用程序和驱动程序。新的 XPS 打印系统可能会改善这种情况,但对于旧应用程序和驱动程序而言,获得可靠页数的唯一方法是解析打印假脱机文件。
【讨论】:
你能告诉我如何解析打印假脱机文件的详细信息吗?现在我使用 spool API 来暂停打印作业;但我找不到找到 NUP 作业的实际打印计数的方法。 做得好,但正如我在其他答案中所说,页数计数是一项不平凡的任务 - 取决于您想要支持的打印语言。 EMF(如果不是假脱机,相当明确)、PCL-XL(明确定义)、PCL(许多变体)、PostScript(一种强大的语言)......公司在这个问题上花费了大量资金。看看undocumented 多少钱,或者如果你是为了好玩,也许你可以使用GhostScript。 谢谢,我试试 我们尝试了很多次,但是在打印N-up ppt时仍然无法获得正确的页数。您有没有解决过这个问题或者您能给我们一些指导吗~谢谢 对不起,我在这个竞争激烈的领域工作,所以我已经尽可能多地说了。这不是魔法:您寻求的答案在假脱机文件中,但主题比 Stack Overflow 答案更大:这是一份职业! ; - )以上是关于为啥使用 Win32_PrintJob/C# 得到错误的 N-Up 打印总页数?的主要内容,如果未能解决你的问题,请参考以下文章
Win32:为啥我的 PRINTDLG(或 PRINTDLGEX)有灰色背景?
为啥在 Win32 中使用 `GetAsyncKeyState()` 时我的热键会出错?