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

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

我是在spring mvc中应用的

  1. String basePath = request.getSession().getServletContext()
  2. .getRealPath("/");
  3. /* 创建配置 */
  4. Configuration cfg = new Configuration();
  5. /* 指定模板存放的路径 */
  6. cfg.setDirectoryForTemplateLoading(new File(basePath + "/WEB-INF/ftl"));
  7. cfg.setDefaultEncoding("UTF-8");
  8. // cfg.setObjectWrapper(new DefaultObjectWrapper());
  9. /* 从上面指定的模板目录中加载对应的模板文件 */
  10. // contractTemplate
  11. Template temp = cfg.getTemplate("contractTemplate.ftl");
  12. /* 创建数据模型 */
  13. Map root = new HashMap();
  14. root.put("user", "Big Joe");
  15. // Map latest = new HashMap();
  16. // root.put("latestProduct", latest);
  17. // latest.put("name", "green mouse");
  18. /* 将生成的内容写入hello .html中 */
  19. String file1 = basePath + "html/contractTemplate.html";
  20. File file = new File(file1);
  21. if (!file.exists())
  22. file.createNewFile();
  23. // Writer out = new FileWriter(file);
  24. Writer out = new BufferedWriter(new OutputStreamWriter(
  25. new FileOutputStream(file), "utf-8"));
  26. // Writer out = new OutputStreamWriter(System.out);
  27. temp.process(root, out);
  28. out.flush();
  29. String url = new File(file1).toURI().toURL().toString();
  30. String outputFile = basePath + "html/contractTemplate.pdf";
  31. OutputStream os = new FileOutputStream(outputFile);
  32. ITextRenderer renderer = new ITextRenderer();
  33. // PDFEncryption pdfEncryption = new
  34. // PDFEncryption(null,null,PdfWriter.ALLOW_PRINTING);
  35. // renderer.setPDFEncryption(pdfEncryption); //只有打印权限的
  36. renderer.setDocument(url);
  37. // 解决中文问题
  38. ITextFontResolver fontResolver = renderer.getFontResolver();
  39. try {
  40. fontResolver.addFont(basePath + "/ui/fonts/simsun.ttc",
  41. BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
  42. } catch (DocumentException e) {
  43. // TODO Auto-generated catch block
  44. e.printStackTrace();
  45. }
  46. renderer.layout();
  47. try {
  48. renderer.createPDF(os);
  49. } catch (DocumentException e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. }
  53. System.out.println("转换成功!");
  54. os.close();

模版中在table 加样式 style="margin-top: 60px;table-layout:fixed; word-break:break-strict;"

这是为了避免 在pdf中显示不全 

我的 功能是 通过生成的html生成合同 pdf

最终效果图:

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

里面可以包含样式  图片

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

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

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <title>要生成的合同文件</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <style mce_bogus="1" type="text/css">
  7. body {font-family: SimSun; background:none;margin-left: auto;margin-right: auto;}
  8. body,html,div,p{ font-size:14px; margin:0px; padding:0px;}
  9. </style>
  10. .....
  11. <div class="table_block">
  12. <table width="680" border="0" cellspacing="1" cellpadding="1" bgcolor="#CCCCCC"  style="table-layout:fixed; word-break:break-strict;">
  13. ....

另外有关中文换行 问题 有网友问我 后 我发现 解决途径必须需要修改源码 修改后源码包我已经传到 了 附件上core-renderer-R8-0604.jar

有什么疑问可以加我 qq :6637152交流

另外很多网友问我要项目demo 和相关文件

我这个功能是集成在公司项目里的 原先不方便放出来,现在我已经单独抽出一个开源项目供网友参考代码,https://git.oschina.net/zqb/usk.git

网友可以把项目导入eclipse或者myeclipse搜索上面提到的相关代码找到相关功能

freemark2pdf的更多相关文章

随机推荐

  1. Date()和new Date()区别

    当任意一个普通函数用于创建一类对象时,它就被称作构造函数,或构造器. new操作符来调用一个构造函数时,创建一个空对象obj, 将这个空对象的__proto__成员指向了构造函数对象的prototyp ...

  2. 8个学习.net的博客链接 (以前收藏过更多的,被百度新版搞没了,恨死了)

    原文发布时间为:2012-09-18 -- 来源于本人的百度文章 [由搬家工具导入] Simone Chiaretta’s CodeClimber http://www.haacked.com/ (  ...

  3. updatepanel的使用【他人经验+原创 完整例子】

    原文发布时间为:2009-05-16 -- 来源于本人的百度文章 [由搬家工具导入] 刚上传的代码,不知道能不能下载:[源码包含所有ajax控件的简单使用] http://www.xmaspx.com ...

  4. 【SQL Server】修改DB逻辑文件名称

    步骤一:查询当前DB逻辑文件名称(主逻辑文件.日志逻辑文件) ; 步骤二:步骤二改变(还原)DB逻辑文件名称 RESTORE DATABASE AW831 FROM DISK='D:\AW831.DA ...

  5. [LeetCode] String to Integer (atoi) 字符串

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  6. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---45

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  7. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---3

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: <Linux命令行与shell脚本 ...

  8. Day 29 process&thread_1

    进程和线程 1 进程(process): 1.定义: 最小的执行单元.进程就是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序.数据集.进程控制块三部分组成: 我们编写的程序用来描述进程要完 ...

  9. 【转载】SQL Server XML Path

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

  10. 爬虫学习笔记(三)requests模块使用

    前面在说爬虫原理的时候说了,就写代码自动化的获取数据,保存下来数据,那怎么写代码来请求一个网址,获取结果呢,就得用requests模块了. 这篇博客说一下requests模块的使用,requests模 ...