2013-03-03 7 views
0

Это мой код, который генерирует PDF:Невозможно прочитать PDF порожденную IText

public String generateList(Group group, List<GroupTerm> terms, List<Child> children, int begin, int finish) 
{ 
    String pathForList = "C:\\...\\List.pdf"; 

    File filePath = new File(pathForList); 
    filePath.delete(); 

    try 
    { 

     Document document = new Document(PageSize.A4.rotate()); 

     PdfWriter.getInstance(document, new FileOutputStream(pathForList)); 

     document.open(); 

     // CONTENT 

     BaseFont helvetica = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1250, BaseFont.EMBEDDED); 
     Font helvetica9 = new Font(helvetica, 9); 
     Font helvetica9bold = new Font(helvetica, 9, Font.BOLD); 

     Paragraph paragraph1 = 
      new Paragraph("Godziny: " + group.getStartHours() + "-" + group.getFinishHours() + " Miejsce: " + group.getPlace() 
       + " Grupa wiekowa: " + group.getAgeGroupName() + " Poziom: " + group.getLevel() + " Instruktor: " + group.getInstructor(), 
          helvetica9bold); 

     paragraph1.setAlignment(Element.ALIGN_LEFT); 

     document.add(paragraph1); 
     document.add(new Paragraph(" ")); 

     PdfPTable table = new PdfPTable(12); // 12 columns. 

     PdfPCell cell01 = new PdfPCell(new Paragraph("Imię", helvetica9)); 
     PdfPCell cell02 = new PdfPCell(new Paragraph("Nazwisko", helvetica9)); 
     table.addCell(cell01); 
     table.addCell(cell02); 

     for (int i = begin; i < finish; i++ 
     { 
      GroupTerm term = new GroupTerm(); 

      int iterator = -1; 
      int a = i + 1; 

      while (term.getTermID() != a) 
      { 
       iterator++; 
       term = terms.get(iterator); 
      } 

      table.addCell(new PdfPCell(new Paragraph(conv.dateFromCalToString(term.getTerm()), helvetica9))); 
     } 

     for (int j = 0; j < children.size(); j++) 
     { 
      table.addCell(new PdfPCell(new Paragraph(children.get(j).getName()))); 
      table.addCell(new PdfPCell(new Paragraph(children.get(j).getSurname()))); 
      for (int k = 0; k < 10; k++) 
      { 
       table.addCell(new PdfPCell(new Paragraph(""))); 
      } 
     } 

     document.add(table); 

     document.close(); 
    } 
    catch (Exception e) 
    { 

    } 

    return pathForList; 
} 

И проблема в том, как идет: я генерировать PDF для определенных данных, он создает List.pdf, это хорошо сделано. Но, тогда я пытаюсь создать еще один для другого набора данных, а сгенерированный файл имеет размер 0kb, а когда он открывается, отображается сообщение «Adobe Reader не смог открыть« List.pdf »beacuse - это либо не поддерживаемый тип фили, либо beacuse файл поврежден ».

PDF создается в моем веб-приложении и отправляется через сервлет в ответ, поэтому я раскрываю его через браузер.

EDIT: Мой сервлет код:

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException 
{ 
    ... // Getting data here 

    String path = pdf.generateList(group, terms, children, begin, finish); 

    // download 

    response.setContentType("application/octet-stream"); 
    response.setHeader("Content-Disposition", "attachment;filename=List.pdf"); 

    ServletOutputStream out = null; 

    try 
    { 
     File file = new File(path); 
     FileInputStream fileIn = new FileInputStream(file); 
     out = response.getOutputStream(); 

     byte[] outputByte = new byte[4096]; 
     // copy binary contect to output stream 
     while (fileIn.read(outputByte, 0, 4096) != -1) 
     { 
      out.write(outputByte, 0, 4096); 
     } 
     fileIn.close(); 
     out.flush(); 
     out.close(); 

     int i = 0; 
    } 
    catch (Exception e) 
    { 
     if (out != null) 
     { 
      out.close(); 
     } 
    } 
    finally 
    { 

    } 

    response.sendRedirect("calendar.jsp"); 
} 

EDIT: Я также использую IText для создания счета-фактуры в этом приложении, и она отлично работает. Все pdf-файлы верны, независимо от того, какие данные я использую.

Что не так? Я использую тот же метод, только набор данных отличается.

+1

Если что-то пойдет не так, вы никогда не будете этого делать из-за вашего пустого блока catch (Exception e). – jlordo

+0

Записывает ли документ поток файлов? Сбросьте и закройте вручную. –

+0

@jlordo: catch имеет только простую реализацию журналов, он ничего не возвращает мне. Michael-O: Я добавил код сервлета выше. Когда debbuging кажется, что выход и если потоки закрыты (закрытые атрибуты изменяются false-> true) – eBEER

ответ

0

Проблема решена. Это были данные. Метод не мог получить данные, и файл был сломан. Я изменил способ отправки данных, и это сработало!

1

Попробуйте заменить свой внутренний контур с:

int got; 
while ((got = fileIn.read(outputByte, 0, 4096)) > 0) { 
    out.write(outputByte, 0, got); 
} 

Ваш оригинальный цикл всегда писал 4096 байт в конце файла, но последний блок файла может быть короче, поэтому исходный цикл написал мусор в конце ответа HTTP, заполняя его до кратного 4096 байт.

+0

Это не помогло, но этот цикл кажется более разумным, чем мой, поэтому я сохраню его. – eBEER

+0

Проблема решена. Это были данные. Метод не мог получить данные, и файл был сломан. Я изменил способ отправки данных, и это сработало! – eBEER

+1

@eBEER: добавьте его в качестве ответа и отметьте его принятым, поэтому люди теперь решаются без чтения каждого комментария. – jlordo

Смежные вопросы