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 加样式 style="margin-top: 60px;table-layout:fixed; word-break:break-strict;"

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

最终效果图:
freemarker+ITextRenderer 生成html转pdf_第1张图片

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

里面可以包含样式  图片


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


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

.....
....


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


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

网友可以把项目导入eclipse或者myeclipse搜索上面提到的相关代码找到相关功能
  • core-renderer.jar (1 MB)
  • 下载次数: 1121
  • freemarker+ITextRenderer 生成html转pdf_第2张图片
  • 大小: 74 KB
  • iText-2.0.8.jar (1.2 MB)
  • 下载次数: 648
  • freemarker2.3.20.jar (994.7 KB)
  • 下载次数: 345
  • iTextAsian.jar (322 KB)
  • 下载次数: 568
  • core-renderer-R8-0604.jar (1.1 MB)
  • 下载次数: 1040
  • 查看图片附件

你可能感兴趣的:(ITextRenderer)