1.OS打印流程
2.cups基本概念
CUPS : Common Unix Print System , 通用Unix 打印系统
CUPS 最初是一款独立的产品,后来被 Apple 买断并保持开源。
CUPS 采用 IPP (因特网打印协议) 标准作为打印任务管理的基础,使用 PostScript 打印机描述文件(PDD)作为打印机驱动程序的基础。
3.cupsd
CUPS 的后台进程为 /usr/sbin/cupsd
cupsd 会将缓冲文件通过一系列被称为打印链的进程进行处理,这些进程把缓冲文件转化为目标打印机能够理解的格式。
4.PPD:PostScript 打印机描述文件
PPD:PostScript Printer Description ,PostScript打印机描述。
PPD是一个文本文件,它包含了有关一个特定的打印机的特征和性能的描述,因此它包含如下信息:
支持的纸张大小
可打印区域
纸盒的数目和名称
可选特性,例如附加的纸盒或双面打印单元等
字体
分辨率
打印机驱动程序 解析 PPD文件 来发现这台打印机的可用性能。打印机驱动程序根据这个信息来确立用户界面,另外,PPD文件还包含了使用这些性能所需的PostScript命令,当用户通过驱动程序的用户界面选择一个功能时,例如双面打印或水印打印,就会从PPD文件中提取适用该功能的 PostScript 代码并将其添加到要发送到打印机的PostScript文件中去,这样就可以实现你所选择的打印功能了。
一旦添加了一台打印机配置,/etc/cups/ppd 中就会放置一个以该设备命名的 pdd 文件副本;并且另外两个配置文件还会被修改:/private/etc/cups/printers.conf , /Library/Preferences/org.cups.printers.plist。
5.CUPS安装 编译安装过于繁琐,需要gcc,c++编译依赖
安装过程过于繁琐,我们使用哦另外一种安装模式;
https://blog.csdn.net/linglongwunv/article/details/5213030
7. 通过yum 安装打印服务 yum install cups
7.1 修改配置
cd /etc/cups
7.2 启动
systemctl restart cups.service
7.3 添加打印机 网络打印机使用AppSocket/HP JetDirect模式
7.4 配置socket URL
socket://192.168.XXX.XXX:9100
7.5 填写打印机name ,description,location信息
7.6 选择斑马打印机
7.7 选择ZPL
7.8 设置默认打印机
8. Java打印服务, windows可以正常运行,Linux不能
http://cn.voidcc.com/question/p-bcfcjrcg-bcd.html
public JsonResult> getPrinterList() {
List list = new ArrayList<>();
HashPrintRequestAttributeSet requestAttributeSet = new HashPrintRequestAttributeSet();
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
//查找所有的可用的打印服务
PrintService[] printService = PrintServiceLookup.lookupPrintServices(flavor, requestAttributeSet);
if (printService == null || printService.length == 0) {
log.info("打印获取失败,未找到可用打印机,请检查。");
}
if (printService != null) {
for (PrintService print : printService) {
list.add(print.getName());
}
}
return JsonResult.ok(list);
}
https://www.nuomiphp.com/eplan/120839.html
我终于找到了一种方法,可以使用jipsi:
URI printerURI = new URI("ipp://SERVER:631/printers/PRINTER_NAME");
IppPrintService svc = new IppPrintService(printerURI);
InputStream stream = new BufferedInputStream(new FileInputStream("image.epl"));
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
Doc myDoc = new SimpleDoc(stream, flavor, null);
DocPrintJob job = svc.createPrintJob();
job.print(myDoc, null);
我不得不承认,对于使用第三方库来执行某些看起来很简单的事情(例如打印到特定打印机)感到失望。
https://github.com/peizihui/jspi
https://github.com/harwey/cups4j
https://github.com/harwey/cups4j
9.4 CupsClient 原始打印,打印cups-raw
https://www.javaroad.cn/questions/341894
CupsClient cupsClient = new CupsClient(IP, port);
URL url = new URL(printerName);
CupsPrinter cupsPrinter = cupsClient.getPrinter(url);
HashMap map = new HashMap<>();
map.put("document-format", "application/vnd.cups-raw");
PrintJob printJob = new PrintJob.Builder(bytes).attributes(map).build();
PrintRequestResult printRequestResult = cupsPrinter.print(printJob);