GWT: отображение PDF, созданного как ответ POST - PullRequest
2 голосов
/ 24 марта 2012

У меня есть сервлет в приложении GWT, который создает файл PDF с данными, предоставленными в запросе на публикацию, и отправляет ответ обратно:

public void service(HttpServletRequest request, HttpServletResponse response) {
        try {
            String text = request.getParameter("text");
            if (text == null || text.trim().length() == 0) {
                text = "no data";
            }

            //PDF Creation with iText
            Document document = new Document();
            ByteArrayOutputStream b = new ByteArrayOutputStream();
            PdfWriter.getInstance(document, b);
            document.open();
            document.add(new Paragraph(text));
            document.close();

            response.setHeader("Expires", "0");
            response.setHeader("Cache-Control",
                    "must-revalidate, post-check=0, pre-check=0");
            response.setHeader("Pragma", "public");
            response.setContentType("application/pdf");

            response.setContentLength(b.size());
            OutputStream os = response.getOutputStream();
            b.writeTo(os);
            os.flush();
            os.close();

        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
    }

Я хочу показать созданный PDF пользователю.Я получил это далеко на клиенте:

final RequestBuilder rb = new RequestBuilder(RequestBuilder.POST,
                GWT.getModuleBaseURL() + "PdfServlet");

    rb.setHeader("Content-type", "application/x-www-form-urlencoded");
    StringBuffer postData = new StringBuffer();
    postData.append(URL.encode("text")).append("=")
            .append(URL.encode(Text));

        rb.setRequestData(postData.toString());
        rb.setCallback(new RequestCallback() {

            @Override
            public void onResponseReceived(Request request,
                    Response response) {
                if (200 == response.getStatusCode()) {
                    //What to do here?
                } else {
                    //TODO:Something
                }
            }

            @Override
            public void onError(Request request, Throwable exception) {
                /TODO:...

            }
        });
        try {
            rb.send();
        } catch (RequestException e) {
            e.printStackTrace();
        }

Итак, мой вопрос: как мне показать этот PDF для пользователя?Все, что мне удалось сделать, это показать PDF с «без данных» ..

Спасибо за вашу помощь:)

Ответы [ 3 ]

3 голосов
/ 24 марта 2012

Вы должны создать файл pdf из вашего сервлета и хранить где-то на сервере. Вам необходимо вернуть путь к файлу, где вы хранились на сервере. И теперь из GWT вы можете предложить пользователю окно для загрузки файла. Ниже приведен пример загрузки файла из GWT:

Window.open(GWT.getHostPageBaseURL() + your return path from server, "", "");
3 голосов
/ 24 марта 2012

Вместо использования RequestBuilder вы можете просто использовать Window.Location.setUrl(yourDowloadUrl?key=value) и включить ваши параметры в строку запроса. Однако обратите внимание, что вы должны установить заголовок Content-disposition header: attachment, чтобы браузер попросил вас сохранить или открыть файл, а не заменить приложение GWT. Более того, создайте скрытый iframe на своей html-странице и вызовите setUrl для этого виджета.

Недостатком использования этого подхода является то, что он не позволяет вашему клиентскому коду перехватывать отзывы, если что-то идет не так, на стороне сервера, и вместо pdf вызов возвращает HTML со строкой ошибки с вашего веб-сервера. Если это очень важно для вас, вы должны использовать механизм опроса, который запрашивает документ, который затем создается и сохраняется на сервере, и проверяет каждые n секунд, есть ли что-то для загрузки. Я реализовал что-то вроде этого, что также предотвращает проблемы времени ожидания с большими документами. Дайте мне знать, если вы заинтересованы

1 голос
/ 21 декабря 2013

Я мог отобразить созданный pdf без необходимости сохранять файл на сервере и сохранять уникальный ключ. Он работает в Chrome, но, согласно некоторым сообщениям, это может быть проблемой в некоторых старых браузерах.

Window.open ("data: application / pdf; base64," + result, cRFTitle.replace ("", "_") + ".pdf", "enabled");

Как и предполагалось, Результат должен быть закодирован в Base64

B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...