itext生成PDF,並彈出下載框提示下載

目錄結構:



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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章