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.ByteArrayOutputStream; 019 020 import org.apache.commons.lang.StringUtils; 021 import org.apache.commons.logging.Log; 022 import org.apache.commons.logging.LogFactory; 023 import org.kuali.kfs.module.purap.document.BulkReceivingDocument; 024 import org.kuali.kfs.sys.KFSConstants; 025 026 import com.lowagie.text.Chunk; 027 import com.lowagie.text.Document; 028 import com.lowagie.text.Element; 029 import com.lowagie.text.ExceptionConverter; 030 import com.lowagie.text.Image; 031 import com.lowagie.text.Paragraph; 032 import com.lowagie.text.Phrase; 033 import com.lowagie.text.pdf.BaseFont; 034 import com.lowagie.text.pdf.PdfPCell; 035 import com.lowagie.text.pdf.PdfPTable; 036 import com.lowagie.text.pdf.PdfWriter; 037 038 /** 039 * Base class to handle pdf for bulk receiving ticket. 040 */ 041 public class BulkReceivingPdf extends PurapPdf { 042 043 private static Log LOG = LogFactory.getLog(BulkReceivingPdf.class); 044 private BulkReceivingDocument blkRecDoc; 045 046 public BulkReceivingPdf() { 047 super(); 048 } 049 050 /** 051 * Overrides the method in PdfPageEventHelper from itext to create and set the headerTable and set its logo image if 052 * there is a logoImage to be used, creates and sets the nestedHeaderTable and its content. 053 * 054 * @param writer The PdfWriter for this document. 055 * @param document The document. 056 * @see com.lowagie.text.pdf.PdfPageEventHelper#onOpenDocument(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document) 057 */ 058 public void onOpenDocument(PdfWriter writer, Document document) { 059 try { 060 061 loadHeaderTable(); 062 063 // initialization of the template 064 tpl = writer.getDirectContent().createTemplate(100, 100); 065 066 // initialization of the font 067 helv = BaseFont.createFont("Helvetica", BaseFont.WINANSI, false); 068 069 }catch (Exception e) { 070 throw new ExceptionConverter(e); 071 } 072 } 073 074 private void loadHeaderTable() 075 throws Exception { 076 077 float[] headerWidths = { 0.20f, 0.80f }; 078 079 headerTable = new PdfPTable(headerWidths); 080 headerTable.setWidthPercentage(100); 081 headerTable.setHorizontalAlignment(Element.ALIGN_CENTER); 082 headerTable.setSplitLate(false); 083 headerTable.getDefaultCell().setBorderWidth(0); 084 headerTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); 085 headerTable.getDefaultCell().setVerticalAlignment(Element.ALIGN_CENTER); 086 087 /** 088 * Logo display 089 */ 090 if (StringUtils.isNotBlank(logoImage)) { 091 logo = Image.getInstance(logoImage); 092 logo.scalePercent(3, 3); 093 headerTable.addCell(new Phrase(new Chunk(logo, 0, 0))); 094 } 095 else { 096 headerTable.addCell(new Phrase(new Chunk(""))); 097 } 098 099 /** 100 * Nested table in tableHeader to display title and doc number 101 */ 102 float[] nestedHeaderWidths = { 0.70f, 0.30f }; 103 nestedHeaderTable = new PdfPTable(nestedHeaderWidths); 104 nestedHeaderTable.setSplitLate(false); 105 PdfPCell cell; 106 107 /** 108 * Title 109 */ 110 cell = new PdfPCell(new Paragraph("RECEIVING TICKET", ver_15_normal)); 111 cell.setHorizontalAlignment(Element.ALIGN_CENTER); 112 cell.setBorderWidth(0); 113 nestedHeaderTable.addCell(cell); 114 115 /** 116 * Doc Number 117 */ 118 Paragraph p = new Paragraph(); 119 p.add(new Chunk("Doc Number: ", ver_11_normal)); 120 p.add(new Chunk(blkRecDoc.getDocumentNumber().toString(), cour_10_normal)); 121 cell = new PdfPCell(p); 122 cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 123 cell.setBorderWidth(0); 124 nestedHeaderTable.addCell(cell); 125 126 // Add the nestedHeaderTable to the headerTable 127 cell = new PdfPCell(nestedHeaderTable); 128 cell.setHorizontalAlignment(Element.ALIGN_CENTER); 129 cell.setBorderWidth(0); 130 headerTable.addCell(cell); 131 } 132 133 /** 134 * Gets a PageEvents object. 135 * 136 * @return a new PageEvents object 137 */ 138 public BulkReceivingPdf getPageEvents() { 139 LOG.debug("getPageEvents() started."); 140 return new BulkReceivingPdf(); 141 } 142 143 /** 144 * Generates the pdf document based on the data in the given BulkReceivingDocument 145 * 146 * @param blkRecDoc The BulkReceivingDocument to be used to generate the pdf. 147 * @param byteStream The ByteArrayOutputStream where the pdf document will be written to. 148 */ 149 public void generatePdf(BulkReceivingDocument blkRecDoc, 150 ByteArrayOutputStream byteStream, 151 String logoImage, 152 String environment) { 153 154 LOG.debug("generatePdf() started for bulk receiving - " + blkRecDoc.getDocumentNumber()); 155 156 Document document = null; 157 158 try { 159 160 document = this.getDocument(9, 9, 70, 36); 161 PdfWriter writer = PdfWriter.getInstance(document, byteStream); 162 163 //These have to be set because they are used by the onOpenDocument() and onStartPage() methods. 164 this.logoImage = logoImage; 165 this.blkRecDoc = blkRecDoc; 166 this.environment = environment; 167 168 // This turns on the page events that handle the header and page numbers. 169 BulkReceivingPdf events = new BulkReceivingPdf().getPageEvents(); 170 writer.setPageEvent(this); 171 172 document.open(); 173 174 document.add(createVendorAndDeliveryDetailsTable()); 175 document.add(new Paragraph("\nAdditional Details\n ", ver_8_bold)); 176 document.add(createAdditionalDetailsTable()); 177 178 document.close(); 179 180 }catch (Exception de) { 181 throw new RuntimeException("Document Exception when trying to save a Bulk Receiving PDF", de); 182 }finally{ 183 if (document != null && document.isOpen()){ 184 document.close(); 185 } 186 } 187 LOG.debug("generatePdf() completed for bulk receiving - " + blkRecDoc.getDocumentNumber()); 188 } 189 190 private PdfPTable createVendorAndDeliveryDetailsTable(){ 191 192 PdfPCell cell; 193 Paragraph p = new Paragraph(); 194 195 float[] infoWidths = { 0.50f, 0.50f }; 196 PdfPTable infoTable = new PdfPTable(infoWidths); 197 198 infoTable.setWidthPercentage(100); 199 infoTable.setHorizontalAlignment(Element.ALIGN_CENTER); 200 infoTable.setSplitLate(false); 201 202 infoTable.addCell(getPDFCell("Vendor", getFormattedVendorAddress())); 203 infoTable.addCell(getPDFCell("Delivery", getFormattedDeliveryAddress())); 204 infoTable.addCell(getPDFCell("Reference Number\n", blkRecDoc.getShipmentReferenceNumber())); 205 206 if (blkRecDoc.getCarrier() != null){ 207 infoTable.addCell(getPDFCell("Carrier\n", blkRecDoc.getCarrier().getCarrierDescription())); 208 }else{ 209 infoTable.addCell(getPDFCell("Carrier\n", StringUtils.EMPTY)); 210 } 211 212 infoTable.addCell(getPDFCell("Tracking/Pro Number\n", blkRecDoc.getTrackingNumber())); 213 214 if (blkRecDoc.getPurchaseOrderIdentifier() != null){ 215 infoTable.addCell(getPDFCell("PO\n", blkRecDoc.getPurchaseOrderIdentifier().toString())); 216 }else{ 217 infoTable.addCell(getPDFCell("PO\n", StringUtils.EMPTY)); 218 } 219 220 infoTable.addCell(getPDFCell("# of Pieces\n", "" + blkRecDoc.getNoOfCartons())); 221 infoTable.addCell(getPDFCell("Shipment Received Date\n", blkRecDoc.getShipmentReceivedDate().toString())); 222 223 if (blkRecDoc.getShipmentWeight() != null){ 224 infoTable.addCell(getPDFCell("Weight\n", blkRecDoc.getShipmentWeight().toString())); 225 }else{ 226 infoTable.addCell(getPDFCell("Weight\n", StringUtils.EMPTY)); 227 } 228 229 infoTable.addCell(getPDFCell("\n", StringUtils.EMPTY)); 230 231 return infoTable; 232 } 233 234 private PdfPCell getPDFCell(String fieldTitle, 235 String fieldValue){ 236 237 Paragraph p = new Paragraph(); 238 p.add(new Chunk(" " + fieldTitle, ver_5_normal)); 239 240 if (StringUtils.isNotEmpty(fieldValue)){ 241 p.add(new Chunk(" " + fieldValue, cour_10_normal)); 242 }else{ 243 p.add(new Chunk(" ")); 244 } 245 246 PdfPCell cell = new PdfPCell(p); 247 cell.setHorizontalAlignment(Element.ALIGN_LEFT); 248 249 return cell; 250 } 251 252 private String getFormattedVendorAddress(){ 253 254 StringBuffer vendorInfo = new StringBuffer(); 255 vendorInfo.append("\n"); 256 257 /** 258 * GoodsDeliveredVendorNumber will be null if it the doc is not for a specific PO 259 */ 260 if (blkRecDoc.getGoodsDeliveredVendorNumber() == null || 261 blkRecDoc.getGoodsDeliveredVendorNumber().equals(blkRecDoc.getVendorNumber())){ 262 263 if (StringUtils.isNotBlank(blkRecDoc.getVendorName())) { 264 vendorInfo.append(" " + blkRecDoc.getVendorName() + "\n"); 265 } 266 267 if (StringUtils.isNotBlank(blkRecDoc.getVendorLine1Address())) { 268 vendorInfo.append(" " + blkRecDoc.getVendorLine1Address() + "\n"); 269 } 270 271 if (StringUtils.isNotBlank(blkRecDoc.getVendorLine2Address())) { 272 vendorInfo.append(" " + blkRecDoc.getVendorLine2Address() + "\n"); 273 } 274 275 if (StringUtils.isNotBlank(blkRecDoc.getVendorCityName())) { 276 vendorInfo.append(" " + blkRecDoc.getVendorCityName()); 277 } 278 279 if (StringUtils.isNotBlank(blkRecDoc.getVendorStateCode())) { 280 vendorInfo.append(", " + blkRecDoc.getVendorStateCode()); 281 } 282 283 if (StringUtils.isNotBlank(blkRecDoc.getVendorAddressInternationalProvinceName())) { 284 vendorInfo.append(", " + blkRecDoc.getVendorAddressInternationalProvinceName()); 285 } 286 287 if (StringUtils.isNotBlank(blkRecDoc.getVendorPostalCode())) { 288 vendorInfo.append(" " + blkRecDoc.getVendorPostalCode() + "\n"); 289 }else { 290 vendorInfo.append("\n"); 291 } 292 293 if (!KFSConstants.COUNTRY_CODE_UNITED_STATES.equalsIgnoreCase(blkRecDoc.getVendorCountryCode()) && blkRecDoc.getVendorCountry() != null) { 294 vendorInfo.append(" " + blkRecDoc.getVendorCountry().getPostalCountryName() + "\n\n"); 295 }else { 296 vendorInfo.append("\n\n"); 297 } 298 299 }else{ 300 301 if (StringUtils.isNotBlank(blkRecDoc.getAlternateVendorDetail().getVendorName())) { 302 vendorInfo.append(" " + blkRecDoc.getAlternateVendorDetail().getVendorName() + "\n"); 303 } 304 305 if (StringUtils.isNotBlank(blkRecDoc.getAlternateVendorDetail().getDefaultAddressLine1())) { 306 vendorInfo.append(" " + blkRecDoc.getAlternateVendorDetail().getDefaultAddressLine1() + "\n"); 307 } 308 309 if (StringUtils.isNotBlank(blkRecDoc.getAlternateVendorDetail().getDefaultAddressLine2())) { 310 vendorInfo.append(" " + blkRecDoc.getAlternateVendorDetail().getDefaultAddressLine2() + "\n"); 311 } 312 313 if (StringUtils.isNotBlank(blkRecDoc.getAlternateVendorDetail().getDefaultAddressCity())) { 314 vendorInfo.append(" " + blkRecDoc.getAlternateVendorDetail().getDefaultAddressCity()); 315 } 316 317 if (StringUtils.isNotBlank(blkRecDoc.getAlternateVendorDetail().getDefaultAddressStateCode())) { 318 vendorInfo.append(", " + blkRecDoc.getAlternateVendorDetail().getDefaultAddressStateCode()); 319 } 320 321 if (StringUtils.isNotBlank(blkRecDoc.getAlternateVendorDetail().getDefaultAddressInternationalProvince())) { 322 vendorInfo.append(", " + blkRecDoc.getAlternateVendorDetail().getDefaultAddressInternationalProvince()); 323 } 324 325 if (StringUtils.isNotBlank(blkRecDoc.getAlternateVendorDetail().getDefaultAddressPostalCode())) { 326 vendorInfo.append(" " + blkRecDoc.getAlternateVendorDetail().getDefaultAddressPostalCode() + "\n"); 327 }else { 328 vendorInfo.append("\n"); 329 } 330 331 if (!KFSConstants.COUNTRY_CODE_UNITED_STATES.equalsIgnoreCase(blkRecDoc.getAlternateVendorDetail().getDefaultAddressCountryCode()) && blkRecDoc.getAlternateVendorDetail().getDefaultAddressCountryCode() != null) { 332 vendorInfo.append(" " + blkRecDoc.getAlternateVendorDetail().getDefaultAddressCountryCode() + "\n\n"); 333 }else { 334 vendorInfo.append("\n\n"); 335 } 336 } 337 338 return vendorInfo.toString(); 339 } 340 341 private String getFormattedDeliveryAddress(){ 342 343 StringBuffer shipToInfo = new StringBuffer(); 344 345 shipToInfo.append("\n"); 346 347 if (StringUtils.isNotBlank(blkRecDoc.getDeliveryToName())){ 348 shipToInfo.append(" " + StringUtils.defaultString(blkRecDoc.getDeliveryToName()) + "\n"); 349 } 350 351 String deliveryBuildingName = blkRecDoc.getDeliveryBuildingName(); 352 353 if(StringUtils.isNotBlank(blkRecDoc.getDeliveryBuildingRoomNumber())){ 354 if (StringUtils.isBlank(deliveryBuildingName)){ 355 shipToInfo.append(" Room #" + blkRecDoc.getDeliveryBuildingRoomNumber() + "\n"); 356 }else{ 357 shipToInfo.append(" " + deliveryBuildingName + " Room #" + blkRecDoc.getDeliveryBuildingRoomNumber() + "\n"); 358 } 359 }else{ 360 if (StringUtils.isNotBlank(deliveryBuildingName)){ 361 shipToInfo.append(" " + deliveryBuildingName + "\n"); 362 } 363 } 364 365 shipToInfo.append(" " + blkRecDoc.getDeliveryBuildingLine1Address() + "\n"); 366 367 if (StringUtils.isNotBlank(blkRecDoc.getDeliveryBuildingLine2Address())) { 368 shipToInfo.append(" " + blkRecDoc.getDeliveryBuildingLine2Address() + "\n"); 369 } 370 371 shipToInfo.append(" " + blkRecDoc.getDeliveryCityName() + ", " + 372 blkRecDoc.getDeliveryStateCode() + " " + 373 blkRecDoc.getDeliveryPostalCode() + "\n\n"); 374 375 return shipToInfo.toString(); 376 } 377 378 private PdfPTable createAdditionalDetailsTable(){ 379 380 float[] additionalInfoWidths = { 0.25f, 0.75f }; 381 PdfPTable additionalInfoTable = new PdfPTable(additionalInfoWidths); 382 additionalInfoTable.setWidthPercentage(100); 383 additionalInfoTable.setSplitLate(false); 384 385 Paragraph p = new Paragraph(); 386 PdfPCell cell; 387 388 /** 389 * Notes to vendor 390 */ 391 p.add(new Chunk(" Notes to Vendor ", ver_5_normal)); 392 cell = new PdfPCell(p); 393 cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 394 additionalInfoTable.addCell(cell); 395 396 p = new Paragraph(); 397 p.add(new Chunk(" " + StringUtils.defaultString(blkRecDoc.getVendorNoteText()), cour_10_normal)); 398 399 cell = new PdfPCell(p); 400 cell.setHorizontalAlignment(Element.ALIGN_LEFT); 401 additionalInfoTable.addCell(cell); 402 403 /** 404 * Delivery instructions 405 */ 406 p = new Paragraph(); 407 p.add(new Chunk(" Delivery instructions ", ver_5_normal)); 408 cell = new PdfPCell(p); 409 cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 410 additionalInfoTable.addCell(cell); 411 412 p = new Paragraph(); 413 p.add(new Chunk(" " + StringUtils.defaultString(blkRecDoc.getDeliveryInstructionText()), cour_10_normal)); 414 415 cell = new PdfPCell(p); 416 cell.setHorizontalAlignment(Element.ALIGN_LEFT); 417 additionalInfoTable.addCell(cell); 418 419 /** 420 * Additional Delivery instructions 421 */ 422 p = new Paragraph(); 423 p.add(new Chunk(" Additional Delivery instructions ", ver_5_normal)); 424 cell = new PdfPCell(p); 425 cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 426 additionalInfoTable.addCell(cell); 427 428 p = new Paragraph(); 429 p.add(new Chunk(" " + StringUtils.defaultString(blkRecDoc.getDeliveryAdditionalInstructionText()), cour_10_normal)); 430 431 cell = new PdfPCell(p); 432 cell.setHorizontalAlignment(Element.ALIGN_LEFT); 433 additionalInfoTable.addCell(cell); 434 435 updateRequestorInfo(blkRecDoc,additionalInfoTable); 436 437 String campusCode = blkRecDoc.getDeliveryCampusCode(); 438 439 /** 440 * Dept Contact 441 */ 442 p = new Paragraph(); 443 p.add(new Chunk(" Contact Name ", ver_5_normal)); 444 cell = new PdfPCell(p); 445 cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 446 additionalInfoTable.addCell(cell); 447 448 p = new Paragraph(); 449 p.add(new Chunk(" " + StringUtils.defaultString(blkRecDoc.getInstitutionContactName()), cour_10_normal)); 450 451 cell = new PdfPCell(p); 452 cell.setHorizontalAlignment(Element.ALIGN_LEFT); 453 additionalInfoTable.addCell(cell); 454 455 /** 456 * Dept Contact Phone 457 */ 458 p = new Paragraph(); 459 p.add(new Chunk(" Contact Phone ", ver_5_normal)); 460 cell = new PdfPCell(p); 461 cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 462 additionalInfoTable.addCell(cell); 463 464 p = new Paragraph(); 465 p.add(new Chunk(" " + StringUtils.defaultString(blkRecDoc.getInstitutionContactPhoneNumber()), cour_10_normal)); 466 467 cell = new PdfPCell(p); 468 cell.setHorizontalAlignment(Element.ALIGN_LEFT); 469 additionalInfoTable.addCell(cell); 470 471 /** 472 * Dept Contact email 473 */ 474 p = new Paragraph(); 475 p.add(new Chunk(" Contact Email ", ver_5_normal)); 476 cell = new PdfPCell(p); 477 cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 478 additionalInfoTable.addCell(cell); 479 480 p = new Paragraph(); 481 p.add(new Chunk(" " + StringUtils.defaultString(blkRecDoc.getInstitutionContactEmailAddress()), cour_10_normal)); 482 483 cell = new PdfPCell(p); 484 cell.setHorizontalAlignment(Element.ALIGN_LEFT); 485 additionalInfoTable.addCell(cell); 486 487 488 /** 489 * Signature 490 */ 491 p = new Paragraph(); 492 p.add(new Chunk(" " + " Signature ", ver_5_normal)); 493 cell = new PdfPCell(p); 494 cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 495 additionalInfoTable.addCell(cell); 496 497 p = new Paragraph(); 498 p.add(new Chunk("\n\n\n\n")); 499 500 cell = new PdfPCell(p); 501 cell.setHorizontalAlignment(Element.ALIGN_LEFT); 502 additionalInfoTable.addCell(cell); 503 504 /** 505 * Date 506 */ 507 p = new Paragraph(); 508 p.add(new Chunk(" " + " Date ", ver_5_normal)); 509 cell = new PdfPCell(p); 510 cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 511 additionalInfoTable.addCell(cell); 512 513 p = new Paragraph(); 514 p.add(new Chunk("\n\n\n\n")); 515 516 cell = new PdfPCell(p); 517 cell.setHorizontalAlignment(Element.ALIGN_LEFT); 518 additionalInfoTable.addCell(cell); 519 520 return additionalInfoTable; 521 } 522 523 private void updateRequestorInfo(BulkReceivingDocument blkRecDoc, 524 PdfPTable additionalInfoTable){ 525 /** 526 * Requestor Name 527 */ 528 Paragraph p = new Paragraph(); 529 p.add(new Chunk(" Requestor Name ", ver_5_normal)); 530 PdfPCell cell = new PdfPCell(p); 531 cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 532 additionalInfoTable.addCell(cell); 533 534 p = new Paragraph(); 535 p.add(new Chunk(" " + StringUtils.defaultString(blkRecDoc.getRequestorPersonName()), cour_10_normal)); 536 537 cell = new PdfPCell(p); 538 cell.setHorizontalAlignment(Element.ALIGN_LEFT); 539 additionalInfoTable.addCell(cell); 540 541 /** 542 * Requestor Phone 543 */ 544 p = new Paragraph(); 545 p.add(new Chunk(" Requestor Phone ", ver_5_normal)); 546 cell = new PdfPCell(p); 547 cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 548 additionalInfoTable.addCell(cell); 549 550 p = new Paragraph(); 551 p.add(new Chunk(" " + StringUtils.defaultString(blkRecDoc.getRequestorPersonPhoneNumber()), cour_10_normal)); 552 553 cell = new PdfPCell(p); 554 cell.setHorizontalAlignment(Element.ALIGN_LEFT); 555 additionalInfoTable.addCell(cell); 556 557 /** 558 * Requestor Email 559 */ 560 p = new Paragraph(); 561 p.add(new Chunk(" Requestor Email ", ver_5_normal)); 562 cell = new PdfPCell(p); 563 cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 564 additionalInfoTable.addCell(cell); 565 566 p = new Paragraph(); 567 p.add(new Chunk(" " + StringUtils.defaultString(blkRecDoc.getRequestorPersonEmailAddress()), cour_10_normal)); 568 cell = new PdfPCell(p); 569 cell.setHorizontalAlignment(Element.ALIGN_LEFT); 570 additionalInfoTable.addCell(cell); 571 } 572 }