Java 如何使用servlet动态生成pdf
我正在使用JSP中的JasperReports和servlet生成一个pdf。我正在向报表传递字符串参数。当我尝试生成单个pdf时,pdf生成得很好,但是当我尝试生成两个pdf时,对于第一个参数,pdf生成,但是对于第二个参数,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
字符串数组[]={“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