Generate a PDF and send that though email

A requirement in underwriting application
To generate quote letter for insured and home office. send insured letter with signature digitally signed and email it the same to insured.

1.Generate a pdf
2.Add signature and date time stamp
3.Email the same to different users..

To achieve it using java and iText library (open source)

package com.vasu.edelivery;
import java.awt.Color;
import java.util.Date;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import com.lowagie.text.Anchor;
import com.lowagie.text.BadElementException;
import com.lowagie.text.Cell;
import com.lowagie.text.Chapter;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;import com.lowagie.text.Font;
import com.lowagie.text.List;import com.lowagie.text.ListItem;
import com.lowagie.text.Paragraph;import com.lowagie.text.Section;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.PdfWriter;
public class HomeOfficeCopy {
private static String FILE = “c:/vasu/tmp/HomeOfficeCopy.pdf”; 
private static Font catFont = new Font(Font.TIMES_ROMAN, 18, Font.BOLD);
private static Font redFont = new Font(Font.TIMES_ROMAN, 12, Font.NORMAL, Color.RED);
private static Font subFont = new Font(Font.TIMES_ROMAN, 16, Font.BOLD); 
private static Font smallBold = new Font(Font.TIMES_ROMAN, 12, Font.BOLD);
public static void main(String[] args) { 
try {
Document document = new Document(); 
PdfWriter.getInstance(document, new FileOutputStream(FILE));; addTitlePage(document); addContent(document); 
document.close(); } catch (Exception e) { e.printStackTrace(); } }
private static void addTitlePage(Document document) throws DocumentException { Paragraph preface = new Paragraph(); // We add one empty line addEmptyLine(preface, 1); // Lets write a big header preface.add(new Paragraph(“xyz Insurance”, catFont));
addEmptyLine(preface, 1); // Will create: Report generated by: _name, _date preface .add(new Paragraph( “Report signed by: ” +”n”+ System.getProperty(“”) + ” , ” + new Date(), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ smallBold)); addEmptyLine(preface, 3); preface.add(new Paragraph( “This document describes something which is very important “, smallBold));
addEmptyLine(preface, 8);
preface .add(new Paragraph( “This document is a preliminary version for HomeOffice and not subject to AIG ;-).”, redFont));
document.add(preface); // Start a new page document.newPage(); }
private static void addContent(Document document) throws DocumentException { Anchor anchor = new Anchor(“First Chapter”, catFont); anchor.setName(“First Chapter”);
// Second parameter is the number of the chapter Chapter catPart = new Chapter(new Paragraph(anchor), 1);
Paragraph subPara = new Paragraph(“Subcategory 1”, subFont); Section subCatPart = catPart.addSection(subPara); subCatPart.add(new Paragraph(“Hello”));
subPara = new Paragraph(“Subcategory 2”, subFont); subCatPart = catPart.addSection(subPara); subCatPart.add(new Paragraph(“Paragraph 1”)); subCatPart.add(new Paragraph(“Paragraph 2”)); subCatPart.add(new Paragraph(“Paragraph 3”)); // Add a little list createList(subCatPart);
// Add a small table createTable(subCatPart); // Now a small table 
// Now add all this to the document document.add(catPart);
// Next section anchor = new Anchor(“Second Chapter”, catFont); anchor.setName(“Second Chapter”);
// Second parameter is the number of the chapter catPart = new Chapter(new Paragraph(anchor), 1);
subPara = new Paragraph(“Subcategory”, subFont); subCatPart = catPart.addSection(subPara); subCatPart.add(new Paragraph(“This is a very important message”)); // Now add all this to the document document.add(catPart);
private static void createTable(Section subCatPart) throws BadElementException { Table t = new Table(3,2);
t.setBorderColor(Color.GRAY); t.setPadding(4); t.setSpacing(4); t.setBorderWidth(1);
Cell c1 = new Cell(“Table Header 1”); c1.setHeader(true); t.addCell(c1); c1 = new Cell(“Table Header 2”); t.addCell(c1); c1 = new Cell(“Table Header 3”); t.addCell(c1); t.endHeaders(); t.addCell(“1.0”); t.addCell(“1.1”); t.addCell(“1.2”); t.addCell(“2.1”); t.addCell(“2.2”); t.addCell(“2.3”);
private static void createList(Section subCatPart) { List list = new List(true, false, 10); list.add(new ListItem(“First point”)); list.add(new ListItem(“Second point”)); list.add(new ListItem(“Third point”)); subCatPart.add(list); }
private static void addEmptyLine(Paragraph paragraph, int number) { for (int i = 0; i < number; i++) { paragraph.add(new Paragraph(” “)); } }

public void postMail( String recipients[ ], String subject, String message , String from) throws MessagingException{
boolean debug = false;
//Set the host smtp address Properties props = new Properties(); 
props.put(“”, “”);
// create some properties and get the default Session Session session = Session.getDefaultInstance(props, null); session.setDebug(debug);
// create a message Message msg = new MimeMessage(session);
// set the from and to address InternetAddress addressFrom = new InternetAddress(from); msg.setFrom(addressFrom);
InternetAddress[] addressTo = new InternetAddress[recipients.length]; 
for (int i = 0; i < recipients.length; i++) {
addressTo[i] = new InternetAddress(recipients[i]); } 
msg.setRecipients(Message.RecipientType.TO, addressTo); 
// Optional : You can also set your custom headers in the Email if you Want msg.addHeader(“MyHeaderName”, “myHeaderValue”);
// Setting the Subject and Content Type msg.setSubject(subject); 
msg.setContent(message, “text/plain”); 


Pega PRPC syllabus

> Introduction to PRPC
> Using Process Commander and PRPC Developer Portal Basics
> Architecture
> Common Rule Types
> Examining Rules Using PRPC (Class, Class Group, Rule Sets etc)
> Understanding work and data class structures
> Understanding Properties
> Process Flows (Flow types, Shapes )
> User Interface overview (Harness, Section etc )
> Rule Set and Security Overview
> Using the Clipboard and tracer
> Implementing PRPC
> Building Class Structure
> Creating Property and Model Rules
> Creating Flow Rules
> Building the User Interface
> Enhancing the User Interface
> An overview of Declarative rules
> Validation
> Using decision rules
> Using Activities
> Assigning work
> Integrating PRPC Applications
> Connecting to an External Relational Database
> Documenting and Saving your Work

PRPC Detailed installation procedure

1) create tablespace
create tablespace pegatablespace
datafile ‘C:oracleproduct10.2.0oradataorclpegadatafile.dbf’
size 100m
autoextend on
next 100m maxsize 3096m
extent management local;

2)create user
create user pegauser
identified by pegauser
default tablespace pegatablespace
temporary tablespace temp;

3) grant access
grant resource,connect,dba to pegauser;

4) logon

