如何在java中下载mulitple.PDF文件

如何在java中下载mulitple.PDF文件,java,Java,单击JSP页面上的按钮后,我尝试使用java代码逐个下载多个pdf,但无法完成,并使用以下代码片段进行下载 Document document[]= new Document[20]; httpServletResponse.setHeader("Content-Disposition", "attachment;filename=welcome.pdf"); httpServletRespon

单击JSP页面上的按钮后,我尝试使用java代码逐个下载多个pdf,但无法完成,并使用以下代码片段进行下载

     Document document[]=  new Document[20];
             httpServletResponse.setHeader("Content-Disposition",
                "attachment;filename=welcome.pdf");
                httpServletResponse.setContentType("application/pdf");
                try{
                    for(int i=0;i<3;i++)
                    {
                    System.out.println(i);
                    document[i]=new Document();
                    PdfWriter.getInstance(document[i], httpServletResponse.getOutputStream());
                    document[i].open();
                    document[i].add(new Paragraph("Hello Prakash"));
                    document[i].add(new Paragraph(new Date().toString()));
                    document[i].close();
                    } 
                     }catch(Exception e){
                    e.printStackTrace();
                }
documentdocument[]=新文档[20];
httpServletResponse.setHeader(“内容处置”,
“附件;文件名=welcome.pdf”);
httpServletResponse.setContentType(“application/pdf”);
试一试{

对于(inti=0;i一个人可以准备一个页面,向服务器发出多个请求,每个请求都下载一个PDF。这不是一个好的用户体验

我将使用包含所有PDF的zip文件:

response.setContentType("application/zip"); // application/octet-stream
response.setHeader("Content-Disposition", "inline; filename=\"all.zip\"");
try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
     for (int i = 0; i < 3; i++) {
         ZipEntry ze = new ZipEntry("document-" + i + ".pdf");
         zos.putNextEntry(ze);

         // It would be nice to write the PDF immediately to zos.
         // However then you must take care to not close the PDF (and zos),
         // but just flush (= write all buffered).
         //PdfWriter pw = PdfWriter.getInstance(document[i], zos);
         //...
         //pw.flush(); // Not closing pw/zos

         // Or write the PDF to memory:
         ByteArrayOutputStream baos = new ...
         PdfWriter pw = PdfWriter.getInstance(document[i], baos);
         ...
         pw.close();
         byte[] bytes = baos.toByteArray();
         zos.write(baos, 0, baos.length);

         zos.closeEntry();
     }
}
response.setContentType(“应用程序/zip”);//应用程序/octet流
setHeader(“内容处置”,“内联;文件名=\”all.zip\”;
try(ZipOutputStream zos=newzipoutpstream(response.getOutputStream())){
对于(int i=0;i<3;i++){
ZipEntry ze=新ZipEntry(“文件-”+i+“.pdf”);
佐斯·普特内森特里(泽);
//如果能立即将PDF文件发送给zos,那就太好了。
//但是,您必须注意不要关闭PDF(和zos),
//但只需刷新(=写入所有缓冲区)。
//PdfWriter pw=PdfWriter.getInstance(文档[i],zos);
//...
//pw.flush();//不关闭pw/zos
//或将PDF文件写入内存:
ByteArrayOutputStream BAS=新建。。。
PdfWriter pw=PdfWriter.getInstance(文档[i],BAS);
...
关闭();
byte[]bytes=baos.toByteArray();
写入(baos,0,baos.length);
zos.closeEntry();
}
}
只需阅读,无法使用ZIP下载。


也许你可以使用HTML5提供更好的下载体验(进度条?).

您不能在一个请求中下载多个文件。解决方法是将它们放入一个zip文件中。我已经使用了一个包含所有pdf文件的zip文件来实现这一点。Y,我不能压缩它。我的要求是一个接一个地下载。也许您应该看看浏览器端的技术,如JavaScript、Flash等,以帮助您初始化拒绝多个请求。正如@Thilo所说,这不可能是一个请求:一个请求-一个文档。请注意,1)您可能误解了要求,2)要求并不总是可行的(即,一次点击下载多个文档不是普通用户从浏览器中期望的)。谢谢joop,但我无法理解您的代码。请提供我编写代码的确切代码选择第二种选择:将PDF写入ByteArrayOutputStream,这样就可以获得要写入zip的文件内容的字节[]。//使用资源进行的尝试适用于Java 7。否则需要调用zos.close()
在.joop结尾,每当我编写这个PdfWriter pw=PdfWriter.getInstance(document[i],baos)的代码时,这里的文档会抛出错误,比如“表达式的类型必须是数组类型,但它已解析为document”我如何解决这个问题?我复制了您的代码;从错误消息中,我认为
document
没有
[i]
足够了,并且已经是一个文档,而不是一个文档数组。