2014-05-13 149 views
2

我有一個web應用程序,我在其中使用JasperReport創建PDF報告。我已經託管了我的網站。如何在JSP中打開PDF文件

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@page import="java.sql.*" %> 
<%@page import="net.sf.jasperreports.engine.JasperExportManager"%> 
<%@page import="net.sf.jasperreports.engine.JasperExportManager"%> 
<%@page import="net.sf.jasperreports.view.JasperViewer"%> 
<%@page import="net.sf.jasperreports.engine.JasperPrint"%> 
<%@page import="net.sf.jasperreports.engine.JasperReport"%> 
<%@page import="net.sf.jasperreports.engine.JasperFillManager"%> 
<%@page import="net.sf.jasperreports.engine.JRResultSetDataSource"%> 
<%@page import="net.sf.jasperreports.engine.JasperCompileManager"%> 
<%@page import="net.sf.jasperreports.*"%> 
<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>JSP Page</title> 
</head> 
<body> 
    <% 
     String invno=request.getParameter("invno"); 
     try { 
     String absolutePath = getServletContext().getRealPath("clDS_Close.jrxml"); 
     JasperReport jasperReport=JasperCompileManager.compileReport(absolutePath); 
     Class.forName("com.mysql.jdbc.Driver"); 
     Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/t_fleet","root","aadi"); 

     Statement stmt = null; 
     ResultSet rset = null; 
     Statement st2=conn.createStatement(); 

     String queryString = "select tbl_invoice.*,tbl_package.package_name,tbl_package.basic_hr,tbl_package.basic_km,tbl_package.amount from tbl_invoice inner join tbl_package on tbl_invoice.package_id=tbl_package.package_id where tbl_invoice.invoice_no="+invno+""; 
     stmt = conn.createStatement(); 
     rset = stmt.executeQuery(queryString); 
     JRResultSetDataSource jasperReports = new JRResultSetDataSource(rset); 
     JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,null, jasperReports); 

     String filename=null; 
     filename="CL"+invno+".pdf"; 

     //Report saved in specified path 
     JasperExportManager.exportReportToPdfFile(jasperPrint,filename); 

     //Report open in Runtime 
     String createdFile = getServletContext().getRealPath(filename); 
     out.println(createdFile); 
      Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " +filename); 
     } catch(Exception e) { 
      out.println(e); 
     } 
    %> 
</body> 
</html> 

我接受用戶的發票號碼並打開該發票的PDF文件。

我的問題是我的pdf文件正在創建並存儲到路徑,但我不知道如何打開它。在Windows中有一個方法RunTime.getRunTime.exec()。但我認爲這是行不通的,因爲我已經將我的Web應用程序託管到免費域名中,所以此方法在此不起作用。 請告訴我以上方法的替代方案,以便我可以打開存儲在特定路徑中的PDF文件。

+0

檢查此[回覆](http://stackoverflow.com/a/1979900/2790364)可能會得到一些東西 –

+0

不,我用jasper報告創建了我的PDF。我只想知道如何通過JSP打開它,因爲我已將我的應用程序託管到www.jvmhost.net。 Runtime.getRuntime()。exec(「rundll32 url.dll,FilProtocolHandler」)在那裏不起作用。 –

回答

2

只需使用response.sendRedirect是()。

+0

這是如何回答這個問題? –

-1

我建議遠離在JSP中生成PDF。

而是生成PDF VIA動作並通過servlet提供內容。

http://www.avajava.com/tutorials/lessons/how-do-i-serve-up-a-pdf-from-a-servlet.html?page=1

Display Pdf in browser using java servlet

你可能因爲你可以訪問HTTP響應,但是這是醜陋和可恥的

<%@ page import="org.apache.commons.io.FileUtils" %> 
<% 
byte[] pdfByteArray = FileUtils.readFileToByteArray(pdfFile); 
response.setContentType("application/pdf"); 
response.getOutputStream().write(pdfByteArray); 
response.getOutputStream().flush(); 
%> 

Exerpt從 Displaying pdf in jsp

0

可以使用的servlet 。

@WebServlet("/Test.pdf") 
public class PdfServlet extends HttpServlet { 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    File file = new File("D:\\Test\\Test.pdf"); 
    response.setHeader("Content-Type", getServletContext().getMimeType(file.getName())); 
    response.setHeader("Content-Length", String.valueOf(file.length())); 
    response.setHeader("Content-Disposition", "inline; filename=\"Test.pdf\""); 
    Files.copy(file.toPath(), response.getOutputStream()); 
    } 
} 

(如果Servlet的3.0不可用,那麼它在web.xml中通常的方式映射,如果Java 7的是不可用的,然後使用一個讀/寫循環通常的方式)

只是copypaste這個類全部加入到你的項目中,並通過/contextpath/Test.pdf而不是/contextpath/youroriginal.jsp打開所需的PDF文件(當然,將它組織到一個包中並自動完成必要的輸入)。

E.g.如在JSP如下,你想顯示PDF內嵌:

<object data="${pageContext.request.contextPath}/Test.pdf" 
type="application/pdf" width="500" height="300"> 
<a href="${pageContext.request.contextPath}/Test.pdf">Download file.pdf</a> 

+0

我用代碼搞砸了你。有什麼簡單的方法在瀏覽器中打開PDF文件?我在web應用程序中根本沒有使用過servlet。那麼我可以在JSP中做到嗎? –

+4

試試 '<%@ page import =「java.io.File」%><%@ page import =「org.apache.commons.io.FileUtils」%><% File pdfFile =(File)request .getAttribute( 「PDF」); byte [] pdfByteArray = FileUtils.readFileToByteArray(pdfFile); response.setContentType(「application/pdf」); response.getOutputStream()。write(pdfByteArray); response.getOutputStream()。flush(); ' %>' – MacDaddy

0
import java.io.File; 
import java.io.IOException; 

/** @author Taher_JAVAHUNTER*/ 
public class GeneratePDF { 

String logUserId = "0"; 
public String path = "c:/PDF"; 

public void genrateCmd(String reqURL, String reqQuery, String folderName, String id) { 
    try { 
     File destFoldereGP = new File("c:/eGP"); 
     if (destFoldereGP.exists() == false) { 
      destFoldereGP.mkdirs(); 
     } 

     File destFolderPDF = new File("c:/PDF/"); 
     if (destFolderPDF.exists() == false) { 
      destFolderPDF.mkdirs(); 
     } 

     File destFolder = new File("c:/PDF/" + folderName); 
     if (destFolder.exists() == false) { 
      destFolder.mkdirs(); 
     } 

     File destFolder2 = new File("c:/PDF/" + folderName + "/" + id); 
     if (destFolder2.exists() == false) { 
      destFolder2.mkdirs(); 
     } 
    } catch (IOException e1) { 
     System.out.println("Exception::" + e1); 
    } catch (Exception e) { 
     System.out.println("Exception::" + e); 
    } 
} 
} 
0

如果你想顯示在網頁中碧玉報告輸出,最乾淨的解決方案是將輸出報告HTML,並直接發送輸出到瀏覽器。

通過一些額外的工作,您可以創建一個接口,允許用戶更改UI中的排序順序和列寬,並將這些更改傳遞給報表對象以重新呈現。

第二個最佳選擇是使用Jasper Report Viewer作爲網頁中的小程序,它允許您以原生碧玉報告格式查看報告。