Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用servlet动态生成pdf_Java_Jasper Reports - Fatal编程技术网

Java 如何使用servlet动态生成pdf

Java 如何使用servlet动态生成pdf,java,jasper-reports,Java,Jasper Reports,我正在使用JSP中的JasperReports和servlet生成一个pdf。我正在向报表传递字符串参数。当我尝试生成单个pdf时,pdf生成得很好,但是当我尝试生成两个pdf时,对于第一个参数,pdf生成,但是对于第二个参数,pdf不生成 我通过一个循环传递参数 字符串数组[]={“1233”,“234”}; HashMap params=新的HashMap(); 类forName(“oracle.jdbc.driver.OracleDriver”); 连接cn=DriverManager.g

我正在使用JSP中的JasperReports和servlet生成一个pdf。我正在向报表传递字符串参数。当我尝试生成单个pdf时,pdf生成得很好,但是当我尝试生成两个pdf时,对于第一个参数,pdf生成,但是对于第二个参数,pdf不生成

我通过一个循环传递参数

字符串数组[]={“1233”,“234”};
HashMap params=新的HashMap();
类forName(“oracle.jdbc.driver.OracleDriver”);
连接cn=DriverManager.getConnection(“jdbc:oracle:thin:@103.179.1.218:1521:tims”、“scoot”、“tiger”);

