C# 如何从.NET核心Web API服务器docker容器向网络CUPS/Raspberry Pi打印服务器发送标签打印作业?

C# 如何从.NET核心Web API服务器docker容器向网络CUPS/Raspberry Pi打印服务器发送标签打印作业?,c#,docker,asp.net-core,printing,raspberry-pi,C#,Docker,Asp.net Core,Printing,Raspberry Pi,我目前完成的工作: 安装一个带罩杯的覆盆子Pi,插入Dymo Labelwriter 450 已跟踪此链接:。如果我通过家庭网络上的Windows安装网络打印机,这在我的本地计算机(Windows)上可以正常工作并打印 通过系统.Drawing.printing从.NET Core本地成功打印打印作业。这主要是为了测试。这是当USB标签打印机直接插入我的机器时 从docker容器运行.NETCore(3.1)WebAPI服务器。(安装在Ubuntu服务器上)。FWIW它是单独docker容器中

我目前完成的工作:

  • 安装一个带罩杯的覆盆子Pi,插入Dymo Labelwriter 450
  • 已跟踪此链接:。如果我通过家庭网络上的Windows安装网络打印机,这在我的本地计算机(Windows)上可以正常工作并打印
  • 通过
    系统.Drawing.printing
    从.NET Core本地成功打印打印作业。这主要是为了测试。这是当USB标签打印机直接插入我的机器时
  • 从docker容器运行.NETCore(3.1)WebAPI服务器。(安装在Ubuntu服务器上)。FWIW它是单独docker容器中的VueJs前端
在我们的设施中(想象一下它像一个仓库制造设施),我希望有一个树莓pi用作“即插即用”打印机服务器,这样我们可以移动pi和标签打印机,pi将通过Wifi留在本地网络上。目前,这些Raspberry Pi将有一个静态IP地址

我的理想目标是将打印作业发送到CUPS服务器的静态ip(Raspberry Pi),而无需在docker容器中安装网络打印机。目前,我可以将打印机的IP地址和配置存储在服务器访问的同一数据库中。
我也希望它是不可知的从打印机。因此,我需要担心的唯一配置或设置是在CUPS中安装打印机

我目前正在研究:

  • 打印机语言,如ZPL、EPL。这似乎不允许打印机不可知论
  • IPP(互联网打印协议)。这似乎是一个很大的学习曲线,我找不到任何使用.NET核心的东西。也不确定这是否实现了目标。(如有任何建议,不胜感激)
  • 一些付费第三方解决方案:。但我不确定这是否能实现目标,因为它似乎利用了已安装打印机的列表
我试图避免在docker容器中安装打印机。因为它不是无状态的,所以我需要以某种方式维护它。然而,我并不完全反对为这一解决方案作出妥协。然而,这超出了我对docker和ubuntu/linux的了解

我最终希望所有内容都包含在我的.NET核心项目/容器中。因此,如果我必须用打印机语言向CUPS服务器发送一些东西,我更愿意与特定的打印机品牌/型号结婚,而不是在docker容器中安装打印机。打印作业需要从服务器(而不是前端web客户端)发送,因为在打印之前已经对数据库进行了检查和验证

另一个不太理想的解决方案是将标签打印机插入物理服务器机器,并以某种方式与Docker容器共享机器的USB端口,以发送打印作业。然而,这是目前超出我的头码头经验。此外,它在设施内受到物理限制

有没有办法以编程方式安装打印机?(我怀疑这一选择是否可行)

  • 因为这将允许我通过配置或硬编码值从代码控制打印机

通过本地网络将打印作业发送到Raspberry Pi CUPS服务器的最佳方式是什么,而无需在您的机器(即docker容器)上安装打印机?

。这是我目前的解决方案:

  • 我首先尝试让docker容器使用USB端口。我将此标签打印机插入服务器,并能够与
    docker run
    命令上的
    --priviledge
    标志共享USB端口。我努力将打印机“安装”到正在运行的docker容器上,而不切换其基本映像。所以我放弃了这个想法。我不喜欢这个主意,因为我被迫把打印机放在服务器机架旁边
通过使用
ipptool

  • 我不得不在Dockerfile中添加一些安装步骤,以使我的映像能够使用IPP工具。我包括了一些额外/多余的库,因为有些库帮助我从容器中进行调试。我在
    /setup
    文件夹中做了所有额外的工作,以避免添加到我的主应用程序中
然后,我可以从.NETCore中调用/bin/bash。我还使用了ShellHelper:

我将标签图像保存到一个文件夹中。然后我用ipptool命令发送标签图像

//set whatever ip
var cmd = $"ipptool -vt -f {filepath} ipp://192.168.XXX.XXX:631/printers/DYMO_LabelWriter_450 printjob.ipp";

var result= cmd.Bash();
printjob.ipp的内容

{
 OPERATION Print-Job
 GROUP operation-attributes-tag
  ATTR charset attributes-charset utf-8
  ATTR language attributes-natural-language en
  ATTR uri printer-uri $uri
 FILE $filename
}

我对这个解决方案不是非常满意。它打印标签的速度并不惊人,但确实有效。我希望将来能尝试在.NET中实现ipp解决方案,这样我就不必保存到文件并运行shell命令。

适用于在此登陆的任何人。这是我目前的解决方案:

  • 我首先尝试让docker容器使用USB端口。我将此标签打印机插入服务器,并能够与
    docker run
    命令上的
    --priviledge
    标志共享USB端口。我努力将打印机“安装”到正在运行的docker容器上,而不切换其基本映像。所以我放弃了这个想法。我不喜欢这个主意,因为我被迫把打印机放在服务器机架旁边
通过使用
ipptool

  • 我不得不在Dockerfile中添加一些安装步骤,以使我的映像能够使用IPP工具。我包括了一些额外/多余的库,因为有些库帮助我从容器中进行调试。我在
    /setup
    文件夹中做了所有额外的工作,以避免添加到我的主应用程序中
然后,我可以从.NETCore中调用/bin/bash。我还使用了ShellHelper:

我保存标签图片
//set whatever ip
var cmd = $"ipptool -vt -f {filepath} ipp://192.168.XXX.XXX:631/printers/DYMO_LabelWriter_450 printjob.ipp";

var result= cmd.Bash();
{
 OPERATION Print-Job
 GROUP operation-attributes-tag
  ATTR charset attributes-charset utf-8
  ATTR language attributes-natural-language en
  ATTR uri printer-uri $uri
 FILE $filename
}