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

(最新)itext7 freemarker动态模板转pdf

1.引入依赖

<!--PDF导出POM-->
<dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>8.0.3</version><type>pom</type>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>html2pdf</artifactId><version>5.0.3</version>
</dependency>
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version>
</dependency>

2.编写FTL文件

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title></title>
</head><style>.pic {width: 100%;height: 100%;}
</style><body>
<div id="app"><#--封面图--><#if show><img class="pic" src="${coverImageFile!''}"/></#if>
</div>
</body>
</html>

3.后台代码

@Resource
Configuration configuration;
/*** 导出*/@Overridepublic void export(HttpServletResponse response){//获取文件byte[]byte[] pdfBytes=getPdfBytes();try{//输出pdf文件String chineseName="中文文件名";response.setCharacterEncoding("utf-8");String fileName=URLEncoder.encode(chineseName, StandardCharsets.UTF_8).replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=" + fileName + ".pdf");//设置响应头(导出为pdf文件)response.setContentType("application/pdf");//设置响应头(返回流给前端预览使用)//response.setContentType("application/octet-stream;charset=UTF-8");// 获取HttpServletResponse的OutputStreamOutputStream os=response.getOutputStream();// 写入字节流数组os.write(pdfBytes);os.flush();os.close();}catch(IOException e){throw new InvalidCmdException(e.getMessage());}}
private byte[] getPdfBytes(){//获取模板替换数据Map<String, Object> map=new HashMap<>();map.put("show", true);map.put("coverImageFile", "base64图片");try{//读取freemarker模板Template template=configuration.getTemplate("FTL文件路径");StringWriter out=new StringWriter();// 将数据模型合并到模板中生成HTMLtemplate.process(map, out);String htmlContent=out.toString();// 初始化字节输出流用于保存PDFByteArrayOutputStream pdfOutput=new ByteArrayOutputStream();// 设置中文字体ConverterProperties converterProperties=new ConverterProperties();FontProvider fontProvider=new DefaultFontProvider(true, true, false);PdfDocument pdfDoc;FontProgram fontProgram=FontProgramFactory.createFont("static/simhei.ttf");// 添加中文字体到字体提供者fontProvider.addFont(fontProgram);converterProperties.setFontProvider(fontProvider);// 转换HTML到PDFtry(ByteArrayOutputStream outputStream=pdfOutput){// 初始化文档PdfWriter writer=new PdfWriter(outputStream);pdfDoc=new PdfDocument(writer);//设置pdf纸张大小pdfDoc.setDefaultPageSize(PageSize.A4);// 将HTML转换为PDFHtmlConverter.convertToPdf(htmlContent, pdfDoc, converterProperties);}// 从字节输出流中获取PDF的字节数组byte[] pdfBytes=pdfOutput.toByteArray();// 关闭流pdfOutput.close();pdfDoc.close();out.close();return pdfBytes;}catch(IOException e){throw new InvalidCmdException("读取候选人freemarker模板错误");}catch(TemplateException e){throw new InvalidCmdException("替换模板值错误");}}

4.注意事项

itext7本身不支持中文 所以需要在项目中引入字体文件。

freemarker图片需要使用base64格式图片

byte[] 数组转base64

 /*** 图片转base64*/private String convertBase64(String ossFileId){if(String2Utils.isNotBlank(ossFileId)){//这里使用的是阿里的oss查询OssUrlDto ossUrlDto=ossFileService.findDfsById(ossFileId).orElse(null);try{byte[] adviserBytes=ossClientService.getContentByteByKey(ossUrlDto.getBucketName(), ossUrlDto.getPath());return "data:image/jpeg;base64," + Base64.getEncoder().encodeToString(adviserBytes);}catch(Exception e){throw new InvalidCmdException("图片转base64失败");}}return "";}

给导出的PDF设置页面边距,网上搜索了很多中办法,只有一种成功了

再FTL页面中添加

<style>@page {size: A4;margin: 10mm;}
</style>

相关文章:

(最新)itext7 freemarker动态模板转pdf

1.引入依赖 <!--PDF导出POM--> <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>8.0.3</version><type>pom</type> </dependency> <dependency><grou…...

solidworks electrical 2D和3D有什么区别

SolidWorks Electrical 是一款专为电气设计开发的软件工具&#xff0c;它提供了两种主要的工作环境&#xff1a;2D电气设计和3D电气集成设计。两者在功能和应用场景上存在显著的区别&#xff1a; SolidWorks Electrical 2D 设计 特点与用途&#xff1a; SolidWorks Electrica…...

4.2、ipex-llm(原bigdl-llm)进行语音识别

ipex-llm环境配置及模型下载 由于需要处理音频文件&#xff0c;还需要安装用于音频分析的 librosa 软件包。 pip install librosa下载音频文件 !wget -O audio_en.mp3 https://datasets-server.huggingface.co/assets/common_voice/--/en/train/5/audio/audio.mp3 !wget -O a…...

上海亚商投顾:创业板指低开低走 黄金、家电股逆势大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指4月12日震荡调整&#xff0c;创业板指尾盘跌超1%。黄金板块延续强势&#xff0c;莱绅通灵9连板&#xff0…...

AIGC革新浪潮:大语言模型如何优化企业运营

在当今快速发展的商业环境中&#xff0c;企业对于有效管理知识资产的需求日益增长。知识管理作为企业核心竞争力的关键组成部分&#xff0c;对于提高决策质量、增强创新能力和优化运营流程起着至关重要的作用。随着数字化转型的推进&#xff0c;企业对知识管理系统提出了新的要…...

Golang基础-12

Go语言基础 介绍 目录操作 创建 删除 重命名 遍历目录 修改权限 文件操作 创建 打开关闭 删除 重命名 修改权限 读文件 写文件 文件定位 拷贝 测试 单元测试 基准测试 示例 介绍 本文介绍Go语言中目录操作&#xff08;创建目录、删除目录、重命名、遍历…...

python递归统计文件夹下pdf文件的数量

python递归统计文件夹下pdf文件的数量 import os from docx import Documentdef count_all_pages(root_dir):total_pages 0# 遍历文件夹for dirpath, dirnames, filenames in os.walk(root_dir):for filename in filenames:# if filename.endswith(.docx) or filename.endswit…...

Kafka 硬件和操作系统

目录 一. 前言 二. Kafka 硬件和操作系统&#xff08;Hardware and OS&#xff09; 2.1. 操作系统&#xff08;OS&#xff09; 2.2. 磁盘和文件系统&#xff08;Disks and Filesystem&#xff09; 一. 前言 Kafka 是 I/O 密集型而非计算密集型的框架&#xff0c;所以对 CP…...

Kolla-ansible部署OpenStack集群

0. OpenStack 部署 系统要求 单机部署最低配置&#xff1a; 2张网卡8G内存40G硬盘空间 主机系统&#xff1a; CentOS Stream 9Debian Bullseye (11)openEuler 22.03 LTSRocky Linux 9- Ubuntu Jammy (22.04) 官方不再支持CentOS 7作为主机系统&#xff0c;我这里使用的是R…...

SHARE 203S PRO:倾斜摄影相机在地灾救援中的应用

在地质灾害的紧急关头&#xff0c;救援队伍面临的首要任务是迅速而准确地掌握灾区的地理信息。这时&#xff0c;倾斜摄影相机成为了救援测绘的利器。SHARE 203S PRO&#xff0c;这款由深圳赛尔智控科技有限公司研发的五镜头倾斜摄影相机&#xff0c;以其卓越的性能和功能&#…...

MATLAB算法实战应用案例精讲-【数模应用】中介效应分析(补充篇)(附R语言和python代码实现)

目录 前言 几个高频面试题目 中介效应分析与路径分析的区别 1.中介效应分析 2.路径分析 注意事项...

Day96:云上攻防-云原生篇Docker安全系统内核版本漏洞CDK自动利用容器逃逸

目录 云原生-Docker安全-容器逃逸&系统内核漏洞 云原生-Docker安全-容器逃逸&docker版本漏洞 CVE-2019-5736 runC容器逃逸(需要管理员配合触发) CVE-2020-15257 containerd逃逸(启动容器时有前提参数) 云原生-Docker安全-容器逃逸&CDK自动化 知识点&#xff1…...

python botos s3 aws

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html AWS是亚马逊的云服务&#xff0c;其提供了非常丰富的套件&#xff0c;以及支持多种语言的SDK/API。本文针对其S3云储存服务的Python SDK&#xff08;boto3&#xff09;的使用进行介绍。 …...

python画神经网络图

代码1(画神经网络连接图&#xff09; from math import cos, sin, atan import matplotlib.pyplot as plt # 注意这里并没有用到这个networkx这个库&#xff0c;完全是根据matploblib这个库来画的。 class Neuron():def __init__(self, x, y,radius,nameNone):self.x xself.y …...

Bash 编程精粹:从新手到高手的全面指南之逻辑控制

在 Unix 和 Linux 系统中&#xff0c;Bash&#xff08;Bourne-Again Shell&#xff09;是一种广泛使用的 shell&#xff0c;提供了强大的脚本编程能力。本文将详细介绍 Bash 脚本中的逻辑控制结构&#xff0c;包括条件判断、分支选择、循环控制以及退出控制等内容。 条件判断&…...

自动化运维(三十)Ansible 实战之自定义插件

Ansible 自定义插件允许你扩展其功能,以满足特定的自动化需求。Ansible 支持多种类型的插件开发,如动态库存、查找、回调、过滤器、变量等。这里我们将通过实例,介绍如何开发、部署和使用一个自定义插件。 开发自定义查找插件 查找插件用于在 Ansible 任务中动态获取数据。…...

实习僧网站的实习岗位信息分析

目录 背景描述数据说明数据集来源问题描述分析目标以及导入模块1. 数据导入2. 数据基本信息和基本处理3. 数据处理3.1 新建data_clean数据框3.2 数值型数据处理3.2.1 “auth_capital”&#xff08;注册资本&#xff09;3.2.2 “day_per_week”&#xff08;每周工作天数&#xf…...

C语言中局部变量和全局变量是否可以重名?为什么?

可以重名 在C语言中, 局部变量指的是定义在函数内的变量, 全局变量指的是定义在函数外的变量 他们在程序中的使用方法是不同的, 当重名时, 局部变量在其所在的作用域内具有更高的优先级, 会覆盖或者说隐藏同名的全局变量 具体来说: 局部变量的生命周期只在函数内部,如果出了…...

小程序中配置scss

找到&#xff1a;project.config.json 文件 setting 模块下添加&#xff1a; "useCompilerPlugins": ["sass","其他的样式类型"] 配置完成后&#xff0c;重启开发工具&#xff0c;并新建文件 结果&#xff1a;...

ZYNQ-Vitis(SDK)裸机开发之(四)PS端MIO和EMIO的使用

目录 一、ZYNQ中MIO和EMIO简介 二、Vivado中搭建block design 1.配置PS端MIO&#xff1a; 2.配置PS端EMIO&#xff1a; 三、Vitis中新建工程进行GPIO控制 1. GPIO操作头文件gpio_hdl.h&#xff1a; 2.GPIO操作源文件gpio_hdl.c&#xff1a; 3.main函数进行调用 例程开发…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...