对于(int i=0;i,如果要使用相同的输出流生成两个pdf,则不可能。 使用输出流只能生成一个文件

如果您想生成2个或更多pdf文件,我建议您创建一个zip文件并将其写入输出流

分析代码很明显,您不能生成两个文件,因为在循环期间,您关闭了输出流并刷新了数据


您应该以这样的方式获得一个已经输入的响应或类似的响应。

如果您想使用相同的输出流生成两个pdf,则是不可能的。 使用输出流只能生成一个文件

如果您想生成2个或更多pdf文件,我建议您创建一个zip文件并将其写入输出流

分析代码很明显,您不能生成两个文件,因为在循环期间,您关闭了输出流并刷新了数据


您应该通过这种方式获得已经收到的回复或类似的回复。

一些评论/建议

  • servlet的响应是每个请求,即一个请求后面跟着一个响应
  • 您将在循环结束时关闭ServletOutputSteam,从而停止任何进一步的响应
  • 您的方法现在可能适用于多个PDF。解决方法之一是在循环中创建PDF列表,创建所有PDF的zip并将其发送给最终用户

  • 一些评论/建议

  • servlet的响应是每个请求,即一个请求后面跟着一个响应
  • 您将在循环结束时关闭ServletOutputSteam,从而停止任何进一步的响应
  • 您的方法现在可能适用于多个PDF。解决方法之一是在循环中创建PDF列表,创建所有PDF的zip并将其发送给最终用户

  • 有多种方法可以在响应中发送多个文件,但浏览器之间并不一致。我认为最好的方法是,如果是单个文件,则返回pdf;如果是多个文件,则返回zip文件,以防您希望在浏览器中直接打开单个文件

    我更改了您的代码以返回一个包含报告的zip文件,但是您应该满足那里的硬编码字符串(seller_name),并将一些功能移动到其他类,而不是单个方法

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
        ZipOutputStream zipfile = null;
    
        try {
            String array[] = {"1233", "234"};
            HashMap params = new HashMap();
    
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection cn = DriverManager.getConnection("jdbc:oracle:thin:@103.179.1.218:1521:tims", "scoot", "tiger");
    
            // Wrap the servlet output stream with a zip output stream
            zipfile = new ZipOutputStream(response.getOutputStream());
    
            for (int i = 0; i < array.length; i++) {
                params.put("seller_name", array[i]);
    
                JasperDesign jasperDesign = JRXmlLoader.load(getServletContext().getRealPath("/") + "report\\CForm.jrxml");
                JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);                
                JasperPrint jasperprint = JasperFillManager.fillReport(jasperReport, params, cn);
    
                byte[] pdfAsBytes = JasperExportManager.exportReportToPdf(jasperprint, params, cn);
    
                // Create and add the zip entry 
                ZipEntry zipentry = new ZipEntry("report" + i + ".pdf");                                
                zipfile.putNextEntry(zipentry);                
                zipfile.write(pdfAsBytes);                                
            }            
    
            // Add the response headers
            response.setHeader("Content-disposition", "attachement; filename=" + UUID.randomUUID().toString() + ".zip");                
            response.setContentType("application/zip");            
        } catch (Exception ex) {
            log("An error occured", ex);
        } finally{
            try {
                // Flush the stream
                zipfile.flush();
            } catch (Exception e) {                
            }
    
            try {
                // Close the stream
                zipfile.close();
            } catch (Exception e) {                
            }
        }
    }
    
    protectedvoidprocessrequest(HttpServletRequest请求,HttpServletResponse响应){
    ZipOutStream zipfile=null;
    试一试{
    字符串数组[]={“1233”,“234”};
    HashMap params=新的HashMap();
    类forName(“oracle.jdbc.driver.OracleDriver”);
    连接cn=DriverManager.getConnection(“jdbc:oracle:thin:@103.179.1.218:1521:tims”、“scoot”、“tiger”);
    //用zip输出流包装servlet输出流
    zipfile=新的ZipOutputStream(response.getOutputStream());
    for(int i=0;i

    我希望这会有所帮助!

    有多种方法可以在响应中发送多个文件,但浏览器之间并不一致。我认为最好的方法是在单个文件中返回pdf,在多个文件中返回zip,以防您希望在浏览器中直接打开单个文件

    我更改了您的代码以返回一个包含报告的zip文件,但是您应该满足那里的硬编码字符串(seller_name),并将一些功能移动到其他类,而不是单个方法

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
        ZipOutputStream zipfile = null;
    
        try {
            String array[] = {"1233", "234"};
            HashMap params = new HashMap();
    
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection cn = DriverManager.getConnection("jdbc:oracle:thin:@103.179.1.218:1521:tims", "scoot", "tiger");
    
            // Wrap the servlet output stream with a zip output stream
            zipfile = new ZipOutputStream(response.getOutputStream());
    
            for (int i = 0; i < array.length; i++) {
                params.put("seller_name", array[i]);
    
                JasperDesign jasperDesign = JRXmlLoader.load(getServletContext().getRealPath("/") + "report\\CForm.jrxml");
                JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);                
                JasperPrint jasperprint = JasperFillManager.fillReport(jasperReport, params, cn);
    
                byte[] pdfAsBytes = JasperExportManager.exportReportToPdf(jasperprint, params, cn);
    
                // Create and add the zip entry 
                ZipEntry zipentry = new ZipEntry("report" + i + ".pdf");                                
                zipfile.putNextEntry(zipentry);                
                zipfile.write(pdfAsBytes);                                
            }            
    
            // Add the response headers
            response.setHeader("Content-disposition", "attachement; filename=" + UUID.randomUUID().toString() + ".zip");                
            response.setContentType("application/zip");            
        } catch (Exception ex) {
            log("An error occured", ex);
        } finally{
            try {
                // Flush the stream
                zipfile.flush();
            } catch (Exception e) {                
            }
    
            try {
                // Close the stream
                zipfile.close();
            } catch (Exception e) {                
            }
        }
    }
    
    protectedvoidprocessrequest(HttpServletRequest请求,HttpServletResponse响应){
    ZipOutStream zipfile=null;
    试一试{
    字符串数组[]={“1233”,“234”};
    HashMap params=新的HashMap();
    类forName(“oracle.jdbc.driver.OracleDriver”);
    连接cn=DriverManager.getConnection(“jdbc:oracle:thin:@103.179.1.218:1521:tims”、“scoot”、“tiger”);
    //用zip输出流包装servlet输出流
    zipfile=新的ZipOutputStream(response.getOutputStream());
    for(int i=0;i