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

如何解决如何从.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/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-