package ee.esutoniagodesu.util.jasperreports;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import org.apache.log4j.Logger;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Map;
/**
* see klass oskab mingite mõistlike etteantud asjade abil genereerida vajaliku PDFi
*/
public final class PdfGenerator {
private static final Logger log = Logger.getLogger(PdfGenerator.class);
/**
* käesolev meetod on võimeline genereerima PDF-i ja andma selle tagasi byte[] kujul
*
* @param params on parameetrid mis antakse repordi genereerimiseks ette
* @param jrxmlAsStream assetist streamina saadud jrxml fail
* @param jdbcConnection connection mille me muidbasepage käest võime saada
* @return baidi massiiv genereeritud PDF-ga
* @throws net.sf.jasperreports.engine.JRException
*/
public static byte[] generatePDF(Map<String, Object> params,
InputStream jrxmlAsStream,
Connection jdbcConnection) throws JRException {
JasperDesign jasperDesign = JRXmlLoader.load(jrxmlAsStream);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, jdbcConnection);
return JasperExportManager.exportReportToPdf(jasperPrint);
}
public static byte[] generatePDF(Map<String, Object> params, InputStream jrxmlAsStream, JRDataSource source) throws JRException {
log.debug("generatePDF: Generate pdf with JRDataSource");
JasperDesign jasperDesign = JRXmlLoader.load(jrxmlAsStream);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, source);
return JasperExportManager.exportReportToPdf(jasperPrint);
}
public static byte[] concatanatePDF(byte[] pdf1, byte[] pdf2) throws IOException, DocumentException {
// näite järgi pdfide kokku panemine -- pole proovinud kas töötab
ByteArrayOutputStream output = new ByteArrayOutputStream();
PdfReader reader = new PdfReader(pdf1);
Document document = new Document(reader.getPageSizeWithRotation(1));
PdfCopy copy = new PdfCopy(document, output);
document.open();
// esimene pdf lisatakse
PdfImportedPage pdfImportedPage;
for (int i = 0; i < reader.getNumberOfPages(); ) {
++i;
pdfImportedPage = copy.getImportedPage(reader, i);
copy.addPage(pdfImportedPage);
}
// teine pdf lisatakse
reader = new PdfReader(pdf2);
for (int i = 0; i < reader.getNumberOfPages(); ) {
++i;
pdfImportedPage = copy.getImportedPage(reader, i);
copy.addPage(pdfImportedPage);
}
document.close();
return output.toByteArray();
}
/**
* kui tekst läheb markupi sisse, siis ei tohi see sisaldada <, >
*/
public static String jasperMarkupFix(String string) {
if (string == null) return null;
if (!string.contains("<") && !string.contains(">")) return string;
char[] chars = string.toCharArray();
StringBuilder result = new StringBuilder();
for (char p : chars) {
if (p == '<') {
result.append("«");
} else if (p == '>') {
result.append("»");
} else {
result.append(p);
}
}
return result.toString();
}
}