第一次尝试:用awt 包将HTML源码转换为图片

优点:不依赖任何外部JAR包,缺点:对CSS的支持比较差,复杂点的样式就无法展示,且不支持外部引入的CSS和写在style中的CSS,只能写在标签上

Eg:

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.util.ArrayList;

import java.util.UUID;

import javax.swing.JTextPane;

import javax.swing.border.EmptyBorder;

import javax.swing.plaf.basic.BasicEditorPaneUI;

import org.apache.commons.io.FileUtils;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import com.sun.image.codec.jpeg.JPEGCodec;

import com.sun.image.codec.jpeg.JPEGEncodeParam;

import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class GraphUtils {

private final static Log log = LogFactory.getLog(GraphUtils.class);

public static int DEFAULT_IMAGE_WIDTH = 1000;

//默认值最好设置大点,因为我们再导之前,不知道这个流有多大,如果过小,则生成的图片后面的为黑色,因为流没有读取完整

public static int DEFAULT_IMAGE_HEIGHT = 200;

public static boolean paintPage(Graphics g, int hPage, int pageIndex, JTextPane panel) {

Graphics2D g2 = (Graphics2D) g;

Dimension d = ((BasicEditorPaneUI) panel.getUI()).getPreferredSize(panel);

double panelHeight = d.height;

double pageHeight = hPage;

int totalNumPages = (int) Math.ceil(panelHeight / pageHeight);

g2.translate(0f, -(pageIndex - 1) * pageHeight);

panel.paint(g2);

boolean ret = true;

if (pageIndex >= totalNumPages) {

ret = false;

return ret;

}

return ret;

}

/**

* 将BufferedImage转换为图片的信息

*/

public static String toJpeg(BufferedImage image) {

// 获取图片文件的在服务器的路径

String imageName = "G:\\" + UUID.randomUUID().toString() + ".jpg";

try {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos);

JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);

param.setQuality(1.0f, false);

encoder.setJPEGEncodeParam(param);

encoder.encode(image);

byte[] buff = baos.toByteArray();

baos.close();

// 将字节流写入文件保存为图片

FileUtils.writeByteArrayToFile(new File(imageName), buff);

} catch (Exception ex) {

log.error("保存删除图片失败:" + ex.getMessage());

}

return imageName;

}

/**

* html转换为jpeg文件

* @param bgColor 图片的背景色

* @param html html的文本信息

* @param width 显示图片的Text容器的宽度

* @param height 显示图片的Text容器的高度

* @param eb 設置容器的边框

* @return

* @throws Exception

*/

private static ArrayList html2jpeg(Color bgColor, String html, int width, int height, EmptyBorder eb)

