html转pdf,jsf实现下载功能

第一步,html转pdf


依赖的jar包可以从这下载

http://download.csdn.net/detail/czj2015/9430534

html转pdf 的代码如下:

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.pdf.BaseFont;

public class HtmltoPDF {

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

		// htmlToPdf();
		htmlToPdf2();
		// htmlToPdf3();
	}

	// 不支持中文
	public static void htmlToPdf() throws Exception {
		String inputFile = "f:/b.html";
		String url = new File(inputFile).toURI().toURL().toString();
		String outputFile = "f:/flying.pdf";
		OutputStream os = new FileOutputStream(outputFile);
		ITextRenderer renderer = new ITextRenderer();
		renderer.setDocument(url);
		renderer.layout();
		renderer.createPDF(os);
		os.close();
	}

	// 支持中文
	public static void htmlToPdf2() throws Exception {
		String outputFile = "F:/demo_3.pdf";
		OutputStream os = new FileOutputStream(outputFile);
		ITextRenderer renderer = new ITextRenderer();
		ITextFontResolver fontResolver = renderer.getFontResolver();
		fontResolver.addFont("C:/Windows/fonts/simsun.ttc",
				BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
		StringBuffer html = new StringBuffer();
		// DOCTYPE 必需写否则类似于 这样的字符解析会出现错误
		html.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
		html.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">")
				.append("<head>")
				.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />")
				.append("<style type=\"text/css\" mce_bogus=\"1\">body {font-family: SimSun;}</style>")
				.append("</head>")
				.append("<body>aaaaaaa测试啊测试</body>");
		html.append("</html>");
		renderer.setDocumentFromString(html.toString());
		// 解决图片的相对路径问题
		// renderer.getSharedContext().setBaseURL("file:/F:/teste/html/");
		renderer.layout();
		renderer.createPDF(os);
		System.out.println("======转换成功!");
		os.close();
	}

	public static void htmlToPdf3() throws Exception {
		String inputFile = "F:/b.html";
		String outFile = "F:/test.pdf";
		OutputStream os = null;
		os = new FileOutputStream(outFile);
		ITextRenderer renderer = new ITextRenderer();
		ITextFontResolver fontResolver = renderer.getFontResolver();
		fontResolver.addFont("C:/Windows/fonts/simsun.ttc",
				BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

		String url = new File(inputFile).toURI().toURL().toString();
		System.out.println("=============url: " + url);
		renderer.setDocument(url);
		renderer.layout();
		renderer.createPDF(os);
		System.out.println("======转换成功!");
		os.close();
	}

}


我使用的是第二种方法,由自己拼接html来生成pdf 。 此处需要注意html的开头注释部分,还有html格式不能错误。


第二步: 提供下载功能

原先的想法是,网页上点击了下载按钮以后, 托管bean开始生成pdf,生成结束后直接给页面跳出下载。

然而后来发现这种方法行不通。因为jsf下载功能只有控件 commandButton和commandLink可以实现。其实用js来控制来onclick按钮也可以解决这个问题,但是这样做的

话调用的就不是一个托管bean了。


提供下载的代码如下:

public void downPdf() {
//		String filePath = this.vals;
		String filePath = "f:/demo_3.pdf";
		System.out.println("filePath" + filePath);
		File file = new File(filePath);
		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletResponse response = (HttpServletResponse) context
				.getExternalContext().getResponse();
		response.setContentType("application/msdownload");
		response.setCharacterEncoding("UTF-8");
		response.setContentLength(new Long(file.length()).intValue());// 文件长度
		response.setHeader("Content-Disposition", "attachment; filename=\""
				+ file.getName() + "\"");// 文件名

		ServletOutputStream out = null;
		FileInputStream fis = null;
		BufferedReader reader = null;
		String readLine = null;

		try {
			out = response.getOutputStream();
			fis = new FileInputStream(file);
			reader = new BufferedReader(new InputStreamReader(fis));

			while ((readLine = reader.readLine()) != null) {
				try {
					out.write(readLine.getBytes());
				} catch (Exception e) {
				}
			}
			out.flush();
			context.responseComplete();
			System.out.println("提供下载结束");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值