问题
要沿着该路由发送数据:
客户端计算机--->服务器(Windows机器)--->打印机(点阵)
...并not让Windows弄乱数据;而是直接从客户端计算机发送原始数据,包括打印机控制代码。
我的解决方案
以下是我如何解决小型内部数据库应用程序的几乎相同的问题:
步骤 1) 使打印机可通过网络访问,而 Windows 不会插手路由到它的数据。我通过使用“通用/仅文本”驱动程序安装打印机,然后安装来完成此操作原始打印服务器 https://sourceforge.net/projects/rawprintserver/在连接到打印机的 Windows 计算机上。
步骤 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()
背景
我分两部分思考了这个问题:
- 客户端计算机:使用打印机的正确格式/控制代码从 Python 吐出我需要的数据,并通过网络发送它
- 打印服务器机:将数据传输到本地连接的打印机
第 1 点是简单的部分。其实有这可能对所有打印机代码都有帮助,但我发现它们中的大多数都是针对小型销售点标签打印机,对我来说用处有限。所以我只是将我需要的内容硬编码到我的 Python 程序中。
当然,您选择解决问题 2 的方式将影响您从 Python 发送数据的方式。我选择 TCP/IP 路由是为了避免处理 Samba 和 Windows 打印问题。
您可能已经发现,Windows 通常会非常努力地将您想要打印的任何内容转换为位图并以图形模式运行打印机。我们可以使用通用驱动程序并将数据直接转储到(本地)打印机端口以防止这种情况发生。
那么,缺少的链接是从网络到连接到打印机的计算机上的本地打印机端口。同样,有多种方法可以解决这个问题。您可以尝试以某种方式访问 Windows 打印机共享。如果您像我一样采用 TCP/IP 路线,您可以用 Python 编写自己的打印服务器。就我而言,RawPrintServer 程序“刚刚工作”,所以我没有进一步调查。显然,它所做的只是从 TCP 端口 9100 获取传入数据并将其推送到本地打印机端口。显然,您必须确保防火墙没有阻止打印服务器计算机上的传入连接。就 Windows 而言,此方法不需要“共享”打印机。
根据您的情况(如果您使用 DHCP),您可能需要做一些额外的工作才能在 Python 中获取服务器的 IP 地址。就我而言,由于我的应用程序的特殊性,我免费获得了 IP。
这个解决方案似乎对我来说非常有效。我有一台旧的松下打印机,在 Epson ESC/P 兼容模式下运行,连接到 Windows 7 机器,我可以从本地网络上的任何其他计算机进行打印。顺便说一句,无论客户端计算机运行什么操作系统,这个总体想法都应该有效。