throws Exception {

ArrayList ret = new ArrayList();

try {

JTextPane tp = new JTextPane();

tp.setSize(width, height);

if (eb == null) {

eb = new EmptyBorder(0, 50, 0, 50);

}

if (bgColor != null) {

tp.setBackground(bgColor);

}

if (width <= 0) {

width = DEFAULT_IMAGE_WIDTH;

}

if (height <= 0) {

height = DEFAULT_IMAGE_HEIGHT;

}

tp.setBorder(eb);

tp.setContentType("text/html");

tp.setText(html);

int pageIndex = 1;

boolean bcontinue = true;

while (bcontinue) {

BufferedImage image = new java.awt.image.BufferedImage(width, height,

java.awt.image.BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics();

g.setClip(0, 0, width, height);

bcontinue = paintPage(g, height, pageIndex, tp);

g.dispose();

String path = toJpeg(image);

ret.add(path);

pageIndex++;

}

} catch (Exception ex) {

throw ex;

}

return ret;

}

/**

* 将一個html转换为图片

* @param htmls

* @return

* @throws Exception

*/

public static ArrayList toImages(String html) throws Exception {

return html2jpeg(Color.white, html, DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT, new EmptyBorder(0, 0, 0, 0));

}

TestCase:

@RunWith(SpringJUnit4ClassRunner.class)

@WebAppConfiguration

@ContextConfiguration(locations = { "classpath*:spring/application.xml", "classpath*:spring/plugin-*.xml" })

public class GraphUtilsTest extends TestCase {

@Autowired

private TaskService taskService;

@Autowired

private VelocitySimpleRelolver velocitySimpleRelolver;

@Test

public void testHtml2Image() {

try {

String imageTemplateFile = "mail/weekly/mile_schedule_task.vm";

//邮件内容

Map velocityData = new HashMap();

String projId = "6a9fb54e3439453e86e819a4d46fdafb";

MileSchedule mileSchedule = taskService.getMileSchedule(projId);

velocityData.put("mileSchedule", mileSchedule);

String htmlstr = velocitySimpleRelolver.relolve(imageTemplateFile, velocityData);

Assert.assertNotNull(htmlstr);

GraphUtils.toImages(htmlstr);

} catch (Exception e) {

e.printStackTrace();

}

}

}

Second: 利用html2image组件

优点:方便,代码简单缺点:CSS支持极差,比不上Java自身的转化

maven引入:

gui.ava

html2image

0.9

TestCase:

@RunWith(SpringJUnit4ClassRunner.class)

@WebAppConfiguration

@ContextConfiguration(locations = { "classpath*:spring/application.xml", "classpath*:spring/plugin-*.xml" })

public class Html2ImageTest extends TestCase {

@Autowired

private TaskService taskService;

@Autowired

private VelocitySimpleRelolver velocitySimpleRelolver;

@Test

public void testHtml2Image() {

try {

String imageTemplateFile = "mail/weekly/mile_schedule_task.vm";

//邮件内容

Map velocityData = new HashMap();

String projId = "6a9fb54e3439453e86e819a4d46fdafb";

MileSchedule mileSchedule = taskService.getMileSchedule(projId);

velocityData.put("mileSchedule", mileSchedule);

String htmlstr = velocitySimpleRelolver.relolve(imageTemplateFile, velocityData);

System.out.println(htmlstr);

Assert.assertNotNull(htmlstr);

String imageName = "G:/weekly_mile_" + projId + ".png";

HtmlImageGenerator imageGenerator = new HtmlImageGenerator();

imageGenerator.setSize(new Dimension(1000, 200));

imageGenerator.loadHtml(htmlstr);

imageGenerator.getBufferedImage();

imageGenerator.saveAsImage(imageName);

} catch (Exception e) {

e.printStackTrace();

}

}

@Test

public void testImage() {

HtmlImageGenerator imageGenerator = new HtmlImageGenerator();

imageGenerator.setSize(new Dimension(1000, 200));

imageGenerator.loadUrl("http://www.baidu.com");

imageGenerator.getBufferedImage();

imageGenerator.saveAsImage("G:/aaa.png");

}

} Third:DJNativeSwing

参考:http://blog.csdn.net/cping1982/article/details/5353049

其中:JAR包下载地址:

此地址下down org.eclipse.swt 包,选择适合你的开发环境

注意:swt 包针对不同的环境有不同的要求,windows与Linux下的不同,使用maven引入时采用properties方式,将下载的包放入你的maven库,然后在POM中进行maven引入

eg:

chrriis.dj.nativeswing

DJNativeSwing

1.0.2

chrriis.dj.nativeswing.swt

DJNativeSwing-SWT

1.0.2

${swt.groupId}

${swt.artifactId}

4.3

import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.util.concurrent.Semaphore;

import javax.imageio.ImageIO;

import javax.swing.JPanel;

import chrriis.dj.nativeswing.swtimpl.NativeComponent;

import chrriis.dj.nativeswing.swtimpl.NativeInterface;

import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;

import chrriis.dj.nativeswing.swtimpl.components.WebBrowserAdapter;

import chrriis.dj.nativeswing.swtimpl.components.WebBrowserEvent;

public class DJNativeSwingUtils extends JPanel {

private static final long serialVersionUID = 8675106494733722832L;

// 行分隔符

final static public String LS = System.getProperty("line.separator", "/n");

// 文件分割符

final static public String FS = System.getProperty("file.separator", "//");

//以javascript脚本获得网页全屏后大小

final static StringBuffer jsDimension;

static {

jsDimension = new StringBuffer();

jsDimension.append("var width = 0;").append(LS);

jsDimension.append("var height = 0;").append(LS);

jsDimension.append("if(document.documentElement) {").append(LS);

jsDimension.append(" width = Math.max(width, document.documentElement.scrollWidth);").append(LS);

jsDimension.append(" height = Math.max(height, document.documentElement.scrollHeight);").append(LS);

jsDimension.append("}").append(LS);

jsDimension.append("if(self.innerWidth) {").append(LS);

jsDimension.append(" width = Math.max(width, self.innerWidth);").append(LS);

jsDimension.append(" height = Math.max(height, self.innerHeight);").append(LS);

jsDimension.append("}").append(LS);

jsDimension.append("if(document.body.scrollWidth) {").append(LS);

jsDimension.append(" width = Math.max(width, document.body.scrollWidth);").append(LS);

jsDimension.append(" height = Math.max(height, document.body.scrollHeight);").append(LS);

jsDimension.append("}").append(LS);

jsDimension.append("return width + ':' + height;");

}

public static JPanel createContent(String htmlStr, final String fileName, final Semaphore semp) {

//浏览器面板

JPanel webBrowserPanel = new JPanel(new BorderLayout());

//swing的内嵌浏览器

final JWebBrowser webBrowser = new JWebBrowser();

//隐藏所有的栏

webBrowser.setBarsVisible(false);

//向浏览器写入html内容

webBrowser.setHTMLContent(htmlStr);

//将浏览器嵌入浏览器面板

webBrowserPanel.add(webBrowser, BorderLayout.CENTER);

//向浏览器增加监听事件

webBrowser.addWebBrowserListener(new WebBrowserAdapter() {

// 监听加载进度

public void loadingProgressChanged(WebBrowserEvent e) {

// 当加载完毕时

if (e.getWebBrowser().getLoadingProgress() == 100) {

try {

//执行JS获取图片的宽度,高度

String result = (String) webBrowser.executeJavascriptWithResult(jsDimension.toString());

int index = result == null ? -1 : result.indexOf(":");

NativeComponent nativeComponent = webBrowser.getNativeComponent();

//获取图片的原始尺寸

Dimension originalSize = nativeComponent.getSize();

//根据JS返回结果设定新的图片尺寸

Dimension imageSize = new Dimension(Integer.parseInt(result.substring(0, index)), Integer

.parseInt(result.substring(index + 1)));

//计算图片的新尺寸

imageSize.width = Math.max(originalSize.width, imageSize.width);

imageSize.height = Math.max(originalSize.height, imageSize.height);

nativeComponent.setSize(imageSize);

//创建一个不带透明色的BufferedImage对象

BufferedImage image = new BufferedImage(imageSize.width, imageSize.height,

BufferedImage.TYPE_INT_RGB);

//对浏览器中图片进行绘色

nativeComponent.paintComponent(image);

//截图

image = image.getSubimage(0, 0, imageSize.width - 25, imageSize.height);

try {

// 输出图像

ImageIO.write(image, "jpg", new File(fileName));

} catch (IOException ex) {

ex.printStackTrace();

}

} finally {

// 退出操作 :释放线程

NativeInterface.close();

semp.release();

}

}

}

});

return webBrowserPanel;

}

} service调用:

private String createImage(final String htmlStr, final Semaphore semaphore) {

final String fileName = FileUtils.getNewFileName("jpg");

NativeInterface.open();

UIUtils.setPreferredLookAndFeel();

SwingUtilities.invokeLater(new Runnable() {

public void run() {

// SWT组件转Swing组件,不初始化父窗体将无法启动webBrowser

JFrame frame = new JFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 加载指定页面

frame.getContentPane().add(DJNativeSwingUtils.createContent(htmlStr, fileName, semaphore),

BorderLayout.CENTER);

// 仅初始化,但不显示

frame.invalidate();

frame.pack();

frame.setVisible(false);

}

});

// 在MAC上使用时,因为MAC不支持双进程,仅支持进程内模式,调用此方法进行事件调度。windows和Linux可以忽略此事件调度

//NativeInterface.runEventPump();

return new File(fileName).getAbsolutePath();

}

private int fillPicture(HSSFSheet sheet, Report report, int startRow) throws IOException {

if(null == weekly.getMileSchedule()){

return startRow + 1;

}

// 将高度设置为图片的高度

HSSFRow pictureRow = sheet.getRow(startRow);

pictureRow.setHeightInPoints(162);

String htmlStr = this.createHtml(report);

String imagePath = null;

final Semaphore semp = new Semaphore(1);//设置信号量

try {

semp.acquire();

// 子线程生成图片

imagePath = this.createImage(htmlStr, semp);

// 等待子线程释放信号量

semp.acquire();

} catch (InterruptedException e) {

LOG.error("", e);

} finally {

semp.release();

}

try {

ExcelExportUtils.insertPicture(sheet, startRow, (short) 0, (short) 15, imagePath);

} catch (Exception e) {

e.printStackTrace();

} finally {

// delete 文件

new File(imagePath).delete();

}

return ++startRow;

}

windows 下截图正常,Linux下异常,Linux下必须安装Mollizia内核的浏览器,在服务器上安装了一个Firefox后,也必须安装图形界面,刚开始采用安装虚拟x-server,但是在CentOS 下安装各种依赖,尝试安装图形界面后tomcat也必须在图形界面下启动才能正常截图,后废弃此种方式,采用java原生绘图方式,下一篇博文介绍

java html 转图片_Java HTML转换为图片相关推荐

  1. java 图片转jpg图片_JAVA转换jpg图片为渐进式图片

    很早之前看到一篇<web前端图片极限优化策略>,了解有jpg分为baseline-jpeg和preogressive-jpeg. 具体的区别如下: baseline-jpeg: 在文件较大 ...

  2. JAVA MYSQL从数据库中提取图片_java web将图片存到储数据库和从数据库中读取图片...

    (Notice:以下所有经验也是我根据网上的经验整理的,如有侵权可以联系我删除,Wx:IT_Ezra,QQ 654303408. 有问题讨论也可联系我,QQ同上.) 一.分析一下基本流程 从前台页面获 ...

  3. java 下载url图片_java下载url图片链接

    1.从之前写的一篇中改写了代码,从远程的url链接中下载图片,并对各种浏览器的中文文件名进行展示 /** * 根据url路径下载图片 * @param filename 处理下载时显示设置好的中文名 ...

  4. java生成带文字的图片_Java在背景图片上面加文字或者文字自动生成图片

    正巧遇到一个项目需要图片合成,查阅了网上许多资料之后整理了一份生成图片的工具类,代码如下:package org.yygzs.acker.util; import java.io.IOExceptio ...

  5. java如何添加自定义的图片_java代码将图片加上自定义水印 -4

    java代码将图片加上自定义水印,然后生成了新的图片 import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; ...

  6. java发送html附件_Java发送邮件(图片、附件、HTML)

    一.简介 要在网络上实现邮件功能,必须要有专门的邮件服务器.这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. SMTP服务器地址: 一般是 ...

  7. java发送图片_Java发送邮件(图片、附件、HTML)

    一.简介 要在网络上实现邮件功能,必须要有专门的邮件服务器.这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. SMTP服务器地址: 一般是 ...

  8. 如何在java中添加照片_Java如何将图片添加到PPT幻灯片中?

    在Java编程中,如何将图片添加到PPT幻灯片中? 注意:需要访问网址: , 下载一个Apache POI软件包.这里下载最新版本:poi-bin-3.17-20170915.tar.gz解压并全部导 ...

  9. java 拖动验证码实现_java实现拖动图片验证码

    思路是,对原图产生两张图片,一张是底图,被抠掉一部分的图片,另外一张是移动图,被抠出的来部分 只写了后台怎么生成拖动验证码的两个图片,前端的还没写,待续.以下是后台的代码 class="ja ...

最新文章

  1. 云技术与云计算的区别
  2. java判断类型_Java中类型判断的几种方式 - 码农小胖哥 - 博客园
  3. (十二)深入浅出TCPIP之Nagle算法
  4. Network of Schools(POJ-1236)
  5. 国内现在web前端高手薪资都拿多少?
  6. ZFS 学习(转载)
  7. poj 2479 Maximum sum(递推)
  8. PING 192.168.5.13 (192.168.5.13 ) 56(84) data bytes后长时间不响应
  9. 怎么用表格做出html网页,用表格制作网页
  10. ​ 最大尺寸的超宽高刷新率显示器 —— Legion Y44w 上手体验
  11. 草根IT江湖路之三:希望,在坚持之中
  12. 高性能、分布式、低延迟的发布订阅中间件对比 Redis 和 emitter
  13. 智能驾驶+多元化长尾应用场景,什么样的公司最终胜出?
  14. 中航一院c语言笔试题目,C笔试题目汇总
  15. 本草纲目pdf彩图版下载_本草纲目彩色插图版 完整版(PDF格式)
  16. 吐槽支付宝红包:逼公鸡下蛋的后果
  17. 三篇ICLR2022与时间图序列相关的研究工作
  18. 子div浮动,父div宽度设置100%
  19. [8/9] M19/M22/M24/M31/M33/M34/M36
  20. Python数据挖掘入门与实践pdf

热门文章

  1. 2015届华为校园招聘机试题
  2. 2012届华为校园招聘机试题
  3. Debian下Cannot set LC_CTYPE to default locale: No such file or directory解决方法
  4. 在人工智能时代下,如何让券商的数据做到“快准稳”
  5. 深入了解UIAutomation 的API
  6. 爱我少一点,我请求你
  7. 位移运算符(7个)之第一个: 左移
  8. Apache 创建虚拟主机目录和设置默认访问页面
  9. jni c向java传递数组_通过jni将jint数组从c返回到java
  10. [Pyhon疫情大数据分析] 三.新闻信息抓取及词云可视化、文本聚类和LDA主题模型文本挖掘