首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ubuntu中的python将原始字符串发送到点阵打印机?

如何使用ubuntu中的python将原始字符串发送到点阵打印机?
EN

Stack Overflow用户
提问于 2016-10-06 08:29:28
回答 2查看 4.6K关注 0票数 5

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-14 15:47:44

问题

若要沿着此路径发送数据,请执行以下操作:

客户端计算机

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

我的解决方案

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

第一步)使打印机网络可以访问,而不需要Windows将它的手指发送到它的数据。为此,我使用“泛型/纯文本”驱动程序安装打印机,然后在连接到打印机的Windows计算机上安装RawPrintServer

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

代码语言:javascript
复制
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. 打印服务器机器:将数据传输到本地连接的打印机

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

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

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

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

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

这个解决办法对我来说似乎很管用。我有一个旧松下打印机运行在爱普生ESC/P兼容模式连接到Windows 7机器,我可以打印到任何其他计算机的本地网络。顺便说一句,不管客户端计算机运行的操作系统是什么,这个总体想法都应该工作。

票数 5
EN

Stack Overflow用户

发布于 2016-10-14 15:27:37

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

在Linux上,发出打印作业的最简单方法是向子过程打开lpr。通常,使用lpr可以让您访问打印机,而不需要以超级用户身份登录(作为超级用户),考虑到作为“超级用户”登录时可以造成的损坏量,这是可取的。

代码如下:

代码语言:javascript
复制
import subprocess
lpr = subprocess.Popen("/usr/bin/lpr", stdin=subprocess.PIPE)
lpr.stdin.write(data_to_send_to_printer)

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

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

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

要了解更多信息,请查看我在文章中包含的超链接。

祝好运!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39891202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档