如何使用jsp在pdf文件中打印数据库中的数据?

时间:2017-04-18 05:54:42

标签: mysql jsp pdf

我对jsp有点新,并且正在研究NetBeansIDE 8.0中的一个项目,我需要从mysql工作台检索数据并将该数据打印到pdf文件中说" HelloWorld.pdf"在D盘中。我正在使用itext7-7.0.2和itextpdf-5.3.5.jar。我正在使用jsp来执行此操作。这是我的代码:

<%@ page trimDirectiveWhitespaces="true" %>
<%@page import="com.itextpdf.text.Element"%>
<%@page import="com.itextpdf.text.Document"%>
<%@page import="com.itextpdf.text.Chunk"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="com.itextpdf.text.Font"%>
<%@page import="java.io.File"%>
<%@page import="java.io.FileOutputStream"%>
<%@page import="java.io.OutputStream"%>
<%@page import="com.itextpdf.text.Anchor"%>
<%@page import="com.itextpdf.text.Font.FontFamily"%>
<%@page import="com.itextpdf.text.BaseColor"%>
<%@page import="com.itextpdf.text.Paragraph"%>
<%@page import="com.itextpdf.text.pdf.PdfWriter"%>
<%@page import="com.itextpdf.text.PageSize" %>
<%@page import="java.io.IOException" %>
<%@page import="java.sql.Connection" %>
<%@page import="java.sql.PreparedStatement" %>
<%@page import="java.sql.ResultSet" %>
<%@page import="javax.naming.Context" %>
<%@page import="javax.naming.InitialContext" %>
<%@page import="javax.servlet.ServletException" %>
<%@page import="javax.servlet.ServletOutputStream" %>
<%@page import="javax.servlet.http.HttpServlet" %>
<%@page import="javax.servlet.http.HttpServletRequest" %>
<%@page import="javax.servlet.http.HttpServletResponse" %>
<%@page import="javax.sql.DataSource" %>


<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
</head>
<body>

<% 
    Document doc = new Document();
OutputStream os = response.getOutputStream();
PdfWriter.getInstance(doc,new FileOutputStream(new File("D:/HelloWorld.pdf")));
doc.open();
String branch1 =request.getParameter("branch");
String sem1 =request.getParameter("semester");
String sub =request.getParameter("subject");

  Font bfBold18 = new Font(FontFamily.TIMES_ROMAN, 18, Font.BOLD, new BaseColor(0, 0, 0)); 
  Font bfBold12 = new Font(FontFamily.TIMES_ROMAN, 12, Font.BOLDITALIC, new BaseColor(0, 0, 0)); 
  Font bf12 = new Font(FontFamily.TIMES_ROMAN, 12);   
  try
{
    String t=null;
   PdfWriter.getInstance(doc, os); 
   doc.open();
   Class.forName("com.mysql.jdbc.Driver");
   Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/projectdb","root","root");
   Statement st=con.createStatement();
   ResultSet rs= st.executeQuery("select qid,question from questiondb where branch='"+branch1+"' and semester='"+sem1+"' and subject='"+sub+"'");
    while(rs.next())
    { 
        t=rs.getString(2);
        Paragraph paragraph = new Paragraph(t, bfBold18);
        paragraph.setAlignment(Element.ALIGN_JUSTIFIED);
        paragraph.setFont(new Font(Font.FontFamily.HELVETICA, 10, Font.NORMAL));
       doc.add(paragraph);
        doc.add( Chunk.NEWLINE );
    }      
       rs.first();  
       doc.close();
       con.close();
       os.flush();
       os.close();      
}
catch(Exception e)
{
    out.println(e);
}

%>
    </body>
</html>

但是在GlassFish Server开源版4.0中运行时出现错误:java.lang.IllegalStateException: getOutputStream() has already been called for this response

1 个答案:

答案 0 :(得分:1)

您无法使用响应的输出流或调出out.println(e)。您获得的异常与servlet的工作方式有关。一旦生成了响应(通过servlet框架),就无法再次使用它们的输出流

那就是说你应该把你的代码编写在Java类而不是JSP中。后者通常只用于生成HTML页面,而不是用于调用像pdf生成这样重的逻辑