一个小需求,需要将页面上的数据导出为PDF,正常情况下这个需求需要让前端来做,但是现在上面让咱们后端来做,也没问题。
直接上代码
com.openhtmltopdf openhtmltopdf-core 1.0.0
com.openhtmltopdf openhtmltopdf-pdfbox 1.0.0
org.thymeleaf thymeleaf 3.0.11.RELEASE
org.thymeleaf thymeleaf-spring5 3.0.11.RELEASE
2、HTML模板文件 audit_order_record.html
审批记录
资源信息 目录名称 [[${resourceName}]] 资源名称 [[${infoName}]] 资源类型 [[${resourceType}]] 数据提供方 [[${resOrgName}]] 订阅信息 资源需求方 [[${orgName}]] 需求方系统 [[${systemName}]] 联系人 [[${linkMan}]] 联系手机 [[${linkPhone}]] 申请日期 [[${orderDate}]] 申请理由 [[${orderReason}]] 审核信息 审核人 [[${prejuUserName}]] 审核结果 [[${prejuResult}]] 审核日期 [[${prejuDate}]] 审核意见 [[${prejuSuggest}]]
将字体文件 STXIHEI.TTF 放在 pdf/fonts 下面
package com.libin.pdf.demo.util;import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;
import org.springframework.util.ResourceUtils;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.thymeleaf.templateresolver.FileTemplateResolver;import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.OutputStream;
import java.util.Map;public class PdfUtil {/*** @param response http请求后的相应* @param pdfFileName pdf文件名称(不包含pdf后缀)* @param templateName 模板名称* @param variables 模板变量*/public static void exportPdf(HttpServletResponse response, String pdfFileName, String templateName, Map variables) throws Exception {response.setContentType("application/pdf");response.setHeader("Content-Disposition", "attachment;filename=" + new String((pdfFileName + ".pdf").getBytes(), "iso8859-1"));OutputStream os = response.getOutputStream();//构造模板引擎ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();resolver.setPrefix("pdf/templates/"); //模板所在目录,相对于当前classloader的classpath。resolver.setSuffix(".html"); //模板文件后缀
// FileTemplateResolver resolver = new FileTemplateResolver();
// resolver.setPrefix(ServletActionContext.getServletContext().getRealPath("pdf/templates") + File.separator); // 如果放在web下
// resolver.setSuffix(".html");SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(resolver);//构造上下文(Model)Context context = new Context();context.setVariable("pdfFileName", pdfFileName);context.setVariables(variables);//渲染模板String example = templateEngine.process(templateName, context);PdfRendererBuilder builder = new PdfRendererBuilder();//设置字体文件builder.useFont(ResourceUtils.getFile("classpath:pdf/fonts/SIMHEI.TTF"), "stxihei");
// builder.useFont(new File(ServletActionContext.getServletContext().getRealPath("/pdf/fonts/SIMHEI.TTF")), "stxihei"); // 如果是放在web下面builder.useFastMode();builder.withHtmlContent(example, null);builder.toStream(os);builder.run();}
}
5、导出接口
package com.libin.pdf.demo.controller;import com.libin.pdf.demo.util.PdfUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;@RestController
public class DemoController {@GetMapping("pdf")public void test(HttpServletResponse response) throws Exception {Map variables = new HashMap<>();// 资源信息// 资源名称variables.put("resourceName", "XXXXXXXXXX");// 目录名称variables.put("infoName", "XXXXXXXXXX");//资源类型variables.put("resourceType", "XXXXXXXXXX");// 数据提供方variables.put("resOrgName", "XXXXXXXXXX");// 资源需求方variables.put("orgName", "XXXXXXXXXX");// 需求方系统variables.put("systemName", "XXXXXXXXXX");// 联系人variables.put("linkMan", "XXXXXXXXXX");// 联系手机variables.put("linkPhone", "XXXXXXXXXX");// 申请日期variables.put("orderDate", "XXXXXXXXXX");// 申请理由variables.put("orderReason", "XXXXXXXXXX");// 审核人variables.put("prejuUserName", "XXXXXXXXXX");// 审核结果variables.put("prejuResult", "XXXXXXXXXX");// 审核日期variables.put("prejuDate", "XXXXXXXXXX");// 审核意见variables.put("prejuSuggest", "XXXXXXXXXX");PdfUtil.exportPdf(response, "审批记录", "audit_order_record.html", variables);}
}
6、打开浏览器测试
浏览器访问 localhost:8080/pdf 进行测试
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。