freemarker框架生成图片使用
// 模板代码Document ! Es importante que conserves el numero de folio del comp rob ante.
Puedes solicitar que el Punto RABEE te lo envie o tomar fotos de esta pantalla.
Comp rob ante de Dropoff
${misSendOutScanRecord.serialNumberTime}
34guias
Punto RABEE:${misSendOutScanRecord.deptName}.${misSendOutScanRecord.deptId}
Responsable:${misSendOutScanRecord.operator}.${misSendOutScanRecord.createBy}
Folio
${misSendOutScanRecord.serialNumber}Numeros de guia RABEE
<#if waybillNos??> <#foreach waybillNo in waybillNos> ${waybillNo} #foreach> #if>
package com.rabee.common.utils;
import com.lowagie.text.pdf.BaseFont;
import com.rabee.common.utils.http.HttpUtils;
import com.rabee.common.utils.image.B64ImgReplacedElementFactory;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.springframework.stereotype.Component;
import org.w3c.dom.Document;
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.xhtmlrenderer.swing.Java2DRenderer;
import org.xhtmlrenderer.util.FSImageWriter;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Base64;
import java.util.Map;
import java.util.UUID;
public class FreemarkerUtils {
private String getTemplate(String template, Map map) throws IOException, TemplateException {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_25);
cfg.setClassForTemplateLoading(this.getClass(), "/template/image");
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
cfg.setLogTemplateExceptions(false);
Template temp = cfg.getTemplate(template);
StringWriter stringWriter = new StringWriter();
temp.process(map, stringWriter);
stringWriter.flush();
stringWriter.close();
String resutl = stringWriter.getBuffer().toString();
return resutl;
}
public byte[] generate(String template, Map map)throws Exception {
String html = getTemplate(template, map);
byte[] bytes=html.getBytes();
ByteArrayInputStream bin=new ByteArrayInputStream(bytes);
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse(bin);
Java2DRenderer renderer = new Java2DRenderer(document,480,-1);
BufferedImage img = renderer.getImage();
return imageToBytes(img);
}
private byte[] imageToBytes(BufferedImage bImage) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ImageIO.write(bImage, "png", out);
} catch (IOException e) {
//log.error(e.getMessage());
}
return out.toByteArray();
}
public String turnImage(String template, Map map, HttpServletResponse response) throws Exception {
String html = getTemplate(template, map);
byte[] bytes=html.getBytes();
ByteArrayInputStream bin=new ByteArrayInputStream(bytes);
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse(bin);
Java2DRenderer renderer = new Java2DRenderer(document,480,850);
BufferedImage img = renderer.getImage();
// 生成图片名字
String uuid = UUID.randomUUID().toString();
renderer.getSharedContext().setReplacedElementFactory(new B64ImgReplacedElementFactory());
renderer.getSharedContext().getTextRenderer().setSmoothingThreshold(1);
BufferedImage image = renderer.getImage();
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
// 可以输出到流
ImageIO.write(image, "jpg", outputStream);
// 也可以直接保存到文件
ImageIO.write(image, "jpg", new File("E:\java\"+ uuid + ".jpg"));
return Base64.getEncoder().encodeToString(outputStream.toByteArray());
} catch (Exception e) {
throw new Exception("桌牌图片转换失败");
}
}
public String turnImage(String template, Map map, int width, int height) throws Exception {
String html = getTemplate(template, map);
byte[] bytes=html.getBytes();
ByteArrayInputStream bin=new ByteArrayInputStream(bytes);
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse(bin);
Java2DRenderer renderer = new Java2DRenderer(document,width,height);
BufferedImage img = renderer.getImage();
// response.setContentType("image/jpeg;charset=UTF-8");
// response.setDateHeader("expries", -1);
// response.setHeader("Cache-Control", "no-cache");
// response.setHeader("Pragma", "no-cache");
// ImageIO.write(img, "jpg", response.getOutputStream());
// final FSImageWriter imageWriter = new FSImageWriter();
// imageWriter.setWriteCompressionQuality(1.0f);
// 生成图片名字
String uuid = UUID.randomUUID().toString();
// 输出路径
// imageWriter.write(img, "E:\java\" + uuid + ".jpg");
// ImageIO.write(img, "jpg", response.getOutputStream());
renderer.getSharedContext().setReplacedElementFactory(new B64ImgReplacedElementFactory());
renderer.getSharedContext().getTextRenderer().setSmoothingThreshold(1);
BufferedImage image = renderer.getImage();
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
// 可以输出到流
ImageIO.write(image, "jpg", outputStream);
// 也可以直接保存到文件
ImageIO.write(image, "jpg", new File("E:\java\"+ uuid + ".jpg"));
return Base64.getEncoder().encodeToString(outputStream.toByteArray());
} catch (Exception e) {
throw new Exception("桌牌图片转换失败");
}
}
public ByteArrayOutputStream createPDF(Map data, String templateFileName) throws Exception {
// 创建一个FreeMarker实例, 负责管理FreeMarker模板的Configuration实例
Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
// 指定FreeMarker模板文件的位置
cfg.setClassForTemplateLoading(this.getClass(), "/template/ceetificate/");
ITextRenderer renderer = new ITextRenderer();
OutputStream out = new ByteArrayOutputStream();
try {
// 设置 css中 的字体样式(暂时仅支持宋体和黑体) 必须,不然中文不显示
renderer.getFontResolver().addFont("/template/ceetificate/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// 设置模板的编码格式
cfg.setDefaultEncoding("UTF-8");
// 获取模板文件
Template template = cfg.getTemplate(templateFileName, "UTF-8");
StringWriter writer = new StringWriter();
// 将数据输出到html中
template.process(data, writer);
writer.flush();
String html = writer.toString();
// 把html代码传入渲染器中
renderer.getSharedContext().setReplacedElementFactory(new B64ImgReplacedElementFactory());
renderer.getSharedContext().getTextRenderer().setSmoothingThreshold(0);
renderer.setDocumentFromString(html);
System.setProperty("java.net.useSystemProxies", "true");
renderer.layout();
renderer.createPDF(out, false);
renderer.finishPDF();
out.flush();
return (ByteArrayOutputStream)out;
} finally {
if(out != null){
out.close();
}
}
}
public static void main(String[] args) {
String res = HttpUtils.sendGet("https://maps.googleapis.com/maps/api/staticmap","center=20.7140616,-103.3612198&size=600x300&markers=color:red%7C20.7140616,-103.3612198&key=AIzaSyCauC0gY3UaaBEuzsic78QdzZWvcgTPJ6w");
System.out.println(res);
}
}



