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预览

 

posted @ 2021-09-04 16:35  王晓鸣  阅读(1072)  评论(0编辑  收藏  举报