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

2023-06-17 968点热度 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;
}
}
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");

 

admin

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

文章评论

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