Tạo Servet để xuất PDF report trên web browser

Trong bài viết này tôi xin trình bày cách viết một Servlet đơn giản để xuất report dạng PDF trên web browser.

Mã nguồn rất dễ hiểu và các comment trong đó đã tự giải thích chức năng.
Hãy xem qua, xin bạn quan tâm đến method exportToPDFStream, đây là method quan trọng để xuất PDF report.







package com.db.misportal.servlet;

import
java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import com.db.report.jasper.custom.common.AbstractReport;
import com.db.report.jasper.custom.consumptionreport.ConsumptionReport;
import com.db.report.jasper.custom.trackingreport.TrackingReport;

/**
* @web.servlet name = "JasperReportsBrowserServlet" description = "Display PDF
* reports on the browser.The default file name is
* <productcode>.pdf"
*
* @web.servlet-mapping url-pattern = "/JasperReportsBrowserServlet/*"
*
* @author anhquan.nguyen@gmail.com
*
*/

public class JasperReportsBowserServlet extends HttpServlet {

private static final long serialVersionUID = 1L;
static Logger _log = Logger.getLogger(JasperReportsBrowserServlet.class);
String strProductCode;
String strReportDate;
String strReportHome;
String strProductCategory;
String strReportType;
String strReportMonth;
String strReportYear;
String strReportMode;

public void init(ServletConfig config) throws ServletException {
super.init(config);

_log.info("init JasperReportsBrowserServlet...");

// String initial = config.getInitParameter("initial");

ServletContext context = this.getServletConfig().getServletContext();

strReportHome = context.getRealPath("/reports");

_log.debug("Report Home : " + strReportHome);

_log.info("init completed!");

}



protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

process(request, response);

}

protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

process(request, response);

}


protected void process(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

ServletOutputStream servletOutputStream = response.getOutputStream();

/* Get parameters from form */
strProductCode = request.getParameter("productCode");

strProductCategory = request.getParameter("productCategory");

strReportType = request.getParameter("reportType");

strReportMonth = request.getParameter("reportMonth");

strReportYear = request.getParameter("reportYear");

strReportMode = request.getParameter("reportMode");

strReportDate = strReportMonth + "/" + strReportYear;

AbstractReport report = null;

String strReportHome = "N:\\thesis\\workspace\\misportal\\WebRoot\\reports";

if ("consumption_report".equals(strReportType)) {

String strPDFFileName = strProductCode + ".pdf";

String strContentHeader = strProductCode;

report = new ConsumptionReport();

report.setParams(strProductCode, strReportDate);

if ("single".equals(strReportMode)) {

report.setPath("consumptionreportsingle", strReportHome+ "\\consumption\\in", strReportHome+ "\\consumption\\out");

} else // all

{

strPDFFileName = "Consumption" + ".pdf";
strContentHeader = "Consumption";
report.setPath("consumptionreportall", strReportHome+ "\\consumption\\in", strReportHome+ "\\consumption\\out");

}

exportToPDFStream(response, servletOutputStream, report,strPDFFileName, strContentHeader);

} else if ("tracking_report".equals(strReportType)) {

if ("single".equals(strReportMode)) {

report = new TrackingReport();

report.setParams(strProductCode, strReportDate);



report.setPath("tracking", strReportHome

+ "\\trackingreport\\in", strReportHome

+ "\\trackingreport\\out");



report.setSubReports("tracking_part", 1, 10);

String strPDFFileName = strProductCode + ".pdf";

String strContentHeader = strProductCode;



exportToPDFStream(response, servletOutputStream, report,

strPDFFileName, strContentHeader);

} else {

report = new TrackingReport();

report.setParams(strProductCode, strReportDate);



report.setPath("tracking", strReportHome

+ "\\trackingreport\\in", strReportHome

+ "\\trackingreport\\out");



report.setSubReports("tracking_part", 1, 10);

String strPDFFileName = strProductCode + ".pdf";

String strContentHeader = strProductCode;

exportToPDFStream(response, servletOutputStream, report,

strPDFFileName, strContentHeader);

}

}



servletOutputStream.close();

}



/**

* Export to PDF Stream

*

* @param response

* @param servletOutputStream

* @param report

* @param strPDFFileName

* Default file name

* @param strContentHeader

* Content header description

* @throws IOException

*/

private void exportToPDFStream(HttpServletResponse response,

ServletOutputStream servletOutputStream, AbstractReport report,

String strPDFFileName, String strContentHeader) throws IOException {



byte[] bytes = report.getPDFBytes();

_log.debug("Bytes length : " + bytes.length);

response.setContentType("application/pdf");

response.setHeader("Content-Description", strContentHeader);

response.setHeader("Content-transfer-encoding", "binary");

response.setHeader("Content-Disposition", "attachment; filename="

+ strPDFFileName);

response.setContentLength(bytes.length);

servletOutputStream.write(bytes, 0, bytes.length);

servletOutputStream.flush();

_log.debug("close outputstream");

}

}






Khi phát triển porlet, một điều nên tránh là sử dụng pha lẫn Servlet và Portlet. Trong bài viết kỳ tới, tôi xin giới thiệu cách xuất PDF từ Portlet. Có thể bạn nghĩ rằng chắc việc đó cũng tương tự như xuất PDF từ servlet, nhưng sự thực không đơn giản như vậy.

Gặp lại trong bài viết sau.

Bài viết hiện chưa có phản hồi.