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");
文章评论