一、背景及机器说明
对接的打印机为 京瓷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
六、其他问题
打印时候总是多出一张报错的纸张
代码不报任何错误,导致我一直以为还是驱动问题
后来才发现是代码问题,流没处理好