Сегодня провел день без работы над проектом, так как день сегодня выходной. Поэтому всех подробностей использования ниже приведенного кода в проекте еще нет, да и в этой статье они будут лишними деталями.
Итак представим - на странице есть объект <af:fileDownloadActionListener>. В его свойстве method записан вызов метода managed bean'а формирования отчета BI (Business Intelligence). Некоторые возможные ошибки формирования в методе отлавливаются и как текст(StringBuilder) записываются в формируемый файл отчета. С целью проинформировать пользователя о том, что отчет не сформирован и показать в отчете ошибки, которые пользователь может отправить разработчику. Идея может быть и хорошая, но получается картина - пользователь в браузере видит загруженный сформированный отчет, а в случае ошибки формирования отчета это текстовый файл с расширением pdf. Не каждый пользователь сможет его открыть, что не хорошо, но уже почти каждый сможет его послать к разработчикам.
Казалось бы все, так тому и быть, но тут свое веское слово сказал выходной день и идея окончательно оформилась - "Необходимо перед записью преобразовать строку к pdf формату данных и записать в отчет их!". Тема для меня пока новая, но возможно полезная и перспективная. Далее приведу код-заготовку для включения в проект и найденную полезную информацию на просторах интернетов при решении этой задачи.
package view;
import com.itextpdf.text.Document;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.apache.commons.io.IOUtils;
public class myRunReport {
public static final String FONT = "/home/soft/WORK/pdf/DejaVuSerif.ttf";
public myRunReport() {
super();
}
public static void main(String[] args) {
//myRunReport myRunReport = new myRunReport();
stPdfTo("/home/soft/WORK/pdf/report.pdf");
}
public static void stPdfTo(String imfile) {
//код вызова отчета и
//где возможно добавить анализ параметров формирования отчета и из try-catch вызова отчета сохранить ошибку
//...
//моделирую ситуацию формирования ошибки отчета
boolean flerr = true;
if (flerr) {
try {
Document document = new Document();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
document.open();
BaseFont bf;
bf = BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font myfont = new Font(bf);
myfont.setStyle(Font.NORMAL);
myfont.setSize(10);
document.add(new Paragraph("Ошибка формирования отчета.", myfont));
document.add(new Paragraph(new Date().toString(),myfont));
SimpleDateFormat formatRu = new SimpleDateFormat("EEEE MMMM dd yyyy HH:mm:ss", new Locale("ru"));
String stDt = formatRu.format(new Date());
document.add(new Paragraph(stDt,myfont));
document.add(new Paragraph("Текст ошибки ...", myfont));
document.close();
OutputStream file = new FileOutputStream(new File(imfile));
//если брать из String stout = new String( baos.toByteArray());
//то тогда pdf сформируется, но в просмотре будет пустой.
//InputStream datafile = new ByteArrayInputStream(stout.getBytes(StandardCharsets.UTF_8));
InputStream datafile = new ByteArrayInputStream(baos.toByteArray());
//в заготовке для вызова отчета вместо возврата из метода данных в формате pdf, сформирую файл
IOUtils.copy(datafile, file);
baos.close();
datafile.close();
file.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Исходный код
iText - http://itextpdf.com/, документация - http://itextpdf.com/book/chapter.php?id=1, обязательно download our free ebook,
загрузка - http://sourceforge.net/projects/itext/?source=typ_redirect.
Полезные ссылки :
20 Very Useful Java Code Snippets For Java Developers - http://viralpatel.net/blogs/20-useful-java-code-snippets-for-java-developers/.
|