Java 如何在 JSP 中打开 PDF 文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23623487/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 00:22:00  来源:igfitidea点击:

How to open PDF file in JSP

javajsppdfjasper-reports

提问by Aditya Ekbote

I have a web application in which I am creating PDF reports using JasperReport. I have hosted my website.

我有一个 Web 应用程序,我在其中使用JasperReport创建 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>

I am accepting invoice number from user and opening PDF file for that invoice.

我正在接受用户的发票编号并打开该发票的 PDF 文件。

My problem is my pdf file is getting created and stored to path but, I don't know how to open it. There is a method RunTime.getRunTime.exec()in windows. But I think this will not work because as I have hosted my web application to free domain, this method will not work there. Please tell me alternative for above method so that I can open my PDF file stored in specific path.

我的问题是我的 pdf 文件正在创建并存储到路径,但是我不知道如何打开它。RunTime.getRunTime.exec()windows中有一个方法。但我认为这行不通,因为我已将 Web 应用程序托管到免费域,因此此方法在那里不起作用。请告诉我上述方法的替代方法,以便我可以打开存储在特定路径中的 PDF 文件。

采纳答案by Ashish Jaggi

Simply use response.sendRedirect().

只需使用 response.sendRedirect()。

回答by Kenneth Clark

I would suggest staying away from generating the PDF in a JSP.

我建议不要在 JSP 中生成 PDF。

Rather generate the PDF VIA an Action and serve the content through a servlet.

而是通过 Action 生成 PDF 并通过 servlet 提供内容。

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

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

使用java servlet在浏览器中显示Pdf

you could potentially as you have access to the HTTP response but this is ugly and shameful

您可以访问 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 from Displaying pdf in jsp

摘自 在jsp中显示pdf

回答by MacDaddy

you can use servlet.

你可以使用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());
   }
}

(if Servlet 3.0 is not available, then map it in web.xml the usual way, if Java 7 is not available, then use a read/write loop the usual way)

(如果 Servlet 3.0 不可用,则以通常方式将其映射到 web.xml 中,如果 Java 7 不可用,则以通常方式使用读/写循环)

Just copypaste this class in its entirety into your project and open the desired PDF file by /contextpath/Test.pdf instead of /contextpath/youroriginal.jsp (after having organized it in a package and autocompleted the necessary imports in the class, of course).

只需将这个类全部复制粘贴到您的项目中,然后通过 /contextpath/Test.pdf 而不是 /contextpath/youroriginal.jsp 打开所需的 PDF 文件(当然,在将它组织到一个包中并自动完成类中必要的导入之后)。

E.g. as follows in a JSP where you'd like to show the PDF inline:

例如,在您希望内联显示 PDF 的 JSP 中,如下所示:

<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>

回答by soorajn

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);
    }
}
}

回答by Rodney P. Barbati

If you are wanting to display jasper reports output in a web page, the cleanest solution is to output the report as HTML, and send the output directly to the browser.

如果您想在网页中显示 jasper 报告输出,最简洁的解决方案是将报告输出为 HTML,并将输出直接发送到浏览器。

With a little extra work, you can create an interface that allows the user to change sort order and column widths in the UI, and communicates those changes down to the report object for re-rendering.

通过一些额外的工作,您可以创建一个界面,该界面允许用户更改 UI 中的排序顺序和列宽,并将这些更改传达给报表对象以重新呈现。

The second best option is to use the Jasper Report Viewer as an applet in your web page, which allows you to view the reports in native jasper reports format.

第二个最佳选择是将 Jasper 报告查看器用作网页中的小程序,它允许您以原生 jasper 报告格式查看报告。

回答by soumen shine

<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Blob"%>
<%@page import="java.io.OutputStream"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>View File</title>
</head>
<body>
   <%


String connectionURL = "jdbc:mysql://localhost:3306/database_name";

String user = "username";
String pass = "password";

Connection con = null;
Statement stat= null;
ResultSet rs= null;

PreparedStatement ps=null;
String Filename = "Filename";
Blob file=null;
byte[] filedata = null;

try
{

try
{
     Class.forName("com.mysql.jdbc.Driver");
    con = DriverManager.getConnection(connectionURL, user, pass);
    stat = con.createStatement();
}
catch(Exception e) {
    out.println("Error During connection to the database : " +e.getMessage());
}
s1="select * from doc where Book_Name='"+Filename+"'";
rs=stat.executeQuery(s1);
try{
    if(rs.next ())
    {
        file=rs.getBlob("Book");
        filedata=file.getBytes(1, (int) file.length());

}


    else
    {
        out.println("file not found.");
        return;

    }
    response.setContentType("application/pdf");
    response.setHeader("content-Disposition","inline");
    response.setContentLength(filedata.length);
    OutputStream output =response.getOutputStream();
    output.write(filedata);
    output.flush();
}
catch(Exception e)
{
 out.println("Error while retriving data : " +e.getMessage());     
}

%>

 <%
  }
 catch(Exception e)
 {
 out.println("Error in application :"+e.getMessage());
 }

 %>
</body>
</html>