Пустые страницы при создании и загрузке файла PDF (iText & JSF) - PullRequest
2 голосов
/ 07 мая 2011

У меня возникла проблема, когда я пытаюсь создать PDF-файл с помощью iText и хочу сразу же загрузить его.Сначала я создаю PDF-файл с помощью библиотеки iText, файл записывается в папку TEMP на сервере, все это отлично работает.Но потом я вызываю экран загрузки для загрузки файла PDF из папки TEMP на клиент, и здесь что-то идет не так.На экране загрузки отображается значок Firefox (браузер) вместо значка Acrobat.Когда я загружаю файл, я вижу только пустые страницы PDF, но количество страниц правильное.Например, у меня есть PDF-файл из 4 страниц, в результате я получаю 4 пустых страницы, контента нет.Файл PDF в папке TEMP, однако, является правильным, он содержит 4 страницы с правильным содержимым.

Это мой код Java, он выполняется, когда пользователь нажимает ах:1005 * На этом сайте я нашел код вызова экрана загрузки http://www.winstonprakash.com/articles/jsf/file_download_link.htm Я искал в Google и в Stack Overflow, но не смог найти связанных вопросов.Я использую JSF 2.0. Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

3 голосов
/ 07 мая 2011

Тип содержимого должен быть установлен на 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();
0 голосов
/ 14 июня 2013

вы можете выходной поток ответить немедленно.Ниже мой код:

        OutputStream out = response.getOutputStream();
        response.setContentType("application/x-msdownload;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;"+"filename="+System.currentTimeMillis()+".pdf");

        Document document = new Document(PageSize.A4, 10, 10, 10,10);
        PdfWriter.getInstance(document, out);
        document.open();
            //The below is document add data
            //....
            //close flow
            if(document!=null){
                document.close();
            }           
            if(out!=null){              
                out.flush();
                out.close();    
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...