如何从.NET Core Web API服务器泊坞容器向网络CUPS / Raspberry Pi打印服务器发送标签打印作业?

问题描述

我目前完成的工作:

  • 使用CUPS设置Raspberry Pi,并插入Dymo Labelwriter 450。
  • 关注此链接:Setup Raspberry Pi。如果我通过家庭网络上的Windows安装网络打印机,则此方法可以在我的本地计算机(Windows)上正常工作并打印正常。
  • 已通过System.Drawing.Printing从.NET Core本地成功打印作业。这主要是为了测试。这是将USB标签打印机直接插入我的机器中的时间。
  • 具有从Docker容器运行的.NET Core(3.1)Web API服务器。 (安装在Ubuntu服务器上)。 FWIW是单独的docker容器中的VueJs前端。

在我们的工厂中(想象它像一个仓库制造工厂),我希望将树莓派用作“即插即用”打印机服务器,以便我们可以随身携带Pi和标签打印机,并且Pi可以继续使用通过Wifi局域网。目前,这些Raspberry Pi将具有静态IP地址。

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

我目前正在研究:

  • 打印机语言,例如ZPL,EPL。这似乎不允许打印机不可知。
  • IPP(Internet打印协议)。这似乎是一个很大的学习曲线,我找不到使用.NET Core的任何东西。也不确定这是否能达到目标。 (任何建议都值得赞赏)
  • 某些付费的第三方解决方案:Neodynamic libraries。但是我不确定这是否可以实现目标,因为它似乎利用了已安装打印机的列表。

我试图避免在docker容器内安装打印机。那时它不是无状态的,我将需要以某种方式保持这一状态。但是,我并不完全反对为此解决方案妥协。但是,这超出了我对docker和ubuntu / linux的了解。

我最终希望将所有内容都包含在.NET Core项目/容器中。因此,如果我必须以打印机语言将某些内容发送到CUPS服务器,与在docker容器中安装打印机相比,我更愿意妥协于与特定的打印机品牌/型号结婚。打印作业必须从服务器(而不是前端Web客户端)发送,因为在打印之前已经对数据库进行了检查和验证。

另一种不太受欢迎的解决方案是将标签打印机插入物理服务器计算机,然后以某种方式与Docker容器共享计算机的USB端口以发送打印作业。但是,对于docker体验,这目前在我头上。另外,它实际上限制了设施内部。

是否可以通过编程方式安装打印机? (我怀疑该选项是否可行)

  • 这将使我能够通过配置或硬编码值从我的代码控制打印机。

在不将打印机安装在计算机(即docker容器)上的情况下,通过本地网络将打印作业发送到Raspberry Pi CUPS服务器的最佳方法是什么?

解决方法

对于任何登陆这里的人。这是我目前的解决方案:

  • 我首先尝试让docker容器利用USB端口。我已将此标签打印机插入服务器,并且能够与--priviledged命令上的docker run标志共享USB端口。我很难在不切换其基础映像的情况下将打印机“安装”到正在运行的Docker容器上。所以我放弃了这个主意。我不喜欢这个主意,因为我被迫将打印机放在服务器机架旁边。

通过使用ipptool

,我能够打印.NET Core Server。
  • 我必须在Dockerfile中添加一些安装步骤,以使映像能够使用ipptool。我包括一些多余的/多余的库,因为有些库帮助我从容器内进行调试。我在/setup文件夹中做了所有额外的工作,以免添加到我的主应用程序中
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
#install printer
WORKDIR /setup
RUN apt-get update && apt-get -y install curl cups cups-client printer-driver-dymo wget nano systemd usbutils netcat libgdiplus iputils-ping
RUN wget http://download.dymo.com/dymo/Software/Download%20Drivers/Linux/Download/dymo-cups-drivers-1.4.0.tar.gz
RUN tar -xzf dymo-cups-drivers-1.4.0.tar.gz
RUN mkdir -p /usr/share/cups/model
RUN cp /setup/dymo-cups-drivers-1.4.0.5/ppd/lw450.ppd /usr/share/cups/model/
RUN cp /usr/share/cups/cupsd.conf.default /etc/cups/cupsd.conf #https://ubuntu-mate.community/t/cups-service-stopped-um-18-04/17381

然后,我能够从.net内核中调用/ bin / bash。我还利用了ShellHelper Reference

using System;
using System.Diagnostics;
    public static class ShellHelper
    {
        public static string Bash(this string cmd)
        {
            var escapedArgs = cmd.Replace("\"","\\\"");
            
            var process = new Process()
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "/bin/bash",Arguments = $"-c \"{escapedArgs}\"",RedirectStandardOutput = true,UseShellExecute = false,CreateNoWindow = true,}
            };
            process.Start();
            string result = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            return result;
        }
    }

我将标签图像保存到文件夹中。然后,我只是使用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命令。

,

以下是有关此主题的一些信息。也许可以帮上忙吗?

https://www.alecburton.co.uk/2017/printing-from-a-docker-container/

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...