Как управлять ошибкой «Невозможно вызвать getWriter (), getOutputStream () уже вызывается» при использовании PdfWriter из bean-компонента - PullRequest
0 голосов
/ 23 января 2019

Я генерирую несколько файлов PDF с использованием itext в приложении jsf / primefaces. Некоторые файлы генерируются правильно, а некоторые нет. После некоторой отладки я обнаружил, что проблема связана с определенной строкой кода.

Когда я звоню

writer.setPageEvent(new Footer(image));

где писатель имеет тип PdfWriter. Я получаю эти ошибки:

[org.primefaces.application.exceptionhandler.PrimeExceptionHandler] (default task-96) Could not handle exception!: java.lang.IllegalStateException: UT010006: Cannot call getWriter(), getOutputStream() already called

Получите экземпляр Pdf Writer, я использую следующие строки кода:

FacesContext fc = FacesContext.getCurrentInstance();
    ExternalContext ec = fc.getExternalContext();

    ec.responseReset(); // Some JSF component library or some Filter might
                        // have set some headers in the buffer beforehand.
                        // We want to get rid of them, else it may collide.
    ec.setResponseContentType(contentType); // Check
                                            // http://www.iana.org/assignments/media-types
                                            // for all types. Use if
                                            // necessary
                                            // ExternalContext#getMimeType()
                                            // for auto-detection based on
                                            // filename.
    // ec.setResponseContentLength(contentLength); // Set it with the file
    // size. This header is optional. It will work if it's omitted, but the
    // download progress will be unknown.
    ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

    OutputStream output = ec.getResponseOutputStream();

    // Now you can write the InputStream of the file to the above
    // OutputStream the usual way.
    Document document = new Document(PageSize.A4);

    PdfWriter writer = PdfWriter.getInstance(document, output);

Я также попытался использовать вместо этого HttpServletResponse:

HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
OutputStream output = httpServletResponse.getOutputStream();

но я получил ту же ошибку.

Как я могу решить эту проблему и написать прямо в PdfWriter? Или делать то же самое без PdfWriter?

...