简介
JasperReports是一个基于Java的开源报表工具,它可以在Java环境下像其它IDE报表工具一样来制作报表。JasperReports 支持PDF、HTML、XLS、CSV和XML文件输出格式。JasperReports是当前Java开发者最常用的报表工具。
准备工作
官网
报表模板设计器下载
iReport报表制作参考
本例使用的JasperReports版本为6.3.0,通过其报表设计器(iReport是其前身)设计好打印模板,使用核心包按照指定的模板.jasper文件生成用于打印的HTML文件。
集成方式
添加Maven依赖
......
6.3.0
2.1
1.5-beta1
2.4.5
3.2
1.8
2.1
......
......
net.sf.jasperreports
jasperreports
${jasperreports.version}
org.codehaus.groovy
groovy-all
${groovy.version}
net.sf.barcode4j
barcode4j
${barcode4j.version}
net.sourceforge.barbecue
barbecue
${barbecue.version}
org.apache.xmlgraphics
batik-bridge
${batik-bridge.version}
org.apache.xmlgraphics
xmlgraphics-commons
${xmlgraphics-commons.version}
org.apache.commons
commons-digester3
${commons-digester3.version}
......
修改配置
在web工程src/main/resources路径下新建jasperreports.properties,在此文件中配置覆盖JasperReports的相关属性的默认值。
由于生成条形码默认格式为svg,本人使用的web端打印插件不支持此图片格式,因此只用到以下配置修改。
# barcode4j 生成图片格式默认为svg,改用普通图片格式
net.sf.jasperreports.components.barcode4j.image.producer=image
# 图片dpi,默认值为72,Lodop打印使用的是96px,因此需要覆盖
net.sf.jasperreports.image.dpi=96
# HTML单位长度单位,默认为px,由于jasperReports的像素是按照1dpi=72px设计,和Lodop打印插件冲突,此处改为1dpi=72pt即可和Lodop的单位换算一致
net.sf.jasperreports.export.html.size.unit=pt
覆盖HtmlExporter
1、HtmlExporter生成的html文件,最终内容和实际设计器中的预览结果有差异,左右两边多了一些间距,通过修改代码去除不必要的间距。
2、由于本人使用的打印插件分页是根据Html实际内容高度进行的,因此需要保证每个分页页面的宽度、高度和设计器指定的纸张宽高(此处使用pt作为单位)一致。
- 重写HtmlExporter类,类路径自己定义。
- 修改内容如下
# 增加以下方法
//获取每个分页的宽度
private String getPageWidth() {
List items = exporterInput.getItems();
if (items.isEmpty()) {
return "";
}
JasperPrint jasperPrint = items.get(0).getJasperPrint();
return jasperPrint.getPageWidth() + "pt";//此处单位保持一致使用pt
}
# 修改exportReportToWriter方法,固定好宽度同时去除左右两边的间距。
protected void exportReportToWriter() throws JRException, IOException {
HtmlExporterConfiguration configuration = getCurrentConfiguration();
String htmlHeader = configuration.getHtmlHeader();
String betweenPagesHtml = configuration.getBetweenPagesHtml();
String htmlFooter = configuration.getHtmlFooter();
boolean flushOutput = configuration.isFlushOutput();// FIXMEEXPORT maybe
// move flush flag to
// output
if (htmlHeader == null) {
String encoding = getExporterOutput().getEncoding();
writer
.write("\n");
writer.write("\n");
writer.write("\n");
writer.write(" \n");
writer.write(" \n");
writer.write(" \n");
writer.write("\n");
writer
.write("\n"); //此处有修改,固定宽度
writer.write("
根据报表模板生成HTML文件
public PrintPageConfig genPrintHtmlFile(String tmplFileUrl, String targetUrl,
Map params) throws DemoServiceException {
Connection connection = null;
try {
DruidDataSource ds = ApplicationContextUtils
.getBean(DemoConstants.DEFAULT_DATASOURCE_CONTEXT_ID, DruidDataSource.class);
connection = ds.getConnection();
//传入模板.jasper文件内容
InputStream inputFile = new FileInputStream(tmplFileUrl);
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(inputFile);
//指定数据源,并传入对应报表的执行参数
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, (Map) params,
connection);
//生成最终结果的HTML文件,注意此处引用自己重写的HtmlExporter
HtmlExporter exporter = new HtmlExporter(DefaultJasperReportsContext.getInstance());
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleHtmlExporterOutput(targetUrl));
exporter.exportReport();
return new PrintPageConfig().setWidth(jasperPrint.getPageWidth())
.setHeight(jasperPrint.getPageHeight());
} catch (Exception e) {
throw new DemoServiceException(e.getMessage());
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
throw new DemoServiceException(e.getMessage());
}
}
}
}
使用Lodop打印生成的html内容
本例使用Lodop综合版本:Lodop6.216_CLodop2.093。
具体集成方式见官网说明,此处只介绍如何配合JasperReports打印出来的html文件进行不失真打印。Lodop官网
/**
* 根据已有的html url进行打印
* @param type
* 是打印还是打印预览:preview-打印预览;其它值为打印。
* @param config
* 打印内容配置:
* 1、为字符串时,表示打印的html所在的远程url地址。
* 2、为对象时:{
* url:打印的html所在的远程url地址,
* width:html内容的实际宽度(单位像素)
* height:html内容的实际高度(单位像素)
* }
*
* 说明:
* JasperReports设计模板的像素和实际纸张的尺寸之比为72pt=1英寸(in)。
* Lodop打印的内容是按照一个dpi占96px=72pt=1in=2.54cm(厘米)=25.4mm(毫米)打印,JasperReports的html结果内容是按照一个dpi占72pt生成。
*
*/
function doPrintByHtml(type, config) {
if (!window.LODOP) {
alert('打印插件不可用,请先到首页进行下载安装,然后刷新浏览器!');
return;
}
if (window.top && window.top.waltz && window.top.waltz.app && window.top.waltz.app.globalOption) {
var globalOption = window.top.waltz.app.globalOption;
if (globalOption.lodopLicenseAuthor) {
LODOP.SET_LICENSES(globalOption.lodopLicenseAuthor, globalOption.lodopLicenseKey, "", "");
}
}
LODOP.PRINT_INIT("printTask");
var url;
if ((typeof config == 'string') && config.constructor == String) {
url = config;
} else {
url = config.url;
var width = Math.round((config.width / 72 ) * 25.4) * 10,//1 inch=25.4mm,Lodop默认单位为0.1mm
height = Math.round((config.height / 72) * 25.4) * 10;
//设置纸张大小,设置后不允许用户手动修改纸张大小
LODOP.SET_PRINT_PAGESIZE(0, width, height, "");
}
// 指定按实际宽度缩放比例
LODOP.SET_PRINT_MODE('PRINT_PAGE_PERCENT', "Full-Width");
LODOP.ADD_PRINT_HTM(0, 0, '100%', '100%', 'URL:' + url);
LODOP.SET_PRINT_STYLE("Stretch", 2);
if (type == 'preview') {
LODOP.PREVIEW();
} else {
LODOP.PRINT();
}
};
注意事项
使用JasperReports根据打印模板生成打印结果文件时,对应服务器必须安装打印模板中用到的字体,比如:打印内容包含中文,linux服务器需要安装中文的语言包,否则执行生成结果文件时报错。