IReport工具:jrxml模板制作及打印(二)
既然模板我们已经创建好了,那么如何打印呢
1、组装模板所需数据 2、jrxml模板文件转Jasper文件 3、将数据放入Jasper文件、并通过Jasper文件生成PDF文件,获取PDF文件路径
4、将PDF文件路径指给打印机进行打印
下面以最近一个需求为例,打印单据PDF,模板如下,
主要方法:
# 生产Jasper文件 JasperCompileManager.compileReportToFile(sourceFileName, destFileName); sourceFileName:jrxml文件位置 destFileName:指定生成的Jasper文件位置 # Jasper文件转PDF文件 JasperFillManager.fillReportToFile(sourceFileName, params, dataSource) sourceFileName: params:表单其他属性$P{} dataSource:表单属性$F{}
相关jar包:
jasperreports-5.1.2.jar
打印代码(仅供参考,这里利用另一个模板生成PDF文件):
package com.w.utils; import java.awt.print.Book; import java.awt.print.PageFormat; import java.awt.print.Paper; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.io.FileInputStream; import java.io.IOException; import javax.print.PrintService; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.printing.PDFPrintable; import org.apache.pdfbox.printing.Scaling; import com.w.utils.StringUtil; /** * 打印测试类 * @author w * */ public class TestPrint { static String printerName = "Brother MFC-7880DN Printer";// 打印机名称 static String pdfFile = "D://test//WF.756594CL0A 00 01.pdf";// 打印文件 static int printType = 0;// 打印方向,0-纵向;1-横向;2-反向横向 /** * 格式: * left(距左边距像素), * right(距右边距像素), * top(距上边距像素), * bottom(距下边距像素), * width(打印纸张宽像素), * height(打印纸张高像素), * diff(偏差值像素;负数上移、正数下移); * 声明:单位像素(毫米*72*10/254),例如,10毫米=10*72*10/254≈28像素,(28,28,28,28,595,842,-228),成比例缩放打印 */ static String printRange = "28,28,28,28,595,283,-220"; public static void main(String[] args) { try { PrintService[] services = PrinterJob.lookupPrintServices(); //从其中一个打印服务中创建一个打印作业 PrintService myService =null; if (services.length > 0) { for (PrintService service : services) { System.out.println("打印机名称------" + service.getName()); if(printerName.equals(service.getName())) { // 筛选出对应名称的打印机 myService = service; } } } if(myService == null) { throw new RuntimeException("找不到打印机,请确认打印机名称是否正确或网络是否正常"); } FileInputStream inputStream = new FileInputStream(pdfFile); // 设置纸张 PDDocument document = PDDocument.load(inputStream); // 创建打印任务 PrinterJob job1 = PrinterJob.getPrinterJob(); Paper paper = new Paper(); // 设置打印纸张大小 // paper.setSize(295,420); // 1/72 inch // 设置打印位置 坐标 double defaultWidth = paper.getWidth(); double defaultHeight = paper.getHeight(); paper.setImageableArea(0D, 0D, defaultWidth, defaultHeight); // A4,590、840 if(!StringUtil.isNullOrEmpty(printRange)){ String[] ranges = printRange.split(","); if(ranges.length == 7){ // 像素=毫米*72*10/254 double marginLeft = StringUtil.toDoubleObj(ranges[0], 0D);// 距左边距像素 double marginRight = StringUtil.toDoubleObj(ranges[1], 0D);// 距右边距像素 double marginTop = StringUtil.toDoubleObj(ranges[2], 0D);// 距上边距像素 double marginBottom = StringUtil.toDoubleObj(ranges[3], 0D);// 距下边距像素 double width = StringUtil.toDoubleObj(ranges[4], defaultWidth);// 打印纸张宽像素 double height = StringUtil.toDoubleObj(ranges[5], defaultHeight);// 打印纸张高像素 double diff = StringUtil.toDoubleObj(ranges[6], 0D);// 偏差值像素;负数上移、正数下移 paper.setSize(width, height); paper.setImageableArea(marginLeft, marginRight+diff, width-(marginLeft + marginRight), height-(marginTop + marginBottom)); // no margins } } // custom page format PageFormat pageFormat = new PageFormat(); pageFormat.setPaper(paper); // 打印方向:0-纵向;1-横向;2-反向横向 if(printType == 1){ pageFormat.setOrientation(PageFormat.LANDSCAPE); }else if(printType == 2){ pageFormat.setOrientation(PageFormat.REVERSE_LANDSCAPE); }else{ pageFormat.setOrientation(PageFormat.PORTRAIT); } // override the page format Book book = new Book(); // append all pages 设置一些属性 是否缩放 打印张数等 // SCALE_TO_FIT-自适应缩放,SHRINK_TO_FIT-收缩到合适的位置,STRETCH_TO_FIT-扩展到合适的位置,ACTUAL_SIZE-实际大小 book.append(new PDFPrintable(document, Scaling.STRETCH_TO_FIT), pageFormat, 1); job1.setPageable(book); job1.setPrintService(myService); job1.print(); } catch (IllegalArgumentException | NullPointerException | IOException | PrinterException e) { System.out.println("打印异常!e=" + e.getMessage()); } } }
相关jar包:
pdfbox-2.0.24.jar
单据PDF预览:
雨淋淋过的季节