java html 转图片

记录一下需求功能

之前做的模板文件转图片,联系到实际业务需要做很多pdf模板比较麻烦
现用freemarker 处理,将页面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>

代码:

public static void main(String[] args) throws Exception {
		String StrTemplate = "<html>\n" +
                "<head>\n" +
                "<title></title>\n" +
                "</head>\n" +
                "<body>\n" +
                "<form>\n" +
                "姓名:<input type=\"text\" value=\"\" name=\"user\"><br><br>\n" +
                "密码:<input type=\"password\" value=\"\" name=\"pass\"><br><br>\n" +
                "性别:<tr><td>\n" +
                "            <input type=\"radio\" name=\"sex\" value=\"1\">男\n" +
                "            <input type=\"radio\" name=\"sex\" value=\"1\">女\n" +
                "                    </td></tr><br><br>\n" +
                "   喜爱的运动:<br><input type=\"checkbox\" name=\"baskball\" value=\"1\">篮球\n" +
                "                            <input type=\"checkbox\" name=\"football\" value=\"1\">足球\n" +
                "                <input type=\"checkbox\" name=\"baseball\" value=\"1\">棒球\n" +
                "                    <input type=\"checkbox\" name=\"volleyball\" value=\"1\">排球 <br><br>\n" +
                "                <input type=\"submit\"><br><br>\n" +
                "                            <!-- 提交 -->\n" +
                "   地址:<tr><td>\n" +
                "               <select multiple=\"multiple\">\n" +
                "                      <option>北京</option>\n" +
                "        <option>上海</option>\n" +
                "        <option>天津</option>\n" +
                "        <option>深圳</option>\n" +
                "        <option>秦皇岛</option>\n" +
                "             </select>\n" +
                "             </td></tr><br><br>\n" +
                "   个人简介:<br><textarea name=\"info\" cols=\"30\" rows=\"10\">填写信息</textarea><br><br>\n" +
                "     <fieldset>\n" +
                "     <legend>健康信息</legend>\n" +
                "     身高:<input type=\"text\"> 体重:<input type=\"text\">\n" +
                "     </fieldset>\n" +
                "   <input type=\"button\" value=\"提交\">\n" +
                "   <input type=\"button\" value=\"重置\">\n" +
                "</form>\n" +
                "</body>\n" +
                "</html>"; // 测试模板数据(一般存储在数据库中)
		Map<String,Object> map = new HashMap<String,Object>();  // map,需要动态填充的数据
		map.put("name", "张三");//需要赋值的属性   例: ${name}
		FreemarkerUtils.turnImage(StrTemplate,map);
	}

import cz.vutbr.web.css.MediaSpec;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.fit.cssbox.css.CSSNorm;
import org.fit.cssbox.css.DOMAnalyzer;
import org.fit.cssbox.demo.ImageRenderer;
import org.fit.cssbox.layout.BrowserCanvas;
import org.jsoup.Jsoup;
import org.jsoup.helper.W3CDom;
import org.jsoup.nodes.Document;

import javax.imageio.ImageIO;
import java.awt.*;
import java.io.*;
import java.net.URL;
import java.util.Map;

public class FreemarkerUtils {
    private static String mediaType = "screen";
    private static Dimension windowSize = new Dimension(1200, 600);
    private static boolean cropWindow = false;
    private static boolean loadImages = true;
    private static boolean loadBackgroundImages = true;
    
    private static String getTemplate(String template, Map<String, Object> model) throws IOException, TemplateException, NoSuchFieldException {
        if (template == null) {
            return null;
        }
        StringWriter out = new StringWriter();
        new Template("template", new StringReader(template)).process(model, out);
        return out.toString();
    }
    
    public static void turnImage(String template, Map<String, Object> map) throws Exception {
        String html = getTemplate(template, map);
        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);
        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.setAutoMediaUpdate(false);
        contentCanvas.getConfig().setClipViewport(cropWindow);
        contentCanvas.getConfig().setLoadImages(loadImages);
        contentCanvas.getConfig().setLoadBackgroundImages(loadBackgroundImages);
        contentCanvas.createLayout(new Dimension(297, 210));
        OutputStream out = new FileOutputStream("d:\\html111.png");
        ImageIO.write(contentCanvas.getImage(), "png", out);

		/**
		*图片转base64
		*/
		contentCanvas.createLayout(new Dimension(297, 210));
        ImageIO.write(contentCanvas.getImage(), "png", outputStream);
        byte[] bytes = outputStream.toByteArray();
        BASE64Encoder encoder = new BASE64Encoder();
        String string = encoder.encode(bytes);
    }
}

在网上找了好久没找到资料后来发现ImageRenderer里有demo!
相对于pdfbox 用pdf模板的方式改起来方便些

数据库设计及代码逻辑在实现这些功能的基础上再做修改就好了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用JavaHTML换为图片可以使用一些工具或插件。其中,你提到的三个引用中有两个工具可以实现这个功能。 首先,你可以使用html2image工具将HTML换为图片。这个工具可以在Linux/Unix平台上运行,并支持将网页换为BMP、PNG和JPG等格式的图片。你可以在浏览器中打开HTML页面,并调用相应的JavaScript函数来生成图片。 另外,你还可以使用freemarker模板引擎生成文本输出。freemarker是一个基于模板生成文本输出的通用工具,使用Java编写。虽然它主要用于生成HTML Web页面,但也可以用于生成其他类型的文本输出。通过编写适当的模板文件,你可以将HTML换为图片。 以下是一个使用html2image和freemarker的Java示例: ```java import org.htmlrenderer.swing.ImageRenderer; import java.io.File; import java.io.FileOutputStream; public class HtmlToImageConverter { public static void main(String[] args) { try { ImageRenderer renderer = new ImageRenderer(); String url = "https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html"; /* 网络链接的HTML */ FileOutputStream out = new FileOutputStream(new File("D:\\html.png")); /* 生成文件的路径 */ // 使用html2image工具 renderer.renderURL(url, out, ImageRenderer.Type.PNG); /* 将URL网页写入生成文件中 */ // 使用freemarker模板引擎 // 生成HTML文本并写入文件中 // 使用renderer.renderURL方法将HTML文件换为图片 System.out.println("换完成"); } catch (Exception e) { e.printStackTrace(); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值