将html页面转换成图片

问题分析:需要根据用户选择的不同游戏,不同年份来生成带有不同描述规则的一张图片,如果利用java去画这张图片,显然很不靠谱,利用一些开源的图形工具,都是在原有图

片的基础上去修改,没有根据指定规则去生成的。经过调研和探讨,觉得freemarker可以定制自己想要的样式模板,如果先用freemarker定制的模板去生成一个静态的html页面,

然后再将这个html页面转换一张图片,这样做不就可以生成指定样式的图片了么,但是如何将html转换成图片呢。网上有很多写好的代码实现,但是经过测试,这些代码都无法解

析html页面的动态css样式和js,导致生成的图片和静态页面不统一,包括开源的html2image jar包,效果都不符合项目的需求。

解决方案:通过freemarker定制好的模板去生成静态页面,利用开源的wkhtmltoimage软件去截取静态页面,由于是截屏,所以会保留静态页面的所有样式。wkhtmltoimage是完

全开源免费的,安装简单,好用。

应用场景:需求上根据用户的不同行为,从而产生不用的效果图片,建议用此方法。

第一步:定制模板

根据需求制作相应的ftl模板页面,因不同需求模板样式不同,固此处省略编写。

第二部:生成静态html页面,调用wk命令生成图片

模板+数据=输出,依照这个原理,加载模板,处理数据,输出一个静态页面。

public void createSpaceImage(Configuration config) throws Throwable {
		//静态页面绝对路径
		String htmlDirectory = "";
		String imageDirectory = "";

		String templatePath = "";
		String htmlFileName = htmlDirectory + "/" + 文件名+".html";
		String imageFileName = imageDirectory + "/" + 文件名+".png";
		
		File htmlFile = new File(htmlFileName);
		if (!htmlFile.getParentFile().exists()) {
			htmlFile.getParentFile().mkdirs();
		}
		if (!htmlFile.exists()) {
			htmlFile.createNewFile();
		}
		File imageFile = new File(imageFileName);
		if (!imageFile.getParentFile().exists()) {
			imageFile.getParentFile().mkdirs();
		}
		config.setNumberFormat("#");

		// 根据模板和数据生成静态HTML
		Template template = config.getTemplate(templatePath, "UTF-8");
		Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));
		Map<String,Object> data = new HashMap<String,Object>();

		template.process(data, out);
		
		// 根据静态HTMl生成图片 htmlFileName 静态页面路径 imageFileName 图片路径  尺寸

		HtmlToImage.html2Image(htmlFileName, imageFileName, 600, 400);
		
	}

方法参数需要根据实际情况进行改写,用来做数据处理。

其中html2Image方法如下:

	public static void html2Image(String filePath, String targetPath, int i,
			int j) throws Throwable {
		String command = ApplicationConfig.getValue("annalsImage.command");
		command = command + " --crop-w " + i + " --crop-h " + 
				j + "  " + filePath + " " + targetPath;
		Runtime.getRuntime().exec(command);
	}
上述
String command = ApplicationConfig.getValue("annalsImage.command");
其中command 是wkhtmltoimage的命令,在linux下可以接上下文路劲,也可配置环境变量。

第三步:wkhtmltoimage下载安装

  (1) 下载

  $wget

        http://wkhtmltopdf.googlecode.com/files/wkhtmltoimage-0.11.0_rc1-static-i386.tar.bz2

  or

  $wget 

        http://wkhtmltopdf.googlecode.com/files/wkhtmltoimage-0.11.0_rc1-static-amd64.tar.bz2

  注:使用 如下命令决定需要下载的版本:

  $uname -a

  (2) 解压安装

  Wkhtmltoimage 是一个可执行文件,解压出来即可运行,解压到某个路径下后,需要配置环境变量,使该可执行文件在任意路径下调用均可用。

  解压命令如下:

  $tar -jxvf wkhtmltoimage-0.11.0_rc1-static-i386.tar.bz2

  or

  $tar -jxvf wkhtmltoimage-0.11.0_rc1-static-amd64.tar.bz2

  (3) 运行

  $./wkhtmltoimage-i386 www.baidu.com baidu.jpg

  (4) 环境要求

  保证系统字体为UTF-8,使用如下命令查看系统字体:

  $at /etc/sysconfig/i18n

  我的电脑的显示结果为:

  LANG="zh_CN.UTF-8"

  必须安装 glibc 和 openssl

  必须安装 x11 以及 正确的 x11 fonts

  使用如下命令:

  rpm -qa|grep x11

  需要安装的字体:

  xorg-x11-font-utils-...

  xorg-x11-fonts-Type1-...

  xorg-x11-fonts-chinese-…

