/*
* 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/>.
*/
/*
* Created on Sep 6, 2005
*
*/
package org.kuali.kfs.module.purap.pdf;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import org.kuali.kfs.module.purap.PurapConstants;
import org.kuali.kfs.module.purap.businessobject.PurchaseOrderVendorQuote;
import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
import org.kuali.kfs.module.purap.util.PurApDateFormatUtils;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.api.datetime.DateTimeService;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.ExceptionConverter;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfPCell;
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 handle pdf for purchase order quote request documents.
*
*/
public class PurchaseOrderQuoteRequestsPdf extends PdfPageEventHelper {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PurchaseOrderQuoteRequestsPdf.class);
public PdfTemplate tpl; // A template that will hold the total number of pages.
public PdfContentByte cb;
public PdfPTable headerTable;
public PurchaseOrderDocument po;
public BaseFont helv;
Font titleFont = FontFactory.getFont("ARIAL", 14, 0);
Font cellTitleFont = FontFactory.getFont("ARIAL", 8, 0);
Font cellTextFont = FontFactory.getFont("ARIAL", 12, 0);
public PurchaseOrderQuoteRequestsPdf() {
super();
}
/**
* Overrides the method in PdfPageEventHelper from itext to initialize the template and font for purchase
* order quote request pdf documents.
*
* @param writer The PdfWriter for this document.
* @param document The document.
* @see com.lowagie.text.pdf.PdfPageEventHelper#onOpenDocument(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document)
*/
public void onOpenDocument(PdfWriter writer, Document document) {
LOG.debug("onOpenDocument() started.");
try {
// initialization of the template
tpl = writer.getDirectContent().createTemplate(100, 100);
// initialization of the font
helv = BaseFont.createFont("Helvetica", BaseFont.WINANSI, false);
}
catch (Exception e) {
throw new ExceptionConverter(e);
}
}
/**
* Overrides the method in PdfPageEventHelper from itext to 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)
*/
public void onEndPage(PdfWriter writer, Document document) {
LOG.debug("onEndPage() started.");
PdfContentByte cb = writer.getDirectContent();
cb.saveState();
// 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)
*/
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 PurchaseOrderPdf getPageEvents() {
LOG.debug("getPageEvents() started.");
return new PurchaseOrderPdf();
}
/**
* Creates an instance of a new Document and set its margins.
*
* @return The created Document object.
*/
private Document getDocument() throws DocumentException {
LOG.debug("getDocument() started");
Document document = new Document(PageSize.A4);
// Margins: 36pt = 0.5 inch, 72pt = 1 inch. Left, right, top, bottom.
document.setMargins(9, 9, 25, 36);
return document;
}
/**
* Generates the purchase order quote request list pdf document based on the data in the given input parameters
* by creating a pdf writer using the given byteArrayOutputStream then calls the createPOQuoteRequestsListPdf to
* write the pdf document into the writer.
*
* @param po The PurchaseOrderDocument to be used to generate the pdf.
* @param byteArrayOutputStream The ByteArrayOutputStream to print the pdf to.
* @param institutionName The purchasing institution name.
* @return Collection of errors which are made of the messages from DocumentException.
*/
public Collection generatePOQuoteRequestsListPdf(PurchaseOrderDocument po, ByteArrayOutputStream byteArrayOutputStream, String institutionName) {
if (LOG.isDebugEnabled()) {
LOG.debug("generatePOQuoteRequestsListPDF() started for po number " + po.getPurapDocumentIdentifier());
}
Collection errors = new ArrayList();
try {
Document doc = this.getDocument();
PdfWriter writer = PdfWriter.getInstance(doc, byteArrayOutputStream);
this.createPOQuoteRequestsListPdf(po, doc, writer, institutionName);
}
catch (DocumentException de) {
LOG.error(de.getMessage(), de);
errors.add(de.getMessage());
}
return errors;
}
/**
* Invokes the createPOQuoteRequestsListPdf method to create a purchase order quote list request pdf document
* and saves it into a file which name and location are specified in the input parameters.
*
* @param po The PurchaseOrderDocument to be used to generate the pdf.
* @param pdfFileLocation The location to save the pdf file.
* @param pdfFilename The name for the pdf file.
* @param institutionName The purchasing institution name.
* @return Collection of errors which are made of the messages from DocumentException.
*/
public Collection savePOQuoteRequestsListPdf(PurchaseOrderDocument po, String pdfFileLocation, String pdfFilename, String institutionName) {
if (LOG.isDebugEnabled()) {
LOG.debug("savePOQuoteRequestsListPDF() started for po number " + po.getPurapDocumentIdentifier());
}
Collection errors = new ArrayList();
try {
Document doc = this.getDocument();
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(pdfFileLocation + pdfFilename));
this.createPOQuoteRequestsListPdf(po, doc, writer, institutionName);
}
catch (DocumentException de) {
LOG.error(de.getMessage(), de);
errors.add(de.getMessage());
}
catch (FileNotFoundException f) {
LOG.error(f.getMessage(), f);
errors.add(f.getMessage());
}
return errors;
}
/**
* Deletes an already created PDF.
*
* @param pdfFileLocation The location to save the pdf file.
* @param pdfFilename The name for 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();
}
/**
* Creates the pdf using given input parameters.
*
* @param po The PurchaseOrderDocument to be used to create the pdf.
* @param document The pdf document whose margins have already been set.
* @param writer The PdfWriter to write the pdf document into.
* @param instName The purchasing institution name
* @throws DocumentException
*/
private void createPOQuoteRequestsListPdf(PurchaseOrderDocument po, Document document, PdfWriter writer, String instName) throws DocumentException {
if (LOG.isDebugEnabled()) {
LOG.debug("createPOQuoteRequestsListPdf() started for po number " + po.getPurapDocumentIdentifier());
}
// These have to be set because they are used by the onOpenDocument() method.
this.po = po;
// Turn on the page events that handle the header and page numbers.
PurchaseOrderPdf events = new PurchaseOrderPdf().getPageEvents();
writer.setPageEvent(this); // Passing in "this" lets it know about the po, campusName, etc.
document.open();
PdfPCell cell;
Paragraph p = new Paragraph();
float[] headerWidths = { 0.25f, 0.25f, 0.25f, 0.25f };
headerTable = new PdfPTable(headerWidths);
headerTable.setWidthPercentage(100);
headerTable.setHorizontalAlignment(Element.ALIGN_CENTER);
headerTable.getDefaultCell().setBorderWidth(0);
headerTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
headerTable.getDefaultCell().setVerticalAlignment(Element.ALIGN_CENTER);
// New row
cell = new PdfPCell(new Paragraph(instName + "\nRequest for Quotation Vendor List\n\n", titleFont));
cell.setBorderWidth(0);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setColspan(4);
headerTable.addCell(cell);
// New row
cell = new PdfPCell(new Paragraph("PO Number: " + po.getPurapDocumentIdentifier(), cellTextFont));
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setBorderWidth(0);
headerTable.addCell(cell);
cell = new PdfPCell(new Paragraph("Req. Number: " + po.getRequisitionIdentifier(), cellTextFont));
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setBorderWidth(0);
headerTable.addCell(cell);
// Date format pattern: MM-dd-yyyy
SimpleDateFormat sdf = PurApDateFormatUtils.getSimpleDateFormat(PurapConstants.NamedDateFormats.KUALI_SIMPLE_DATE_FORMAT_2);
Date today = SpringContext.getBean(DateTimeService.class).getCurrentSqlDate();
cell = new PdfPCell(new Paragraph("Printed: " + sdf.format(today), cellTextFont));
cell.setBorderWidth(0);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
headerTable.addCell(cell);
if (po.getPurchaseOrderQuoteDueDate() != null) {
Date dueDate = po.getPurchaseOrderQuoteDueDate();
cell = new PdfPCell(new Paragraph("Due: " + sdf.format(dueDate) + "\n\n", cellTextFont));
}
else {
cell = new PdfPCell(new Paragraph("Due: N/A\n\n", cellTextFont));
}
cell.setBorderWidth(0);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
headerTable.addCell(cell);
document.add(headerTable);
// ***** List table *****
LOG.debug("createPOQuoteRequestsListPdf() list table started.");
float[] listWidths = { 0.20f, 0.20f, 0.20f, 0.20f, 0.20f };
PdfPTable listTable = new PdfPTable(listWidths);
listTable.setWidthPercentage(100);
listTable.setHorizontalAlignment(Element.ALIGN_CENTER);
cell = new PdfPCell(new Paragraph("Vendor Name", cellTextFont));
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setBorderWidth(0);
listTable.addCell(cell);
cell = new PdfPCell(new Paragraph("City", cellTextFont));
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setBorderWidth(0);
listTable.addCell(cell);
cell = new PdfPCell(new Paragraph("Attention", cellTextFont));
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setBorderWidth(0);
listTable.addCell(cell);
cell = new PdfPCell(new Paragraph("Fax #", cellTextFont));
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setBorderWidth(0);
listTable.addCell(cell);
cell = new PdfPCell(new Paragraph("Received", cellTextFont));
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setBorderWidth(0);
listTable.addCell(cell);
// The line under the headings.
cell = new PdfPCell(new Paragraph(" ", cellTitleFont));
cell.setFixedHeight(1);
cell.setColspan(5);
listTable.addCell(cell);
for (PurchaseOrderVendorQuote poqv : po.getPurchaseOrderVendorQuotes()) {
cell = new PdfPCell(new Paragraph(poqv.getVendorName(), cellTextFont));
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setBorderWidth(0);
listTable.addCell(cell);
if (poqv.getVendorStateCode() != null) {
cell = new PdfPCell(new Paragraph(poqv.getVendorCityName() + ", " + poqv.getVendorStateCode(), cellTextFont));
}
else if (poqv.getVendorCountryCode() != null) {
cell = new PdfPCell(new Paragraph(poqv.getVendorCityName() + ", " + poqv.getVendorCountryCode(), cellTextFont));
}
else {
cell = new PdfPCell(new Paragraph(poqv.getVendorCityName(), cellTextFont));
}
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setBorderWidth(0);
listTable.addCell(cell);
cell = new PdfPCell(new Paragraph(poqv.getVendorAttentionName(), cellTextFont));
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setBorderWidth(0);
listTable.addCell(cell);
cell = new PdfPCell(new Paragraph(poqv.getVendorFaxNumber(), cellTextFont));
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setBorderWidth(0);
listTable.addCell(cell);
cell = new PdfPCell(new Paragraph("__________", cellTextFont));
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setBorderWidth(0);
listTable.addCell(cell);
}
document.add(listTable);
document.close();
LOG.debug("createPOQuoteRequestsListPdf()pdf document closed.");
} // End of createQuotePdf()
}