我使用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
-
PdfWriter
可以向任意OutputStream
写入PDF。如果要创建Servlet,不应该将PDF写入FileOutputStream
,而应该写入ServletOutputStream
。请查看官方文档中的PdfServlet
示例。在这个例子中,我们将PDF写入内存(使用ByteArrayOutputStream
),一旦我们关闭文档,我们将其写入ServletOutputStream
:OutputStream os = response.getOutputStream(); baos.writeTo(os);
有非常具体的原因,为什么你想要首先在内存中创建文档,并在文档完全完成后将其写入ServletOutputStream
,但它会导致我们太远,无法解释所有这些原因(它们在我的书的第9章中列出,解释需要几页)。 - 默认情况下,内容处置为内联。这意味着PDF是在浏览器插件中打开的。如果您希望浏览器显示"另存为"对话框,您需要将内容配置更改为附件。这在CreateFDF示例中显示:
response.setHeader("Content-Disposition", "attachment; filename="subscribe.fdf"");
在这种情况下,我们还给出了文件名的建议。该文件的默认名称为subscribe.fdf
。
警告:浏览器的行为可以是不同的,例如,由于特定的浏览器功能,使浏览器忽略响应头。