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:[email protected]/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:[email protected]/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

六、其他问题

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

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

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

相关推荐
摘星编程1 分钟前
并发设计模式实战系列(6):读写锁
java·设计模式·并发编程
哈哈幸运13 分钟前
Linux Sed 深度解析:从日志清洗到 K8s 等12个高频场景
linux·运维·编辑器·sed
心随_风动15 分钟前
主流操作系统对比分析(macOS、Linux、Windows、Unix)
linux·windows·macos
Java中文社群22 分钟前
最火向量数据库Milvus安装使用一条龙!
java·人工智能·后端
Apache Flink34 分钟前
京东物流基于Flink & StarRocks的湖仓建设实践
java·大数据·flink
JAVA百练成神39 分钟前
深度理解spring——BeanFactory的实现
java·后端·spring
兔子蟹子42 分钟前
Java集合框架解析
java·windows·python
DKPT1 小时前
正则表达式
java·数据库·笔记·学习·正则表达式
南博萬1 小时前
java将pdf转换成word
java·pdf·word
有什么东东1 小时前
山东大学软件学院创新项目实训开发日志(20)之中医知识问答自动生成对话标题bug修改
java·vue·bug·springboot