天天看点

jasportsoft碰到的坑

  • 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)