poi-tl-ext将html转成docx实现自定义tag转分页符

2023-06-17 362点热度 0人点赞 0条评论

Java语言将html转换成docx文件,我们使用了Apache POIpoi-tlpoi-tl-ext

基本上大部分的html都能转成docx了,不过还需要一个需求,就是需要将docx文件内容,在特定某一处地方实现分页。

通过查找和自己的研究,实现了在html增加一个特殊的标签,例如:<pbr/> 可以将这个标签在转换成docx的时候,换成分页。

PageBreakRenderer.java

import org.apache.poi.xwpf.usermodel.BreakType;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.ddr.poi.html.ElementRenderer;
import org.ddr.poi.html.HtmlRenderContext;
import org.jsoup.nodes.Element;

import java.util.List;

/**
 * @author Terry E-mail: yaoxinghuo at 126 dot com
 * @date 2023/5/9 21:12
 * @description
 */
public class PageBreakRenderer implements ElementRenderer {
    private static final String[] TAGS = {"pbr"};

    /**
     * 开始渲染
     *
     * @param element HTML元素
     * @param context 渲染上下文
     * @return 是否继续渲染子元素
     */
    @Override
    public boolean renderStart(Element element, HtmlRenderContext context) {
        List<XWPFRun> runs = context.getClosestParagraph().getRuns();
        if (runs.size() > 0) {
            runs.get(0).addBreak();
            runs.get(0).addBreak(BreakType.PAGE);
        }
        return true;
    }

    @Override
    public String[] supportedTags() {
        return TAGS;
    }

    @Override
    public boolean renderAsBlock() {
        return true;
    }
}

使用方式:

HtmlRenderConfig config = new HtmlRenderConfig();
List<ElementRenderer> elementRenderers = new ArrayList<>();
// html里面增加<pbr/>就能显示出分页符
elementRenderers.add(new PageBreakRenderer());
config.setCustomRenderers(elementRenderers);

HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy(config);
Configure configure = Configure.builder()
        .bind("key", htmlRenderPolicy)
        .build();
Map<String, Object> data = new HashMap<>();
data.put("key", "<p>Hello <b>world</b>!</p>");
XWPFTemplate.compile("input.docx", configure).render(data).writeToFile("output.docx");

 

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论