Word模板替换,并转PDF格式输出,Linux服务器乱码问题解决

news2024/9/20 5:57:29

Poi-tl参考文档地址:http://deepoove.com/poi-tl/1.8.x/#hack-loop-table

word模板替换,转pdf

    • 1. 依赖引入:
    • 2. word模板配置:
    • 3. 示例demo:
    • 4 . 效果图
    • 5. 本地测试没问题,上Linux服务乱码,出现小方框

1. 依赖引入:

  <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>4.1.2</version>
  </dependency>

  <dependency>
      <groupId>com.aspose</groupId>
      <artifactId>aspose-words</artifactId>
      <version>18.2</version>
      <classifier>jdk16</classifier>
  </dependency>

  <dependency>
      <groupId>com.deepoove</groupId>
      <artifactId>poi-tl</artifactId>
      <version>1.8.2</version>
  </dependency>

<!-- 通过Maven库拿不到,就加下面的配置 -->
<repositories>
     <repository>
         <id>AsposeJavaAPI</id>
         <name>Aspose Java API</name>
         <url>https://repository.aspose.com/repo/</url>
     </repository>
 </repositories>
 <pluginRepositories>
     <pluginRepository>
         <id>AsposeJavaAPI</id>
         <url>https://repository.aspose.com/repo/</url>
     </pluginRepository>
 </pluginRepositories>

2. word模板配置:

        绿色部分是直接渲染的,对应map中的key-value,蓝色部分是绑定collections对象,进行遍历循环集合数据
在这里插入图片描述

3. 示例demo:

