Как вставить изображение в PDF с помощью iText и загрузить на клиентский компьютер?

Я использую jdbc для извлечения данных из базы данных, а затем с помощью iText создаю файл PDF, который можно загрузить на клиентскую машину. Приложение написано на html/jsp и работает на Apache Tomcat.

Я использую response.getOutputStream для немедленного создания выходного PDF-файла.

Проблема в том, что теперь я не могу вставить изображение в этот документ, так как он выдает мне ошибку, что

getOutputStream() уже был вызван для этого ответа

Я понимаю, что я снова вызываю Outputstream при вставке изображения и, следовательно, ошибка

Как я могу вставить изображение в документ и при этом создать динамический файл PDF, который может быть загружен клиентским компьютером?

Соответствующий код:

response.setContentType("application/pdf");
response.setHeader("Content-Disposition","attachment; filename=\"LicenseInfo.pdf\""); // Code 1
Document document = new Document();

PdfWriter.getInstance(document, response.getOutputStream()); // Code 2

Image image = Image.getInstance("logo.jpg");

document.open();

document.add(image);

person Sahil Sharma    schedule 13.06.2013    source источник


Ответы (1)


Извините, но вы не показываете никакого соответствующего кода, так как код, который вы копируете/вставляете, не отвечает за упомянутое вами исключение.

Важно то, что вы используете JSP и не читали важных предупреждений относительно JSP, перечисленных в главе 9 моего руководства. книга.

Когда вы пишете JSP, вам, вероятно, нравятся пробелы и отступы, например:

<% //a line of code %>
<%
   // some more code
%>
<% // another line of code %>
<%
   response.getOutputStream();
%>

Это всегда будет вызывать исключение "getOutputStream() has already been called for this response" независимо от того, используете ли вы iText или нет. Метод getOutputStream() был вызван в тот момент, когда вы ввели свой первый символ пробела в свой сценарий JSP.

Чтобы это исправить, вам нужно удалить все пробелы:

<% //a line of code %><%
   // some more code
%><% // another line of code %><%
   response.getOutputStream();
%>

Ни один символ не принимается за пределами маркеров <% и %>. Как объясняется в лучших руководствах по JSP, вы не должны использовать JSP для создания двоичных файлов. Почему нет? Потому что JSP вводит пробелы в произвольных местах вашего двоичного файла. Это приводит к повреждению файлов. Вместо этого используйте сервлеты!

person Bruno Lowagie    schedule 13.06.2013
comment
спасибо за ваши предложения, Бруно, однако я должен использовать JSP (тут нет выбора), во-вторых, я попытался удалить пробелы. Когда я это делаю, мой PDF-файл создается, но я не могу его открыть, так как он говорит, что данные повреждены. - person Sahil Sharma; 13.06.2013
comment
я использовал следующее, чтобы удалить пробелы ‹%@ page trimDirectiveWhitespaces=true %› - person Sahil Sharma; 13.06.2013
comment
Э... это совершенно неправильно; вам нужно вручную удалить пробелы из вашего JSP-файла! - person Bruno Lowagie; 13.06.2013