- jaspersoft 设计pdf模板遇到的坑
1.项目启动的时候
.jrxml生成的文件.jasper每次用完以后删除,下次再用.jfxml生成文件
每次导入idea以后要重新编译:
mvn clean install -DskipTests 进行编译
编译成功以后再进行对项目单机右键,选择-》maven-》Reimport
最后再启动项目
2.制作内容时候
JasperReport做报表
在画框框图的时候,parameters代表的是一个参数a,它可以通过parameters.set("a",xx)可以进行传值
filed代表是一个字段,可以通过进行List的传递
param最好放在文本的Head中,field最好放在文本的Detail中,如果放放在一起,可能会存在Field出现多次的(观察原文件可看出来位置发生变化)
3.父子传递设计过程中
在父子传递的设置过程中,父首先要设置两个parameters参数:一个是path(指定子的路径),一个是list(指定子的数据源集合)
为了引入子在父中加入Palette中的Subreport :
在Subreport设置Expression:P{path}并且Data Source Expression
填写以下内容
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{list})
子的话就只需要在Detail里面写好prameter等待父的参数即可
在设插入图片过程中
1.设置图片的Expression 为$P{imagesPaths}
2.Lazy 勾选上
3.Using Cache 为true
4在parameters中添加imagesPaths参数
解决中文乱码问题:
首先在项目中resource下引入三个文件 jasperreportes_extension.properties
stsong 文件包含:fonts.xml 和 stsong.TFT
其次在设计表的时候每个字段都要设计为 华文宋体
执行过程中可能出现读取失败的问题,重复1里面的内容启动项目即可
4.可能再resource里面文件读取的时候会出现被拦截的情况
对插件进行了修改
<plugins>
<plugin>
<artifactId>maven-resource-plugin</artifactId>
<inherited>false</inherited>
<configuration>
<nonfilteredFileExtension>jasper</nonfilteredFileExtension>
</configuration>
</plugin>
</plugins>
最后,上代码
public String getReceipt(ReceiptBo receiptBo, List<ReceiptItemBo>receiptItemBos,List<MedisDescBo>medisDes,String documentNo,Integer type){
try(InputStream fis = new ClassPathResource("template/SellReceipt.jasper").getInputStream();
ByteArrayOutPutStream byteArrayOutPutStream = new ByteArrayOutPutStream();
//读取模板文件
InputStream childTemplateFile = new CalssPathResource("template/MediaDesc.jasper").getInputStream();
InputStream childTemplateFile2 = new CalssPathResource("template/ReceiptItemBos.jasper").getInputStream();
InputStream pictureInputStream = new CalssPathResource("picture/logo.png").getInputStream()){
//通过ObjectMapper将对象转为map
ObjectMapper oMapper = new ObjectMapper();
Map<String,Object>parameters = oMapper.converValue(receiptBo,Map.class);
parameters.put("imagesPaths",pictureInputStream);
parameters.put("isPrinted","");
parameters.put("mediaDesc",mediaDesc);
parameters.put("mediaDescPath",childTemplateFile);
Parameters.put("documentNo",documentNo);
parameters.put("receiptItemBos",receiptItemBos);
parameters.put("receiptItemPath",childTemplateFile2);
if(type!=null){
return getPngReceipt(fis,parameters);
}else{
JasperPrint print = JasperFillManager.filReport(fis,parameters,new JREmptyDataSource());
//转换为流
JasperExportManager.exportReportToPdfStream()
}
}
}
数据长度的自适应
Strech,在设计器里面有个属性叫:Strech With Overflow
当数据长度超过组件的长度的时候,会自动折行
导出图片Base64字符串
private String getPngReceipt(InputStream fis,Map<String,Object>parameters){
try{
JasperPrint jasperPrint =
JasperFillManager.fillReport(
(JasperReport) JRLoader.loadObject(fis),//jasper对象 parameters,//参数列表 new JREmptyDataSource()//数据源信息);
JRGraphics2DExporter exporter = new JRGraphics2DExporter();//创建graphics输出器
//创建一个影像对象
BufferedImage bufferedImage = new BufferedImage(jasperPrint.getPageWidth() * 4, jasperPrint.getPageHeight() * 4, BufferedImage.TYPE_INT_RGB);
//取graphics
Graphics2D g = (Graphics2D) bufferedImage.getGraphics();
//设置相应参数信息
exporter.setParameter(JRGraphics2DExporterParameter.GRAPHICS_2D, g);
exporter.setParameter(JRGraphics2DExporterParameter.ZOOM_RATIO, Float.valueOf(4));
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.exportReport();
g.dispose();//释放资源信息
//这里的bufferedImage就是最终的影像图像信息,可以通过这个对象导入到cm中了.
ImageIO.write(bufferedImage, "JPEG", new File("d:/aa.jpg"));
ByteArrayOutStream os = new ByteArrayOutPutStream();
ImageIO.write(bufferedImage,"PNG",os);
retrun Base64.getEncoder.encodeToString(os.toByteArray()).trim();
}catch(JRException e){
log.error("ReceiptService:getPngReceipt",e);
}catch(IOException e){
log.error("ReceiptService:getPngReceipt",e)
}
return null;
}
}
生成条形码需要的pom
<dependencuy>
<groupId>net.sourceforge.barbecue</groupId>
<artifactId>barbecue</artifactId>
<version>1.5-betal</version>
</dependencuy>
这种引入条形码的方式可以使用jasper文件,设计器中直接使用$P{parameter}即可
生成二维码需要的pom
https://blog.csdn.net/dailuwen/article/details/52249128
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>2.2</version>
</dependency>
一维码 ($F{WAYBILL_NO} 为条码数据)
com.google.zxing.client.j2se.MatrixToImageWriter.toBufferedImage(new com.google.zxing.oned.Code128Writer().encode($F{WAYBILL_NO},com.google.zxing.BarcodeFormat.CODE_128,188,40))
二维码 ($F{WAYBILL_NO} 为条码数据)
com.google.zxing.client.j2se.MatrixToImageWriter.toBufferedImage(new com.google.zxing.qrcode.QRCodeWriter().encode($F{WAYBILL_NO},com.google.zxing.BarcodeFormat.QR_CODE,200,180))
这种方式导入的是图片直接 修改组建 属性 Image Experssion
父子模板的另一种书写方式
https://www.cnblogs.com/penghongwei/p/9471801.html
我们在生产代码中可以先将子报表的模板预编译好,然后直接以参数的形式传递给主报表(例如如下代码将编译好的 “checklist.jrxml” 子报表作为参数传给主报表,然后在主报表中的引用表达式写成$P{checklist})。
String subreport = "checklist";
JasperReport jasperReport = null;
try (InputStream inputStream = getResourceAsStream(subreport + ".jrxml")) {
jasperReport = JasperCompileManager.compileReport(inputStream);
} catch (IOException | JRException e) {
e.printStackTrace();
}
params.put(subreport, jasperReport);
JasperCompileManager.compilerReport(inputStream)
Image.read(inputStream)