【问题标题】:Intercepting data sent to a Windows printer (using RedMon)拦截发送到 Windows 打印机的数据(使用 RedMon)
【发布时间】:2012-07-10 08:06:57
【问题描述】:

我需要截获发送到 Windows 上的 ESC/POS 打印机的数据并对其进行分析。

所以我想以纯文本形式获取数据,以便提取并理解发送到打印机的信息。

目前,我尝试使用 RedMon 将数据流发送到打印机端口。但是发送的数据是光栅图形的形式,即要打印的点,嵌入在 ESC/POS 命令中。

所以我想知道是否有人可以建议我如何获取文本格式的打印数据,以便能够从中提取一些信息。

【问题讨论】:

  • 您能详细说明一下吗?哪个应用程序正在发送数据?它是 Java 应用程序吗?源代码在您的控制之下吗?您真的知道最初发送的是文本吗?您可以切换打印机驱动程序以将其输出写入文件并分析该文件的内容吗?我不是印刷专家,也不是 Postscript 专家,但根据您的回答,我可能会为您提供如何拦截印刷的想法。

标签: java windows printing postscript redmon


【解决方案1】:

发送到 ESC/POS 打印机的数据IS 嵌入了 ESC/POS 命令的光栅数据。这是 ESC/POS 打印机驱动程序根据其输入生成的内容。这就是 RedMon 为您找到的。

您似乎希望看到发送到打印机驱动程序的输入。这意味着您必须找出哪些应用程序确实使用了打印机,并且您必须拦截到达打印机驱动程序的内容。

您没有说是否要在“实时”环境中设置拦截,或者是否仅用于临时测试。如果您想临时测试,您也可以执行以下步骤:

  1. 暂停打印队列(上图,下图)。
  2. 可选:将驱动程序从 ESC/POS 更改为 PostScript 或 Microsoft XPS。如上所述,在打印机属性对话框上的同一“高级”选项卡上执行此操作。 (右下方屏幕截图)。
  3. 打印。
  4. 检索在假脱机目录中等待的假脱机文件。在 Windows 8 上,默认情况下是 C:\Windows\System32\spool\PRINTERS。假脱机文件名为 NNNNN.spl,其中 NNNNN 是当前打印作业的编号。
  5. 分析 PostScript 或 XPS 数据。

查看以下 3 个屏幕截图:

  


但是,如果您... 会更容易(而不是使用 RedMon)

  • ...只需启用名为 “保留打印的文档” 的打印机驱动程序设置:转到打印队列属性 => 选择“高级”选项卡 => 启用相应的复选框(见左侧截图, 以上);

  • ...fish spooled printjob 从 windows 打印假脱机目录;

  • ...分析您的NNNNN.spl 文件:

    • 在 Windows 8 上,这将是一个 XPS 文件。将其重命名为 NNNNN.xps,您可以使用内置的 XPS 查看器打开它。

    • 在以前的 Windows 版本上,NNNNN.spl 将具有相应打印机驱动程序的文件格式(PostScript 用于 PostScript 驱动程序,XPS 用于 Microsoft XPS 打印机,ESC/POS 用于您的打印机,...)。相应地重命名它并在 XPS 或 PostScript 查看器中打开它。

【讨论】:

  • 您好,请确认:.spl 文件将包含发送到打印机驱动程序的数据,对吗?但是当我看到一个从 .spl 文件打印的工具时,我有点困惑:compuphase.com/software_spool.htm 如果你在这个页面上写着“Spool 是一个小型 Win32 控制台实用程序,它将文件的内容发送到假脱机程序Windows 打印机,绕过打印机驱动程序。”当这些数据实际上必须发送到打印机驱动程序时,为什么它说绕过打印机驱动程序?
  • @shaarang:我不知道这个工具,也不知道它是如何工作的。如果您要发送到打印机的文件格式是打印机“理解”的格式,您可以绕过打印机驱动程序:根据型号,这可能是文本、TIFF、PostScript、PDF、PCL 甚至 SVG 或 XPS。 (或者你想发送任意数据来测试打印机的行为:如果它崩溃,如果它默默地忽略“垃圾”,如果它打印大量包含“随机”字符或空白区域的页面......)
  • 我认为你是对的,但有问题的文件是 Windows 准备的假脱机文件,无论如何我想做的就是将此 .spl 发送到打印机,所以我遇到了:support.microsoft.com/en-us/kb/179774 ,如果你去那里你会看到一个命令:复制 00002.spl \\\ 但是我的系统上安装了本地打印机,那么我该如何使用这个命令..?任何帮助将不胜感激。
  • @shaarang: 你的本地计算机名就是你的
  • 哦,对不起,我是 stackoverflow 的新手,我现在肯定会投票。 Computername 很好,但是 我可以从哪里得到它呢..
【解决方案2】:

如果您只是想捕获,您可以创建一个指向工作站 IP 的 TCP/IP 打印机端口并运行我的 vclpdcap 工具。它监控 9100 或 515(RAW 或 LPR)并捕获数据并将其写入文件。

看看这里,如果您需要更多指导,请告诉我。

更新:http://www.ballisticecho.com/articles/print-capture-lpd-9100

【讨论】:

    【解决方案3】:

    您可以将 Epson POS 打印机置于调试模式,它们将打印出传入数据的 HEX 转储。请参阅此 pdf 的第 88 页:http://www.pos.epson.com/epsonexpertTSG/Templates/POS_Developers_Details.aspx?NRMODE=Published&NRORIGINALURL=%2fdevelopers%2ftechresdetails%2ehtm%3fproductpk%3d642&NRNODEGUID=%7b934F5A6D-E01A-40B1-B2B0-648C1EC68047%7d&NRCACHEHINT=NoModifyGuest&productpk=642

    为了理解这一点,如果您注册并同意他们的条款,您可以获得 Epson ESC/POS SDK:https://www.epsonexpert.com/ee/prelogin/registration.htm

    【讨论】:

    • 我正在寻找一种方法来拦截发送到网络打印机的打印,并在打印机实际完成打印之前将正在打印的文档保存到目录中。这可能吗?如果可以,我该如何实现?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 2012-03-28
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多