目錄結構:
pom.xml文件配置:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.22</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.0.3</version>
</dependency>
</dependencies>
index.jsp配置:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="loadServlet"></a>
</body>
</html>
loadServlet配置:
package com.lee.load.pdf;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Map<Object, Object> data=new HashMap<Object, Object>();
data.put("name", "七點");
PdfExport pdf = new PdfExport();
pdf.ExportPDF("/template/pdf/", "tpl.ftl",data, response,request);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
PdfExport類配置:
package com.lee.load.pdf;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringWriter;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfWriter;
import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;
public class PdfExport {
/**
* @描述 生成PDF並彈出下載框
* @author lim
* @時間 2017年11月9日
* @param ftlPath ftl模板文件的路徑
* @param ftlName ftl模板的名稱
* @param data map類型的數據
* @param response
* @param request
* @throws Exception
*/
public void ExportPDF(String ftlPath,String ftlName,Map<Object, Object> data,HttpServletResponse response,HttpServletRequest request) {
// create PDF document
Document document = new Document();
try {
response.setContentType("application/x-msdownload;charset=UTF-8");
response.setHeader("Content-Disposition","attachment;filename=report.pdf");
PdfWriter.getInstance(document, response.getOutputStream());
document.open();
String html=PdfExport.getPdfContent(ftlPath, ftlName, data,request);
OutputStream out = null;
ITextRenderer render = null;
out = response.getOutputStream();
render = PdfExport.getRender(request);
render.setDocumentFromString(html);
render.layout();
render.createPDF(out);
render.finishPDF();
document.add(new Paragraph(render.toString()));
render = null;
out.close();
}
catch(Exception e) {
e.printStackTrace();
System.err.println("document: " + e.getMessage());
}finally{
document.close();
}
}
//獲取要寫入PDF的內容
public static String getPdfContent(String ftlPath, String ftlName, Map<Object, Object> data, HttpServletRequest request) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException, TemplateException {
return PdfExport.useTemplate(ftlPath, ftlName, data,request);
}
//使用freemarker得到html內容
public static String useTemplate(String ftlPath, String ftlName, Map<Object, Object> data, HttpServletRequest request) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException, TemplateException {
String html = null;
String webPath = getWEBPath(request);
Template tpl = getFreemarkerConfig(webPath+ftlPath).getTemplate(ftlName);
StringWriter writer = new StringWriter();
tpl.process(data, writer);
writer.flush();
html = writer.toString();
return html;
}
/**
* 獲取Freemarker配置
* @param templatePath
* @return
* @throws IOException
*/
private static Configuration getFreemarkerConfig(String templatePath) throws IOException {
freemarker.template.Version version = new freemarker.template.Version("2.3.22");
Configuration config = new Configuration(version);
config.setDirectoryForTemplateLoading(new File(templatePath));
config.setEncoding(Locale.CHINA, "utf-8");
return config;
}
/**
*
* @描述 加載字體,以便支持中文
* @author lim
* @時間 2017年11月9日
* @param request
* @return
* @throws DocumentException
* @throws IOException
*/
public static ITextRenderer getRender(HttpServletRequest request) throws DocumentException, IOException {
//獲取路徑
String webPath = getWEBPath(request);
ITextRenderer render = new ITextRenderer();
//添加字體,以支持中文
render.getFontResolver().addFont(webPath+"/template/pdf/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
render.getFontResolver().addFont(webPath+"/template/pdf/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
return render;
}
/**
* @描述 獲取路徑,以便加載webapp目錄下的資源文件
* @author lim
* @時間 2017年11月9日
* @param request
* @return
*/
public static String getWEBPath(HttpServletRequest request) {
return request.getSession().getServletContext().getRealPath("/");
}
}
上面那個類可以稍微修改一下,另一種寫法:
package com.lee.load.pdf;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringWriter;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfWriter;
import freemarker.cache.FileTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;
public class PdfExport {
/**
* @描述 生成PDF並彈出下載框
* @author lim
* @時間 2017年11月9日
* @param ftlPath ftl模板文件的路徑
* @param ftlName ftl模板的名稱
* @param data map類型的數據
* @param response
* @param request
* @throws Exception
*/
public void ExportPDF(String ftlPath,String ftlName,Map<Object, Object> data,HttpServletResponse response,HttpServletRequest request) {
// create PDF document
Document document = new Document();
try {
response.setContentType("application/x-msdownload;charset=UTF-8");
response.setHeader("Content-Disposition","attachment;filename=report.pdf");
PdfWriter.getInstance(document, response.getOutputStream());
document.open();
String html=PdfExport.getPdfContent(ftlPath, ftlName, data,request);
OutputStream out = null;
ITextRenderer render = null;
out = response.getOutputStream();
render = PdfExport.getRender(request);
render.setDocumentFromString(html);
render.layout();
render.createPDF(out);
render.finishPDF();
document.add(new Paragraph(render.toString()));
render = null;
out.close();
}
catch(Exception e) {
e.printStackTrace();
System.err.println("document: " + e.getMessage());
}finally{
document.close();
}
}
//獲取要寫入PDF的內容
public static String getPdfContent(String ftlPath, String ftlName, Map<Object, Object> data, HttpServletRequest request) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException, TemplateException {
return PdfExport.useTemplate(ftlPath, ftlName, data,request);
}
//使用freemarker得到html內容
public static String useTemplate(String ftlPath, String ftlName, Map<Object, Object> data, HttpServletRequest request) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException, TemplateException {
String html = null;
String webPath = getWEBPath(request);
Configuration configuration = new Configuration();
TemplateLoader templateLoader = new FileTemplateLoader(new File(webPath));
configuration.setTemplateLoader(templateLoader);
String path = ftlPath+ftlName;
Template tpl =configuration.getTemplate(path,"UTF-8");
//Template tpl = getFreemarkerConfig(webPath+ftlPath).getTemplate(ftlName);
StringWriter writer = new StringWriter();
tpl.process(data, writer);
writer.flush();
html = writer.toString();
return html;
}
/**
*
* @描述 加載字體,以便支持中文
* @author lim
* @時間 2017年11月9日
* @param request
* @return
* @throws DocumentException
* @throws IOException
*/
public static ITextRenderer getRender(HttpServletRequest request) throws DocumentException, IOException {
//獲取路徑
String webPath = getWEBPath(request);
ITextRenderer render = new ITextRenderer();
//添加字體,以支持中文
render.getFontResolver().addFont(webPath+"/template/pdf/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
render.getFontResolver().addFont(webPath+"/template/pdf/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
return render;
}
/**
* @描述 獲取路徑,以便加載webapp目錄下的資源文件
* @author lim
* @時間 2017年11月9日
* @param request
* @return
*/
public static String getWEBPath(HttpServletRequest request) {
return request.getSession().getServletContext().getRealPath("/");
}
}
最後記得servlet需要在web.xml中配置一下
代碼已經上傳至:http://download.csdn.net/download/lm5463640/10111723