001 /*
002 * Copyright 2011 The Kuali Foundation.
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.kfs.module.purap.pdf;
017
018 import java.io.File;
019
020 import org.apache.struts.taglib.tiles.GetAttributeTag;
021 import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
022 import org.kuali.kfs.sys.context.SpringContext;
023 import org.kuali.rice.kns.service.DateTimeService;
024 import org.kuali.rice.kns.service.KualiConfigurationService;
025 import org.kuali.rice.kns.util.GlobalVariables;
026 import org.kuali.rice.kns.util.KualiDecimal;
027 import org.kuali.rice.kns.util.ObjectUtils;
028
029 import com.lowagie.text.Document;
030 import com.lowagie.text.Element;
031 import com.lowagie.text.Font;
032 import com.lowagie.text.FontFactory;
033 import com.lowagie.text.Image;
034 import com.lowagie.text.PageSize;
035 import com.lowagie.text.pdf.BaseFont;
036 import com.lowagie.text.pdf.PdfContentByte;
037 import com.lowagie.text.pdf.PdfPTable;
038 import com.lowagie.text.pdf.PdfPageEventHelper;
039 import com.lowagie.text.pdf.PdfTemplate;
040 import com.lowagie.text.pdf.PdfWriter;
041
042 /**
043 * Base class to be extended for implementing PDF documents in Purchasing/Accounts Payable module.
044 */
045 public class PurapPdf extends PdfPageEventHelper {
046 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PurapPdf.class);
047
048 /** headerTable pieces need to be public */
049 public PdfTemplate tpl; // A template that will hold the total number of pages.
050 public PdfContentByte cb;
051 public Image logo;
052 public PdfPTable headerTable;
053 public PdfPTable nestedHeaderTable;
054 public String campusName;
055 public PurchaseOrderDocument po;
056 public String logoImage;
057 public BaseFont helv;
058 public String environment;
059 public boolean isPreview = false;
060 public boolean isRetransmit = false;
061
062 Font ver_4_normal = FontFactory.getFont("VERDANA", 4, 0);
063 Font ver_5_normal = FontFactory.getFont("VERDANA", 5, 0);
064 Font ver_6_normal = FontFactory.getFont("VERDANA", 6, 0);
065 Font ver_8_normal = FontFactory.getFont("VERDANA", 8, 0);
066 Font ver_10_normal = FontFactory.getFont("VERDANA", 10, 0);
067 Font ver_11_normal = FontFactory.getFont("VERDANA", 11, 0);
068 Font ver_12_normal = FontFactory.getFont("VERDANA", 12, 0);
069 Font ver_13_normal = FontFactory.getFont("VERDANA", 13, 0);
070 Font ver_14_normal = FontFactory.getFont("VERDANA", 14, 0);
071 Font ver_15_normal = FontFactory.getFont("VERDANA", 15, 0);
072 Font ver_16_normal = FontFactory.getFont("VERDANA", 16, 0);
073 Font ver_17_normal = FontFactory.getFont("VERDANA", 17, 0);
074
075 Font ver_6_bold = FontFactory.getFont("VERDANA", 6, 1);
076 Font ver_8_bold = FontFactory.getFont("VERDANA", 8, 1);
077 Font ver_10_bold = FontFactory.getFont("VERDANA", 10, 1);
078
079 Font cour_7_normal = FontFactory.getFont("COURIER", 7, 0);
080 Font cour_10_normal = FontFactory.getFont("COURIER", 10, 0);
081
082 static KualiDecimal zero = KualiDecimal.ZERO;
083
084 private DateTimeService dateTimeService;
085
086 public PurapPdf() {
087 super();
088 }
089
090 public DateTimeService getDateTimeService() {
091 if (ObjectUtils.isNull(dateTimeService)) {
092 this.dateTimeService = SpringContext.getBean(DateTimeService.class);
093 }
094 return this.dateTimeService;
095 }
096
097 /**
098 * Overrides the method in PdfPageEventHelper from itext to include our watermark text to indicate that
099 * this is a Test document and include the environment, if the environment is not a production environment.
100 *
101 * @param writer The PdfWriter for this document.
102 * @param document The document.
103 * @see com.lowagie.text.pdf.PdfPageEventHelper#onStartPage(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document)
104 */
105 public void onStartPage(PdfWriter writer, Document document) {
106 if (!SpringContext.getBean(KualiConfigurationService.class).isProductionEnvironment()) {
107 PdfContentByte cb = writer.getDirectContentUnder();
108 cb.saveState();
109 cb.beginText();
110 cb.setFontAndSize(helv, 48);
111 String watermarkText = "Test document (" + environment + ")";
112 cb.showTextAligned(Element.ALIGN_CENTER, watermarkText, document.getPageSize().width() / 2, document.getPageSize().height() / 2, 45);
113 cb.endText();
114 cb.restoreState();
115 }
116 if(GlobalVariables.getUserSession() != null && GlobalVariables.getUserSession().retrieveObject("isPreview") != null) {
117 GlobalVariables.getUserSession().removeObject("isPreview");
118 PdfContentByte cb = writer.getDirectContentUnder();
119 cb.saveState();
120 cb.beginText();
121 cb.setFontAndSize(helv, 48);
122 String watermarkText = "DRAFT";
123 cb.showTextAligned(Element.ALIGN_CENTER, watermarkText, document.getPageSize().width() / 2, document.getPageSize().height() / 2, 45);
124 cb.endText();
125 cb.restoreState();
126 }
127 }
128
129 /**
130 * Overrides the method in PdfPageEventHelper from itext to write the headerTable, compose the footer and show the
131 * footer.
132 *
133 * @param writer The PdfWriter for this document.
134 * @param document The document.
135 * @see com.lowagie.text.pdf.PdfPageEventHelper#onEndPage(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document)
136 */
137 public void onEndPage(PdfWriter writer, Document document) {
138 LOG.debug("onEndPage() started.");
139 PdfContentByte cb = writer.getDirectContent();
140 cb.saveState();
141 // write the headerTable
142 headerTable.setTotalWidth(document.right() - document.left());
143 headerTable.writeSelectedRows(0, -1, document.left(), document.getPageSize().height() - 10, cb);
144 // compose the footer
145 String text = "Page " + writer.getPageNumber() + " of ";
146 float textSize = helv.getWidthPoint(text, 12);
147 float textBase = document.bottom() - 20;
148 cb.beginText();
149 cb.setFontAndSize(helv, 12);
150 // show the footer
151 float adjust = helv.getWidthPoint("0", 12);
152 cb.setTextMatrix(document.right() - textSize - adjust, textBase);
153 cb.showText(text);
154 cb.endText();
155 cb.addTemplate(tpl, document.right() - adjust, textBase);
156 cb.saveState();
157 }
158
159
160 /**
161 * Overrides the method in the PdfPageEventHelper from itext to put the total number of pages into the template.
162 *
163 * @param writer The PdfWriter for this document.
164 * @param document The document.
165 * @see com.lowagie.text.pdf.PdfPageEventHelper#onCloseDocument(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document)
166 */
167 public void onCloseDocument(PdfWriter writer, Document document) {
168 LOG.debug("onCloseDocument() started.");
169 tpl.beginText();
170 tpl.setFontAndSize(helv, 12);
171 tpl.setTextMatrix(0, 0);
172 tpl.showText("" + (writer.getPageNumber() - 1));
173 tpl.endText();
174 }
175
176 /**
177 * Gets a PageEvents object.
178 *
179 * @return a new PageEvents object
180 */
181 public PurapPdf getPageEvents() {
182 LOG.debug("getPageEvents() started.");
183 return new PurapPdf();
184 }
185
186 /**
187 * Creates an instance of a new Document and set its margins according to
188 * the given input parameters.
189 *
190 * @param f1 Left margin.
191 * @param f2 Right margin.
192 * @param f3 Top margin.
193 * @param f4 Bottom margin.
194 * @return The created Document object.
195 */
196 public Document getDocument(float f1, float f2, float f3, float f4) {
197 LOG.debug("getDocument() started");
198 Document document = new Document(PageSize.A4);
199 // Margins: 36pt = 0.5 inch, 72pt = 1 inch. Left, right, top, bottom.
200 document.setMargins(f1, f2, f3, f4);
201 return document;
202 }
203
204 /**
205 * Deletes an already created PDF.
206 *
207 * @param pdfFileLocation The location of the pdf file.
208 * @param pdfFilename The name of the pdf file.
209 */
210 public void deletePdf(String pdfFileLocation, String pdfFilename) {
211 LOG.debug("deletePdf() started for po pdf file: " + pdfFilename);
212 File f = new File(pdfFileLocation + pdfFilename);
213 f.delete();
214 }
215
216 }