Происхождение проблемы.
Не так давно я выполнил небольшой проект по созданию отчетов в формате PDF через JSP, который стал для меня откровением. Некоторая информация компании формирует HTML-отчеты через сеть. Хотя IE может напрямую распечатывать отображаемый в нем контент, с точки зрения интерфейса, если результаты отображения Html распечатываются напрямую, это выглядит не очень красиво. Если вы преобразуете его в PDF-файл, а затем распечатаете, эффект печати будет намного лучше.
Введение в iText
iText — это библиотека классов Java с открытым исходным кодом, которую можно использовать для легкого создания файлов PDF. Вы можете загрузить последнюю версию библиотеки классов, посетив http://sourceforge.net/project/showfiles.php?group_id=15255&release_id=167948. После завершения загрузки вы получите пакет .jar. Добавьте этот пакет в. путь к классам JDK для его использования. Если в созданном PDF-файле должны присутствовать китайские, японские и корейские символы, вам также необходимо загрузить пакет iTextAsian.jar, посетив http://itext.sourceforge.net/downloads/iTextAsian.jar .
Что касается использования библиотеки классов iText, http://www.lowagie.com/iText/tutorial/index.html содержит более подробное руководство. Это руководство начинается с самого начала и систематически знакомит с методами и приемами размещения текста, изображений, таблиц и т. д. в файлах PDF. Прочитав это руководство, вы сможете создавать простые и сложные PDF-файлы. Однако пытаться решить все трудности, возникающие в процессе создания PDF-файлов, с помощью обучающих программ, несомненно, является роскошью. Поэтому очень важно прочитать документацию по API iText. Когда читатели загружают библиотеку классов, они также могут загрузить документацию к библиотеке классов.
Как использовать iText для создания отчетов в формате PDF в программе Java
Ниже приведен простейший пример из приведенного выше руководства. В этом примере показана общая структура программы для создания файлов PDF с помощью iText. Читателям нужно только добавить контент, который они хотят поместить в PDF-файл, между двумя операторами document.open() и document.close();. В этом примере в PDF-файл добавляется только строка текста «Hello World».
Document document = new Document();
try
{
PdfWriter.getInstance(document, new FileOutputStream ("Chap0101.pdf"));
document.open
(
);
document.add(new Paragraph("Hello World" ));
DocumentException de)
{
System.err.println(de.getMessage());
}
catch(IOException ioe)
{
System.err.println(ioe.getMessage());
document.close
()
; приведенный выше пример. Структура программы очень ясна и проста. Однако указать расположение текста, изображений и таблиц в PDF — весьма хлопотная задача. Помимо процесса постоянного изменения положения в программе, последующего запуска программы, создания PDF-файла и наблюдения за разумностью положения элементов в PDF, кажется, нет другого лучшего метода.
Как создавать отчеты в формате PDF с помощью JSP,
нет в учебниках iText, а в Интернете относительно мало соответствующей информации. Однажды я видел, как кто-то писал на CSDN с просьбой рассказать о деталях реализации, и кто-то ответил о принципе реализации: сначала генерируется PDF-файл на сервере, а затем пользователь выбирает, скачать или открыть его, щелкнув гиперссылку, указывающую на PDF-файл. Это идея или одна из идей. В этой статье реализована эта идея, а также представлена другая идея, реализованная двумя способами.
1) Создавайте PDF-файлы прямо на сервере.
<%@ импорт страницы ="com.lowagie.text.*,com.lowagie.text.pdf.*, java.io.*"%>
<%
String filename = "PDF"+(new Random()).nextInt ()+".pdf" ;
Document document = new Document(PageSize.A4);
ServletOutputStream
out1 = response.getOutputStream();
try
{
PdfWriter Writer = PdfWriter.getInstance(document, new FileOutputStream(filename) );
);
document.add(new Paragraph("Привет, мир"));
document.close();
}
catch(Exception e){}%>
Вышеупомянутая программа генерирует статический PDF-файл на сервере. Очевидно, что имя PDF-файла, полученного при каждом запуске, должно быть уникальным и не дублироваться. Эта программа использует случайную функцию для именования сгенерированных PDF-файлов. Недостатком этой программы является то, что при каждом запуске на сервере будет создаваться PDF-файл. Если его не удалить вовремя, число будет становиться все больше и больше. Очевидно, что администратор сайта этого не хочет. видеть.
2) Перенести PDF-файл в кэш клиента в виде потока. Преимущество этого в том, что на сервере не останется никаких «реликвий».
i) Генерировать непосредственно через страницу JSP
<%@
page import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<%
response.setContentType( "application/pdf" );
Документ document = новый Document();
ByteArrayOutputStream buffer = новый ByteArrayOutputStream();
PdfWriter write=PdfWriter.getInstance( document.open
();
document.add(new Paragraph("Hello World");
document.close();
вывод DataOutput = новый DataOutputStream(response.getOutputStream());
byte[] bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
for(int i = 0; i < bytes. длина; я++)
{
output.writeByte(bytes[i]
}
%>
;
ii) Создано через сервлет
import java.io.*;
import javax.servlet.*;
import com.lowagie.text.*; import com.lowagie.text.pdf.*; import javax.servlet.http.*;
import com.lowagie.text.pdf.*;
importjavax.servlet.http
.*; import com.lowagie.text.pdf.*;
Ответ HttpServletResponse)
выдает IOException,ServletException
{
Document document = new Document(PageSize.A4, 36,36,36,36);
ByteArrayOutputStream ba = new ByteArrayOutputStream();
try
{
PdfWriter
Writer = PdfWriter.getInstance(document, ba);
.open();
document.add(new Paragraph("Hello World"));
}
catch(DocumentException de)
{
de.printStackTrace();
System.err.println("Ошибка документа:" +de.getMessage(); }
document.close();
response.setContentType
(
"
application
/pdf")
;
();
}
В итоге
использовал второй подход в своем проекте. Исходный код этой статьи был отлажен на моем Tomcat4. Надеюсь, это принесет удобство всем.
Приглашаем всех желающих использовать ее. При необходимости перепечатки укажите источник.