java - 如何显示弹出pdf文件而不是使用java内部保存?

标签 java html jsp servlets itext

我已经使用iText jar将内容导出为pdf。我已使用 FileOutputStream 将文件存储在本地(如 D:/filename.pdf)。我需要显示弹出对话框并要求在 pdf 中保存选项,而不是这样做。如何实现?

Here is my code.

JSP:

<%@ page language="java" 
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Export to Excel - Demo</title>
<!-- Jquery script -->
<script src="scripts.js"></script>
<script language="javascript"> 
function ExportToPDF()
{

    $('#myForm').submit();      
}
</script>
</head>
<body>
  <form id="myForm" action="Sample" method="post">
    <br><br>
    <p>
    some text
    </p>
    <a href="" onclick="ExportToPDF();" target="_blank">Export to Excel</a>

   </form>
</body>
</html>

Servlet:

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.itextpdf.text.Document;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;



/**
 * Servlet implementation class Sample
 */
public class Sample extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Sample() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        System.out.println("Inside doGet");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        System.out.println("Inside doPost");
        try {
            actionExportToPDF(request, response);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

  public void actionExportToPDF(HttpServletRequest request, HttpServletResponse response) throws Exception
  {

      /* Create Connection objects */
      Class.forName ("oracle.jdbc.OracleDriver"); 
      Connection conn=DriverManager.getConnection(
            "jdbc:oracle:thin:@localhost:1521:XID","username","password");
      Statement stmt = conn.createStatement();
      System.out.println(conn);
      /* Define the SQL query */
      ResultSet query_set = stmt.executeQuery("SELECT first_name,last_name,email,phone,dob,squestion FROM signup");
      /* Step-2: Initialize PDF documents - logical objects */
      Document my_pdf_report = new Document();
      PdfWriter.getInstance(my_pdf_report, new FileOutputStream("D:/pdf_report_from_sql_using_java.pdf"));
      my_pdf_report.open();            
      //we have four columns in our table
      PdfPTable my_report_table = new PdfPTable(4);
      //create a cell object
      PdfPCell table_cell;

      while (query_set.next()) {                
                      String first_id = query_set.getString("first_name");
                      table_cell=new PdfPCell(new Phrase(first_id));
                      my_report_table.addCell(table_cell);
                      String last_name=query_set.getString("last_name");
                      table_cell=new PdfPCell(new Phrase(last_name));
                      my_report_table.addCell(table_cell);
                      String email_id=query_set.getString("email");
                      table_cell=new PdfPCell(new Phrase(email_id));
                      my_report_table.addCell(table_cell);
                      String phone_id=query_set.getString("phone");
                      table_cell=new PdfPCell(new Phrase(phone_id));
                      my_report_table.addCell(table_cell);
                      String dob_id=query_set.getString("dob");
                      table_cell=new PdfPCell(new Phrase(dob_id));
                      my_report_table.addCell(table_cell);
                      String squestion_id=query_set.getString("squestion");
                      table_cell=new PdfPCell(new Phrase(squestion_id));
                      my_report_table.addCell(table_cell);
                      }
      /* Attach report table to PDF */
      my_pdf_report.add(my_report_table);                       
      my_pdf_report.close();

      /* Close all DB related objects */
      query_set.close();
      stmt.close(); 
      conn.close();     


  }

}

用过的 jar :

itextpdf-5.2.0.jar

itextpdf-5.2.0-javadoc.jar

itextpdf-5.2.0-sources.jar

itext-xtra-5.2.0.jar

itext-xtra-5.2.0-javadoc.jar

itext-xtra-5.2.0-sources.jar

ojdbc14-10g.jar

最佳答案

  1. PdfWriter可以将PDF写入任何OutputStream 。如果您想创建 Servlet,则不应将 PDF 写入 FileOutputStream ,但是到 ServletOutputStream 。看看 PdfServlet 官方文档中的示例。在此示例中,我们将 PDF 写入内存(使用 ByteArrayOutputStream ),关闭文档后,我们将其写入 ServletOutputStream 。 :OutputStream os = response.getOutputStream(); baos.writeTo(os);由于非常具体的原因,您希望首先在内存中创建文档并将其写入 ServletOutputStream一旦文档完全完成,但它会导致我们无法解释所有这些原因(它们列在 my book 的第 9 章中,并且解释需要好几页)。
  2. 默认情况下,内容配置内联。这意味着 PDF 是在浏览器内的浏览器插件中打开的。如果您希望浏览器显示“另存为”对话框,则需要将内容配置更改为附件。这显示在 CreateFDF 中示例:response.setHeader("Content-Disposition", "attachment; filename=\"subscribe.fdf\"");在这种情况下,我们还给出了文件名的建议。文件的默认名称为 subscribe.fdf .

警告:浏览器的行为可能会有所不同,例如,由于特定的浏览器功能导致浏览器忽略响应 header 。

关于java - 如何显示弹出pdf文件而不是使用java内部保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24528708/

相关文章:

javascript - 当表位于可滚动 div 中时,如何使用 jquery 使表行滚动到 View 中?

java - 两个或多个点的正则表达式应分隔为点空间

html - CSS div高度继承

html - 如何使此代码响应

java - 如何访问jsp中输入的当前页面url?

java - JSP中如何引用css、images、java script等静态资源?

java - Java中如何输入二叉树

Java 应用程序 Windows 与 Mac OS X

java数据绑定(bind)到gui,就像在c#中一样

java - Netbeans 无法在不同操作系统上创建的项目中编译 JSP