java 富文本(含图片)导出为docx文件,以及docx文件的合并

2024-06-18 06:28

本文主要是介绍java 富文本(含图片)导出为docx文件,以及docx文件的合并,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

应用场景:

本身是用easypoi来进行导出docx文件的,但是发现easypoi 不支持导出富文本格式。于是有了此场景。

解决思路:

  1. 先把富文本(含图片)内容转为docx文件。
  2. 将easypoi导出的文件 与 富文本转出的docx文件 合并。
  3. 获取到最终文件
  4. 注释清楚的一批,又不会的直接留言。不经常看,回复的可能不及时

使用工具:
使用了e-iceblue依赖,来进行对docx文档的操作(富文本转docx,合并文档)。(缺点就是有水印,需要去除文档中的水印)

用到的依赖(应该有多余的):

 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.1.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.1.0</version></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.13.1</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version></dependency><dependency><groupId>e-iceblue</groupId><artifactId>spire.doc</artifactId><version>12.4.1</version></dependency>
<!--poi--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-examples</artifactId><version>3.14</version></dependency></dependencies><repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>http://repo.e-iceblue.cn/repository/maven-public/</url></repository></repositories>

富文本转为docx文档

 /*** 富文本导出为docx文档* @param htmlContext 富文本内容* @param temporaryFileName  导出的临时文件名称* @param titleName  这一块富文本内容的标题,看自己需求* @return* @throws IOException*/private String htmlStringToWord(String htmlContext, String temporaryFileName, String titleName) throws IOException {
//        替换img 标签中  src的代理路径,换成自己的 profile为我图片的保存路径,自己替换htmlContext = htmlContext.replace("/dev-api/profile", profile).replace("/prod-api/profile", profile).replace("http://localhost", "");//临时保存文件路径String filePath = profile + temporaryFilePath + temporaryFileName + ".docx";//新建Document对象com.spire.doc.Document document = new com.spire.doc.Document();
//         在此docx文件中 创一个标题样式-可以不要ParagraphStyle style1 = new ParagraphStyle(document);style1.setName("titleStyle");style1.getCharacterFormat().setBold(true);style1.getCharacterFormat().setFontSize(16f);style1.getCharacterFormat().setFontName("Times New Roman");document.getStyles().add(style1);//添加sectionSection sec = document.addSection();//        先新增一个标题 可以不要Paragraph para1 = sec.addParagraph();
//        titleName 为 方法传入 可以不要para1.appendText(titleName);para1.applyStyle("titleStyle");//        img标签的 正则表达式String imgPattern = "<img\\s+[^>]*src=\"([^\"]*)\"[^>]*>";Pattern pattern = Pattern.compile(imgPattern);Matcher matcher = pattern.matcher(htmlContext);//        创建表格Table table = sec.addTable(true);
//        只有一个单元格table.resetCells(1,1);// 获取左页边距float leftMargin = sec.getPageSetup().getMargins().getLeft();// 获取右页边距float rightMargin = sec.getPageSetup().getMargins().getRight();double pageWidth = sec.getPageSetup().getPageSize().getWidth() - leftMargin - rightMargin;//        获取第(1,1)单元格TableCell cell = table.getRows().get(0).getCells().get(0);int lastIndex = 0;while (matcher.find()) {// 获取 img 标签之前的 HTML 片段String textBeforeImg = htmlContext.substring(lastIndex, matcher.start());// 添加 HTML 片段到段落Paragraph textParagraph = cell.addParagraph();textParagraph.appendHTML(textBeforeImg);// 获取 src 属性的值String imgSrc = matcher.group(1);// 添加图片到新段落Paragraph imgParagraph = cell.addParagraph();DocPicture picture = new DocPicture(document);picture.loadImage(imgSrc);imgParagraph.getChildObjects().insert(0, picture);// 更新 lastIndexlastIndex = matcher.end();}
//        新增表格的段落Paragraph remainingTextParagraph = cell.addParagraph();remainingTextParagraph.appendHTML(htmlContext.substring(lastIndex));
//        表格宽度table.getRows().get(0).getCells().get(0).setCellWidth((float)(pageWidth * 1.3), CellWidthType.Point);//文档另存为docxdocument.saveToFile(filePath, FileFormat.Docx);return filePath;}

合并文档

/*** 合并文档  另起一页合并* @param filePath1  最终留存文件路径* @param filePath2 被合并文档路径* @return*/private String mergeDocx(String filePath1, String filePath2, String finalFilePath){//创建 Document 类的对象并从磁盘加载 Word 文档com.spire.doc.Document document = new com.spire.doc.Document(filePath1);//将另一个文档插入当前文档document.insertTextFromFile(filePath2, FileFormat.Docx);//保存结果文档document.saveToFile(finalFilePath, FileFormat.Docx);return finalFilePath;}/*** 合并文档  内容合并  不另起一页* @param filePath1  最终留存文件路径* @param filePath2 被合并文档路径* @return*/private String mergeDocxFile(String filePath1, String filePath2, String finalFilePath){com.spire.doc.Document document1  = new com.spire.doc.Document(filePath1);com.spire.doc.Document document2  = new com.spire.doc.Document(filePath2);//在第二个文档中循环获取所有节for (Object sectionObj : (Iterable) document2.getSections()) {Section sec=(Section)sectionObj;//在所有节中循环获取所有子对象for (Object docObj :(Iterable ) sec.getBody().getChildObjects()) {DocumentObject obj=(DocumentObject)docObj;//获取第一个文档的最后一节Section lastSection = document1.getLastSection();//将所有子对象添加到第一个文档的最后一节中Body body = lastSection.getBody();body.getChildObjects().add(obj.deepClone());}}//保存结果文档document1.saveToFile(finalFilePath, FileFormat.Docx);return finalFilePath;}

这篇关于java 富文本(含图片)导出为docx文件,以及docx文件的合并的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071543

相关文章

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Spring Cloud之注册中心Nacos的使用详解

《SpringCloud之注册中心Nacos的使用详解》本文介绍SpringCloudAlibaba中的Nacos组件,对比了Nacos与Eureka的区别,展示了如何在项目中引入SpringClo... 目录Naacos服务注册/服务发现引⼊Spring Cloud Alibaba依赖引入Naco编程s依

java导出pdf文件的详细实现方法

《java导出pdf文件的详细实现方法》:本文主要介绍java导出pdf文件的详细实现方法,包括制作模板、获取中文字体文件、实现后端服务以及前端发起请求并生成下载链接,需要的朋友可以参考下... 目录使用注意点包含内容1、制作pdf模板2、获取pdf导出中文需要的文件3、实现4、前端发起请求并生成下载链接使

Java springBoot初步使用websocket的代码示例

《JavaspringBoot初步使用websocket的代码示例》:本文主要介绍JavaspringBoot初步使用websocket的相关资料,WebSocket是一种实现实时双向通信的协... 目录一、什么是websocket二、依赖坐标地址1.springBoot父级依赖2.springBoot依赖

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

什么是 Java 的 CyclicBarrier(代码示例)

《什么是Java的CyclicBarrier(代码示例)》CyclicBarrier是多线程协同的利器,适合需要多次同步的场景,本文通过代码示例讲解什么是Java的CyclicBarrier,感... 你的回答(口语化,面试场景)面试官:什么是 Java 的 CyclicBarrier?你:好的,我来举个例