python包可以轻松打印到cups服务器或google云打印上配置的打印机。
ezprinting的Python项目详细描述
ezprinting
python包可以轻松地将打印作业提交到cups服务器或google cloud print上配置的打印机。
gcp打印是通过服务帐户身份验证实现的,这是google为服务器到服务器交互提供的最佳身份验证方法。这意味着您需要从google下载一个service_account.json文件。
我们计划在未来支持其他身份验证方式(即刷新令牌)。
安装
pip安装ezprinting 或 诗歌加ezpriting
pycups是需要安装libcups2 dev(这是ubuntu/debian上的名称)的依赖项(sudo apt install libcups2 dev)。
快速入门指南
注意:下面示例中的success=true/false表示打印作业是否已成功提交给CUPS或GCP,而不是是否已成功打印。
<H3>1。选项一:from ezprinting import PrintJob
with open('service_account.json', 'rb') as f:
service_account = f.read()
with open('dummy.pdf', 'rb') as f:
content = f.read()
# If we want to print to GCP...
pjob = PrintJob.new_gcp(service_account=service_account, printer_id='gcp-printer-id', content=content)
success = pjob.print()
# If we want to use CUPS instead...
pjob = PrintJob.new_cups(printer_name='cups-printer-name', content=content)
success = pjob.print()
# Use host="cups.domain.tld:631", username="lpadmin", password="123456" to specify
# a remote cups server with authentication.
# By default "localhost:631" is assumed with blank user/passwd
如果内容是pdf格式,则无需指定内容类型。如果跳过"应用程序/pdf"中的"内容类型",则还无法自动检测内容类型。
<H3>2。选项二:from ezprinting import PrintServer, Printer, PrintJob
import json
with open('service_account.json', 'rb') as f:
service_account = f.read()
with open('dummy.pdf', 'rb') as f:
content = f.read()
# If we want GCP...
print_server = PrintServer.gcp(service_account=service_account)
# If we want CUPS on localhost...
print_server = PrintServer.cups()
# If we want remote CUPS server...
print_server = PrintServer.cups(host="cups.domain.tld:631", username="lpadmin", password="123456")
# the rest of the code is the same for either cups or GCP...
connection_ok, message = print_server.test_connection()
print("Testing connection: {} - {}".format(connection_ok, message))
# Let's check what printers we have available
if connection_ok:
printers = print_server.get_printers()
print(json.dumps(printers, sort_keys=True, indent=4))
printer = Printer(print_server, 'printer name (CUPS) or printer ID (GCP)')
printer_exists = printer.check_printer_exists()
print("Does the printer exist on that print server? {}".format(printer_exists))
if printer_exists:
pjob = PrintJob(printer=printer, content=content)
success = pjob.print()
print('Print job submitted with success? {}'.format(success))
if success:
print('Print job id: {}'.format(pjob.job_id))
测试
您可以使用内置测试代码轻松测试此软件包的功能。
要测试gcp功能,您需要在tests/private_data/目录中添加一个service_account.json(从google下载)。
要测试CUPS功能,必须具有有效的tests/private_data/cups.json
要定义要测试打印的文档和应测试打印这些文档的打印机,您必须具有以下文件:
- tests/private_data/printers.json
- tests/data/print_tests.json
提供了注释示例json文件(不要忘记删除注释,json不支持注释)。
此包的状态
此存储库中的代码正在生产中使用,并且大部分都可以正常工作。但是,它是非常新的,不能很好地处理例外情况。 print job类中仍然缺少的一个重要功能是跟踪打印作业的生命周期,并能够在出错时找出出错的地方(例如卡纸、缺纸、缺墨等)。 欢迎您的帮助来填补空白。请把错误报告归档。
主待办事项
- []使用刷新令牌支持GCP身份验证;
- []添加打印机。search_by_serial_number()函数按序列号搜索打印机名称或ID(GCP打印机ID有些不稳定);
- []在print job类上开发功能,以跟踪打印作业的状态并确定故障原因(例如卡纸、缺纸、缺墨等)
- []允许直接打印到IPP打印机;
- []附加组件:mqtt monitor发送在mqtt主题上接收到的打印作业,具有完整的qos实现;
请随时帮助填补空白!
动机
让远程web应用程序自动打印到本地打印机可能很困难。然而,这通常是必要的。
我手头的任务是让一个基于web的erp软件自动将打印作业推送到任何组织的各种打印机上。在此之前,用户会单击"打印"按钮,该按钮将在用户浏览器上打开显示PDF内容的新选项卡,然后再次单击"打印"按钮以实际打印。当此工作流工作时,它会在可能是单击操作的情况下再添加几秒钟和一个额外的单击。此外,在某些情况下,我们希望打印机启动操作(即,当产品价格发生变化时自动打印货架标签,自动打印仓库操作员的领料单等)。
在描述问题时,我们发现:
- 我们需要规范"另一面"。处理打印机型号、驱动程序、设备discovERY等是远远超出范围的,我们不需要重新发明轮子;
- 我们需要远程访问这些打印机,而不需要在远程站点上配置网络(甚至设置端口转发对某些客户来说也是一个挑战);
- 我们需要一个解决方案,我们的客户可以处理自己很少甚至没有支持。
- 谷歌云打印是最简单的解决方案,任何客户都可以处理,并将在任何地方工作。但是,并非所有打印机都支持gcp;
- 如果客户想支持其他类型的打印机(如80mm热敏收据打印机、Brother's Line的QL标签打印机,甚至是传统设备),他可以通过在专用CUPS(虚拟)服务器上配置所有内容来实现此目的;
- 参加杯赛并不意味着放弃GCP。使用官方的Google Cloud Print Connector,CUPS服务器上的所有打印机都将使用GCP进行加密。
在测试我们的解决方案时,我们发现:
- 设置CUPS服务器以支持任意数量的打印机是很容易的,大多数打印机制造商都有正式的CUPS驱动程序,在CUPS上安装打印机通常比在任何其他解决方案(甚至Windows)上都快;
- 很多客户机都通过USB连接了网络打印机。让我们的客户移动所有这些设备直接连接到网络是最困难的部分;
- 为了避免麻烦,网络打印机应该有静态IP地址,这是CUPS应该指向的。不要依赖dnssd或任何其他类型的发现协议。
- 有了CUPS服务器和Google Cloud Print Coonnector,我们至少有几个选项可以远程访问远程站点上的打印机(纯GCP、端口631转发、ssh隧道、VPN等),这正是一个Web基础云上托管的D软件需要;
- 拼图中缺少的部分是一个python包,它可以让我们轻松地将打印作业提交给那些远程打印机,而这正是这个包试图实现的目标。
其他(随机)注释
- pycups<;=1.9.73有一个阻止cups工作的错误。您将看到筛选失败或某种"文档已损坏"消息;
- google云连接器将使所有cups打印机与google云打印帐户保持同步。然而, 打印机ID不是持久的,如果对CUPS打印机进行一些更改(并且没有足够的 有经验说明这些ID何时/为何更改,但它们可能会更改)。将来我们计划通过 序列号;
- 服务帐户(SA)附带一个虚拟电子邮件。您必须将打印机与服务的电子邮件共享 以组成员身份向包含您的服务帐户电子邮件地址的谷歌组注册或共享打印机。 google cloud print connector有一个"share_scope"参数,它只接受一个电子邮件地址,应该是 谷歌集团的地址。但是,这种方法不适合我们,因此我们只与sa电子邮件共享打印机;
- 当打印机与sa电子邮件共享时,必须首先接受它。有一个未记录的api调用"/processinvite" 这是SA电子邮件接受它的唯一方式。此包在printer.enable_printer()方法中支持此调用。 另外,对于gcp,函数printer.check_printer_exists()在第一次查询printer id返回时处理invite 没有;