绕过 Windows 后台处理程序,直接将原始数据打印到 USB 打印机
我正在尝试 Zebra TTP8200热敏打印机。对于我的应用程序,我需要连续打印绘图仪类型跟踪,直到用户按下停止按钮。我尝试过 ZPL 语言,我可以成功生成位图数据,并通过将 ZPL 作为原始数据输出,一次转储一行(或几行)位图。
我正在使用一些 Microsoft 演示代码 将原始数据输出到打印机,这效果很好,但有一个问题:假脱机程序。事实证明,每次我使用 MS rawprn.exe 代码输出一些数据时,它实际上都会作为打印作业进行假脱机处理,然后传输到打印机。这需要长达 10 秒的时间才能通过后台处理程序,显然太慢了。在驱动程序中禁用假脱机功能并没有帮助,它只是意味着在作业通过假脱机程序并完成打印时程序挂起。
有没有办法绕过假脱机程序并将数据直接输出到此 USB 打印机?到目前为止,我的研究还没有发现任何可能在 Windows API 中查找的内容。理想情况下,我希望能够像使用串行打印机一样使用打印机 - 打开端口并将数据推入。
提前非常感谢您提供任何提示!
I'm experimenting with a Zebra TTP8200 thermal printer. For my application I need to print plotter type traces continuously until the user hits a stop button. I've had a play with the ZPL language and I can successfully generate bitmap data and dump out my bitmap a line (or few lines) at a time by outputting the ZPL as raw data.
I'm using some Microsoft demo code to output the raw data to the printer and this works great, bar one issue: the spooler. It turns out that every time I output some data using the MS rawprn.exe code it is actually spooled as a print job and then transmitted to the printer. This takes up to 10 seconds to get through the spooler, obviously too slow. Disabling spooling in the driver doesn't help, it just means that the program hangs while the job is passed through the spooler and printing completes.
Is there a way to bypass the spooler and output data straight to this USB printer? My research so far hasn't turned up anything likely looking in the Windows API. Ideally, I'd like to be able to use the printer like it was a serial printer - open the port and shove data in.
Many thanks in advance for any hints!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果 USB 打印机可用作 COM 端口,则只需写入 COM 端口即可。像这样,在 DOS 提示符下:
前一个示例将
dir
命令的结果输出到打印机。或者,这是另一个示例:
前一个示例将
file.txt
的内容输出到打印机。输出格式正确的 ZPL 数据比纯文本更困难。不过,我已经使用 Ruby(和 Epson/ESC 命令)在 Linux 上实现了这一点。
If the USB printer is available as a COM port, you can just write to the COM port. Like this, from the DOS prompt:
The former example will output the results of the
dir
command to the printer.Or, here is another example:
The former example will output the contents of
file.txt
to the printer.Outputting properly formatted ZPL data will be harder than just plain text. I have gotten this to work from Linux using Ruby (and Epson/ESC commands), however.
是的,绝对是。它内置于大多数操作系统中,通过 USB 打印原始数据比以太网和 COM/LPT 稍微不那么明显。请注意,许多应用程序(例如记事本)无法打印原始数据,因此您的应用程序也需要支持这一点。
立即完成,使用新创建的打印机。
聚苯乙烯
这些说明也可在此处获取,并带有屏幕截图,作为 Java 开源原始打印教程的一部分。该项目还提供其他平台(Ubuntu、OS X)的教程。
http://qzindustries.com/TutorialRawWin
-Tres
Yes, absolutely. It's built into most OSs, printing raw via USB is just a bit less obvious than Ethernet and COM/LPT. Note, many applications, such as notepad are incapable of printing raw, so your application needs to support this as well.
Now with your raw printing application, use the newly created printer.
P.S.
These instructions are also available here, with screenshots, as part of a Java open source raw printing tutorial. The project provides tutorials for other platforms (Ubuntu, OS X) as well.
http://qzindustries.com/TutorialRawWin
-Tres
感谢您的评论。
经过更多挖掘后,我发现 这篇关于使用 usbprint.sys 提供的 Windows 打印机功能的有趣文章。通过一些修改,示例代码似乎可以工作。我想我会走这条路。
文章中给出了最终的代码:
再次感谢您的建议。
Thanks for the comments.
After some more digging around, I found this interesting article on using Windows printer functions provided by usbprint.sys. With a bit of hacking the sample code there seemed to work. I think I'll take this route.
There is the final code given in the article:
Thanks again for the suggestions.
下面的 C# 类是我从 Microsoft 知识库文章中改编而来的。此类中有一些方法可以将打印作业作为
字符串
和字节[]
发送。请注意,其中有一些对 log4net 的引用,可以将其删除/替换为您选择的日志记录框架。 :The below class in C# is something I've adapted from a Microsoft Knowledgebase article. There are methods in this class to send the print job as a
string
andbyte[]
. Please note there are some references to log4net in there that can be removed/replaced with the logging framework of your choice. :