2013-04-12 7 views
3

Итак, я создаю файл PDF отчет с моего сервера, используя этот кодIText PDF в Servlet

response.setHeader("Expires", "0"); 
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); 
response.setHeader("Pragma", "public"); 
response.setContentType("application/pdf"); 
List<Integer> cartas1 = new ArrayList<Integer>(); 
DeudorDAO DDAO = new DeudorDAO(); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
try { 
    baos = DocumentoCartaCobranza.CrearDocumento(
     getServletContext().getRealPath("static/images/pdf_banner.jpg"), 
     getServletContext().getRealPath("static/images/firmaJG.png"), 
     getServletContext().getRealPath("static/images/firmaAB.jpg"), 
     DDAO.getDatosFullDeudores(cartas1) 
    ); 
} catch (DocumentException e) { 
    e.printStackTrace(); 
} 
OutputStream os = response.getOutputStream(); 
baos.writeTo(os); 
os.flush(); 
os.close(); 

И

public static ByteArrayOutputStream CrearDocumento(
    String imgCabecera, 
    String imgFirma, 
    String imgAbogado, 
    java.util.List<Deudor> carta1) throws DocumentException { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     try { 
      PdfWriter pdfw = null; 
      pdfw = PdfWriter.getInstance(Documento, baos); 
      Documento.open(); 
      for (Deudor D : carta1){ 
       //Imagen cabecera 
       Image imgHead = Image.getInstance(imgCabecera); 
       //imgHead.setAbsolutePosition(35, 770); 
       imgHead.scaleAbsolute(125, 40); 
       Documento.add(imgHead); 
       Carta1(D); 
       //Imagen Firma 
       Image imgSign = Image.getInstance(imgFirma); 
       //imgHead.setAbsolutePosition(35, 770); 
       imgSign.scaleAbsolute(110, 105); 
       Documento.add(imgSign); 
       Documento.newPage(); 
      } 
      Documento.close(); 
     } 
     catch(DocumentException e) { 
      System.out.println(e.getMessage()); 
     } catch (MalformedURLException e) { 
      System.out.println(e.getMessage()); 
     } catch (IOException e) { 
      System.out.println(e.getMessage()); 
     } 
     return baos; 
    } 

Так что мой сервлет вызов класса и возвращает ByteArrayOutputStream. Пока все хорошо. Оно работает !

Проблемы возникают, когда я вызываю другой отчет ... Сервлет не отвечает. В нем говорится:

Документ был закрыт. Вы не можете добавлять элементы.

И, конечно, он был закрыт, по первому звонку. Но это новый призыв к разному докладу.

Я предполагаю, что это было что-то о PDFWriter ...

Спасибо !!

EDIT!

Только в случае, если вы спросите:

private static float Espaciado = 15; 
private static Document Documento = new Document(); 

private static void Carta1(Deudor D) throws DocumentException { 
     //Cabecera Cuerpo 
     Paragraph persona = new Paragraph(); persona.add(Chunk.NEWLINE); persona.add(new Chunk("Señor(a)")); 
     persona.add(Chunk.NEWLINE); persona.add(new Chunk(D.getPaciente().getNombre()).append(" "). 
       append(D.getPaciente().getApepat()).append(" ").append(D.getPaciente().getApemat()).toString()); 
     persona.add(Chunk.NEWLINE); persona.add(new Chunk(D.getPaciente().getRut().toString()).append("-").append(D.getPaciente().getDV()).toString()); 
     persona.add(Chunk.NEWLINE); persona.add(new Chunk(D.getPaciente().getDireccion()+", "+D.getPaciente().getCiudad()+", "+D.getPaciente().getComuna())); 
     persona.setAlignment(Element.ALIGN_LEFT); 

     Paragraph folio = new Paragraph(); 
     Chunk c = new Chunk(D.getIngreso().toString()+"-"+D.getDV(), new Font(folio.getFont().getFamily(), 20, Font.BOLD)); c.setUnderline(0.5f, -1.5f); folio.add(c); 
     folio.add(Chunk.NEWLINE); folio.add(new Chunk("Ref: Valorización PAM")); 
     folio.setAlignment(Element.ALIGN_RIGHT); 

     Paragraph cc = new Paragraph(new Chunk("Estimado Paciente:")); 
     cc.setAlignment(Element.ALIGN_LEFT); cc.setSpacingAfter(Espaciado); 
     //Cuerpo 
     Paragraph p2 = new Paragraph(new Chunk("En CLINICA IQUIQUE S.A. bla bla").toString()); 
     p2.setFirstLineIndent(50); p2.setSpacingAfter(Espaciado); p2.setAlignment(Element.ALIGN_JUSTIFIED); 

     Documento.add(persona); Documento.add(folio); Documento.add(cc); 
     Documento.add(p2); 
    } 
+0

Показать код: 'pdfw = PdfWriter.getInstance (Documento, baos);' –

+0

private static Document Documento = new Document(); –

+0

Я имею в виду, он возвращает новый экземпляр 'PdfWriter'? –

ответ

5

это довольно просто: вы создаете статический документ:

private static Document Documento = new Document(); 

, а затем вы звоните близко от него:

Documento.close(); 

Таким образом, ошибка логична. Создайте документ как свойство метода и передайте его вместо использования в качестве статического. Использование статических полей в сервлетах полезно только для кешей, все остальное задает проблемы.

+4

Я должен умереть и сжечь в аду –

+2

@MarioCaresCabezas, если каждый программист делает это, ни один программист не останется на земле :) lolz –

+0

@MarioCaresCabezas Shit бывает, не беспокойтесь – bluevoid