2014-05-13 219 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作为网页中的小程序,它允许您以原生碧玉报告格式查看报告。