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

2024-10-01 17:35:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 字符串图像计算机打印机字符网络连接lx电脑
2条回答

问题

要沿此路径发送数据:

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

…而不是让Windows乱处理数据,而是直接从客户机发送原始数据,包括打印机控制代码。在

我的解决方案

下面是我如何为一个小型内部数据库应用程序解决一个几乎相同的问题:

步骤1)使打印机网络可访问,而无需Windows将手指伸入到打印机网络的数据中。我通过使用“Generic/Text-Only”驱动程序安装打印机,然后安装 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()

背景

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

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

第一是最简单的部分。实际上有some libraries in PyPI可以帮助所有的打印机代码,但我发现其中大多数都是针对销售点标签打印机的,对我来说用处有限。所以我只是把我需要的东西硬编码到我的Python程序中。在

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

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

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

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

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

最终,您将需要并希望编写自己的包装器/脚本来实现这一点。而且,由于您使用的是Linux发行版,这相对容易。在

在Linux操作系统上,发出打印作业的最简单方法是打开subprocess到{a2}。通常,使用lpr可以访问打印机,而无需以root用户身份登录(作为超级用户),考虑到以“超级用户”身份登录时可能造成的损害程度,这是可取的。在

代码如下:

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

对你来说应该是个很好的起点。本质上,这段代码应该允许您完成您需要的。在

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

子进程通常inherit运行命令的用户的用户标识和访问权限。例如,如果子流程是由根用户创建的,则需要root用户/超级用户权限才能访问该子流程。在

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

祝你好运!在

相关问题 更多 >

    热门问题