/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program 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, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.module.purap.pdf;
import java.io.File;
import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.KRADUtils;
import org.kuali.rice.krad.util.ObjectUtils;
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfPageEventHelper;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;
/**
* Base class to be extended for implementing PDF documents in Purchasing/Accounts Payable module.
*/
public class PurapPdf extends PdfPageEventHelper {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PurapPdf.class);
/** headerTable pieces need to be public */
public PdfTemplate tpl; // A template that will hold the total number of pages.
public PdfContentByte cb;
public Image logo;
public PdfPTable headerTable;
public PdfPTable nestedHeaderTable;
public String campusName;
public PurchaseOrderDocument po;
public String logoImage;
public BaseFont helv;
public String environment;
public boolean isPreview = false;
public boolean isRetransmit = false;
Font ver_4_normal = FontFactory.getFont("VERDANA", 4, 0);
Font ver_5_normal = FontFactory.getFont("VERDANA", 5, 0);
Font ver_6_normal = FontFactory.getFont("VERDANA", 6, 0);
Font ver_8_normal = FontFactory.getFont("VERDANA", 8, 0);
Font ver_10_normal = FontFactory.getFont("VERDANA", 10, 0);
Font ver_11_normal = FontFactory.getFont("VERDANA", 11, 0);
Font ver_12_normal = FontFactory.getFont("VERDANA", 12, 0);
Font ver_13_normal = FontFactory.getFont("VERDANA", 13, 0);
Font ver_14_normal = FontFactory.getFont("VERDANA", 14, 0);
Font ver_15_normal = FontFactory.getFont("VERDANA", 15, 0);
Font ver_16_normal = FontFactory.getFont("VERDANA", 16, 0);
Font ver_17_normal = FontFactory.getFont("VERDANA", 17, 0);
Font ver_6_bold = FontFactory.getFont("VERDANA", 6, 1);
Font ver_8_bold = FontFactory.getFont("VERDANA", 8, 1);
Font ver_10_bold = FontFactory.getFont("VERDANA", 10, 1);
Font cour_7_normal = FontFactory.getFont("COURIER", 7, 0);
Font cour_10_normal = FontFactory.getFont("COURIER", 10, 0);
Font cour_16_bold = FontFactory.getFont("COURIER", 16, 1);
static KualiDecimal zero = KualiDecimal.ZERO;
private DateTimeService dateTimeService;
public PurapPdf() {
super();
}
public DateTimeService getDateTimeService() {
if (ObjectUtils.isNull(dateTimeService)) {
this.dateTimeService = SpringContext.getBean(DateTimeService.class);
}
return this.dateTimeService;
}
/**
* Overrides the method in PdfPageEventHelper from itext to include our watermark text to indicate that
* this is a Test document and include the environment, if the environment is not a production environment.
*
* @param writer The PdfWriter for this document.
* @param document The document.
* @see com.lowagie.text.pdf.PdfPageEventHelper#onStartPage(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document)
*/
@Override
public void onStartPage(PdfWriter writer, Document document) {
if (!KRADUtils.isProductionEnvironment()) {
PdfContentByte cb = writer.getDirectContentUnder();
cb.saveState();
cb.beginText();
cb.setFontAndSize(helv, 48);
String watermarkText = "Test document (" + environment + ")";
cb.showTextAligned(Element.ALIGN_CENTER, watermarkText, document.getPageSize().width() / 2, document.getPageSize().height() / 2, 45);
cb.endText();
cb.restoreState();
}
if(GlobalVariables.getUserSession() != null && GlobalVariables.getUserSession().retrieveObject("isPreview") != null) {
GlobalVariables.getUserSession().removeObject("isPreview");
PdfContentByte cb = writer.getDirectContentUnder();
cb.saveState();
cb.beginText();
cb.setFontAndSize(helv, 48);
String watermarkText = "DRAFT";
cb.showTextAligned(Element.ALIGN_CENTER, watermarkText, document.getPageSize().width() / 2, document.getPageSize().height() / 2, 45);
cb.endText();
cb.restoreState();
}
}
/**
* Overrides the method in PdfPageEventHelper from itext to write the headerTable, compose the footer and show the
* footer.
*
* @param writer The PdfWriter for this document.
* @param document The document.
* @see com.lowagie.text.pdf.PdfPageEventHelper#onEndPage(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document)
*/
@Override
public void onEndPage(PdfWriter writer, Document document) {
LOG.debug("onEndPage() started.");
PdfContentByte cb = writer.getDirectContent();
cb.saveState();
// write the headerTable
headerTable.setTotalWidth(document.right() - document.left());
headerTable.writeSelectedRows(0, -1, document.left(), document.getPageSize().height() - 10, cb);
// compose the footer
String text = "Page " + writer.getPageNumber() + " of ";
float textSize = helv.getWidthPoint(text, 12);
float textBase = document.bottom() - 20;
cb.beginText();
cb.setFontAndSize(helv, 12);
// show the footer
float adjust = helv.getWidthPoint("0", 12);
cb.setTextMatrix(document.right() - textSize - adjust, textBase);
cb.showText(text);
cb.endText();
cb.addTemplate(tpl, document.right() - adjust, textBase);
cb.saveState();
}
/**
* Overrides the method in the PdfPageEventHelper from itext to put the total number of pages into the template.
*
* @param writer The PdfWriter for this document.
* @param document The document.
* @see com.lowagie.text.pdf.PdfPageEventHelper#onCloseDocument(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document)
*/
@Override
public void onCloseDocument(PdfWriter writer, Document document) {
LOG.debug("onCloseDocument() started.");
tpl.beginText();
tpl.setFontAndSize(helv, 12);
tpl.setTextMatrix(0, 0);
tpl.showText("" + (writer.getPageNumber() - 1));
tpl.endText();
}
/**
* Gets a PageEvents object.
*
* @return a new PageEvents object
*/
public PurapPdf getPageEvents() {
LOG.debug("getPageEvents() started.");
return new PurapPdf();
}
/**
* Creates an instance of a new Document and set its margins according to
* the given input parameters.
*
* @param f1 Left margin.
* @param f2 Right margin.
* @param f3 Top margin.
* @param f4 Bottom margin.
* @return The created Document object.
*/
public Document getDocument(float f1, float f2, float f3, float f4) {
LOG.debug("getDocument() started");
Document document = new Document(PageSize.A4);
// Margins: 36pt = 0.5 inch, 72pt = 1 inch. Left, right, top, bottom.
document.setMargins(f1, f2, f3, f4);
return document;
}
/**
* Deletes an already created PDF.
*
* @param pdfFileLocation The location of the pdf file.
* @param pdfFilename The name of the pdf file.
*/
public void deletePdf(String pdfFileLocation, String pdfFilename) {
if (LOG.isDebugEnabled()) {
LOG.debug("deletePdf() started for po pdf file: " + pdfFilename);
}
File f = new File(pdfFileLocation + pdfFilename);
f.delete();
}
}