利用freemark进行pdf的转换
1. 对pom文件进行引入
org.springframework.boot spring-boot-starter-freemarker org.xhtmlrenderer flying-saucer-pdf 9.0.9 org.springframework spring-test RELEASE
2. 转换的流程思路
(1) 读取静态文件模板,将数据进行动态显示
(2)利用模板生成器将ftl模板生成html静态文件
(3)将静态文件转化为流的方式,利用pdf模板将流转化为pdf文件
坑点:pdf模板默认中文不显示,需要引入外界字体,静态文件一般读取到的是中,文件读取不到,建议采用绝对路径的方式,将路径配置到.yml中
(4)可以将pdf文件转化为流,上传到文件系统
3. 方法代码(后台代码)
@Override public RgetRedSet(Integer id) {log.info("开始进行套红。。。。。。。。。。。");//获取模板对象Template template = null;try {//获取自定义的模板对象template = freemarkerConfig.getTemplate("redset.ftl");} catch (IOException e) {e.printStackTrace();}//通过id查找公文信息OaOfficialDocument oaOfficialDocument = oaOfficialDocumentService.getById(id);//存放页面输出的参数Map param = new HashMap();//用于页面绑定参数param.put("oaOfficialDocument", oaOfficialDocument);//获取html转化为pdf对象ITextRenderer renderer = new ITextRenderer();try {//在配置文件中存放字体信息用于读取配置文件的路径String filePath = applicationContext.getEnvironment().getProperty("zhxy.fontfile");//在模板中添加字体信息,默认模板的非字体不显示中文renderer.getFontResolver().addFont(filePath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}try (StringWriter writer = new StringWriter();) {//将html模板转化为流信息template.process(param, writer);writer.flush();//将html流信息写入到pdf中renderer.setDocumentFromString(writer.toString());} catch (TemplateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}renderer.layout();//用来定义一个存储pdf的流信息byte[] fileBytes = null;try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();) {//将创建的pdf文件的流信息,写入到定义的流中renderer.createPDF(byteArrayOutputStream);fileBytes = byteArrayOutputStream.toByteArray();} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}MultipartFile file = null;//将byte数组转化为写入流try (InputStream inputStream = new ByteArrayInputStream(fileBytes);) {//将写入流转化为MockMultipartFile对象file = new MockMultipartFile("file", "file.pdf", ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);} catch (IOException e) {e.printStackTrace();}//调用远程的fegin接口将文件上传到minIo中R pdfFile = remoteFileUploadService.upload(file);log.info("套红结束。。。。。。。。。。");return pdfFile; }
4. 前台代码
正文套红
style="font-family: SimHei;">三门峡社会管理职业学院三门峡技师学院文件${oaOfficialDocument.docText}