使用Printable操作打印机
需求:使用《web、手机端》点击打印可以直接使用打印机打印出来。
1.jdk1.8中有个Printable类,实现这个类,就可以。具体上代码:
package com.contractor.utils; import com.contractor.models.ContractorWorkInfo; import com.jfinal.kit.StrKit; import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.Line2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.print.*; import java.io.File; import java.io.IOException; import static java.lang.Character.isLetter; /** * 操作打印机 */ public class PrintJob implements Printable { // 无参构造 public PrintJob() { } private ContractorWorkInfo workInfo; private String imgPath; public String getImgPath() { return imgPath; } public void setImgPath(String imgPath) { this.imgPath = imgPath; } public ContractorWorkInfo getWorkInfo() { return workInfo; } public void setWorkInfo(ContractorWorkInfo workInfo) { this.workInfo = workInfo; } // 有参构造 public PrintJob(ContractorWorkInfo workInfo, String imgPath) { this.workInfo = workInfo; this.imgPath = imgPath; } /** * @param graphics 指明打印图像环境 * @param pageFormat 指明打印页格式(页面大小以点为计量单位,1点为1英才的1/72,1英寸为25.4毫米。A4纸大致为595×842点) * @param pageIndex 指明页号 */ @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { Graphics2D g2 = (Graphics2D) graphics; // 黑色 g2.setColor(Color.BLACK); //打印起点坐标 double x = 20; double y = 60; int default_height = 16; Component c = null; switch (pageIndex) { case 0: Font font = null; //矩形(外边框) Rectangle2D rect = new Rectangle2D.Double(30, 30, 520, 704);//声明并创建矩形对象,矩形的左上角是(20,30),宽是300,高是40 g2.draw(rect); font = new Font("新宋体", Font.BOLD, 25); g2.setFont(font);//设置字体 g2.drawString("施工信息", (float) x + 210, (float) y); Line2D line = new Line2D.Double(30, y + 5 + default_height, 550, y + 5 + default_height); g2.draw(line); g2.drawString("", (float) x + 25, (float) y - 10 + default_height * 2);//空行 font = new Font("新宋体", Font.PLAIN, 13); g2.setFont(font);//设置字体 g2.drawString("承包商:" + workInfo.getStr("contractorName"), (float) x + 25, (float) y + default_height * 3); g2.drawString("施工日期:" + workInfo.getStr("createtime").substring(0,10), (float) x + 25, (float) y + default_height * 5); g2.drawString("施工区域:" + workInfo.getStr("areaname"), (float) x + 25, (float) y + default_height * 7); g2.drawString("施工生产线:" + workInfo.getStr("productlinename"), (float) x + 25, (float) y + default_height * 9); g2.drawString("工作类型:" +workInfo.getStr("workmaintypes") +"—"+ workInfo.getStr("worktypes"), (float) x + 25, (float) y + default_height * 11); g2.drawString("工作内容:" + workInfo.getStr("credentials"), (float) x + 25, (float) y + default_height * 13); g2.drawString("施工人数:" + workInfo.getInt("units"), (float) x + 25, (float) y + default_height * 15); String titles = nullToBlank(workInfo.getStr("titles")); String workers = nullToBlank(workInfo.getStr("workers")); if (StrKit.notBlank(workers)){ int length = workers.length(); if (length<=35){ g2.drawString("施工人员:" + workers, (float) x + 25, (float) y + default_height *17); if (StrKit.notBlank(titles)){ int titlesLength = titles.length(); if (titlesLength<=32){ g2.drawString("施工描述:" + titles, (float) x + 25, (float) y + default_height * 19); }else if (titlesLength<=64){ String titlesSub1 = titles.substring(0, 32); String titlesSub2 = titles.substring(32, titles.length()); g2.drawString("施工描述:" + titlesSub1, (float) x + 25, (float) y + default_height *19); g2.drawString(" "+titlesSub2, (float) x + 27, (float) y + default_height *20); }else if (titlesLength<=96){ String titlesSub1 = titles.substring(0, 32); String titlesSub2 = titles.substring(32, 64); String titlesSub3 = titles.substring(64, titles.length()); g2.drawString("施工描述:" + titlesSub1, (float) x + 25, (float) y + default_height *19); g2.drawString(" "+titlesSub2, (float) x + 27, (float) y + default_height *20); g2.drawString(" "+titlesSub3, (float) x + 27, (float) y + default_height *21); }else if (titlesLength<=128){ String titlesSub1 = titles.substring(0, 32); String titlesSub2 = titles.substring(32, 64); String titlesSub3 = titles.substring(64, 96); String titlesSub4 = titles.substring(96, titles.length()); g2.drawString("施工描述:" + titlesSub1, (float) x + 25, (float) y + default_height *21); g2.drawString(" "+titlesSub2, (float) x + 27, (float) y + default_height *22); g2.drawString(" "+titlesSub3, (float) x + 27, (float) y + default_height *23); g2.drawString(" "+titlesSub4, (float) x + 27, (float) y + default_height *24); } } }else { String workersSub1 = workers.substring(0, 35); String workersSub2 = workers.substring(35, workers.length()); g2.drawString("施工人员:" + workersSub1, (float) x + 25, (float) y + default_height *17); g2.drawString(" "+workersSub2, (float) x + 27, (float) y + default_height *19); if (StrKit.notBlank(titles)){ int titlesLength = titles.length(); if (titlesLength<=32){ g2.drawString("施工描述:" + titles, (float) x + 25, (float) y + default_height * 21); }else if (titlesLength<=64){ String titlesSub1 = titles.substring(0, 32); String titlesSub2 = titles.substring(32, titles.length()); g2.drawString("施工描述:" + titlesSub1, (float) x + 25, (float) y + default_height *21); g2.drawString(" "+titlesSub2, (float) x + 27, (float) y + default_height *22); }else if (titlesLength<=96){ String titlesSub1 = titles.substring(0, 32); String titlesSub2 = titles.substring(32, 64); String titlesSub3 = titles.substring(64, titles.length()); g2.drawString("施工描述:" + titlesSub1, (float) x + 25, (float) y + default_height *21); g2.drawString(" "+titlesSub2, (float) x + 27, (float) y + default_height *22); g2.drawString(" "+titlesSub3, (float) x + 27, (float) y + default_height *23); }else if (titlesLength<=128){ String titlesSub1 = titles.substring(0, 32); String titlesSub2 = titles.substring(32, 64); String titlesSub3 = titles.substring(64, 96); String titlesSub4 = titles.substring(96, titles.length()); g2.drawString("施工描述:" + titlesSub1, (float) x + 25, (float) y + default_height *21); g2.drawString(" "+titlesSub2, (float) x + 27, (float) y + default_height *22); g2.drawString(" "+titlesSub3, (float) x + 27, (float) y + default_height *23); g2.drawString(" "+titlesSub4, (float) x + 27, (float) y + default_height *24); } } } } // 下划线 Line2D lineBottom = new Line2D.Double(30, y + 5 + default_height * 25, 550, y + 5 + default_height * 25); g2.draw(lineBottom); font = new Font("新宋体", Font.PLAIN, 11); g2.setFont(font);//设置字体 g2.drawString("请打开HUA的专用APP MyPlant,使用承包商管理中的扫码功能", (float) x + 25, (float) y + default_height * 35); g2.drawString("扫描该二维码以获取更多施工信息或对本次施工进行反馈。", (float) x + 25, (float) y + default_height * 36); try { BufferedImage read = ImageIO.read(new File(imgPath)); int img_Height = read.getHeight(c); g2.drawImage(read, (int) x + 360, img_Height + 400, c); } catch (IOException e) { e.printStackTrace(); } return PAGE_EXISTS; default: return NO_SUCH_PAGE; } } /** * 将null转换成"",并且将Object转换成String类型 * @param oTempObject:输入的Object对象 **/ public static String nullToBlank(Object oTempObject){ try{ if (oTempObject==null){ return ""; } else{ return oTempObject.toString(); } } catch(Exception e){ } return ""; } /** * 调用打印 */ public static void callPrint(ContractorWorkInfo contractorWorkInfo, String imgPath) { // book类提供的文档,不同的页面格式和页面painter。 Book book = new Book(); // 要打印的页面大小和方向 PageFormat pageFormat = new PageFormat(); // 页面打印的顺序 pageFormat.setOrientation(PageFormat.PORTRAIT); // 使用paper设置打印页面大小 Paper paper = new Paper(); // 纸张大小 paper.setSize(590, 835); // 设置文章区域 paper.setImageableArea(10, 10, 580, 844); pageFormat.setPaper(paper); // 传入自定义数据 book.append(new PrintJob(contractorWorkInfo, imgPath), pageFormat); // 调用打印 PrinterJob printerJob = PrinterJob.getPrinterJob(); // 设置打印类 printerJob.setPageable(book); try { // 开始打印 printerJob.print(); } catch (PrinterException e) { e.printStackTrace(); } } }
2.相应的代码解释:
2.1:实现Printable就会重写print。
2.2它通过Graphics2D
进行绘制,有字体、大小、颜色等操作
2.3 drawString:要输入的内容,x,y是作用在坐标点。