安装成功之后,就可以用以上方式将html页面转换成图片啦。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用JavaScript将HTML网页换为PDF,以下是一些方法: 1. 使用第三方库:可以使用像jsPDF这样的第三方库来将HTML换为PDF。jsPDF是一个JavaScript库,可在浏览器中生成PDF文件。下面是一个使用jsPDF的示例代码: ``` // 引入jsPDF库 <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.4.0/jspdf.umd.min.js"></script> // 将HTML换为PDF <script> var doc = new jsPDF(); doc.html(document.body, { callback: function (doc) { doc.save('output.pdf'); } }); </script> ``` 2. 使用浏览器内置功能:现代浏览器提供了将网页换为PDF的内置功能。你可以使用window.print()函数触发打印对话框,然后在打印对话框中选择“另存为PDF”选项。以下是一个示例代码: ``` // 打印对话框 window.print(); ``` 3. 使用服务器端库:如果你有一个服务器,你可以使用像PhantomJS这样的库在服务器端将HTML换为PDF。PhantomJS是一个无界面的浏览器,可以在服务器端运行JavaScript并渲染HTML页面。以下是一个使用PhantomJS的示例代码: ``` // 引入PhantomJS库 <script src="https://cdnjs.cloudflare.com/ajax/libs/phantomjs/2.1.1/phantomjs.min.js"></script> // 将HTML换为PDF <script> var page = require('webpage').create(); page.open('http://example.com', function() { page.render('output.pdf'); phantom.exit(); }); </script> ``` 这些都是将HTML换为PDF的方法,你可以根据你的需要选择其中一种方法。 ### 回答2: 通过JavaScript将HTML网页换为PDF可以使用第三方库或API来实现。 一种常见的方法是使用jsPDF库。jsPDF是一个开源的JavaScript库,可以生成PDF文件并提供多种功能和选项。首先,你需要将jsPDF库添加到你的HTML文件中。可以通过CDN链接引入该库或者通过下载并将其链接到你的项目中。 使用jsPDF库的基本步骤如下: 1. 创建一个新的jsPDF实例:var pdf = new jsPDF(); 2. 将HTML元素换为PDF内容并将其添加到jsPDF实例中: - 使用HTML2canvas库将HTML元素换为canvas图片html2canvas(element, {options}).then(function(canvas) {...}); - 使用toDataURL方法将canvas图片换为DataURL:var imgData = canvas.toDataURL('image/png'); - 使用addImage方法将图片添加到jsPDF实例中:pdf.addImage(imgData, 'PNG', x, y, width, height); 3. 保存或下载PDF文件: - 使用save方法将PDF保存到本地:pdf.save('filename.pdf'); - 或者使用output方法将PDF换为数据流,并通过Ajax请求发送给服务器保存或下载。 另一种方法是使用第三方API,例如pdfmake或pdfcrowd。这些API提供基于云端的PDF换服务,你需要将HTML数据发送给API,然后它们将返回一个生成的PDF文件。对于使用API的方法,请查阅相关文档以获取更多详细信息。 无论你选择使用哪种方法,确保在将HTML网页换为PDF之前,你已经学习和理解了相关库或API的使用方法,并遵循其文档中的指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值