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

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

        首先先看下需求:

       给定的pdf:

        

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

         之前没做过啊,百度一下午关于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 Boot结合iText生成请假单PDF文件的步骤如下: 1. 添加依赖 在`pom.xml`文件中添加iText库的依赖: ```xml <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency> ``` 2. 编写Controller 编写一个Controller类,用于接收请假单的数据并生成PDF文件。 ```java import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.PdfWriter; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; @Controller public class LeaveController { @GetMapping("/leave") public void generateLeavePDF(@RequestParam String name, @RequestParam String startDate, @RequestParam String endDate, @RequestParam String reason, HttpServletResponse response) throws IOException, DocumentException { // 设置响应类型为PDF文件 response.setContentType("application/pdf"); // 设置响应头,表示文件名为leave_application.pdf response.setHeader("Content-Disposition", "attachment; filename=leave_application.pdf"); // 创建一个PDF文档对象 Document document = new Document(); // 获取输出流 OutputStream out = response.getOutputStream(); // 将输出流包装成PdfWriter对象 PdfWriter.getInstance(document, out); // 打开文档 document.open(); // 向文档中添加内容 document.add(new Paragraph("Leave Application")); document.add(new Paragraph("Name: " + name)); document.add(new Paragraph("Start Date: " + startDate)); document.add(new Paragraph("End Date: " + endDate)); document.add(new Paragraph("Reason: " + reason)); // 关闭文档 document.close(); // 关闭输出流 out.close(); } } ``` 上述代码中,我们使用`@RequestParam`注解来接收四个参数:姓名、开始日期、结束日期和请假原因。在`generateLeavePDF`方法中,我们首先设置响应类型为PDF文件,并设置响应头表示文件名为`leave_application.pdf`。然后,我们创建一个PDF文档对象并获取输出流。我们使用PdfWriter对象将输出流包装起来,以便向文件中写入内容。在文档中添加内容后,我们关闭文档和输出流。 3. 运行程序 启动Spring Boot应用程序,并在浏览器中输入URL `http://localhost:8080/leave?name=张三&startDate=2021-07-01&endDate=2021-07-05&reason=因私事需要请假。`。浏览器将下载名为`leave_application.pdf`的PDF文件,其中包含输入的请假单信息。 上述步骤中,我们使用iText库创建PDF文件并使用Spring Boot框架将其作为响应返回给客户端。如果你需要更复杂的PDF文件,可以查阅iText库的官方文档以获取更多信息。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值