/**
* ***************************************************************************
* Copyright (c) 2010 Qcadoo Limited
* Project: Qcadoo Framework
* Version: 1.4
*
* This file is part of Qcadoo.
*
* Qcadoo is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* ***************************************************************************
*/
package com.qcadoo.report.api.pdf;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.PageSize;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfWriter;
import com.qcadoo.localization.api.TranslationService;
import com.qcadoo.model.api.Entity;
import com.qcadoo.model.api.file.FileService;
import com.qcadoo.report.api.FooterResolver;
import com.qcadoo.report.api.ReportDocumentService;
import com.qcadoo.report.api.ReportService;
public abstract class PdfDocumentWithWriterService implements ReportDocumentService {
@Autowired
private TranslationService translationService;
@Autowired
private FileService fileService;
@Autowired
private PdfHelper pdfHelper;
@Autowired
private FooterResolver footerResolver;
private static final Logger LOG = LoggerFactory.getLogger(PdfDocumentWithWriterService.class);
@Override
public void generateDocument(final Entity entity, final Locale locale, final Rectangle pageSize) throws IOException,
DocumentException {
String path = entity.getStringField("fileName").split(",")[0];
generate(entity, locale, path, pageSize);
}
@Override
public void generateDocument(final Entity entity, final Locale locale) throws IOException, DocumentException {
generateDocument(entity, locale, PageSize.A4);
}
public void generateDocument(final Entity entity, final Locale locale, final String localePrefixToMatch) throws IOException,
DocumentException {
generateDocument(entity, locale, localePrefixToMatch, PageSize.A4);
}
public void generateDocument(final Entity entity, final Locale locale, final String localePrefixToMatch,
final Rectangle pageSize) throws IOException, DocumentException {
String prefix = translationService.translate(localePrefixToMatch, locale);
String path = null;
for (String pt : entity.getStringField("fileName").split(",")) {
if (fileService.getName(pt).startsWith(prefix)) {
path = pt;
}
}
if (path == null) {
throw new IllegalStateException("filename pattern not found");
}
generate(entity, locale, path, pageSize);
}
private void generate(final Entity entity, final Locale locale, final String filename, final Rectangle pageSize)
throws IOException, DocumentException {
Document document = new Document(pageSize);
try {
FileOutputStream fileOutputStream = new FileOutputStream(fileService.createReportFile(filename + "."
+ ReportService.ReportType.PDF.getExtension()));
PdfWriter writer = PdfWriter.getInstance(document, fileOutputStream);
writer.setPageEvent(new PdfPageNumbering(footerResolver.resolveFooter(locale)));
document.setMargins(40, 40, 60, 60);
buildPdfMetadata(document, locale);
writer.createXmpMetadata();
document.open();
buildPdfContent(writer, document, entity, locale);
document.close();
} catch (DocumentException e) {
LOG.error("Problem with generating document - " + e.getMessage());
document.close();
throw e;
}
}
protected void buildPdfMetadata(final Document document, final Locale locale) {
document.addTitle(getReportTitle(locale));
pdfHelper.addMetaData(document);
}
protected abstract void buildPdfContent(final PdfWriter writer, final Document document, final Entity entity,
final Locale locale)
throws DocumentException;
}