引入jar html转图片
<dependency>
<groupId>net.sf.cssbox</groupId>
<artifactId>cssbox</artifactId>
<version>4.14</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
public Long baseProve(Object obj) throws Exception {
Class<?> cla = obj.getClass();
Map<String, Object> map = JSONObject.parseObject(JSON.toJSONString(obj), Map.class);
//选择模板
ProveTemplateEntity entity = proveTemplateDao.selectOne(new QueryWrapper<ProveTemplateEntity>().eq("entity", cla.getName()));
if (null == entity) {
return null;
}
ProveDto proveDto = new ProveDto();
FreemarkerUtils.turnImage(entity.getTemplate(), map);
proveDto.setInstruction(resultMap.get(FreemarkerUtils.INSTRUCTION));
proveDto.setValue(resultMap.get(FreemarkerUtils.TEMPLATE_VALUE));
super.save(proveDto);
return proveDto.getId();
}
public class FreemarkerUtils {
private static String mediaType = "screen";
private static Dimension windowSize = new Dimension(672, 1032);
private static boolean cropWindow = false;
private static boolean loadImages = true;
private static boolean loadBackgroundImages = true;
public static final String INSTRUCTION = "instruction";
public static final String TEMPLATE_VALUE = "value";
public FreemarkerUtils() {
}
public void setMediaType(String media) {
this.mediaType = new String(media);
}
public void setWindowSize(Dimension size, boolean crop) {
this.windowSize = new Dimension(size);
this.cropWindow = crop;
}
public void setLoadImages(boolean content, boolean background) {
this.loadImages = content;
this.loadBackgroundImages = background;
}
private static String getTemplate(String template, Map<String, Object> model) throws IOException, TemplateException {
if (null == template) {
return null;
}
StringWriter out = new StringWriter();
new Template("template", new StringReader(template)).process(model, out);
return out.toString();
}
public static Map<String, String> turnImage(String template, Map<String, Object> map) throws Exception {
String html = getTemplate(template, map);
if (StringUtils.isEmpty(html)) {
return null;
}
Document document = Jsoup.parse(html);
W3CDom w3CDom = new W3CDom();
org.w3c.dom.Document w3cDoc = w3CDom.fromJsoup(document);
DOMAnalyzer da = new DOMAnalyzer(w3cDoc, null);
MediaSpec media = new MediaSpec(mediaType);
media.setDimensions((float) windowSize.width, (float) windowSize.height);
media.setDeviceDimensions((float) windowSize.width, (float) windowSize.height);
media.setResolution(300);
da.setMediaSpec(media);
da.attributesToStyles();
da.addStyleSheet((URL) null, CSSNorm.stdStyleSheet(), DOMAnalyzer.Origin.AGENT);
da.addStyleSheet((URL) null, CSSNorm.userStyleSheet(), DOMAnalyzer.Origin.AGENT);
da.addStyleSheet((URL) null, CSSNorm.formsStyleSheet(), DOMAnalyzer.Origin.AGENT);
da.getStyleSheets();
BrowserCanvas contentCanvas = new BrowserCanvas(w3cDoc.getDocumentElement(), da, null);
contentCanvas.setFont(Font.getFont("宋体"));
contentCanvas.setAutoMediaUpdate(false);
contentCanvas.getConfig().setClipViewport(cropWindow);
contentCanvas.getConfig().setUseHTML(false);
contentCanvas.getConfig().setLoadImages(loadImages);
contentCanvas.getConfig().setLoadBackgroundImages(loadBackgroundImages);
contentCanvas.createLayout(windowSize);
ImageIO.write(contentCanvas.getImage(), "png", outputStream);
byte[] bytes = outputStream.toByteArray();
BASE64Encoder encoder = new BASE64Encoder();
resultMap.put(INSTRUCTION, encoder.encode(bytes));
resultMap.put(TEMPLATE_VALUE, html);
return resultMap;
}
}