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

java使用word模板填充内容,再生成pdf

1.word模板填充内容

使用EasyPoi写入Word文档。

import cn.afterturn.easypoi.word.WordExportUtil;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class WriteWordtemplate {


    public static void main(String[] args) throws Exception {
        Map<String, Object> params = createDate();
        String sourceFile = "d:/temp/模版word3.docx";
        String targetFile = "d:/temp/输出结果3.docx";
        FileOutputStream fos = null;
        try {
            //获取模板文档
            File templateFile = new File(sourceFile);
            System.out.println(templateFile.getName());
            // 写入word
            XWPFDocument doc = WordExportUtil.exportWord07(templateFile.getPath(), params);
            fos = FileUtils.openOutputStream(new File(targetFile));
            doc.write(fos);
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            IOUtils.closeQuietly(fos);
        }
    }

    private static Map<String, Object> createDate() {

        //填充数据
        List<WordExportBatch> resultList = new ArrayList<>();
        WordExportBatch wordExport = new WordExportBatch();
        WordExportBatch wordExport1 = new WordExportBatch();
        wordExport.setCreateDate("2022/9/30");
        wordExport1.setCreateDate("2022/9/28");
        wordExport.setNumber("11");
        wordExport.setExMoneny("11");
        wordExport.setExFunc("支付宝");
        wordExport1.setNumber("15");
        wordExport.setAmount("1234.5");
        wordExport1.setAmount("2345.77");
        wordExport.setEndDate("2022/12/31");
        wordExport1.setEndDate("2022/11/30");
        wordExport.setType("支付宝");
        wordExport1.setType("微信");
        wordExport1.setExMoneny("22");
        wordExport1.setExFunc("微信");
        resultList.add(wordExport);
        resultList.add(wordExport1);
        //准备数据
        Map<String, Object> params = new HashMap<>();
        params.put("number", "112");
        params.put("amount", "1234.5");
        params.put("endDate", "2022/11/30");
        params.put("resultList", resultList);
        return params;
    }

}

pom依赖可以参考https://blog.csdn.net/u011067966/article/details/134293480#comments_36351020

把word转换为pdf

word生成pdf的方法比较多,调研了常用的方式

  1. 一种方式是部署一台windowserver,对外提供接口来进行生成,能最大程度还原格式。
  2. 第二种方式就是利用jodconverter,会有少许的失真。

现在介绍的是基于jodconverter把word转换为PDF。首先引入jar包

 <!--jodconverter-->
        <dependency>
            <groupId>org.jodconverter</groupId>
            <artifactId>jodconverter-local</artifactId>
            <version>4.2.2</version>
        </dependency>

        <!--springboot支持包,里面包括了自动配置类 -->
        <dependency>
            <groupId>org.jodconverter</groupId>
            <artifactId>jodconverter-spring-boot-starter</artifactId>
            <version>4.2.2</version>
        </dependency>

在配置文件中加入如下配置

jodconverter:
  local:
    enabled: true             # 启用本地模式
    office-home: /opt/libreoffice7.5    # LibreOffice 的安装路径
    max-tasks-per-process: 10 # 每个 Office 进程处理的最大任务数
    port-numbers: 8202        # LibreOffice 后台服务使用的端口号

在处理类中注入,之所以使用@Lazy是因为加载的使用会报错,让它延迟加载。

 	@Lazy
   @Autowired
   private DocumentConverter converter;
    
 public void wordConvertToPdf(File wordFile, File pdfFile) {
        try {
            logger.info("word转换pdf开始");
            converter.convert(wordFile).to(pdfFile).execute();
            logger.info("word转换pdf结束");
        } catch (Exception e) {
            logger.error("word转pdf异常", e);
        }
    }

后续使用

之前写过word模板生成段落和生成表格的段落。
结合起来就能生成相对完整的word了。后续如果需要盖章什么的直接拿生成的pdf文件就可以了。

相关文章:

  • autojs例子之webView的UA切换
  • Java中的日志框架:Log4j2 vs SLF4J vs Logback
  • 【力扣】2621. 睡眠函数——认识Promise
  • JAVA若依框架
  • 在 Vue 3 中,如何缓存和复用动态组件
  • 微服务2025/2/15
  • 前缀和算法:解锁高效编程的钥匙
  • Leetcode---83.删除排序链表中的重复元素
  • 谷歌GMS认证,安卓14版本的谷歌EDLA认证详细介绍,谷歌安卓14 EDLA认证有多少测试项?
  • 2025年软考报名费用是多少?全国费用汇总!
  • HDFS数据存储与数据管理
  • Facebook Instant Game:即时游戏的新时代
  • JVM 简单内存结构及例子
  • 某住宅小区地下车库安科瑞的新能源汽车充电桩的配电设计与应用方案 安科瑞 耿笠
  • 算法系列之回溯算法
  • 35. Spring Boot 2.1.3.RELEASE 应用监控【监控信息可视化】
  • Python - Python连接数据库
  • 十一、k8s安全机制
  • Java篇之继承
  • 防御保护-----第五章:状态检测和会话技术
  • 做自媒体的有哪些素材网站/discuz论坛seo设置
  • 网站建设服务哪家有/app推广拉新接单平台
  • 网站建设的主题什么比较好/百度网址大全网址导航
  • 游戏网站搭建需要多少钱/百度权重什么意思
  • 山东网站制作/产品市场推广方案范文
  • 怎样把自己做的网站发布/武汉百度网站优化公司