利用JAVA 的几种方法来打印A4纸
每篇一句励志:没有伞的孩子必须努力奔跑!
第一种:Socket直连
/**
* ip 打印机IP
* port 端口,一般默认是9100
* filePath 要打印的文件路径
*/
public static boolean print(String ip,Integer port,String filePath){
log.info("IP:{},PORT:{}",ip,port);
try {
File file = new File(filePath); // 获取选择的文件
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ip, port),23000); //设置超时时间23秒,一版超时是21秒多点
//创建输入输出流
OutputStream out = socket.getOutputStream();
FileInputStream fis = new FileInputStream(file);
//建立数组
byte[] buf = new byte[1024];
int len = 0;
//判断是否读到文件末尾
while((len=fis.read(buf)) != -1){
out.write(buf, 0, len);
}
//告诉服务端,文件已传输完毕
socket.shutdownOutput();
// 流关闭
socket.close();
fis.close();
return true;
} catch (Exception e) {
log.error("打印报错,{}",e);
}
return false;
}
第二种:DocPrintJob创建打印作业
此方法得先把打印机绑定在windows的打印设备列表(好像得装好打印驱动),传入的打印机服务名称是你绑定打印机的名称。
/**
*
* getfile 要打印文件路径
* printerName 绑定打印机服务名称
*/
public static String printA4(String getfile,String printerName){
//构造一个文件选择器,默认为当前目录
File file = new File(getfile);//获取选择的文件
//构建打印请求属性集
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
//设置打印格式,因为未确定文件类型,这里选择AUTOSENSE
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
HashAttributeSet hs = new HashAttributeSet();
//把你的打印机名称传入直接去找
hs.add(new PrinterName(printerName,null));
//找对应名称的的打印机
PrintService[] printService = PrintServiceLookup.lookupPrintServices(null, hs);
if (printService == null || printService.length == 0) {
return "未找到可用打印机,请检查驱动或网络!";
}
try {
DocPrintJob job = printService[0].createPrintJob(); //创建打印作业
FileInputStream fis = new FileInputStream(file); //构造待打印的文件流
DocAttributeSet das = new HashDocAttributeSet();
Doc doc = new SimpleDoc(fis, flavor, das); //建立打印文件格式
job.print(doc, pras); //进行文件的打印
}catch(Exception e) {
log.error("打印错误,{}",e);
return "fail";
}
return "success";
}
第三种:PrinterJob 创建打印任务
此方法得先把打印机绑定在windows的打印设备列表(好像得装好打印驱动),传入的打印机服务名称是你绑定打印机的名称。
/**
* file 要打印的文件
* print 打印机名称
*/
public static String printPdf(String file,String print){
log.info("打印机名称:{}",print);
try {
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
System.out.println(flavor.getMediaSubtype());
//找到打印服务中所有的打印机名称
PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, aset);
// 找到打印服务中所有的打印机名称
// PrintService[] services = PrinterJob.lookupPrintServices();
PrintService service = null;
//循环对比和你传入的打印机名称是否一致
for (int i = 0; i < services.length; i++) {
System.out.println("打印机++++++++"+services[i]);
if (print.equals(services[i].getName())) {
service = services[i];
break;
}
}
if (service == null) {
return "未找到可用打印机,请检查驱动或网络!";
}
log.info("找到了打印机");
InputStream in = new FileInputStream(file);
PDDocument document = PDDocument.load(in);
//指定打印机
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintService(service);
job.setPageable(new PDFPageable(document));
job.print();
document.close();
in.close();
} catch (Exception e) {
log.error("打印错误,{}",e);
return "fail";
}
return "success";
}
- 如有何不对,请大佬指出。我愿取其精华,去其糟粕。[抱拳]