5)go to Administration and click users and select pegauser and click on edit
and goto Roles and checl all AdminOptions and click on apply
then click on System Privileges then editlist
then select some privileges and click on apply then select Admin option for all and click Apply

6) Login as pegauser in sql+

7) copy oracledate_install0503.sql to C direcory and run sql> @C:oracledate_install0503.sql;

8) set the classpath with java/lib, tomcat/lib under system variables

9) set the poolsize for tomcat/java

10) copy prdbutil.war from Training to tomcat/webapps
start tomcat then stop tomcat and delete prdb.util.war

11) create new folder with name pegatemp in C drive

12) open prconfig.xml in tomcat/webapps/prdbutil/web-inf/classes

13) change the value of explicittempdir to C:/pegatemp

14) add the env for oracle in prconfig to

15) copy classes12.jar from oracle/lib to tomcat/common/lib

16) http:\localhost:8080prdbutil
upload TrainingpegaPRPCv5_v53_relcand_0049.jar
next, skip
enter ip and port
next, verify
next, exit
stop tomcat

17) copy prweb.war to tomcat/webapps

start tomcat and stop tomcat and delete prweb.war

18) copy prconfig.xml from tomcat/webapps/prdbutil/web-inf/classes and paste in tomcat/webapps/prweb/web-inf/classes

19) start tomcat
http:\localhost:8080prwebPRServlet pwd: xxxx
click on process

Wishing to learn Pega/PRPC?

There is no easy way to say this, but there is no easy way to learn Pega PRPC 🙂

