Это мой код, который генерирует 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-файлы верны, независимо от того, какие данные я использую.
Что не так? Я использую тот же метод, только набор данных отличается.
Если что-то пойдет не так, вы никогда не будете этого делать из-за вашего пустого блока catch (Exception e). – jlordo
Записывает ли документ поток файлов? Сбросьте и закройте вручную. –
@jlordo: catch имеет только простую реализацию журналов, он ничего не возвращает мне. Michael-O: Я добавил код сервлета выше. Когда debbuging кажется, что выход и если потоки закрыты (закрытые атрибуты изменяются false-> true) – eBEER