freemarker+ITextRenderer 生成html转pdf

网上已经有比较多的例子 写这个 但是很多都是简单的 demo,而且有很多隐藏的问题 或者是零散的 对某些问题的解决方案 

本人再次写一个完整的demo  无bug 可用 

我是在spring mvc中应用的 

String basePath = request.getSession().getServletContext()  
                .getRealPath("/");  
        /* 创建配置 */  
        Configuration cfg = new Configuration();  
        /* 指定模板存放的路径 */  
        cfg.setDirectoryForTemplateLoading(new File(basePath + "/WEB-INF/ftl"));  
        cfg.setDefaultEncoding("UTF-8");  
        // cfg.setObjectWrapper(new DefaultObjectWrapper());  
  
        /* 从上面指定的模板目录中加载对应的模板文件 */  
        // contractTemplate  
        Template temp = cfg.getTemplate("contractTemplate.ftl");  
  
        /* 创建数据模型 */  
        Map root = new HashMap();  
        root.put("user", "Big Joe");  
        // Map latest = new HashMap();  
        // root.put("latestProduct", latest);  
        // latest.put("name", "green mouse");  
  
        /* 将生成的内容写入hello .html中 */  
  
        String file1 = basePath + "html/contractTemplate.html";  
        File file = new File(file1);  
        if (!file.exists())  
            file.createNewFile();  
        // Writer out = new FileWriter(file);  
        Writer out = new BufferedWriter(new OutputStreamWriter(  
                new FileOutputStream(file), "utf-8"));  
        // Writer out = new OutputStreamWriter(System.out);  
        temp.process(root, out);  
        out.flush();  
  
        String url = new File(file1).toURI().toURL().toString();  
        String outputFile = basePath + "html/contractTemplate.pdf";  
        OutputStream os = new FileOutputStream(outputFile);  
  
        ITextRenderer renderer = new ITextRenderer();  
        // PDFEncryption pdfEncryption = new  
        // PDFEncryption(null,null,PdfWriter.ALLOW_PRINTING);  
        // renderer.setPDFEncryption(pdfEncryption); //只有打印权限的  
        renderer.setDocument(url);  
  
        // 解决中文问题  
        ITextFontResolver fontResolver = renderer.getFontResolver();  
        try {  
            fontResolver.addFont(basePath + "/ui/fonts/simsun.ttc",  
                    BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);  
        } catch (DocumentException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
  
        renderer.layout();  
        try {  
            renderer.createPDF(os);  
        } catch (DocumentException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        System.out.println("转换成功!");  
        os.close();

模版中在table 加样式 

这是为了避免 在pdf中显示不全  
我的 功能是 通过生成的html生成合同 pdf 

最终效果图: 


模版文件 就是 ftl文件 你 用html怎么显示就可以生成什么样的pdf 

里面可以包含样式  图片 

尽量用table布局 这样不会出现 显示到pdf显示不全的 问题 

另外 附上freemark、模板文件头部关键 代码主要是处理 中文问题 

<!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>  
    <title>要生成的合同文件</title>  
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<style mce_bogus="1" type="text/css">  
body {font-family: SimSun; background:none;margin-left: auto;margin-right: auto;}  
body,html,div,p{ font-size:14px; margin:0px; padding:0px;}  
  
  
</style>  
.....  
<div class="table_block">  
<table width="680" border="0" cellspacing="1" cellpadding="1" bgcolor="#CCCCCC"  style="table-layout:fixed; word-break:break-strict;">  
....

转自:http://skyfar666.iteye.com/blog/2001353