当前位置: 首页 > news >正文

freemarker 使用

 首次使用freemarker遇到的全是坑,还好,各种问题,最终都解决了。芹菜加油

import com.lowagie.text.pdf.BaseFont;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xhtmlrenderer.pdf.ITextRenderer;import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;public class PDFUtils {private static Log logger = LogFactory.getLog(PDFUtils.class);public static ByteArrayOutputStream createPDFFromHtml(String html) throws Exception {ITextRenderer renderer = new ITextRenderer();OutputStream out = new ByteArrayOutputStream();logger.info("getFontResolver********************************************************start");// 设置 css中 的字体样式(暂时仅支持宋体和黑体) 必须,不然中文不显示// 使用类加载器获取资源文件InputStreamInputStream fontInputStream = PDFUtils.class.getResourceAsStream("/font/simsun.ttf");if (fontInputStream == null) {throw new RuntimeException("Font file not found in classpath.");}// 将资源文件临时复制到系统临时目录,以便iText访问Path tempFontFile = Files.createTempFile("simsun", ".ttf");Files.copy(fontInputStream, tempFontFile, StandardCopyOption.REPLACE_EXISTING);fontInputStream.close();String ss= tempFontFile.toString();// 添加临时字体文件到字体解析器,使用linux发版,同时需要将字体放到linux服务器中,renderer.getFontResolver().addFont(ss, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
//      如果使用windows发版,使用下面方式,
//        renderer.getFontResolver().addFont("/usr/share/fonts/simsunsongti.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);// 把html代码传入渲染器中logger.info("setDocumentFromString********************************************************start");renderer.setDocumentFromString(html);logger.info("setDocumentFromString********************************************************end");renderer.layout();renderer.createPDF(out, false);renderer.finishPDF();logger.info("finishPDF********************************************************end");out.flush();ByteArrayOutputStream byteArrayOutputStream = (ByteArrayOutputStream) out;return byteArrayOutputStream;}
}

 //图片  测试环境:netUrl: https://test.net.com.cn@Value("${netUrl}")private String netUrl;//图片地址 :/api/file/sys-file/@Value("${fileUrl}")private String fileUrl;/*** 从模板文件中加载* @param response* @throws Exception*/@PostMapping("/template/file")public void load(HttpServletResponse response, @RequestBody ParmObjDto parmObjDto) throws Exception {R r = ticketService.getByRecordId(parmObjDto.getRecordId());WkElectricalTicketVo apply = JSONUtil.toBean(JSONUtil.toJsonStr(r.getData()), WkElectricalTicketVo.class);String templateFileName = "/one.ftl";List<Map<String,Object>> list = new ArrayList<>();Map<String,Object> map = new HashMap();map.put("recordId", apply.getRecordId());map.put("deptCode", apply.getWorkUnit());map.put("deptName", apply.getDeptName());map.put("workOrderName", apply.getWorkOrderName());map.put("operationTicketNumber", apply.getOperationTicketNumber());map.put("workTicketNumber", apply.getWorkTicketNumber());map.put("unitType", apply.getUnitType());//放图片的话,模板上出不来,需要如下设置map.put("workObject", apply.getWorkObject());//  图片if(StringUtils.isNotEmpty(apply.getIssuerSign())) {map.put("issuerSign",StringEscapeUtils.escapeXml10(netUrl + fileUrl + apply.getIssuerSign()));}else{map.put("issuerSign","");}//计划开始时间,处理日期,防止为空,必须,否则如果为空,模板显示会报错Date date1 = apply.getTimeStart();Optional<Date> optionalDate = Optional.ofNullable(date1);if (optionalDate.isPresent()) {String t

相关文章:

  • Vue46-render函数
  • 收银系统源码-连锁店收银系统,支持二次开发
  • MYSQL(事务)
  • oracle发送邮件附件的步骤?怎么配置发信?
  • CUDA算子优化:矩阵乘GEMM优化(三)
  • Java 插入Mysql 报错:Column count doesn‘t match value count at row 1
  • 如何完美解决 Xshell 使用 SSH 连接 Linux 服务器报错:找不到匹配的 host key 算法
  • Linux下C程序的编写
  • 如何安全进行亚马逊、沃尔玛测评?
  • 【vue】终端 常用代码 和其他注意
  • 提高磁盘I/O速度的途径
  • 【C++】AVL树/红黑树实现及map与set的封装
  • 龙芯+RT-Thread+LVGL实战笔记(36)——密码锁完善
  • java实现两个不同对象的集合复制
  • Unity | Shader基础知识(第十四集:简单效果练习)
  • C# 免费离线人脸识别 2.0 Demo
  • Django 博客开发教程 16 - 统计文章阅读量
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java比较器对数组,集合排序
  • JS笔记四:作用域、变量(函数)提升
  • Lsb图片隐写
  • Promise面试题2实现异步串行执行
  • vue-cli3搭建项目
  • 使用Gradle第一次构建Java程序
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • Spring第一个helloWorld
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • (35)远程识别(又称无人机识别)(二)
  • (C#)获取字符编码的类
  • (SpringBoot)第二章:Spring创建和使用
  • (八)Flink Join 连接
  • (超详细)语音信号处理之特征提取
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (规划)24届春招和25届暑假实习路线准备规划
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (一)Linux+Windows下安装ffmpeg
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .net core使用ef 6
  • .Net 应用中使用dot trace进行性能诊断
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NetCore部署微服务(二)
  • .NetCore项目nginx发布
  • .net通过类组装数据转换为json并且传递给对方接口
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @JoinTable会自动删除关联表的数据
  • @Not - Empty-Null-Blank
  • @SpringBootConfiguration重复加载报错
  • @SuppressWarnings(unchecked)代码的作用
  • @Transient注解
  • @WebServiceClient注解,wsdlLocation 可配置
  • @软考考生,这份软考高分攻略你须知道