2017-10-04 1 views
0

Je suis capable de générer un fichier pdf et le vider dans le navigateur. Mais, maintenant, mon exigence est modifiée. J'ai besoin de générer plusieurs pdf et les garder dans un seul fichier zip et le vider dans le navigateur. J'ai suivi cela http://www.avajava.com/tutorials/lessons/how-can-i-create-a-zip-file-from-a-set-of-files.htmlZip multiples pdf dans un seul fichier zip en utilisant Java

Mais n'a pas pu trouver comment intégrer dans mon code. Voici mon code. Toutes les idées seraient grandement appréciées.

for(int i = 0; i < 5 ; i++) { 
      byte[] documentBytes = TSService.generateDocument(dealKey, i); 
      String documentType = TSUtil.getDocumentType(i); 
      response.setHeader("Content-Disposition", "attachment;filename="+documentType); 
      response.setContentType("application/pdf"); 
      response.setHeader("Expires", "0"); 
      response.setHeader("Cache-Control", "must-revalidate, postcheck=0, pre-check=0"); 
      response.setHeader("Pragma", "public"); 
      response.setContentLength(documentBytes.length); 
      ServletOutputStream out = response.getOutputStream(); 
      out.write(documentBytes);  
      out.flush(); 
      out.close(); 
     } 

Initialement, je n'avais que du code qui est en boucle. Maintenant, je veux générer 5 rapports basés sur la valeur i.

code mis à jour pour Alex

String documentType = TSUtil.getDocumentType(Integer.valueOf(documentKey)); 
     response.setHeader("Content-Disposition", "attachment;filename=dd.zip"); 
     response.setContentType("application/zip"); 
     response.setHeader("Expires", "0"); 
     response.setHeader("Cache-Control", "must-revalidate, postcheck=0, pre-check=0"); 
     response.setHeader("Pragma", "public"); 

     ServletOutputStream out = response.getOutputStream(); 
     ZipOutputStream zout = new ZipOutputStream(out); 

     for(int i = 1; i <= 5 ; i++) { 
      byte[] documentBytes = TSService.generateDocument(dealKey, i); 
      ZipEntry zip = new ZipEntry(i+".pdf"); 
      zout.putNextEntry(zip); 
      zout.write(documentBytes); 
      zout.closeEntry(); 
     } 

     zout.close(); 
+0

Vous devez utiliser un ZipOutputStream, rincer tout le pdf dans ce outpustream puis rincer le résultat dans le navigateur – Tuco

+0

@Tuco, pouvez-vous plz poster un extrait de l'échantillon? – Yakhoob

Répondre

2

Le code ci-dessous doit être travaillé et peut être téléchargé directement sans créer de fichiers temporaires. Tous sont créés à la volée et sont en mémoire.

response.setHeader("Content-Disposition", "attachment;filename="+***Your zip filename***); 
response.setContentType("application/zip"); 
response.setHeader("Expires", "0"); 
response.setHeader("Cache-Control", "must-revalidate, postcheck=0, pre-check=0"); 
response.setHeader("Pragma", "public"); 

ServletOutputStream out = response.getOutputStream(); 
ZipOutputStream zout = new ZipOutputStream(out); 

for(int i = 0; i < 5 ; i++) { 
    byte[] documentBytes = TSService.generateDocument(dealKey, i); 
    ZipEntry zip = new ZipEntry(***your pdf name***); 
    zout.putNextEntry(zip); 
    zout.write(documentBytes); 
    zout.closeEntry(); 
} 

zout.close(); 

MISE À JOUR

Je viens d'essayer le code ci-dessous et sans problème. Un nouveau fichier zip peut être créé avec 5 fichiers texte à l'intérieur. Donc je ne sais pas pourquoi vous obtenez des exceptions.

FileOutputStream out = new FileOutputStream("abc.zip"); 
    ZipOutputStream zout = new ZipOutputStream(out); 

    for(int i = 0; i < 5 ; i++) { 
     byte[] documentBytes = "12345".getBytes(); 
     ZipEntry zip = new ZipEntry(i+".txt"); 
     zout.putNextEntry(zip); 
     zout.write(documentBytes); 
     zout.closeEntry(); 
    } 

    zout.close(); 
+0

Laissez-moi vérifier et revenir vers vous. – Yakhoob

+0

il a donné l'exception immédiatement après ZipEntry zip = new ZipEntry ("dd.zip"); as java.util.zip.ZipException: entrée en double: dd.zip – Yakhoob

+0

ZipEntry est utilisé pour votre nom de fichier PDF. Ainsi, vous pouvez nommer votre 1er fichier comme 1.pdf et le 2ème comme 2.pdf et ainsi de suite. – Alex

1

je l'avais fait même tâche avec xml file.below est mon code

public String createZipFromXmlFile(List<String> filePath) { 
    String date = new SimpleDateFormat("yyyMMddHHmmssSS").format(new Date()); 
    String fName = "zipDownload" + date + ".zip"; 
    System.out.println(" File Path.................."+filePath); 
    String fileName = filePath.get(0).substring(0, filePath.get(0).indexOf("xml")) + "//" + fName; 
    try { 
     FileOutputStream fout = new FileOutputStream(fileName); 
     ZipOutputStream zout = new ZipOutputStream(fout); 
     for (String fnm : filePath) { 
      FileInputStream fin = new FileInputStream(new File(fnm)); 
      ZipEntry zip = new ZipEntry(fnm.substring(fnm.indexOf("xml"))); 
      zout.putNextEntry(zip); 
      byte[] bytes = new byte[1024]; 
      int length; 
      while ((length = fin.read(bytes)) >= 0) { 
       zout.write(bytes, 0, length); 
      } 
      zout.closeEntry(); 
      fin.close(); 
     } 
     zout.close(); 
     fout.close(); 
    } catch (Exception e) { 
    } 
    return fileName; 
} 

où filePath est la liste qui contient le chemin des fichiers xml.

+0

Je n'aurai pas de chemin de fichier. Le fichier ne sera pas stocké initialement. Je veux générer un dossier zip avec le pdf qui est généré à partir de la réponse. – Yakhoob

+0

Vous devez conserver le chemin du fichier pdf dans la liste et passer dans la méthode ci-dessus. Mes fichiers xml sont également créés lors de l'exécution. Je les stocke dans le chemin local du projet, puis j'obtiens la liste des chemins. –

+0

Le chemin de fichier recherchera le fichier qui est stocké correctement? – Yakhoob