Тип содержимого должен быть установлен на application/pdf
, а заголовок расположения содержимого должен быть установлен до того, как в ответ будет записан какой-либо байт, в противном случае его слишком поздно устанавливать.Кроме того, вы также можете сразу же записать PDF-файл в выходной поток ответа.
Все вместе, метод может быть упрощен следующим образом:
public <E> String createPDF(E type, boolean print) throws Exception {
getPdfNaam(type); // ??? It should *return* name, not change/set the local value.
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.setResponseHeader("Content-Type", "application/pdf");
ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + naam + ".pdf" + "\"");
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, ec.getResponseOutputStream());
document.open();
buildPDFContent(document, type);
close(document);
}
Также убедитесь, что вывызов FacesContext#responseComplete()
, чтобы сообщить JSF, что вы уже взяли обработку ответов в свои руки, чтобы он знал, что ему не нужно переходить к какому-либо представлению.
FacesContext.getCurrentInstance().responseComplete();