Although the PRPC software provided by Pegasystems does not really have “pre-requisites” required of those who plan to learn it, I have found it is very helpful for developers to have some experience in an Object Oriented programming language such as Java or C++, due to the importance the class structure and inheritance used within the product.

Many companies also provide training internally to their employees, or have the ability to train promising job applicants.

Unfortunately there are no known books available for purchase to perform self-study on PRPC. Pegasystems, the software vendor, does offer training classes, and information about those can be found here:

While the product is very powerful in the tools it provides OOB to use, and thus, enables a developer to build an entire system with little to no “hard coding”, it does benefit the developer to have a good solid technical background.

It is also helpful for new developers to PRPC to have a good understanding of various types of integrations
including, but not limited to, SOAP, SQL/RDBMS, EJBs, and various queuing technologies like JMS, MQ, and MSMQ. An understanding of XML, HTML, and javascript is a plus.

Pega Training topics

1. Introduction to PRPC
2. Using Process Commander and PRPC Developer Portal Basics
3. Architecture
4. Common Rule Types
5. Examining Rules Using PRPC (Class, ClassGroup, Rule Sets etc)
6. Understanding work and data class structures
7. Understanding Properties
8. Process Flows (Flow types, Shapes )
9. User Interface overview (Harness, Section etc…)
10. Rule Set and Security Overview
11. Using the Clipboard and tracer
12. Implementing PRPC
13. Building Class Structure
14. Creating Property and Model Rules
15. Creating Flow Rules
16. Building the User Interface
17. Enhancing the User Interface
18. An overview of Declarative rules
19. Validation
20. Using decision rules
21. Using Activities
22. Assigning work
23. Integrating PRPC Applications
24. Connecting to an External Relational Database
25. Documenting and Saving your Work

PRPC Code: Write message to the log

oLog.infoForced(“Creating queue connection factory using server string:” + AQserverString);

oLog.infoForced(“AQ Interface adding Work Item:”+ tools.findPage(“WorkTicket”).getString(“pyID”) +” of class:”+ tools.findPage(“WorkTicket”).getString(“pxObjClass”));

oLog.error(“error in incoming AQ from Workflow interface, could not add support item”);
oLog.error(“Received message: ” + tools.findPage(“WorkTicket”).getString(“message”));
oLog.error(“error in DB Workflow interface, could not add support item”);
oLog.error(“Received message: ” + tools.findPage(“SupportWFLDBError”).getString(“Message”));


Pega Rules Process Commander – PRPC

Pega Rules process Commander is a rules engine for business processes. Advantages are:
1. This eliminates manual programming
2. Captures business objectives into fully automated processes

Pegasystems is one of the leaders in Business Process Management softwares (BPM) and Customer Relationship Management (CRM) softwares.

Rules engines are popular in expert systems, such as diagnostic systems. The rules are defined on what should happen when certain rules are met.

Rules are declarative (not programmatic)

Flows are then defined to various applications – like call centers, order processing, technical support, etc.

Date Format

function FormatDate(cname)
   if (cname == null)
    return false;
   var re = new RegExp(/(d{6})(d{2})?/);
   var v1 = cname.value;
   if (cname.value.length > 0)
    if (cname.value.length == 8)
     cname.value = ‘0’+v1.substring(0,1)+’/’+’0’+v1.substring(2,2)+v1.substring(2,v1.length+1);
      cname.value = v1.substring(0, 2) + ‘/’ + v1.substring(2, 4) + ‘/’ + v1.substring(4, 8);
          else if (cname.value.length == 6)
     cname.value = ‘0’+ cname.value.substring(0, 1) + ‘/’ +’0’+ cname.value.substring(1, 2) + ‘/’ + cname.value.substring(2, 6);
          else if (cname.value.length == 7)
     var o = cname.value.substring(0,1);01/22011
     if(o != 0)
       cname.value = ‘0’ +cname.value.substring(0, 1) + ‘/’ + cname.value.substring(1, 3) + ‘/’ + cname.value.substring(3, 7);
      cname.value = cname.value.substring(0, 2) + ‘/’+’0’+ cname.value.substring(2, 3) + ‘/’ + cname.value.substring(3, 7);