六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 26|回复: 0

用java实现html转pdf

[复制链接]

升级  43.2%

222

主题

222

主题

222

主题

进士

Rank: 4

积分
716
 楼主| 发表于 2013-1-28 18:11:56 | 显示全部楼层 |阅读模式
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 TestFlyingSauser{    public static void main( String[] args ) throws Exception    {//        demo_1();        demo_2();    }    // 不支持中文    public static void demo_1() throws Exception    {        String inputFile = "D:/Test/flying.html";        String url = new File( inputFile ).toURI().toURL().toString();        String outputFile = "D:/Test/flying.pdf";        OutputStream os = new FileOutputStream( outputFile );        ITextRenderer renderer = new ITextRenderer();        renderer.setDocument( url );        renderer.layout();        renderer.createPDF( os );        os.close();    }    // 支持中文    public static void demo_2() throws Exception {          String outputFile = "G:/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>");          html.append("<div>支持中文!</div>");          html.append("</body></html>");          renderer.setDocumentFromString(html.toString());          // 解决图片的相对路径问题          // renderer.getSharedContext().setBaseURL("file:/F:/teste/html/");          renderer.layout();          renderer.createPDF(os);          os.close();      }}


import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.io.OutputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;import org.xhtmlrenderer.pdf.ITextFontResolver;import org.xhtmlrenderer.pdf.ITextRenderer;public class HTML2PDF {/**  * 调用方式 htmlToPDF(response.getOutputStream(), htmlstr, "C:/WINDOWS/Fonts/simfang.ttf", "FangSong_GB2312", "GB2312", "http://xxxx/dtd/xhtml1-transitional.dtd");  *   * 相关图片必须使用绝对路径才能显示 如果要下载生成的文件,在此方法上方加上:  * response.setHeader("Content-disposition",  * "attachment;filename=英文文件名.pdf");  *   * @param 参数  * @param OutputStream out 输出流  * @param String htmlcode html代码。  *   * @param String fontName 字体名称 如:FangSong_GB2312  * @param String fontpath windows 字体路径 如:C:/WINDOWS/Fonts/simfang.ttf  * @param String encoding 编码 如:GB2312。  * @param String htmlDTDURL  如:http://xxxx/xhtml1-transitional.dtd  * version 2009.03.05  */public void htmlToPDF(OutputStream out, String htmlcode, String fontpath,  String  fontName, String encoding, String htmlDTDURL) throws Exception {  DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();  ByteArrayOutputStream bos = new ByteArrayOutputStream();  Transformer transformer = TransformerFactory.newInstance()    .newTransformer();  ITextRenderer renderer = new ITextRenderer();  ITextFontResolver resolver = renderer.getFontResolver();  InputStream intream = null;  Document doc = null;  Document doc2 = null;  try {  htmlcode = this.filterHeader(htmlcode,  encoding, fontName, htmlDTDURL);    intream = new ByteArrayInputStream(htmlcode.getBytes(encoding));  doc = (Document) builder.parse(intream);  transformer.setOutputProperty("encoding", encoding);  new DOMSource(doc);  transformer.transform(new DOMSource(doc), new StreamResult(bos));  intream = new ByteArrayInputStream(bos.toString().getBytes());  doc2 = (Document) builder.parse(intream);    resolver.addFont(fontpath, BaseFont.IDENTITY_H,    BaseFont.NOT_EMBEDDED);    renderer.setDocument(doc2, null);  renderer.layout();    renderer.createPDF(out, true);    out.flush();  out.close();  } catch (Exception ex) {    throw new Exception(ex.getMessage());  }}/**  *文件头 */private String filterHeader(String htmlcode, String encoding,String fontName,String htmlDTDURL) {  htmlcode="<table style=\"font-family:FangSong_GB2312\" width=\"100%\" height=\"100%\" border=\"0\"><tr><td>"+htmlcode+"</td></tr></table>";  htmlcode="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"  \""+htmlDTDURL+"\" >\n"+htmlcode;  htmlcode = "<?xml version=\"1.0\" encoding=\"" + encoding + "\" ?>\n"    + htmlcode;  return htmlcode;}}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表