问题1: JasperReport打印出来的整个pdf文件为空白文件;
问题2:JasperReport定义变量后打印PDF变量为null;
问题1原因是因为缺少数据源JRDataSource
JasperFillManager.fillReport(jasperReport, params,new JREmptyDataSource());
如果你打印的jrxml文件单纯是一些文本,没有数据,那么你需要在fillReport
函数传入一个空的数据源,如果没有数据源生成的PDF就是空白的,如下图:
问题2原因是把field 和 parameter 搞混了,如果只是参数,那么你就定义成parameter,如果是数据信息就定义成字段即可;
小提示:如果你需要将数据进行打印出来,那么定义成field,此时你的数据就是数据源:JRDataSource datasource = new JRBeanCollectionDataSource(dataList);
最后附上相关源码:
//主函数
public static void main(String[] args){
String str = "/Documents/work/ccount_4.jrxml"; //jrxml文件地址
Map<String, Object> params = new HashMap<>();
params.put("tenantName","ccccccc"); //封装变量tenantName
pdfByJrxml(str,params); //PDF文件生成逻辑
}
//Jasper生产PDF文件
public static String pdfByJrxml(String jrxmlPath, Map<String, Object> params) {
try {
InputStream resourceAsStream = new FileInputStream(jrxmlPath);
JasperDesign jasperDesign = JRXmlLoader.load(resourceAsStream);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
//fillReport 重点是这个方法,如果没有数据,那么需要制定空的数据源,否则生成的PDF是空白的
JasperPrint jasperPrint =
JasperFillManager.fillReport(jasperReport, params,new JREmptyDataSource());
byte[] bytes = JasperExportManager.exportReportToPdf(jasperPrint);
testWriteLocalFile(bytes); //将PDF文件输出到本地
} catch (Exception e) {
logger.error("generate pdf error{}", e);
}
}
//本地生成PDF文件
public static void testWriteLocalFile(byte[] bytes){
BufferedOutputStream bos = null;
FileOutputStream fos = null;
File file;
String filePath = "/xxx/Documents/work/";
try {
File dir = new File(filePath);
if(!dir.exists()&&dir.isDirectory()){//判断文件目录是否存在
dir.mkdirs();
}
file = new File(filePath+"d.pdf");
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}```