5

我有一台通过网络连接到我的计算机的点阵打印机 LX-300。如何在 Python 中将带有 ESCP 字符的原始字符串直接发送到我的打印机?

计算机通过另一台计算机连接到打印机。我需要发送一个原始字符串,因为 LX-300 图像打印结果模糊。

4

2 回答 2

5

问题

沿着这条路线发送数据:

客户端计算机--->服务器(Windows机器)--->打印机(点阵)

...并且不要让 Windows 弄乱数据;而是直接从客户端计算机发送原始数据,包括打印机控制代码。

我的解决方案

以下是我为小型内部数据库应用程序解决几乎相同问题的方法:

步骤 1) 使打印机可以通过网络访问,而 Windows 不会接触到路由到它的数据。我通过使用“Generic/Text Only”驱动程序安装打印机,然后 在连接到打印机的 Windows 机器上安装RawPrintServer来完成此操作。

步骤 2) 通过网络将原始数据发送到您设置 RawPrintServer 时指定的 TCP/IP 端口(默认为 9100)。有多种方法可以做到这一点,这就是我所做的:

data = b"\x1B@A String To Print\x1B@" # be sure to use the right codes for your printer
ip_addr = 123.123.123.123 # address of the machine with the printer
port = 9100 # or whatever you set it to
s = socket.socket()
try:
    s.connect((ip_addr, port))
    s.send(data)
except:
    # deal with the error
finally:
    s.close()

背景

我从两个方面考虑了这个问题:

  1. 客户端机器:从 Python 中吐出我需要的数据,并为我的打印机提供正确的格式/控制代码,然后通过网络发送
  2. 打印服务器机器:将数据传输到本地连接的打印机

1号是容易的部分。PyPI中实际上有一些库可以帮助处理所有打印机代码,但我发现它们中的大多数都是针对小型销售点标签打印机的,对我来说用途有限。所以我只是将我需要的东西硬编码到我的 Python 程序中。

当然,您选择解决数字 2 的方式将影响您从 Python 发送数据的方式。我选择 TCP/IP 路由以避免处理 Samba 和 Windows 打印问题。

正如您可能发现的那样,Windows 通常会非常努力地将您想要打印的任何内容转换为位图并以图形模式运行打印机。我们可以使用通用驱动程序并将数据直接转储到(本地)打印机端口以防止这种情况。

然后,缺少的链接是从网络到连接到打印机的机器上的本地打印机端口。同样,有多种方法可以解决这个问题。您可以尝试以某种方式访问​​ Windows 打印机共享。如果你像我一样走 TCP/IP 路由,你可以用 Python 编写你自己的打印服务器。就我而言,RawPrintServer 程序“正常工作”,所以我没有进一步调查。显然,它所做的只是从 TCP 端口 9100 获取传入数据并将其推送到本地打印机端口。显然,您必须确保防火墙没有阻止打印服务器机器上的传入连接。就 Windows 而言,此方法不需要“共享”打印机。

根据您的情况(如果您使用 DHCP),您可能需要做一些额外的工作才能在 Python 中获取服务器的 IP 地址。就我而言,由于我的应用程序的特殊性,我免费获得了 IP。

这个解决方案对我来说似乎效果很好。我有一台以 Epson ESC/P 兼容模式运行的旧 Panasonic 打印机连接到 Windows 7 机器,我可以从本地网络上的任何其他计算机打印到该机器。顺便说一句,无论客户端计算机运行什么操作系统,这个总体思路都应该有效。

于 2016-10-14T15:47:44.380 回答
2

最终,您将需要并且想要编写自己的包装器/脚本来执行此操作。而且由于您使用的是 Linux 发行版,因此这相对容易。

在 Linux 操作系统上,发出打印作业的最简单方法是向 lpr 打开一个进程。通常,使用允许您无需以 root 身份(作为超级用户)登录即可访问打印机,考虑到以“超级用户”身份登录时可能造成的损坏程度,这是可取的。lpr

代码如下:

import subprocess
lpr = subprocess.Popen("/usr/bin/lpr", stdin=subprocess.PIPE)
lpr.stdin.write(data_to_send_to_printer)

对你来说应该是一个很好的起点。本质上,此代码应该允许您完成所需的工作。

不过要小心;根据您的权限级别,打开子进程的调用可能需要根级别/超级用户权限。

子进程通常继承运行命令的用户的用户 ID 和访问权限。例如,如果子进程是由 root 用户创建的,那么您将需要 root 用户/超级用户权限才能访问该子进程。

有关更多信息,请查看我在帖子中包含的超链接。

祝你好运!

于 2016-10-14T15:27:37.070 回答