Главная » Spring » Создание документов PDF Spring

0

Документы PDF часто используются в Интернете для отображе- ния информации в формате, одинаково точном и универсальном. Несмотря на то что каскадные таблицы стилей (Cascading Style Sheets, CSS) достигли определенного совершенства, обеспечив про- фессиональный уровень форматирования документов HTML, они имеют некоторые ограничения. Форматирование содержимого до- кументов PDF, напротив, практически не имеет ограничений.

Кроме того, реализации CSS в разных браузерах могут отличать- ся, тогда как документы PDF отображаются в Adobe Acrobat Viewer совершенно идентично на всех платформах.

Допустим, что вдобавок к отображению списка сообщений в фор- мат электронной таблицы Excel нам необходимо реализовать вывод того же списка в формате PDF. Используя формат PDF, можно быть уверенными, что выходные данные будут отображаться одинаково у всех пользователей.

Поддержка отображения документов PDF в представлении реа- лизована в Spring MVC в виде абстрактного класса AbstractPdfView. По аналогии с AbstractExcelView  необходимо определить подкласс,

наследующий AbstractPdfView, и реализовать метод buildPdfDocument(), конструирующий документ PDF.

В листинге 8.20 приводится класс RantPdfView, наследующий класс AbstractPdfView и реализующий вывод списка сообщений в формате PDF.

Листинг 8.20. Список сообщений в формате PDF

package  com.roadrantz.mvc; import     java.util.Iterator; import    java.util.List; import java.util.Map;

import  javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

import     org.springframework.web.servlet.view.document.AbstractPdfView; import  com.lowagie.text.Document;

import  com.lowagie.text.Table;

import   com.lowagie.text.pdf.PdfWriter; import com.roadrantz.domain.Rant;

public class RantPdfView extends AbstractPdfView {

protected void buildPdfDocument(Map model, Document document, PdfWriter   pdfWriter,   HttpServletRequest   request, HttpServletResponse  response)  throws  Exception  {

List   rants   =   (List)   model.get("rants");

Table rantTable = new Table(4); // Создание таблицы rantTable.setWidth(90);

rantTable.setBorderWidth(1);

rantTable.addCell("State");      // Добавление строки заголовков rantTable.addCell("Plate");

rantTable.addCell("Date Posted"); rantTable.addCell("Text");

for  (Iterator  iter  =  rants.iterator();  iter.hasNext();)  { Rant rant = (Rant) iter.next();

rantTable.addCell(rant.getVehicle().getState());       // Добавление rantTable.addCell(rant.getVehicle().getPlateNumber()); // каждого rantTable.addCell(rant.getPostedDate().toString());  // сообщения rantTable.addCell(rant.getRantText());

}

document.add(rantTable);

}

Подобно методу buildExcelDocument() в классе AbstractExcelView, ме- тод buildPdfDocument() получает данные модели в виде отображения (Map), а также HttpServletRequest и HttpServletResponse. Дополнительно ему передаются объекты классов Document и PdfWriter. Эти два класса являются частью библиотеки iText PDF (www.lowagie.com/iText) и используются для конструирования документов PDF. За дополни- тельной информацией о библиотеке iText я рекомендую обратиться к книге «iText in Action» (Manning, 2006).

В объекте Document методу buildPdfDocument() передается пустой документ iText, ожидающий наполнения содержимым. В RantPdfView список сообщений извлекается из модели, и на его основе конструи- руется таблица, где каждому сообщению отводится одна строка. После добавления в таблицу всех сообщений таблица добавляется в Document.

Чтобы обеспечить доступность представления RantPdfView для Spring MVC, добавим его объявление в файл roadrantzviews.xml ря- дом с объявлением RantExcelView:

<bean   id="vehicleRants.pdf" class="com.roadrantz.mvc.RantPdfView" />

Теперь любой контроллер, возвращающий ModelAndView с именем представления vehicleRants.pdf, получит представление, отображае- мое компонентом RantPdfView.

В разделе 8.6.1 мы уже реализовали в контроллере RantsFor- VehicleController динамический выбор представления на основе рас- ширения URI. Поэтому никаких дальнейших изменений в RantsFor- VehicleController не требуется, чтобы обеспечить поддержку RantPdf- View. Достаточно просто зарегистрировать отображение URL, чтобы DispatcherServlet смог передать запрос к адресу /rantsForVehicle.pdf контроллеру   RantsForVehicleController:

<prop   key="/rantsForVehicle.pdf"> rantsForVehicleController

</prop>

Кроме того, по аналогии с представлением, реализующим вывод данных в формате Excel, необходимо создать <servlet-mapping> в web. xml, чтобы обеспечить передачу запросов *.pdf сервлету Dispatcher- Servlet:

В заключение

391

<servlet-mapping>

<servlet-name>roadrantz</servlet-name>

<url-pattern>*.pdf</url-pattern>

</servlet-mapping>

Классы AbstractExcelView и AbstractPdfView, входящие в состав фреймворка Spring, позволяют быстро реализовать вывод докумен- тов в форматах Excel и PDF.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии