java html 转图片_Java HTML转换为图片
第一次尝试:用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转换为图片相关推荐
- java 图片转jpg图片_JAVA转换jpg图片为渐进式图片
很早之前看到一篇<web前端图片极限优化策略>,了解有jpg分为baseline-jpeg和preogressive-jpeg. 具体的区别如下: baseline-jpeg: 在文件较大 ...
- JAVA MYSQL从数据库中提取图片_java web将图片存到储数据库和从数据库中读取图片...
(Notice:以下所有经验也是我根据网上的经验整理的,如有侵权可以联系我删除,Wx:IT_Ezra,QQ 654303408. 有问题讨论也可联系我,QQ同上.) 一.分析一下基本流程 从前台页面获 ...
- java 下载url图片_java下载url图片链接
1.从之前写的一篇中改写了代码,从远程的url链接中下载图片,并对各种浏览器的中文文件名进行展示 /** * 根据url路径下载图片 * @param filename 处理下载时显示设置好的中文名 ...
- java生成带文字的图片_Java在背景图片上面加文字或者文字自动生成图片
正巧遇到一个项目需要图片合成,查阅了网上许多资料之后整理了一份生成图片的工具类,代码如下:package org.yygzs.acker.util; import java.io.IOExceptio ...
- java如何添加自定义的图片_java代码将图片加上自定义水印 -4
java代码将图片加上自定义水印,然后生成了新的图片 import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; ...
- java发送html附件_Java发送邮件(图片、附件、HTML)
一.简介 要在网络上实现邮件功能,必须要有专门的邮件服务器.这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. SMTP服务器地址: 一般是 ...
- java发送图片_Java发送邮件(图片、附件、HTML)
一.简介 要在网络上实现邮件功能,必须要有专门的邮件服务器.这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. SMTP服务器地址: 一般是 ...
- 如何在java中添加照片_Java如何将图片添加到PPT幻灯片中?
在Java编程中,如何将图片添加到PPT幻灯片中? 注意:需要访问网址: , 下载一个Apache POI软件包.这里下载最新版本:poi-bin-3.17-20170915.tar.gz解压并全部导 ...
- java 拖动验证码实现_java实现拖动图片验证码
思路是,对原图产生两张图片,一张是底图,被抠掉一部分的图片,另外一张是移动图,被抠出的来部分 只写了后台怎么生成拖动验证码的两个图片,前端的还没写,待续.以下是后台的代码 class="ja ...
最新文章
- 云技术与云计算的区别
- java判断类型_Java中类型判断的几种方式 - 码农小胖哥 - 博客园
- (十二)深入浅出TCPIP之Nagle算法
- Network of Schools(POJ-1236)
- 国内现在web前端高手薪资都拿多少?
- ZFS 学习(转载)
- poj 2479 Maximum sum(递推)
- PING 192.168.5.13 (192.168.5.13 ) 56(84) data bytes后长时间不响应
- 怎么用表格做出html网页,用表格制作网页
- ​ 最大尺寸的超宽高刷新率显示器 —— Legion Y44w 上手体验
- 草根IT江湖路之三:希望,在坚持之中
- 高性能、分布式、低延迟的发布订阅中间件对比 Redis 和 emitter
- 智能驾驶+多元化长尾应用场景,什么样的公司最终胜出?
- 中航一院c语言笔试题目,C笔试题目汇总
- 本草纲目pdf彩图版下载_本草纲目彩色插图版 完整版(PDF格式)
- 吐槽支付宝红包:逼公鸡下蛋的后果
- 三篇ICLR2022与时间图序列相关的研究工作
- 子div浮动,父div宽度设置100%
- [8/9] M19/M22/M24/M31/M33/M34/M36
- Python数据挖掘入门与实践pdf
热门文章
- 2015届华为校园招聘机试题
- 2012届华为校园招聘机试题
- Debian下Cannot set LC_CTYPE to default locale: No such file or directory解决方法
- 在人工智能时代下,如何让券商的数据做到“快准稳”
- 深入了解UIAutomation 的API
- 爱我少一点,我请求你
- 位移运算符(7个)之第一个: 左移
- Apache 创建虚拟主机目录和设置默认访问页面
- jni c向java传递数组_通过jni将jint数组从c返回到java
- [Pyhon疫情大数据分析] 三.新闻信息抓取及词云可视化、文本聚类和LDA主题模型文本挖掘