前段時間公司的項目,有一個需求是拼接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頁面也沒什麼東西,就是一個在表單裏的按鈕,點擊時提交,就不貼代碼了。希望能對大家有所幫助!