POST XML на сервер, получение PDF - PullRequest
3 голосов
/ 28 мая 2010

Подобно этому вопросу , мы разрабатываем веб-приложение, в котором клиент нажимает кнопку, чтобы получить PDF с сервера. Прямо сейчас мы используем метод .ajax () с jQuery для POST-данных, необходимых бэкенду для генерации PDF (мы отправляем XML) при нажатии кнопки, а затем бэкэнд генерирует PDF полностью в памяти и отправив его обратно как application / pdf в ответе HTTP.

Один ответ на этот вопрос требует от сервера сохранения PDF-файла на диск, чтобы он мог вернуть URL-адрес клиента для GET. Но я не хочу, чтобы бэкенд кешировал контент вообще.

Другой ответ предполагает использование плагина jQuery, но когда вы смотрите на его код, он фактически генерирует элемент form, а затем отправляет form. Этот метод не будет работать для нас, так как мы отправляем данные XML в теле HTTP-запроса.

Есть ли способ заставить браузер открывать PDF, не кэшируя PDF-файл на стороне сервера и не требуя от нас выбросить наше решение для отправки данных на сервер с использованием XML?

(Я бы хотел, чтобы браузер вел себя так же, как и при отправке элемента form - выполняется POST, а затем браузер просматривает заголовок Content-type, чтобы определить, что делать дальше, например, загрузить PDF в окне браузера, а-ля Safari)

Ответы [ 4 ]

1 голос
/ 09 июня 2010

Вот пример формы, которая позволяет вам вводить текст, и в браузере появляется PDF. Ну, это для меня. И все, что я делаю, это создаю PDF в памяти, устанавливаю тело ответа на PDF, а заголовок ответа на application / pdf. И это все.

См. http://129.33.194.254:8080/makepdf.rsp для рабочего примера.

Если это не работает для вас, отследите транзакцию http, используя wireshark.

<html>
<body>
<%
    either none? text: select request/content 'data [
        %>
        <strong> PDF Test </strong>
        <form method="post">
        Enter some text:
        <input type="text" name="data" value="">
        <input type="submit" value="Submit">
        </form>
        <%
    ][
    if not exists? %pdf-maker.r [
        write %pdf-maker.r read http://www.colellachiara.com/soft/Misc/pdf-maker.r
    ]
    if not value? 'layout-pdf [
        *do %pdf-maker.r
    ]
    response/buffer: layout-pdf compose/deep [[textbox [(dehex text)]]]
    response/set-header 'Content-type "application/pdf"
    ]
%>
</body>
</html>
1 голос
/ 28 мая 2010

Я вижу некоторые решения:

1) отправить его в простой сервлет, передать файл через процессор xslt (например, saxon), который преобразует его в xsl-fo (разновидность языка описания страниц xml), который можно преобразовать в PDF с помощью FOP или RenderX.

2) отправить сервлету, проанализировать xml в массивах bean-компонентов или в любой подходяще структурированной модели данных, которая может обрабатываться механизмом отчетности, а затем передать ее в механизм отчетов (например, Birt, JasperReports, ...), который поддерживает PDF рендеринг как стандартный формат вывода. Если XML небольшой, вы можете просто передать его полностью сервлету механизма отчетов и выполнить обработку внутри самого отчета. Я знаю, что у одного из них есть Javascript Data Source, который может выполнять преобразования.

3) Используйте iText для генерации PDF из разобранного xml в сервлете, но я никогда раньше этим не пользовался, поэтому понятия не имею, как это будет работать.

0 голосов
/ 09 мая 2012

У меня была точно такая же проблема, единственное отличие было: я использовал JSON для отправки данных на сервер. Мое решение было:

Создайте скрытую форму (#printform) на своей странице с полем ввода (#printdata) и отправьте параметры в виде строки:

  $("#printdata").val(JSON.stringify(my_json_data_object));
  $("#printform").submit();

В my_json_data_object я сохранил все необходимые данные для создания PDF. На сервере мне пришлось проанализировать параметры обратно в объект JSON с помощью JSON.parse (...). С помощью этого решения я могу создавать и передавать PDF-файлы клиенту, не сохраняя их на сервере. Не забудьте указать в заголовке следующие заголовки:

content-type: application/json
content-disposition: attachment; filename="output.pdf"
0 голосов
/ 28 мая 2010

Просто создайте соответствующие заголовки содержимого и запишите обратно PDF в ответе. Вам не нужно кэшировать созданный вами PDF-файл так же, как вам не нужно кэшировать динамически создаваемый HTML или изображения.

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