Itext2.0.8 和freemarker导出pdf
这个是跟上一篇写的freemarker导出word是一块的。但是关联性不是很大。由于本人技术有限本篇导出也是根据网上大家的做出的demo混合而成。有不足的地方请大家指出。好改正,使以后看到的freemarker导出pdf的朋友们能通俗易懂上手。
本程序是在maven中实现的所以如果有的朋友是用jar包实现的请注意版本号。
<!-- itext 组件 -->
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.0.</version>
</dependency>
<!-- freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.0.</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>core-renderer</artifactId>
<version>R8</version>
</dependency>
这里需要注意下。itext要用2.0.8的版本要不然会在下面的itext使用的时候报字节错误。
程序也是个在web中实现的所以代码实现的时候也是访问的。
@RequestMapping(value="/pdfdown",method={RequestMethod.GET,RequestMethod.POST})
public void PDFchange(HttpServletRequest request, HttpServletResponse response) throws Exception{
//从数据库中查询需要的条件
Map<String,Object> variables = new HashMap<String,Object>();
List<UserTestBean> userList = new ArrayList<UserTestBean>();
UserTestBean tom = new UserTestBean("Tom",,);
UserTestBean amy = new UserTestBean("Amy",,);
UserTestBean leo = new UserTestBean("Leo",,);
userList.add(tom);
userList.add(amy);
userList.add(leo);
variables.put("title", "你看");
variables.put("userList", userList);
/*variables.put("title","gerenjianli");
variables.put("userName","xueyucheng");
variables.put("userSex","man");
variables.put("userAge","17");
variables.put("height","161");sss
variables.put("address","handan");
variables.put("University","ligong");sssss
variables.put("skill","jineng");
variables.put("content","asdasasd");*/
String ftlName="ceshi.ftl";
//然后组装好之后调用该方法 FTLIMAGEPATH是用的配置模板中的内容实现的
try {
ByteArrayOutputStream bos= PDFUtil.createPDF(request, ftlName, variables,FTLIMAGEPATH);/**字节*/
PDFUtil.renderPdf(response, bos.toByteArray(), "");
} catch (Exception e) {
logger.error("pdf导出出错。。。",e);
}
}
bean可以自己随便写个只要按照模式就行。下面也是调用的pdf工具类。让其实现的是客户端下载保存。没有在服务器端保存
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.Locale;
import java.util.Map; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer; import com.lowagie.text.pdf.BaseFont; import freemarker.template.Configuration;
import freemarker.template.Template;
/**
* pdf转换类
* @author test fengruiqi
* 创建 时间2017年2月4日 上午9:36:42
*
*/
public class PDFUtil { /**
* 创建pdf
* @author fengruiqi
* 创建时间 2017年2月4日 下午6:47:18
* @param request
* @param ftlName
* @param root
* @return
* @throws Exception
*/
public static ByteArrayOutputStream createPDF(HttpServletRequest request, String ftlName,Map root,String imageName) throws Exception {
String basePath =request.getSession().getServletContext().getRealPath("/");//绝对路径
String basePath2=basePath.replaceAll("\\\\", "/");
Configuration cfg = new Configuration();
try {
cfg.setLocale(Locale.CHINA);
cfg.setEncoding(Locale.CHINA, "UTF-8");
//设置编码
cfg.setDefaultEncoding("UTF-8");
//设置模板路径
cfg.setDirectoryForTemplateLoading(new File(basePath + "/WEB-INF/views/ftl/")); //解决图片路径问题 设置好图片所选择的路径
if(imageName!=null && !"".equals(imageName)){
root.put("imagePath",imageName);
}
//获取模板
Template template = cfg.getTemplate(ftlName);
template.setEncoding("UTF-8");
Writer writer = new StringWriter();
//数据填充模板
template.process(root, writer);
String str = writer.toString();
//pdf生成
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); ITextRenderer iTextRenderer = new ITextRenderer();
iTextRenderer.setDocumentFromString(str); //设置字体 其他字体需要添加字体库
ITextFontResolver fontResolver = iTextRenderer.getFontResolver();
fontResolver.addFont(basePath + "/WEB-INF/views/font/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
iTextRenderer.setDocument(builder.parse(new ByteArrayInputStream(str.getBytes())),null);
iTextRenderer.layout(); //生成PDF
ByteArrayOutputStream baos = new ByteArrayOutputStream();
iTextRenderer.createPDF(baos);
baos.close();
return baos;
} catch(Exception e) {
throw new Exception(e);
}
} /**
* 客户端下载pdf
* @author fengruiqi
* 创建时间 2017年2月4日 下午7:05:01
* @param response
* @param bytes
* @param filename
*/
public static void renderPdf(HttpServletResponse response, final byte[] bytes, final String filename) {
/* initResponseHeader(response, PDF_TYPE); */
setFileDownloadHeader(response, filename, ".pdf");
if (null != bytes) {
try {
response.getOutputStream().write(bytes);
response.getOutputStream().flush();
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
}
} /**
* 分析并设置contentType与headers.
*/
/*
private HttpServletResponse initResponseHeader(HttpServletResponse response, final String contentType, final String... headers) {
// 分析headers参数
String encoding = DEFAULT_ENCODING;
boolean noCache = DEFAULT_NOCACHE;
for (String header : headers) {
String headerName = StringUtils.substringBefore(header, ":");
String headerValue = StringUtils.substringAfter(header, ":");
if (StringUtils.equalsIgnoreCase(headerName, HEADER_ENCODING)) {
encoding = headerValue;
} else if (StringUtils.equalsIgnoreCase(headerName, HEADER_NOCACHE)) {
noCache = Boolean.parseBoolean(headerValue);
} else {
throw new IllegalArgumentException(headerName + "不是一个合法的header类型");
}
}
// 设置headers参数
String fullContentType = contentType + ";charset=" + encoding;
response.setContentType(fullContentType);
if (noCache) {
// Http 1.0 header
response.setDateHeader("Expires", 0);
response.addHeader("Pragma", "no-cache");
// Http 1.1 header
response.setHeader("Cache-Control", "no-cache");
}
return response;
} */ /**
* 设置让浏览器弹出下载对话框的Header
* @author fengruiqi
* 创建时间 2017年2月4日 下午6:58:44
* @param response
* @param fileName
* @param fileType
*/
public static void setFileDownloadHeader(HttpServletResponse response, String fileName, String fileType) {
try {
// 中文文件名支持
String encodedfileName = new String(fileName.getBytes("GBK"), "ISO8859-1");
response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedfileName + fileType + "\"");
} catch (UnsupportedEncodingException e) {
}
} }
。
我在解决图片路径的问题时候没有用网上的使用绝对路径的方法,而是在模板中设置了存储路径的字段,
在程序中直接做成村路路径访问。不知道是因为包的原因还是其他什么,使用绝对路径我这里发现不了图片导出一直有错。
<html>
<head>
<title>${title}</title>
<style>
table {
width:100%;border:green dotted ;border-width:2 0 0 2
}
td {
border:green dotted;border-width:0 2 2 0
}
@page {
size: 8.5in 11in;
@bottom-center {
content: "page " counter(page) " of " counter(pages);
}
}
<#--使用字体一定要定义好-->
body {
font-family: SimSun;
font-size:14px;
font-style:italic;
font-weight:500;
} .heiti
{
font-family: simsun-bold;
}
</style>
</head>
<body>
<h1>Just a blank page.</h1> <div style="page-break-before:always;">
<div align="center">
<h1>${title}</h1>
</div>
<div>
<#-- freemarker的注释 imagePath是用来存储路径的 -->
图片支持 <img src="${imagePath}add.png " /> </div>
<table>
<tr>
<td><b>Name</b></td>
<td><b>Age</b></td>
<td><b>Sex</b></td>
</tr>
<#list userList as user>
<tr>
<td>${user.name}</td>
<td>${user.age}</td>
<td>
<#if user.sex = 1>
male
<#else>
◇◇
</#if>
</td>
</tr>
</#list>
</table>
</div>
</body>
</html>
原文地址:http://www.wang1314.com/doc/topic-1568137-1.html
Itext2.0.8 和freemarker导出pdf的更多相关文章
- PHP yii2.0框架利用mpdf导出pdf
安装: composer require mpdf/mpdf 使用: use Mpdf\Mpdf;//(php7以前) //获取页面内容 $res = $this->controller-> ...
- flying-saucer + iText + Freemarker实现pdf的导出, 支持中文、css以及图片
前言 项目中有个需求,需要将合同内容导出成pdf.上网查阅到了 iText , iText 是一个生成PDF文档的开源Java库,能够动态的从XML或者数据库生成PDF,同时还可以对文档进行加密,权限 ...
- java通过freemarker模板导出pdf
需求:将网页内容导出为pdf文件,其中包含文字,图片,echarts图 原理:利用freemarker模板与数据渲染所得到的html内容,通过ITextRenderer对象解析html内容生成pdf ...
- asp.net2.0导出pdf文件完美解决方案【转载】
asp.net2.0导出pdf文件完美解决方案 作者:清清月儿 PDF简介:PDF(Portable Document Format)文件格式是Adobe公司开发的电子文件格式.这种文件格式与操作系统 ...
- Proe5.0导出PDF至配置文件的相关方法,VC++
定义文件bcsMessage.txt PLM PLM PLM # login login 测试 # Active messagebox menu Active messagebox menu 激活菜单 ...
- iText导出pdf、word、图片
一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...
- Itext导出PDF,word,图片案例
iText导出pdf.word.图片 一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生 ...
- 史上最全的springboot导出pdf文件
最近项目有一个导出报表文件的需求,我脑中闪过第一念头就是导出pdf(产品经理没有硬性规定导出excel还是pdf文件),于是赶紧上网查看相关的资料,直到踩了无数的坑把功能做出来了才知道其实导出exce ...
- 利用itext导出PDF的小例子
我这边使用的jar包: itext-2.1.7.jar itextasian-1.5.2.jar 代码,简单的小例子,导出pdf: PdfService.java: package com.cy.se ...
随机推荐
- 基于物品的协同过滤算法(ItemCF)
最近在学习使用阿里云的推荐引擎时,在使用的过程中用到很多推荐算法,所以就研究了一下,这里主要介绍一种推荐算法—基于物品的协同过滤算法.ItemCF算法不是根据物品内容的属性计算物品之间的相似度,而是通 ...
- 聊聊、dubbo 找不到 dubbo.xsd 报错
平常在用 Dubbo 的时候,创建 xml 会提示 http://code.alibabatech.com/schema/dubbo/dubbo.xsd 找不到. 大家可以去 https://gith ...
- HDU 3062 Party(2-SAT模版题)
Problem Description 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是 ...
- canvas学习(二):渐变与曲线的绘制
canvas学习(二):渐变与曲线的绘制 一:createLinearGradient()线性渐变: 二:createLinearGradient() 放射状/圆形渐变: 三:createPatter ...
- vue移动音乐app开发学习(一):环境搭建
本系列文章是为了记录学习中的知识点,便于后期自己观看.如果有需要的同学请登录慕课网,找到Vue 2.0 高级实战-开发移动端音乐WebApp进行观看,传送门. 一:使用vue-cli脚手架搭建: 1: ...
- TensorFlow安装解惑
本文整理自网络,若有侵犯请告知. 1.安装环境 目前TensorFlow社区推荐的环境是Ubuntu, 但是TensorFlow同时支持Mac,Windows上的安装部署. 2.关于GPU版本 因为深 ...
- LintCode-50.数组剔除元素后的乘积
数组剔除元素后的乘积 给定一个整数数组A. 定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法. 样例 给出A=[1 ...
- WIN8/8.1/10进入BIOS方法图解
1.首先点击桌面左下角的"开始". 2.然后点击电源. 3.然后按住shift,同时点击"重启".于是进入这个画面: 4.然后点击"疑难解答" ...
- 生成以指定字符为开头的md5值(6位数字)
以下脚本的功能是生成以指定字符为开头的md5值 #-*- coding:utf-8 -*- #脚本功能:生成以指定字符为开头的md5值(6位数字) import hashlib import rand ...
- 第五部分shell项目一监控脚本
需求: 使用shell定制各种个性化告警工具,但需要统一化管理.规范化管理. 思路:指定一个脚本包,包含主程序.子程序.配置文件.邮件引擎.输出日志等.主程序:作为整个脚本的入口,是整个系统的命脉.配 ...