在做项目时,经常会遇到打印帐票的问题,很多项目用到的SVF等工具大多是收费的,这样就限制了客户的使用,增加了客户的负担,而且我们国内也很少有软件付费的习惯嘛,本人采用一个开源的软件--ireport进行帐票的开发。开发环境是ireport5.6,需要注意的是现在的ireport都结合了Jasper,不需要额外的在下jar包,在ireport的zip包中就有。
那么接下来,我们需要制作帐票,在进行帐票绘画的时候,需要注意几个事情。
(1)使用ireport是需要注意,它不支持jdk1.8,需要修改ireport.conf文件中的jdkhome。
(2)文字类型,需要在面板中选择pdf font和pdf encoding.pdf,并且 Embedded进行勾选。否则代码打印文字到模板上时会报错。
(3)页面不同分区功能不同,比如Title是唯一的,但是column header或者detail则会重复(4)参数类型分为parameter与field两种,field类似于表格,可以进行循环,每行的宽度与detail的宽度有关系。parameter类似于一个一个的控件,可以单个赋值。
(5)设置类型为Integer之后才能够进行数值的格式化,在面板的Pattern中。
(6)条件显示时,需要在print when Expression 中进行设置,比如new Boolean($F{countS}!=null)。而且可以用Frame框起来,这样不显示的时候不会占用空间。或者设置多个detail,也可以实现Frame的效果。
(7) 页面的控件可以设置边框,内边距等等。
(8)在后台进行打印时,需要将部分的jar引入到工程中或者tomcat中,才能够正常使用一些方法。
我们的帐票模板做好之后,就得从代码中把数据流打到模板上。
String fileName ="contractDetail.jrxml";
JasperReport jasperReport = null;
JasperPrint jasperPrint = null;
jasperReport = JasperCompileManager.compileReport(fileName);//编译jrxml文件
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("totalym", ymd);
List<String> beanCollection = new ArrayList<String>();
beanCollection.add("");
JRDataSource dataSource = new JRBeanCollectionDataSource(beanCollection);
byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), parameters, dataSource);
jasperPrint = JasperFillManager.fillReport(jasperReport, parameter, dataSource);
File pdf = new File("report.pdf");
JasperExportManager.exportReportToPdfFile(jasperPrint, pdf.getAbsolutePath());
或者直接读取Jasper文件,因为编译jrxml文件会比较慢
File reportFile = new File(paymentDetail.jasper);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("totalym", ymd);
List<String> beanCollection = new ArrayList<String>();
beanCollection.add("");
JRDataSource dataSource = new JRBeanCollectionDataSource(beanCollection);
byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), parameters, dataSource);
但是打印帐票时可能是打印多张不同数据的PDF,如何处理这个问题呢?
List jasperPrintList = new ArrayList();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST,jasperPrintList);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
exporter.exportReport();
byte[] bytes= baos.toByteArray();
再把byte流转为文件流就可以啦。