SpringMVC實例-HTML代碼生成PDF文件並下載

前段時間公司的項目,有一個需求是拼接HTML代碼,然後轉化成PDF供客戶下載,本來以爲是個挺簡單的事,就從網上找了個flying saucer在本地生成的Demo,結果在本地生成是成功的,結果在做項目時,發現不可用,後來也是費了很多時間,試了很多方法,最後終於搞定。

說一下思路,其實很簡單,先在服務器上創建一個臨時的文件夾,用於保存PDF文件,然後將PDF文件寫到response的流中進行下載,最後在臨時文件夾中刪除PDF文件。當然,最後一步也可以做個定時任務啥的,這個看各位的需求吧 = =。

OK,上代碼:

首先看一下項目結構

web.config配置文件

<?xml version="1.0" encoding="UTF-8"?>  
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  
      
    <!-- 配置Spring MVC DispatcherServlet -->  
    <servlet>  
        <servlet-name>SpringMVC</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <!-- 初始化參數 -->  
        <init-param>  
            <!-- 加載SpringMVC的xml到 spring的上下文容器中 -->  
            <param-name>contextConfigLocation</param-name>  
            <param-value>
                classpath:SpringMVC-servlet.xml
            </param-value>  
        </init-param>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
  
    <!-- 配置DispatcherServlet所需要攔截的 url -->  
    <servlet-mapping>  
        <servlet-name>SpringMVC</servlet-name>  
        <url-pattern>/</url-pattern>  
    </servlet-mapping>  
</web-app> 

spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd  
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd  
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">
	
	<mvc:default-servlet-handler/>
	<mvc:annotation-driven />
	<mvc:resources mapping="/js/**"   
        location="/WEB-INF/js/"/>
	
	<context:component-scan base-package="com.pdfDownLoad.Controller"/>
	
	 

	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>

</beans>

Java代碼

com.pdfDownLoad.Controller/pdfController.java

package com.pdfDownLoad.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.pdfDownLoad.Utils.pdfUtil;

@Controller
public class PDFController {
	@RequestMapping(value="index.do")
	public String getIndexUI(){
		return "index";
	}
	
	@RequestMapping(value="downLoad.do")
	public void pdfDownLoad(HttpServletRequest request, HttpServletResponse response){
		pdfUtil pdf = new pdfUtil();
		String htmlCode = getHtmlCode();
		String fileName = "MyPDF.pdf";
		pdf.createPDF(htmlCode, fileName);
		pdf.downLoad(fileName, response);
		pdf.deletePDF(fileName);
	}
	
	private String getHtmlCode(){
		StringBuffer html = new StringBuffer();   
        html.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");  
        html.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">")  
        .append("<head>")  
        .append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />")  
        .append("<style type=\"text/css\" mce_bogus=\"1\">body {font-family: SimSun;}</style>")  
        .append("<style type=\"text/css\">img {width: 700px;}</style>")  
        .append("</head>")  
        .append("<body>");  
        html.append("<h1>這是一個PDF文檔</h1>");
        html.append("<table>");
        html.append("<tr>");
        html.append("<td>第一列</td>");
        html.append("<td>第二列</td>");
        html.append("<td>第三列</td>");
        html.append("<td>第四列</td>");
        html.append("</tr>");
        html.append("</table>");  
        html.append("</body></html>"); 
        return html.toString();
	}
}

package com.pdfDownLoad.Utils/pdfUtil.java

package com.pdfDownLoad.Utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.pdf.BaseFont;



public class pdfUtil {
	private static String BASE_PATH;
	private static String PDF_TEMP_PATH;
	private static String FONT_PATH;
	
	/**
	 * 初始化
	 */
	public pdfUtil(){
		BASE_PATH = this.getClass().getResource("/").getPath();
		BASE_PATH = new File(BASE_PATH).getParentFile().getPath();
		PDF_TEMP_PATH = BASE_PATH + "\\" + "pdf\\";
		FONT_PATH = BASE_PATH + "\\fonts\\";
		File filePath = new File(PDF_TEMP_PATH);
		if (!filePath.exists()){
			filePath.mkdir();
		}
	}
	
	/**
	 * 創建PDF文件到服務器
	 * @param htmlCode HTML代碼
	 * @param fileName 文件名
	 */
	public void createPDF(String htmlCode, String fileName){
		try{
			File file = new File(PDF_TEMP_PATH + fileName);
			FileOutputStream outputStream = new FileOutputStream(file);
			ITextRenderer renderer = new ITextRenderer();
			ITextFontResolver fontResolver = renderer.getFontResolver();
			fontResolver.addFont(FONT_PATH + "simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
			renderer.setDocumentFromString(htmlCode);
			renderer.layout();
			renderer.createPDF(outputStream);
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
	}
	
	/**
	 * 從服務器上下載PDF
	 * @param fileName 文件名
	 * @param response
	 */
	public void downLoad(String fileName, HttpServletResponse response){
		try {
			
			FileInputStream fileInputStream = new FileInputStream(PDF_TEMP_PATH + fileName);
			ServletOutputStream outputStream = response.getOutputStream();
			response.setHeader("content-disposition","attachment;filename=MyPDF.pdf");
			response.setHeader("content-type", "application/pdf");
			//輸出
			int len = 1;
			byte[] bs = new byte[1024];
			while((len = fileInputStream.read(bs)) != -1){
				outputStream.write(bs, 0, len);
			}
			fileInputStream.close();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	/**
	 * 刪除PDF
	 * @param fileName 文件名
	 */
	public void deletePDF(String fileName){
		File file = new File(PDF_TEMP_PATH + fileName);
		if (file.exists()){
			file.delete();
		}
	}
}

好了,基本就是這些了,jsp頁面也沒什麼東西,就是一個在表單裏的按鈕,點擊時提交,就不貼代碼了。希望能對大家有所幫助!

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