Friday, June 29, 2007

Formatting char/number to US style phone number

Someone asked this question on Oracle BI publisher forum and i just wondered whether it is possible with any formatting XSL function or not. I tried with format-number function but finally i got with extended XSL functions for use in RTF template

Case:
Let's say we have xml data in below format
1234567890
Now we want to display it as (123)456-7890 (US style Ph #)

Solution:
<?xdofx:’(‘||substr(Phone_No,1,3)||’) ’||substr(Phone_No,4,3)||’-‘||substr(Phone_No,7,4)?>

Thursday, June 7, 2007

Download BIP 10.1.3.2 Standalone

Get full informations about new version of BIP at Tim Dexter's blog.

http://blogs.oracle.com/xmlpublisher/2007/04/16#a243

Tuesday, June 5, 2007

Process XML data and generate a PDF and Store PDF file in same input XML data

Use Case:
Objective is to process XML data and generate a PDF for the same using XML Publisher API. After the PDF is generated the PDF documented is to be converted into a Base64 encoded string and appended back to the input XML.

Solution:
Following are the steps involved to achieve the above use case
1) Create a RTF template file. This file is used for generating the PDF using Oracle BI Publisher APIs.
2) Generate Java classes for the input XML schema using Apache XML Beans. This is done in order to facilitate accessing the XML file using Java. Any other technology can be used for the same
3) Retrieve the List of files to be processed from a folder. Alternatively the input XML can be picked up from a database, JMS / MQ queue or any alternative data source.
4) Parse the input XML file using the generated XML Bean classes.
5) Extract the application id from the input xml. This is used as the filename for the generated XML file.
6) Create an RTFProcessor to generate a XSL file, which will be used by the FOProcessor to convert the input XML data into a PDF document. Both of these classes are part of Oracle BI Publisher API’s. The FOProcessor class is the front¬end class to use the FO Processing engine. The RTFProcessor class is the front¬end class to use RTF Processing engine. Both of these classes are used to generate the PDF using a RTF template file.
7) Retrieve the bytes for the generated PDF file using a FileInputStream object, this is used to convert the PDF file into a Base64 encoded string.
8) Set the Base64 encoded string, along with other information to the in memory XML bean.
9) Finally convert the XML Bean into an xml string and sore it onto a file system object. Alternatively the XML can be stored in a database or sent to a JMS / MQ queue or any alternative data source.

Sample Code:
public class XMLProcess {
// Variable declarations
static String xmlInputFolder = "D://XMLProcess//xmlInput//";
static String xmlOutputFolder = "D://XMLProcess//xmlOutput//";
static String pdfOutputFolder = "D://XMLProcess//pdfOutput//";
static String tmpFolder = "D://XMLProcess//tmp//";

static String templateFileName = "report.rtf";
static String templateFileLocation = tmpFolder + templateFileName;

static String xslFileName = tmpFolder + "tmp.xsl";
static String pdfFileName = "";
static String base64PDF = "";

public XMLProcess() {
}
public static void main(String[] args) {
try {

System.out.println("[XML Process] : Processing started"); System.out.println("[XML Process] : Generating temporary XSL");
// *******************************
// GENERATE XSL FOR PDF PROCESSING
// *******************************
RTFProcessor rtfProcessor = new RTFProcessor(templateFileLocation); rtfProcessor.setOutput(xslFileName); // output file rtfProcessor.process();
System.out.println("[XML Process] : Retrieving files to be processed");
// **********************************
// RETREIVE FILENAMES TO BE PROCESSED
// **********************************

File files = new File(xmlInputFolder);
String fileNames[] = files.list();

// ***************************
// PROCESS EACH INPUT XML FILE
// ***************************

for (int i = 0; i <>
System.out.println("[XML Process] : Processing " + fileNames[i] + " ¬Start");

// *******************************
// PARSE INPUT XML USING XML BEANS
// *******************************

AAUTransDocument doc = AAUTransDocument.Factory.parse(new File(xmlInputFolder + fileNames[i]));
pdfFileName = doc.getAAUTrans().getAAUEventData().getADIObject().getApplId().toString() + ".pdf";
// ************
// GENERATE PDF
// ************

System.out.println("[XML Process] : Generating PDF file " +
pdfFileName);

FOProcessor processor = new FOProcessor();
processor.setData(xmlInputFolder +

fileNames[i]); // set XML input file
processor.setTemplate(xslFileName); // set XSL input file
processor.setOutput(pdfOutputFolder +

pdfFileName); //set output file
processor.setOutputFormat(FOProcessor.FORMAT_PDF);

processor.generate();
// ************************
// GENERATE BASE64 ENCODING
// ************************

FileInputStream fileInputStream =
new FileInputStream(new File(pdfOutputFolder +

pdfFileName));
byte bytes[] = new byte[fileInputStream.available()];
fileInputStream.read(bytes);

// ****************************
// SET THE DOCUMENT PROPERTIES
// ****************************

doc.getAAUTrans().getAAUEventData().addNewDOCObject().setFileName(pdfFileName); doc.getAAUTrans().getAAUEventData().getDOCObject().setDocumentType("PDF");
doc.getAAUTrans().getAAUEventData().getDOCObject().setDocumentType("CORRESPONDENCE")
; doc.getAAUTrans().getAAUEventData().getDOCObject().setDocumentAuthor("DW"); doc.getAAUTrans().getAAUEventData().getDOCObject().setDocumentInfo("");

doc.getAAUTrans().getAAUEventData().getDOCObject().setDocumentStatus("PROCESSED"); doc.getAAUTrans().getAAUEventData().getDOCObject().setDocumentYear("2007"); doc.getAAUTrans().getAAUEventData().getDOCObject().setDocumentData(bytes);
// **************************
// WRITE MODFIIED XML TO FILE
// **************************

System.out.println("[XML Process] : Writing output xml file " + fileNames[i]);
FileWriter fileWriter =
new FileWriter(new File(xmlOutputFolder + fileNames[i])); fileWriter.write(doc.toString()); fileWriter.close();
System.out.println("[XML Process] : Processing " +
fileNames[i] + " ¬Finished");
}

System.out.println("[XML Process] : Processing finished");
} catch (Exception e) { e.printStackTrace(); } } }