如何在ubuntu中使用python将原始字符串发送到dotmatrix打印机?

时间:2016-10-06 08:29:29

标签: python epson dot-matrix escpos

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

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

2 个答案:

答案 0 :(得分:3)

问题

沿此路线发送数据:

客户端计算机--->服务器(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. 客户端计算机:使用正确的格式化/控制代码从我的打印机吐出我需要的数据,然后通过网络发送
  2. 打印服务器:将数据传输到本地连接的打印机
  3. 1号是容易的部分。实际上some libraries in PyPI可能对所有打印机代码都有帮助,但我发现其中大部分是针对小型销售点标签打印机,对我来说使用有限。所以我只是将我需要的内容硬编码到我的Python程序中。

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

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

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

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

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

答案 1 :(得分:2)

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

在Linux操作系统上,发布打印作业的最简单方法是向subprocess打开lpr。通常,使用lpr可以访问打印机而无需以root身份登录(作为超级用户),考虑到以超级用户身份登录时可以完成的损坏量,这是可取的。 #34;

代码如下:

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

对你来说应该是一个很好的跳跃点。基本上,这段代码应该可以让你完成你需要的东西。

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

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

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

祝你好运!