java操作打印机直接打印及详细linux部署(只适用于机器和打印机处于同一个网段中)

一、背景及机器说明

对接的打印机为 京瓷3252ci汉印n31

  • 京瓷3252ci在局域网中可以直接搜索到,很方便
  • 汉印n31这个就比较麻烦了,需要开启共享打印机,linux驱动安装也摸索了一阵

二、java代码

代码其实很简单的,没多少,直接上

java 复制代码
/**
 * 打印工具类
 *
 * @date 2025/4/15
 */
@Slf4j
public class PrintUtils {

    /**
     * 打印
     *
     * @param intput    输入流
     * @param printName 打印机名字
     */
    public static void print(InputStream intput, String printName) throws Exception {
        //获取默认打印机或指定打印机
        PrintService printer = PrintServiceLookup.lookupDefaultPrintService();
        //遍历打印机列表
        PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
        boolean flag = true;
        for (PrintService service : services) {
            log.info("打印机名字:{}", service.getName());
            if (service.getName().contains(printName)) {
                printer = service;
                flag = false;
                break;
            }
        }
        if (flag) {
            throw new ServiceException("未找到名字为" + printName + "的指定打印机");
        }

        // 创建打印任务
        DocPrintJob job = printer.createPrintJob();
        PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
        //attributes.add(MediaSizeName.ISO_A4);
        //设置方向
        //attributes.add(OrientationRequested.PORTRAIT);
        // 读取待打印文件(支持文本/PDF/图片)
        Doc doc = new SimpleDoc(intput, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
        // 提交打印任务
        job.print(doc, attributes);
    }
}

三、window部署

上面代码window跑起来很简单,装下驱动就可以找到对应的打印机,然后写好名字就完事了。

简单说下步骤:

局域网内的点击添加可以自动下载驱动,就不过多描述了

四、linux

4.1、安装cups

首先要先装个cups,这个是一个可视化安装打印机驱动的界面,可以让我们比较方便的安装驱动及观察打印机状态

centos https://cn.linux-terminal.com/?p=3324

Ubuntu https://blog.csdn.net/syrchina/article/details/126057197

详细的参考上面连接,下面仅供参考(似乎也够了)

bash 复制代码
sudo apt install cups

//修改/etc/cups/cupsd.conf
Listen localhost:631
改为
Port 631

//以下行将使 CUPS 显示本地网络上的共享打印机,以便同一网络中的其他计算机可以看到连接到计算机的打印机。
Browsing Off
改为
Browsing On

//带有<Location />的都给加上
//要允许同一网络中的其他计算机进行访问,请将 Allow @LOCAL 添加到配置中
<Location /admin>
  Order allow,deny
</Location>

改完后重启下即可
sudo systemctl restart cups

4.2、访问ip:631网站及添加京瓷打印机

添加京瓷打印机‌

  • 在CUPS界面选择Administration > Add Printer
  • 可能需要登录,输入登录linux的账号密码即可

    会显示已经有的打印机,选择

    勾选share,然后continue

    手动选择驱动上传下
    驱动官网
    https://www.kyoceradocumentsolutions.com.cn/support/mfp/download

    下载后是个压缩包,选择global,eu是欧洲的


    选择对应的pdd驱动上传上去即可

