jrxml模板製作及列印(二)
阿新 • • 發佈:2021-09-04
既然模板我們已經建立好了,那麼如何列印呢
1、組裝模板所需資料 2、jrxml模板檔案轉Jasper檔案 3、將資料放入Jasper檔案、並通過Jasper檔案生成PDF檔案,獲取PDF檔案路徑
4、將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.jc.middlegoods.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.jc.common.utils.StringUtil;/** * 列印測試類 * @author wang-xiaoming * */ 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預覽:
小孩子の哎