我有一台点阵打印机LX-300通过网络连接到我的计算机上.如何用Python将带有ESCP字符的原始字符串直接发送到打印机?
计算机通过另一台计算机连接到打印机。我需要发送一个原始字符串,因为LX-300图像打印结果是模糊的。
发布于 2016-10-14 15:47:44
问题
若要沿着此路径发送数据,请执行以下操作:
客户端计算机
...and不要让Windows处理数据,而是直接从客户端计算机发送原始数据,包括打印机控制代码。
我的解决方案
下面是我如何解决小型内部数据库应用程序的一个几乎相同的问题:
第一步)使打印机网络可以访问,而不需要Windows将它的手指发送到它的数据。为此,我使用“泛型/纯文本”驱动程序安装打印机,然后在连接到打印机的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()背景
我从两个方面思考这个问题:
第一是容易的部分。实际上,有一些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机器,我可以打印到任何其他计算机的本地网络。顺便说一句,不管客户端计算机运行的操作系统是什么,这个总体想法都应该工作。
发布于 2016-10-14 15:27:37
最终,您需要并希望编写自己的包装器/脚本。而且,由于您使用的是Linux发行版,这相对容易一些。
在Linux上,发出打印作业的最简单方法是向子过程打开lpr。通常,使用lpr可以让您访问打印机,而不需要以超级用户身份登录(作为超级用户),考虑到作为“超级用户”登录时可以造成的损坏量,这是可取的。
代码如下:
import subprocess
lpr = subprocess.Popen("/usr/bin/lpr", stdin=subprocess.PIPE)
lpr.stdin.write(data_to_send_to_printer)对你来说应该是个很好的起点。本质上,这段代码应该允许您完成所需的任务。
不过,要小心;根据您的特权级别,打开子进程的调用可能需要根级/超级用户权限。
子进程通常由运行命令的用户继承用户is和访问权限。例如,如果子进程是由根用户创建的,那么您将需要root用户/超级用户权限来访问该子进程。
要了解更多信息,请查看我在文章中包含的超链接。
祝好运!
https://stackoverflow.com/questions/39891202
复制相似问题