    点击add printer就完事了

4.3、添加汉印n31打印机(这个比较麻烦)

因为这个不显示在局域网中,所以需要手动添加

4.3.1、首先找一个window机器来共享这台打印机

不知道为啥,我自己的共享完之后京瓷的驱动失效了,java代码始终调用不到了,最后找官方工具卸载驱动才重新加上(折腾了好几个小时。。。)

共享步骤:点开共享,然后点击网络和共享中心

来宾和专用都开启

设置完使用其他电脑连接试试

这样子就会出来了

如果不行最好尽快换台电脑试试,之前使用一个同事的电脑(window11)共享,折腾半天就是不行。换台电脑共享几分钟搞定。

4.3.2、linux安装smb协议及驱动

window的共享就是通过smb协议来的,但是一开始在cups页面是没有这个东西的,需要安装下

bash 复制代码
#Ubuntu 
sudo apt install samba
sudo apt install cups-bsd
sudo apt install libcups2 samba-client

#centos
sudo yum install samba
sudo yum install cups-client samba-client

最后重启下就会出来上面的图片的那个东西了
sudo systemctl restart cups

之后也是老样子,添加驱动

弄完之后这里是这样的
status:显示Idle - "File "/usr/lib/cups/filter/raster-tspl" not available: No such file or directory"

而不是像我截图这样子的

后来看了一下人家的驱动文件,是包含raster-tspl这个文件的,只需要执行下这个install文件即可

bash 复制代码
//授权
chmod +x install
//运行
./install

4.3.3、尝试打印遇到的问题

问题1

驱动完事了,所以尝试着打印了下,代码没报错,cups上显示

不知道为啥,window已经关了账号密码验证了还报这个,没办法,只能在写驱动地址时候加上账号密码,

如下

smb://Administrator:9335118007@192.168.108.123/HPRT N31

对了说下怎么改已有的打印机,在这个下拉框中选。。。

问题2

打印又报错
2025年04月18日 星期五 13时47分05秒 "Tree connect failed (NT_STATUS_BAD_NETWORK_NAME)"

简单来说就是打印机名字写错了

可以敲个命令查询下

bash 复制代码
smbclient -L //192.168.108.123 -U 用户名

注意下window我给把共享名字改成了n31,linux这边不认的,只是个comment,名字还是前面那个

空格不能直接敲,要用%20

改成下面这样终于联通了打印机
smb://Administrator:9335118007@192.168.108.123/HPRT%20N31

五、docker部署应用

首先要先创建一个文件client.conf文件,注意:不是cupsd.conf

bash 复制代码
echo "ServerName /var/run/cups/cups.sock" > client.conf

dockerfile文件

dockerfile 复制代码
FROM registry.cn-beijing.aliyuncs.com/hub-mirrors/openjdk:8-jdk-alpine

# 设置工作目录和临时卷
WORKDIR /app
VOLUME /tmp

# 安装 cups + 字体(防乱码),如果太慢可以去掉apk update &&
RUN apk update && apk add --no-cache \
    cups \
    cups-client \
    cups-libs \
    font-noto
# 复制本地编译好的 jar 文件(从target目录)
COPY device-supervision.jar app.jar
COPY 2.pdf .

# 设置时区为中国时区
ENV TZ=Asia/Shanghai \
    #设置中文不乱码的    
    LANG=C.UTF-8 \
    LC_ALL=C.UTF-8

# 暴露端口
EXPOSE 18881

# 设置 Java 运行参数
ENTRYPOINT ["java", \
            "-Djava.security.egd=file:/dev/./urandom", \
            "-XX:+UseContainerSupport", \
            "-XX:MaxRAMPercentage=75.0", \
            "-jar", \
            "/app/app.jar"]

docker运行

需要使用--net=host,否则网络是不通的,没法调用打印机

复制代码
docker run -d --net=host --name test \
  -v /var/run/cups/cups.sock:/var/run/cups/cups.sock \
  -v /etc/cups/client.conf:/etc/cups/client.conf:ro \
  test:0.0.1

六、其他问题

打印时候总是多出一张报错的纸张

代码不报任何错误,导致我一直以为还是驱动问题

后来才发现是代码问题,流没处理好

相关推荐
tt55555555555517 小时前
Linux启动流程与字符设备驱动详解 - 从bootloader到驱动开发
linux·运维·驱动开发
李贺梖梖18 小时前
DAY23 单例设计模式、多例设计模式、枚举、工厂设计模式、动态代理
java
武昌库里写JAVA18 小时前
Java设计模式之工厂模式
java·vue.js·spring boot·后端·sql
一只游鱼19 小时前
linux使用yum安装数据库
linux·mysql·adb
大白的编程日记.20 小时前
【Linux学习笔记】线程概念和控制(三)
linux·笔记·学习
赛姐在努力.20 小时前
SpringMVC中的常用注解及使用方法
java·spring
让我上个超影吧21 小时前
黑马点评秒杀优化和场景补充
java
寻星探路21 小时前
Java EE初阶启程记06---synchronized关键字
java·java-ee
沉木渡香21 小时前
【VSCode中Java开发环境配置的三个层级之Maven篇】(Windows版)
java·vscode·maven
EnCi Zheng1 天前
Spring Boot 4.0.0-SNAPSHOT @Configuration 问题解决指南
java·spring boot·spring