java操作富文本插入到word模板

最近项目有个需求,大致流程是前端保存富文本(html的代码)到数据库,后台需要将富文本代码转成带格式的文字,插入到word模板里,然后将word转成pdf,再由前端调用接口下载pdf文件!

1、思路

这里的主要难点就是将html的格式带入到word里,所以这里要先将格式写入到html里。怎么写入到html里呢?这里提供一下思路,就是把你的word模板先转成html代码,为啥是代码不是html文件呢?因为我要用这个html代码去把富文本插进去,怎么插呢?首先要标记一个替换符在word模板里,这里有了替换符我们就可以用replace把富文本代码替换掉这个替换符,这样富文本就插进去了嘛!然后再把html代码转成word文档,再进行你的逻辑操作就可以了!
总结: 大致意思就是将word模板提取成html代码,再把富文本替换进去,然后把替换完的代码转成word。

2、依赖

主要就是用的aspose-words,因为好用所以一直在用,这里用aspose主要是文件的转换。我的业务逻辑需要把数据放到word指定的位置里,所以我要用替换的方式去替换数据,这里也用到了poi-tl。
贴一下我的版本,这里的aspose我是放到lib里了

依赖想下载的直接去下载:https://download.csdn.net/download/weixin_44953395/88565563
不要积分的


<dependency>
    <groupId>com.asposegroupId>
    <artifactId>aspose-wordsartifactId>
    <version>15.8.0version>
    <scope>systemscope>
    <systemPath>${project.basedir}/lib/aspose-words-15.8.0-jdk16.jarsystemPath>
dependency>

<dependency>
    <groupId>com.deepoovegroupId>
    <artifactId>poi-tlartifactId>
    <version>1.10.4version>
dependency>

3、代码

说了一堆废话,还是得看代码,谁也挡不住复制粘贴!

@Test
public void testDocToHtml() {
    String html = WordToPdfUtil.parseWord2Html("D:\\environment\\idea\\company\\ceshi\\test.docx");
    String fwb = "
  1. 古诗

《南歌子·似带如丝柳》

唐·温庭筠

似带如丝柳,团酥握雪花。

帘卷玉钩斜,九衢尘欲暮,逐香车。

"
; assert html != null; String fwbHtml = html.replaceAll("Fwb1", fwb); System.out.println(fwbHtml); WordToPdfUtil.htmlToWord(fwbHtml.getBytes(StandardCharsets.UTF_8), 20, "D:\\environment\\idea\\company\\ceshi\\ceshi.docx"); }
package com.byqh.utils;

import com.aspose.words.*;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * word转Pdf帮助类
 * 

* 备注:需要引入 aspose-words-15.8.0-jdk16.jar */ public class WordToPdfUtil { private static boolean getLicense() { boolean result = false; try { InputStream is = WordToPdfUtil.class.getClassLoader().getResourceAsStream("license.xml"); License asposeLic = new License(); asposeLic.setLicense(is); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * word转pdf * * @param wordPath 需要被转换的word全路径带文件名 * @param pdfPath 转换之后pdf的全路径带文件名 */ public static void docToPdf(String wordPath, String pdfPath) { // 验证License 若不验证则转化出的pdf文档会有水印产生 if (!getLicense()) { return; } try { long old = System.currentTimeMillis(); //新建一个pdf文档 File file = new File(pdfPath); FileOutputStream os = new FileOutputStream(file); //wordPath是将要被转化的word文档 Document doc = new Document(wordPath); //全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换 doc.save(os, SaveFormat.PDF); long now = System.currentTimeMillis(); os.close(); //转化用时 System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); } catch (Exception e) { e.printStackTrace(); } } /** * word转html文本 * * @param wordPath 需要转换的doc文件 * @return html代码 */ public static String parseWord2Html(String wordPath) { // 验证License 若不验证则转化出的pdf文档会有水印产生 if (!getLicense()) { return null; } HtmlSaveOptions saveOptions = new HtmlSaveOptions(); saveOptions.setExportHeadersFootersMode(ExportHeadersFootersMode.NONE); ByteArrayOutputStream htmlStream = new ByteArrayOutputStream(); String htmlText = ""; try { Document doc = new Document(wordPath); doc.save(htmlStream, saveOptions); htmlText = new String(htmlStream.toByteArray(), StandardCharsets.UTF_8); htmlStream.close(); } catch (Exception e) { System.out.println(e.getMessage()); } return htmlText; } /** * html字节数组转word字节数组 * * @param content html字节数组 * @param toType 值为SaveFormat.DOCX-20或SavaFormat.Doc-10对应的值 * @param filePath 转换完成之后的文件路径 */ public static void htmlToWord(byte[] content, Integer toType, String filePath) { // 验证License 若不验证则转化出的pdf文档会有水印产生 if (!getLicense()) { return; } try { File file = new File(filePath); FileOutputStream os = new FileOutputStream(file); InputStream is = new ByteArrayInputStream(content); Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); InputStreamReader streamReader = new InputStreamReader(is, StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(streamReader); String line; StringBuilder html = new StringBuilder(); while ((line = reader.readLine()) != null) { html.append(line); } reader.close(); builder.insertHtml(String.valueOf(html)); doc.save(os, toType); System.out.println("html转word成功!"); } catch (Exception e) { System.out.println(e.getMessage()); } } }

效果:

替换之前:(这里的Fwb1就是一个标志符)
java操作富文本插入到word模板_第1张图片
替换之后:
java操作富文本插入到word模板_第2张图片
这里的富文本是用的wangeditor,网站是:https://www.wangeditor.com/

写在富文本的样子是下图这样的,总体来说还可以!
java操作富文本插入到word模板_第3张图片

4、替换

替换用的是poi-tl,它的网址说明文档:http://deepoove.com/

@Test
public void testDocTh() throws IOException {
    Map<String, Object> map = new HashMap<>();
    map.put("sj01", "测试-test01");
    map.put("sj02", "测试-test02");
    List<PictureRenderData> list = new ArrayList<>();
    //这里的size设置的是宽和高
    list.add(Pictures.ofStream(new FileInputStream("D:\\environment\\idea\\company\\ceshi\\400X350.png")).size(400, 350).create());
    list.add(Pictures.ofStream(new FileInputStream("D:\\environment\\idea\\company\\ceshi\\400X400.png")).size(400, 400).create());
    for (int i = 0; i < list.size(); i++) {
        map.put("tp0" + (i + 1), list.get(i));
    }
    XWPFTemplate template = XWPFTemplate.compile("D:\\environment\\idea\\company\\ceshi\\test.docx").render(map);
    FileOutputStream out1 = new FileOutputStream("D:\\environment\\idea\\company\\ceshi\\out_template.docx");
    template.write(out1);
    out1.close();
}

替换之前:
java操作富文本插入到word模板_第4张图片
替换之后:
java操作富文本插入到word模板_第5张图片
说明一下,这里的两张图片一个是400X350的一个是400X400的两个大小差不太多,所以大小不太明显!

你可能感兴趣的:(笔记,java,开发语言)