当前位置: 首页 > 知识库问答 >
问题:

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

濮波
2023-03-14

我目前完成的工作:

  • 设置一个带有杯子的树莓圆周率,插入Dymo Labelwriter 450
  • 点击以下链接:设置树莓圆周率。如果我通过家庭网络上的Windows安装网络打印机,这可以在我的本地计算机(Windows)上正常工作并打印
  • 已从成功打印打印作业。NET内核通过系统进行本地访问。绘画打印。这主要是为了测试。这是当USB标签打印机直接插入我的机器
  • 有一个。从docker容器运行的NET Core(3.1)Web API服务器。(安装在Ubuntu服务器上)。FWIW它是独立docker容器中的VueJs前端

在我们的工厂(想象一下它像一个仓库制造工厂)中,我希望有一个树莓圆周率用作“即插即用”打印机服务器,这样我们可以移动圆周率和标签打印机,圆周率将通过Wifi留在本地网络上。目前,这些树莓圆周率将有一个静态IP地址。

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

我目前研究:

  • 打印机语言,如ZPL、EPL。这似乎不允许打印机是不可知的。
  • IPP(Internet打印协议)。这似乎是一个很大的学习曲线,我找不到任何使用的东西。NET Core。也不确定这是否实现了目标。(感谢任何建议)
  • 一些付费的第三方解决方案:新动态库。但我不确定这是否会实现目标,因为它似乎利用了已安装打印机的列表。

我试图避免在docker容器中安装打印机。因为它不是无状态的,所以我需要以某种方式维护它。然而,我并不完全反对为这个解决方案妥协。然而,这超出了我对docker和ubuntu/linux的了解。

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

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

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

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

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

共有2个答案

张岳
2023-03-14

这里有一些关于这个话题的信息。也许它能有所帮助?

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

萧成文
2023-03-14

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

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

我能够获得。NET Core Server打印,通过使用ipptools

  • 我不得不在Dockerfile中添加一些安装步骤,以使我的图像能够使用IPP工具。我包括了一些额外/多余的库,因为有些库帮助我在容器内进行调试。为了不添加到我的主应用程序中,我在一个文件夹中做了所有额外的工作
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
# THIS IS OLD VERSION : RUN wget http://download.dymo.com/dymo/Software/Download%20Drivers/Linux/Download/dymo-cups-drivers-1.4.0.tar.gz
COPY ["MyMainProjectFolder/Properties/dymo-cups-drivers-1.4.0.tar.gz", "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

然后我可以从内部调用/bin/bash。净核心。我还使用了ShellHelper参考:

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;
        }
    }

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

//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
}

我对这个解决方案不太满意。它打印标签的速度并不快,但确实有效。我希望尝试在中实现ipp解决方案。NET,所以我不必保存到文件并运行shell命令。

 类似资料:
  • 我有两台固定IP地址的linux计算机: 打印服务器,通过CUPS共享连接的打印机 (服务器的IP地址为“192.168.1.2”,打印机称为“test_printer”。) 不幸的是,通过CUPS的打印机传播似乎无法可靠地工作(可能是由于网络结构)。 我可以将打印作业直接从python程序发送到CUPS打印服务器吗? 如果是,你能提供一个小例子吗? 理论上,我只会将格式正确的数据发送到IP地址端

  • 有没有一种方法可以让CUPS在尚未完成最后一个作业的情况下将作业排队到IPP打印机? 背景:我们有一台XEROX Workcenter打印机,它有自己的作业队列。每次有人想要打印时,他们都必须将作业假脱机,将他们的支付卡插入打印机,然后在打印机触摸板上选择他们的作业。但是,当在中央服务器上使用CUPS时,CUPS只在最后一个作业完成时后台处理下一个作业,因此只有第一个后台处理的人才能看到并支付他们

  • 问题内容: 我是负责重新设计软件系统的java / grails开发人员。 要求之一是让服务器端应用程序将数据发送到各种网络打印机以打印文本数据。 我在网上搜索了有关Java网络打印的信息,然后简短地了解了Java Print Service API,java.awt.print,javax.print,但在连接到网络打印机时未找到任何信息。 是我想做的可能或有利的事情。缺乏发现使我相信服务器端软

  • 问题内容: 我有一部分代码可以作为服务的一部分在本地正常运行。 该代码作为服务的一部分运行,当我通过提供数据进行单元测试时,它最终将生成报告并进行打印。 当我从ajax调用在.ashx中运行完全相同的代码段时。报告已生成(我可以看到在磁盘上创建的pdf文件),但未进行打印。 在这两种情况下,都使用相同的代码来打印报告。(两种情况下objReport.DefaultAutoPrint = 0) 我唯

  • 我正在尝试与CUPS打印服务器通信,该服务器的所有连接都设置了“需要加密”。这意味着,当您尝试建立到它的连接时,它会要求将连接升级到TLS加密的连接,而Cups4j和Jspi似乎都无法处理它。 有没有办法从Java应用程序(使用这些库或其他库)连接到这样的服务器?

  • 我想从web浏览器的Brother标签打印机打印标签。我知道DYMO有一个JavaScript框架,可以使从浏览器打印变得简单。但我有一个兄弟标签打印机的客户,所以我需要使它工作。 我一直在做一些测试和搜索,令人惊讶的是,关于这个主题的信息如此之少。 到目前为止,我唯一成功使用的浏览器是谷歌Chrome,因为它似乎不打印页眉和页脚。我已经安装了打印机/驱动程序,并创建了尺寸为62 x 29mm的自