java开发html转pdf 解决方案

    之前在工作中遇到过一个需求,是将用户填写的申报,由固定模板的来生成pdf,后来想到先把内容生成html,

然后再把html格式的内容转换成pdf。

    之前在网上找了很多,有很多内容都是转载的,后来折腾了好几天才试出一个真实能用的,所以在这里记录一下。方便以后查阅,也希望能帮到别人。

1.所需jar包

 core-renderer.jar ,iText-2.0.8.jar

2、示例html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head >
<meta charset="utf-8" /> 
<style> 
	 body{ padding:0; margin:0; font-family:SimSun; color: red} 

</style>
 </head>	
		
<body>
 <h1>2233322dsss--你好--dss2</h1>
 
  <img alt="w2" width="100px" height="100px" src="http://tva4.sinaimg.cn/crop.0.0.180.180.50/9907976cjw1e8qgp5bmzyj2050050aa8.jpg"/>
 </body>
 </html>

html中要注意的是字体的设置,

font-family:SimSun;

在下面的java代码中,也需要加载对应的字体,不然会出现中文显示不出来的情况

3、java代码

package wqb.pdf.test;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.pdf.BaseFont;

/**
 * html转pdf
 * 
 * @author wqb
 *
 */
public class PdfDemoTest {

	public static void main(String[] args) throws Exception {

		//读取html的流
		InputStream inputStream = PdfDemoTest.class.getResourceAsStream("test.html");
		
		//流转换成字符串
		StringBuffer out = new StringBuffer();
		byte[] b = new byte[4096];
		for (int n; (n = inputStream.read(b)) != -1;) {
			out.append(new String(b, 0, n));
		}

		String html = out.toString();
		String pdffile = "C:\\wqb\\test.pdf";

		OutputStream os = new FileOutputStream(pdffile);
		ITextRenderer renderer = new ITextRenderer();
		renderer.setDocumentFromString(html);
		// writer.setPageEvent(header);
		ITextFontResolver fontResolver = renderer.getFontResolver();
		// 添加字体支持,路径可以自身项目的实际情况设置,我这里是本地项目,而且为了方便测试,就写成固定的了
		// 实际项目中,可以获取改字体所在真实的服务器的路径,这个方法是本地地址和网络地址都支持的
		// 这里面添加的是宋体
		fontResolver.addFont("C:\\software\\eclipse-neon\\workspace\\htmlToPdfDemo\\bin\\SIMSUN.TTC",
				BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

		 
		renderer.layout();
		renderer.createPDF(os);
		os.flush();
		os.close();

	}
}

4、实际效果



总结:示例代码比较简单,只是单纯的实现了导出pdf而已。在真实业务场景中,html的内容一般是用template或者Velocity 生成。并且字体的路径也不能写死,可以根据自己的项目情况采用合适的读取办法。

需要注意的是字体,一定要设置!!!

对html的规范要求极高,例如:页面中<mate></mate> 等标签必须闭合!!!

示例代码下载地址

比较缺分,所以资源要分了。谅解

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页