Java语言将html转换成docx文件,我们使用了Apache POI、poi-tl、poi-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");
文章评论