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