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中 的字体样式(暂时仅支持宋体和黑体) 必须,不然中文不显示

        // 使用类加载器获取资源文件InputStream
        InputStream 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/716479.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

喜讯 | 全视通获得珠海市第七届“市长杯”工业设计大赛三等奖

近日&#xff0c;在珠海市举行的第七届“市长杯”工业设计大赛颁奖典礼上&#xff0c;珠海全视通信息技术有限公司&#xff08;以下简称“全视通”&#xff09;凭借创新的“医护对讲一体终端机”产品&#xff0c;历经激烈的竞争和严格的评选流程&#xff0c;包括大赛宣传发动、…

python-docx-template 的 Replace docx pictures 占位图片名称从哪来?

python-docx-template 的 Replace docx pictures 占位图片名称从哪来&#xff1f; 在 Word 中看占位图片名称用代码输出输出结果找对应图片 使用 replace_pic参考资料 在 Word 中看占位图片名称 右键图片 》查看可选文字 用代码输出 from docxtpl import DocxTemplate# 初始化…

二刷算法训练营Day30 | 回溯算法(6/6)

目录 详细布置&#xff1a; 1. 回溯总结 2. 332. 重新安排行程 3. 51. N 皇后 4. 37. 解数独 详细布置&#xff1a; 1. 回溯总结 回溯是递归的副产品&#xff0c;只要有递归就会有回溯&#xff0c;所以回溯法也经常和二叉树遍历&#xff0c;深度优先搜索混在一起&#x…

借助浏览器实现一个录屏插件?

说在前面 &#x1f388;不知道大家平时都是使用什么录屏软件呢&#xff1f;有没有想过只用JavaScript我们也可以快速实现一个录屏插件&#xff1f; 准备工作 开始写代码前我们需要先了解一下以下几点&#xff1a; 1、getDisplayMedia navigator.mediaDevices.getDisplayMedi…

【C++】AVL树/红黑树实现及map与set的封装

前言 【C】二叉树进阶&#xff08;二叉搜索树&#xff09; 这篇文章讲述了关于二叉搜索树知识&#xff0c;但是二叉搜索树有其自身的缺陷&#xff0c;假如往树中插入的元素有序或者接近有序&#xff0c;二叉搜索树就会退化成单支树&#xff0c;时间复杂度会退化成O(N)&#xff…

充电学习——0、电源管理

一、设备电源管理&#xff1a; 两种类型 1、系统睡眠模型&#xff1a; 设备驱动作为系统一部分&#xff0c;会跟随系统进入低功耗状态&#xff0c;suspend &#xff08;suspend-to-ram&#xff09; 一些驱动程序可以管理硬件的唤醒事件&#xff0c; 这一特性通过/sys/device/…

图像处理与视觉感知复习--彩色图像处理

文章目录 三原色原理及其两种应用常用彩色模型及其应用领域各种颜色模型的转换彩色图像处理 三原色原理及其两种应用 三基色原理 自然界中绝大多数的颜色都可看作是由红、绿、蓝三种颜色组合而成&#xff1b;自然界中的绝大多数的颜色都可以分解成红、绿、蓝这三种颜色。这即…

minIo ubuntu单节点部署

资源准备 minio二进制包 下载地址:https://dl.min.io/server/minio/release/linux-amd64/minio ubuntu-单节点部署 选择一台ubuntu18.04机器10.253.9.41、intel 或者 amd 64位处理器 上传minio到~目录 sudo cp minio /usr/local/bin/ sudo chmod x /usr/local/bin/minio 设…

Vue3+ECharts

Vue3 Echarts 在Vue3中使用Echarts V5.5.0时&#xff0c;报错如下&#xff1a; 在Vue3中&#xff0c;初始化echarts实例时&#xff0c;会将echarts实例对象转换成响应式对象&#xff0c;从而在resize时无法获取需要的数据。 此时需要使用 markRaw() 将echarts实例对象转换成…

团结的力量:友情、互助与感恩

时间如白驹过隙&#xff0c;半载光阴转瞬即逝。回首过去的六个月&#xff0c;在CSDN平台上&#xff0c;我经历了无数的挑战和成长。在大厂和阿豪的帮助下&#xff0c;我的粉丝数终于突破了万大关。这不仅是我个人的成就&#xff0c;更是我们团结、互助和感恩精神的见证。 初识…

力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 521.最长特殊序列 I【简单】 题目&#xff1a; 给你两个字符串 a 和 b&am…

人民日报:高考填志愿十问十答,填报志愿时需要考虑哪些因素?

高考结束&#xff0c;志愿填报即将开始&#xff0c;填报志愿时需要考虑哪些因素&#xff1f;如何避免高分低录甚至落榜&#xff1f;高考填志愿你需要知道的事↓↓ 祝福考生考入理想大学、就读喜欢的专业。加油&#xff01; 责任编辑&#xff1a;曹继炜

Attention机制到底是什么?

AI算法之一 的Attention机制到底是什么&#xff0c;你知道吗? 这里写目录标题 1. Attention 的本质2. Attention的3大优点3. Attention的原理3.Attention的类型3.1计算区域3.2 所用信息3.3 结构层次 4. 模型方面5. 相似度计算 1. Attention 的本质 Attention&#xff08;注意…

hive on spark 记录

环境&#xff1a; hadoop 2.7.2 spark-without-hadoop 2.4.6 hive 2.3.4 hive-site.xml <property><name>hive.execution.engine</name><value>spark</value> </property> <property><name>spark.yarn.jars</name>&l…

ETAS AUTOSAR工具链的作用

一、AUTOSAR是什么&#xff1f; AUTOSAR&#xff08;Automotive Open System Architecture&#xff09;是一个全球性的联盟&#xff0c;致力于制定和推广汽车电子系统的标准化解决方案。它是由汽车制造商、供应商和工程公司组成的合作伙伴网络&#xff0c;旨在解决汽车电子系统…

[Qt的学习日常]--常用控件2

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、widget的…

U盘文件夹变exe:现象解析与数据恢复策略

一、U盘文件夹变exe现象描述 在日常使用U盘进行数据传输和存储的过程中&#xff0c;部分用户可能会遭遇一种异常现象&#xff1a;原本正常的文件夹突然变成了可执行文件&#xff08;即后缀为.exe的文件&#xff09;。这种变化不仅影响了用户对文件的正常访问和管理&#xff0c…

基于文本和图片输入的3D数字人化身生成技术解析

随着虚拟现实、增强现实和元宇宙等技术的飞速发展,对高度逼真且具有表现力的3D数字人化身的需求日益增长。传统的3D数字人生成方法往往需要依赖大量的3D数据集,这不仅增加了数据收集和处理的成本,还限制了生成的多样性和灵活性。为了克服这些挑战,我们提出了一种基于文本提…

短剧系统搭建全攻略:功能齐全,一步到位

前言 近年来&#xff0c;短剧系统以其独特魅力&#xff0c;成为大众消遣娱乐的热门选择。简单来说&#xff0c;短剧系统就是用来看短剧的小程序&#xff0c;它汇集了丰富多彩的短剧资源&#xff0c;让观众随时随地享受观影乐趣。本文将为你详细解析短剧系统的搭建全攻略&#…

GaussDB技术解读——GaussDB架构介绍(四)

目录 11 GaussDB云原生架构 11.1 云原生关键技术架构 11.2 关键技术方案 11.2.1 通信组件 11.2.2 集群管理组件 11.2.3 多租组件 GaussDB架构介绍&#xff08;三&#xff09;从智能关键技术方案、驱动接口关键技术方案等方面对GaussDB架构进行了解读&#xff0c;本篇将…