2017-06-12 7 views
0

iTextを使用して、内部でPDFでZIPファイルをダウンロードするには、HttpServletResponseを返す必要があります。これは私のコードです:私は、ZIPファイルをダウンロードするときPDFでZIPを生成する

  String fileName = "Acreditaciones.zip"; 

      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      ZipOutputStream zos = new ZipOutputStream(baos); 

      for(int i = 0; i < numAcre; i++){ 
       zos.putNextEntry(new ZipEntry("Acreditaciones" + String.valueOf(i+1) + ".pdf")); 

       Document document = new Document(); 
       PdfWriter.getInstance(document, baos); 

       //Abrimos el documento para insertarle contenido 
       document.open(); 

       //TODO: Coger la URL de los parametros de la BD y cifrar el id del perceptor o la columna que lo identifique 
       //Creamos imagen con codigo QR 
       BarcodeQRCode barcodeQRCode2 = new BarcodeQRCode(URL + UtilsSeguridad.cifrar("80004244D"), 1000, 1000, null); 
       Image codeQrImage2 = barcodeQRCode2.getImage(); 
       codeQrImage2.setAlignment(Image.RIGHT); 
       codeQrImage2.scaleAbsolute(70, 70); 
       document.add(codeQrImage2); 

       document.close(); 
       zos.closeEntry(); 
      } 

      zos.finish(); 
      zos.close(); 

      response.setHeader("Content-Disposition", "attachment; filename=\""+ fileName + "\";"); 
      // Indicamos que es un PDF 
      response.setContentType("application/zip"); 
      // El tamaño del contenido es igual al del ByteArrayOutputStream 
      response.setContentLength(baos.size()); 
      // Inyectamos el ByteArrayOutputStream al ServletOutputStream 
      ServletOutputStream os = response.getOutputStream(); 
      baos.writeTo(os); 
      os.flush(); 
      os.close(); 
      FacesContext.getCurrentInstance().responseComplete(); 

が、これはすべてのPDFファイルが破損して来て、大きさせずに...私は私が間違ってやっているのか分からないが、文書があるようですインスタンス化されていません。

+0

あなたの郵便番号をどんなファイルでも試してみてください。あなたのコメントも間違っています。アプリケーション/ zipはそれがPDFであることを示していません:) –

答えて

4

次の行を置き換えます

PdfWriter writer = PdfWriter.getInstance(document, zos); 
writer.setCloseStream(false); 

そうdocumentインスタンスを閉じます、基になるストリームをクローズしないwriterインスタンスを伝えることを忘れないでください:この2行で

PdfWriter.getInstance(document, baos); 

ZipOutputStreamも閉じてください。新しいエントリを追加することはできません。

+0

私は試しました: 'java.io.IOException:Stream閉じた javax.faces.el.E​​valuationException:java.io.IOException:ストリームが閉じた ' 私は' zos.finish();を削除しようとしました。 zos.close(); 'と同じエラーを私に与えます。 – Jota

+0

私は私の答えを更新します。 –

+0

あなたは私の一日を保存しました。それは作品です。 'zos.closeEntry();'を削除しようとしましたが、 'writer.setCloseStream(false);'がなくてもうまくいきました。 ありがとうございます。 – Jota