public static void main(String[] args) throws Exception {
       public static void main(String[] args) throws Exception {
        ByteArrayOutputStream docOutput = new ByteArrayOutputStream();

        Map<String, Object> map = new HashMap<>(3);
        map.put("zfkp", "AAAA");
        map.put("kpjg", "123");
        map.put("kpr", "李四");

        List<Map> list = new ArrayList<>();
        Map<String, Object> map1 = new HashMap<>(3);
        map1.put("number", 1);
        map1.put("kprlist", "xxxa");
        map1.put("fs", 17);
        Map<String, Object> map2 = new HashMap<>(3);
        map2.put("number", 2);
        map2.put("kprlist", "xxxa3aa");
        map2.put("fs", 10);
        list.add(map1);
        list.add(map2);
        //列表集合数据
        map.put("collections", list);

        HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
        Configure config = Configure.newBuilder()
                //绑定集合数据
                .bind("collections", policy).build();

        System.out.println(map);
        //加载配置的word模板
        XWPFTemplate template = XWPFTemplate.compile("C:\\Users\\DELL\\Desktop\\kpwtlb.docx", config);

        template.render(map);
        //写入word,swapStream可输出word文档
        template.write(docOutput);
        ByteArrayInputStream swapStream = new ByteArrayInputStream(docOutput.toByteArray());

        //word转PDF
        Document doc = new Document(swapStream);
        ByteArrayOutputStream pdfOutput = new ByteArrayOutputStream();
        doc.save(pdfOutput, SaveFormat.PDF);

        ByteArrayInputStream pdfinput = new ByteArrayInputStream(pdfOutput.toByteArray());
        FileUtil.inputStreamToFile(pdfinput, "C:\\Users\\DELL\\Desktop\\", "123.pdf");
    }

4 . 效果图

        转换的pdf有水印,去水印很方便, 加载License(要买)即可 封装一个工具类
https://blog.csdn.net/weixin_42827159/article/details/105031663
在这里插入图片描述

5. 本地测试没问题,上Linux服务乱码,出现小方框

参考博客:https://blog.csdn.net/qq_42055933/article/details/128285226

1、将windows字体压缩上传到Linux,并安装进行缓存

//查看linux有的字体
fc-list
//linux中的中文字体
fc-list :lang=zh
//进入c:\windows\fonts,压缩字体包,上传至Linux /usr/share/fonts/路径,自建一个文件夹 win
//解压上传的windows字体至win中
//给以下格式字体文件赋权限
chmod 755 *.ttf  chmod 755 *.ttc  chmod 755 *.TTF
//安装字体以及缓存字体
sudo mkfontscale
sudo mkfontdir 
sudo fc-cache -fv
//生效指令
source /etc/profile

2、在转换之前设置一下字体路径来源
        执行完以上步骤,加上以下代码,两个截图是两种不同的方法,选其一,打包上传重启基本就解决了,如果是docker启动,还需做一步。重构docker容器,将windows字体存放的路径,即以下代码指定的路径,做挂载,然后重启
        docker相关操作:https://blog.csdn.net/loney_wolf/article/details/128255199 构建容器时,除了挂载项目路径,再加 -v /usr/share/fonts/(window字体的文件夹) :/usr/share/fonts/ 将安装的windows字体路径挂在至docker容器中,重启即可

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python———运行环境搭建

不管用什么工具开发 Python 程序&#xff0c;都必须安装 Python 的运行环境。 目前最常用的是Windows 、 Linux 平台。这里 我们以Windows10为主讲解。 其实编程和平台关系不大。大家也可以使用Linux、Mac。 Windows 平台下 Python 环境搭建 第一步&#xff1a;进入 python 官…

python绘制热力图,数据来源pandas.dataframe

通过pandas.dataframe绘制热力图&#xff0c;并标出颜色最深即z轴数据最大的点。 import matplotlib.pyplot as plt import pandas as pd import numpy as npclass Heatmap:def __init__(self, data, marker*, marker_colorwhite, marker_size10):self.data dataself.size l…

排序的概念,插入排序,希尔排序,选择排序

文章目录 排序的概念排序的概念&#xff1a;排序运用常见的排序与时间复杂度 插入排序希尔排序希尔排序的概念希尔排序总结 选择排序概念 排序的概念 排序的概念&#xff1a; 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小…

【复习《剑指Offer》13-17题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第十三天 7/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

什么是精益创业?精益创业的核心方法有哪些?

《经理人参阅&#xff1a;创业管理学》是一本非常有价值的创业类书籍&#xff0c;为创业者提供了许多实用的方法和经验&#xff0c;特别是关于精益创业方面的内容。精益创业是一种以快速验证假设为核心的创业方法&#xff0c;它可以帮助创业者在最短的时间内找到最有效的商业模…

Kafka跨集群备份解决方案MirrorMaker

文章目录 1 什么是 MirrorMaker&#xff1f;2 运行 MirrorMakerMirrorMaker 配置实例第 1 步&#xff1a;启动两套 Kafka 集群第 2 步&#xff1a;启动 MirrorMaker 工具第 3 步&#xff1a;验证消息是否拷贝成功 3 其他跨集群镜像方案4 小结 一般情况下&#xff0c;我们会使用…

Win2008下使用IIS+URL重写+Server Farms在同一台服务器实现混合 多域名网站与多个负载平衡集群网站 共存,配置及域名绑定笔记

因公司要在现有云服务器增加负载平衡集群网站&#xff0c;但要保证现有在用网站不动&#xff0c;操作系统为Win2008。 以前没有配置过IIS的负载平衡&#xff0c;只能百度一下&#xff0c;实现也简单&#xff1a;只要安装URL重写Server Farms就能实现负载平衡集群网站。于是根据…

IMX6ULL系统移植篇-uboot的烧写与运行

一. uboot 配置与编译 本文来学习 uboot的烧写&#xff0c;承接之前 uboot的配置与编译篇&#xff0c;博文如下&#xff1a; IMX6ULL系统移植篇-uboot的配置与编译_凌肖战的博客-CSDN博客 二. uboot的烧写 uboot 编程成功后&#xff0c;会在 uboot的根目录下生成 u-boot.b…

CentOS Linux的最佳替代方案(三)_银河麒麟Kylin Linux Advanced Server V10 SP2 for X86安装教程

文章目录 CentOS Linux的最佳替代方案&#xff08;三&#xff09;_银河麒麟Kylin Linux Advanced Server V10 SP2 for X86安装教程1 银河麒麟Kylin Linux Advanced Server V10简介1.1 同源构建1.2 自主CPU平台深入优化1.3 虚拟化及云原生支持1.4 高可用性1.5 可管理性1.6 内生本…

java阻塞队列/kafka

queue增加删除元素 增加元素 add方法在添加元素的时候&#xff0c;若超出了度列的长度会直接抛出异常&#xff1a;put方法&#xff0c;若向队尾添加元素的时候发现队列已经满了会发生阻塞一直等待空间&#xff0c;以加入元素offer方法在添加元素时&#xff0c;如果发现队列已满…

PCL点云处理之沿着法向量投影点云到平面 (一百九十四)

即使你很爱她,也要保留一些尊严 PCL点云处理之沿着法向量投影点云到平面 (一百九十四) 一、算法介绍二、具体实现1.代码(详细注释)2.效果一、算法介绍 实现这样的目标:沿着法向量,将点云投影到一个平面上 具体步骤: 1计算整个点云的法向量,来确定平面方向 2选择某一点…

IP编址数据转发

目录 一、IP编址 1.1、二进制、十进制和十六进制 1.2、进制之间的转换 1.3、IP编址 1.4、子网掩码 1.5、二进制和十进制转换 1.6、IP地址分类 1.7、IP地址类型 1.8、地址规划 二、VLSM与CIDR 2.1、有类IP编址的缺陷 2.2、变长子网掩码 VLSM 2.3、缺省情况下的掩码 …

红色通信史(四):永不消逝的电波

年龄稍大一点的读者&#xff0c;相信对下面这张剧照并不会感到陌生。 没错&#xff0c;这张经典的剧照&#xff0c;来自曾经家喻户晓的一部红色电影——《永不消逝的电波》。 这部电影上映于1958年&#xff0c;由八一电影制片厂摄制&#xff0c;王苹执导&#xff0c;孙道临、袁…

Qt和MySQL的连接

具体视频的教程 视频教程 我的文章是做一下补充的 流程&#xff1a; 第一点你要确保你的数据库的位数&#xff0c;如果你数据库位数的是32位&#xff0c;mingw编译的时候就需要选择的是32位**&#xff08;在下面会提到&#xff09;** 去到所在的文件 点击.pro文件进行编译…

ModaHub魔搭社区:为什么选择Zilliz Cloud?

目录 Zilliz Cloud是什么&#xff1f; 为什么选择Zilliz Cloud&#xff1f; 基于Milvus构建&#xff0c;针对性能进行优化 弹性和可扩展 按需付费 多云支持&#xff08;AWS、GCP&#xff09; 云原生的可靠性 企业安全和治理 Zilliz Cloud基于Milvus的云原生服务 Zilliz…

深蓝学院C++基础与深度解析笔记 第 8 章 动态内存管理

第 8 章 动态内存管理 1. 动态内存基础 ● 栈内存 V.S. 堆内存 – 栈内存的特点&#xff1a;更好的局部性&#xff0c;用于语言的固有类型&#xff0c;对象自动销毁,由低到高开辟 – 堆内存的特点&#xff1a;运行期动态扩展&#xff0c;需要显式释放&#xff0c;由高到低开辟…

使用 TailwindCSS 中的 color-mix() 构建自定义调色板

在这篇文章中&#xff0c;我们将了解如何使用 CSS 函数color-mix()和 CSS 变量&#xff0c;通过 TailwindCSS 高效地为 Nuxt 应用程序生成自定义调色板。 先决条件 最好使用以下命令设置 Nuxt 应用程序&#xff1a; npx nuxi init tailwindcss-color-mix 在安装提示期间选择 …

新项目即将启动!小灰做个市场调研

熟悉小灰的小伙伴们都知道&#xff0c;在2019年初&#xff0c;做了整整10年程序员的小灰离开职场&#xff0c;成为了一名自由职业者。 2021年末&#xff0c;小灰注册了自己的公司&#xff0c;名为北京小灰大黄科技有限公司。 公司虽然注册了&#xff0c;但是整个公司只有小灰一…

【C2】文件,时间,多线程,动静态库

文章目录 1.文件&#xff1a;fprint/fgets/fwrite/fread&#xff0c;ftell/rewind/fseek/fflush1.1 文本文件&#xff1a;FILE结构体1.2 二进制文件&#xff1a;没有行概念1.3 文件定位&#xff1a;linux下文本文件模式和二进制文件模式没有区别。fgets和fprintf以行方式读写文…

【Flutter】Flutter 国际化入门 使用 intl 包 格式化日期

文章目录 一、 前言二、 版本信息三、 什么是 intl 包四、 如何安装和使用 intl 包1. 安装 intl 包2. 使用 intl 包进行基本的日期和数字格式化3. 使用 intl 包进行消息翻译 五、 一个简单的使用示例六、 总结 一、 前言 在全球化的今天&#xff0c;为你的 Flutter 应用添加国…