直接上代码
package com.yx.face.test;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.SneakyThrows;
import javax.print.*;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.OrientationRequested;
import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobListener;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
/**
* @ProjectName: ldb-airport
* @Package: com.yx.face.test
* @ClassName: test
* @Author: 崔哥
* @Description:
* @Date: 2021/12/8 15:49
* @Version: 1.0
*/
public class test {
@SneakyThrows
public static void main(String[] args) {
URL url = new URL("http://hanghui.oss-cn-gz-ysgzlt-d01-a.ltops.gzdata.com.cn/photo/20211208/163895017796160138037a3d448b69565be7998b7dce1.png");
BufferedInputStream input = null;
input = new BufferedInputStream(url.openStream());
AbstractOutputDto abstractOutputDto = printPDF(input);
System.out.println(abstractOutputDto);
}
public static AbstractOutputDto printPDF(InputStream in) throws IOException {
AbstractOutputDto abstractOutputDto = new AbstractOutputDto();
//1.得到一个文件的输入流
BufferedInputStream fiStream = new BufferedInputStream(in);
//这是要打印文件的格式,如果是PDF文档要设为自动识别
DocFlavor fileFormat = DocFlavor.INPUT_STREAM.JPEG;
DocAttributeSet das=new HashDocAttributeSet();
das.add(OrientationRequested.PORTRAIT);
//2.得到要打印的文档类DOC
Doc myDoc = new SimpleDoc(fiStream, fileFormat, das);
//3.生成一个打印属性设置对象
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
/*aset.add(new Copies(1));//Copies-打印份数1份
aset.add(MediaSizeName.ISO_A4);//A4纸张
aset.add(Sides.ONE_SIDED);//双面打印*/
//4.关键一步,得到当前机器上所有已经安装的打印机
//传入的参数是文档格式跟打印属性,只有支持这个格式与属性的打印机才会被找到
PrintService printService= PrintServiceLookup.lookupDefaultPrintService();
if (printService!= null) {
System.out.println(printService);
System.out.println(printService.getName());
DocFlavor[] flavors=printService.getSupportedDocFlavors();
for (int i = 0; i < flavors.length; i++) {
System.out.println("\t" + flavors[i]);
}
// System.out.println(services[i].getName());
//5.用打印服务生成一个文档打印任务,这里用的是第一个服务
//也可以进行筛选,services[i].getName()可以得到打印机名称,可用名称进行比较得到自己想要的打印机
DocPrintJob job=printService.createPrintJob();
job.addPrintJobListener(new PrintJobListener() {
@Override
public void printJobRequiresAttention(PrintJobEvent arg0) {
System.out.println("printJobRequiresAttention");
}
@Override
public void printJobNoMoreEvents(PrintJobEvent arg0) {
System.out.println("通知客户端,不需要再提供事件");
}
@Override
public void printJobFailed(PrintJobEvent arg0) {
System.out.println("通知客户端无法完成作业,必须重新提交");
}
@Override
public void printJobCompleted(PrintJobEvent arg0) {
System.out.println("打印结束");
}
@Override
public void printJobCanceled(PrintJobEvent arg0) {
System.out.println("作业已被用户或者程序取消");
}
@Override
public void printDataTransferCompleted(PrintJobEvent arg0) {
System.out.println("数据已成功传输打印机");
}
});
try {
//6.最后一步,执行打印文档任务,传入的参数是Doc文档类,与属性
job.print(myDoc, aset);//成功后电脑会提示已有文档添加到打印队列
abstractOutputDto.setStatus(1);
abstractOutputDto.setMsg("打印任务已添加");
} catch (PrintException pe) {
pe.printStackTrace();
}
} else {
abstractOutputDto.setStatus(0);
abstractOutputDto.setMsg("打印机未连接");
}
return abstractOutputDto;
}
@Data
public static class AbstractOutputDto {
private Integer status ;
private String msg;
}
}