Spring boot基于itext实现定制化模板pdf生成功能

       最近被安排公司项目的一个活:根据给定的模板生成pdf,很多公司的项目涉及这种xxx单的生成,我这里是个检查单的生成,具体内容下面给出,和各位csdner一起分享学习一下,如有不对多多指教。

        首先先看下需求:

       给定的pdf:

        Spring boot基于itext实现定制化模板pdf生成功能_第1张图片

         为了不涉密,基本上类似于这种模板。

         之前没做过啊,百度一下午关于spring boot 生成pdf的方法,找了ireport 和jasperreports,正打算用这个后来有coder说这个版本比较挑JDK,最新的5.X版本只适配1.6(如果没错的话)的jdk,要知道我们的项目是基于1.8以上的,妥妥的放弃了。接着找,说使用itext,研究了一下itext,可以自动生成pdf,也可以根据pdf模板获取field的值进行填充。但是看看我们的模板,数据都是动态填充的,怎么能用固定模板,处理仿list的列都是一个难点。

        项目中之前都是生成word,excel,pdf没有,好吧,没有现成的让我用,那我自己设计实现一个吧。

        引入jar包依赖:(我们的项目用gradle管理的,使用中央管理仓库,这个可以去官网去查,找自己适配的版本)

        

    第一个引入itext  jar包,用来调用itext的基本工具类:PdfpTable、PdfpCell等

    第二个引入asian jar包,用来实现自定义字体,实现宋体和中文编码:

BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
 
  
 
  

      这个搞定就可以开发了。这个模板最难的不是list,那都是小case。最难的就是那个复选框。

     itextpdf没有对复选框提供一个使用的工具类,有个CheckBox不能当做在PdfpCell(单元格)填充,然后我就百度找了一圈,后来有人说用自定义一个table当做复选框。我这里的复选框不需要对框做取值,所以我就使用这种思路做了一个自定义的CheckBox。


//自定义设置复选框的样式
    public PdfPTable getCheck(){
        PdfPCell checkCell =null;
        PdfPTable checkTable = new PdfPTable(1);
        checkTable.setWidthPercentage(2);
        checkCell = new PdfPCell();
        checkCell.setMinimumHeight(5f);
        checkCell.setBorder(Rectangle.BOX);
        checkCell.setBorderWidth(1);
//        checkCell.setLeading(5,5);
        checkCell.setFixedHeight(2f);
        checkTable.addCell(checkCell);
        return checkTable;
    }
 
  

复选框调用示例:

PdfPCell cellCheck2 = new PdfPCell(getCheck());
//        cellCheck2.setLeading(3f,1.2f);
//        cellCheck2.setPaddingTop(10f);
        cellCheck2.setPaddingRight(2f);
        cellCheck2.setPaddingTop(2f);
        cellCheck2.setPaddingBottom(2f);
//        cellCheck2.setPaddingLeft(2f);
        cellCheck2.setBorder(0);
        cellCheck2.setFixedHeight(2f);
        tableRecieve.addCell(cellCheck2);


       代码有点冗余,需要的童鞋可以参考这个思路,但是在使用的时候放在cell里面,由于这个单元格并不能很好的控制它的宽度,所有对宽度的设置都是相对值,所以在使用的时候还要对其上下左右的padding进行设置。

        基本思路就是这样,耗时两天做一个模板,并动态生成数据,这个都是最简单的。

        模板里面各种table当cell套用,多看看API的调用就可以了,其他的没啥难点。希望可以帮助到大家。

你可能感兴趣的:(spring)