Integrating XML Publisher and OAF:Generating output in PDF, MSWord, MSExcel and HTML Format

It is a very common requirement where we want to generate reports in PDF, MSWord, MS Excel and HTML format from an OAF page itself without submitting any concurrent program. 

To generate the output in PDF or other formats we need the following:

  • XML Data Definition, registered with Apps
  • Template, registered with Apps
  • XML Publisher APIs to process the template and generate the output in required format.

As we are going to generate the output from OAF, we need to generate the XML data using view object, View Object is having inbuilt functionality to read and write data in XML format. View Object is having one method called writeXML which will generate the data in XML format. We can use it for two purposes:

  1. To generate XML Data in Jdeveloper Embedded OC4J Sever Log (It will give XML Definition of data; we can use it for designing our Template and register this as Data definition).
  2. To generate XML data for actual template processing.

Steps to Generate the Output in required format:

Step 1: Create OAWorkspace, Project, packages, VO and AM (I hope you are already familiar with these)

Step 2: Import following Packages in AM and Controller:

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletResponse;

import oracle.apps.fnd.framework.webui.beans.table.OAAdvancedTableBean;

import oracle.apps.xdo.oa.schema.server.TemplateHelper;

import oracle.jbo.XMLInterface;

Step 3: Create one method in your AM to generate XML output, call this method from your processRequest mathod and get it printed on Jdeveloper console:

Your code for should look like this:

public void getPrintDataXML()

{

 try

 {

   ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

   OAViewObject vo = (OAViewObject)am.findViewObject(“XXEGASRPrintPageVO1”);

   ((XMLNode) vo.writeXML(4, XMLInterface.XML_OPT_ALL_ROWS)).print(outputStream);

   System.out.println(outputStream.toString());

  }

 catch(Exception e)

 {

  throw new OAException (e.getMessage());

 }

}  

Statements highlighted(BOLD) will print the XML data generated by your view object to Jdeveloper console.

In first line vo.writeXML will generate the XML for VO and print method will write the XML data in outputstream that can further be used to print XML data on Jdeveloper console using println method.

1

You can copy this output and save with some meaningful name and use it to register as data definition and to design your template(copy only XML data). 

Step 4: Design your template

Step 5: Register your Template and data Definition in Oracle Apps

2

Step 5: Register your Template and data Definition in Oracle Apps

3

Click on “Create Data Definition” button

4

Fill in all the mandatory columns and give a short code for your data definition and clink on “Apply” button

now click on “Template” Tab

5

 Click on “Create Template” button

6

Fill in all the mandatory columns and give a short code (It will be used by XML Publisher APIs to process the template) for your template and clink on “Apply” button

 Step 6: Generate output, using XML publisher APIs

    Step 6.1: Create a submit button to Generate the output say “Print”

     Step 6.2: Add following method to your AM Impl class

  public XMLNode getPrintDataXML()//XMLNode

  {

   OAViewObject vo = (OAViewObject)findViewObject(“EmpVO1”);

   ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

   XMLNode xmlNode = (XMLNode) vo.writeXML(4, XMLInterface.XML_OPT_ALL_ROWS);

   return xmlNode;

  }

     Step 6.3: Handle the event for “Print” button:

 /*

 * Handles functionality of Print button

 */

 if(pageContext.getParameter(“btnPrint”)!=null)

               {

// Get the HttpServletResponse object from the PageContext. The report output is written to HttpServletResponse.

DataObject sessionDictionary = (DataObject)pageContext.getNamedDataObject(“_SessionParameters”);

 HttpServletResponse response = (HttpServletResponse)sessionDictionary.selectValue(null,”HttpServletResponse”);

                         try {

                          ServletOutputStream os = response.getOutputStream();

                           // Set the Output Report File Name and Content Type

                           String contentDisposition = “attachment;filename=PrintPage.pdf”;

                           response.setHeader(“Content-Disposition”,contentDisposition);

                           response.setContentType(“application/pdf”);

                           // Get the Data XML File as the XMLNode

                           XMLNode xmlNode = (XMLNode) am.invokeMethod(“getPrintDataXML”);

            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

            ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());

            ByteArrayOutputStream pdfFile = new ByteArrayOutputStream();

            //Generate the PDF Report.

            //Process Template

            TemplateHelper.processTemplate(

            ((OADBTransactionImpl)pageContext.getApplicationModule(webBean).getOADBTransaction()).getAppsContext(),

            “AK”,//APPLICATION SHORT NAME

            “Print Template TMP”, //TEMPLATE_SHORT_CODE

            ((OADBTransactionImpl)pageContext.getApplicationModule(webBean).getOADBTransaction()).getUserLocale().getLanguage(),

            ((OADBTransactionImpl)pageContext.getApplicationModule(webBean).getOADBTransaction()).getUserLocale().getCountry(),

            inputStream,

            TemplateHelper.OUTPUT_TYPE_PDF,

            null,

            pdfFile);

              //TemplateHelper.

            // Write the PDF Report to the HttpServletResponse object and flush.

            byte[] b = pdfFile.toByteArray();

            response.setContentLength(b.length);

            os.write(b, 0, b.length);

            os.flush();

            os.close();

    pdfFile.flush();

    pdfFile.close();

            }

            catch(Exception e)

            {

            response.setContentType(“text/html”);

            throw new OAException(e.getMessage(), OAException.ERROR);

            }

            pageContext.setDocumentRendered(true);

            } 

Now run your page and click on Print button:

7

In this manner we can generate the output in Excel, Word and HTML format also but we need to modify our code a bit, few statements in above code are in BOLD… 

The statements in BOLD need to be modified:

First file name in following statement :

String contentDisposition = “attachment;filename=PrintPage.pdf”;

In above statement PrintPage.pdf  can be  replaced with <userdefined_filename>.doc/.xls/.htm

Second is file MIME Type needs to be changed:

response.setContentType(“application/pdf”);

Here application/pdf can be replaced with valid MIME type for Excel/Word and HTML 

Third, TemplateHelper.OUTPUT_TYPE_PDF, in this OUTPUT_TYPE_PDF can be replaced by OUTPUT_TYPE_HTML/ OUTPUT_TYPE_EXCEL/ OUTPUT_TYPE_RTF.

About Ritesh

• Around 4 years of IT experience in Oracle based projects. • Over 3 years of experience in Oracle Applications(ERP and CRM) in various modules in Manufacturing (PO,OM,), Oracle Sourcing and Trading community Architecture, AOL, Oracle Alerts. • Currently working with Blink Consulting Pvt. Ltd., Pune as Consultant, Since 26th May, 2008 • Previously worked for reputed organizations like Wipro Technologies and HCL Infosystems. Proficiency in Oracle Application architecture with exposure to solution design, coding and implementation using AIM methodology. • Wide experience in OAF Forms (Java based), Forms Personalization, Reports, Interfaces, Data Migration and conversion, XML Publisher, Workflow and Oracle Forms Customizations and development in Oracle E-Business suite in particular. • Experience of all the vital steps of SDLC.
This entry was posted in OA Framework. Bookmark the permalink.

7 Responses to Integrating XML Publisher and OAF:Generating output in PDF, MSWord, MSExcel and HTML Format

  1. Pingback: 2010 in review « Dinesh Nair's Oracle EBS Blog

  2. judev says:

    thanks for your idear.but i met error like this:

    org.xml.sax.SAXParseException: : XML-0108: (Fatal Error) Start of root element expected.

    at oracle.xml.parser.v2.XMLError.flushErrorHandler(XMLError.java:226)

    at oracle.xml.parser.v2.XMLError.flushErrors1(XMLError.java:162)

    at oracle.xml.parser.v2.NonValidatingParser.parseRootElement(NonValidatingParser.java:300)

    at oracle.xml.parser.v2.NonValidatingParser.parseDocument(NonValidatingParser.java:262)

    at oracle.xml.parser.v2.XMLParser.parse(XMLParser.java:225)

    at oracle.apps.xdo.common.xml.XSLTClassic.transform(XSLTClassic.java:196)

    at oracle.apps.xdo.common.xml.XSLTWrapper.transform(XSLTWrapper.java:182)

    at oracle.apps.xdo.template.fo.util.FOUtility.generateFO(FOUtility.java:1044)

    at oracle.apps.xdo.template.fo.util.FOUtility.generateFO(FOUtility.java:997)

    at oracle.apps.xdo.template.fo.util.FOUtility.generateFO(FOUtility.java:212)

    at oracle.apps.xdo.template.FOProcessor.createFO(FOProcessor.java:1665)

    at oracle.apps.xdo.template.FOProcessor.generate(FOProcessor.java:975)

    at oracle.apps.xdo.oa.schema.server.TemplateHelper.runProcessTemplate(TemplateHelper.java:5926)

    at oracle.apps.xdo.oa.schema.server.TemplateHelper.processTemplate(TemplateHelper.java:3458)

    at oracle.apps.xdo.oa.schema.server.TemplateHelper.processTemplate(TemplateHelper.java:3547)

    at rbac.oracle.apps.rbac.self.server.webui.DealerPoSearchCO.processFormRequest(DealerPoSearchCO.java:212)

    at oracle.apps.fnd.framework.webui.OAWebBeanHelper.processFormRequest(OAWebBeanHelper.java:799)

    at oracle.apps.fnd.framework.webui.OAWebBeanContainerHelper.processFormRequest(OAWebBeanContainerHelper.java:363)

    at oracle.apps.fnd.framework.webui.OAPageLayoutHelper.processFormRequest(OAPageLayoutHelper.java:1118)

    at oracle.apps.fnd.framework.webui.beans.layout.OAPageLayoutBean.processFormRequest(OAPageLayoutBean.java:1579)

    at oracle.apps.fnd.framework.webui.OAWebBeanHelper.processFormRequestChildren(OAWebBeanHelper.java:995)

    at oracle.apps.fnd.framework.webui.OAWebBeanHelper.processFormRequestChildren(OAWebBeanHelper.java:961)

    at oracle.apps.fnd.framework.webui.OAWebBeanHelper.processFormRequest(OAWebBeanHelper.java:816)

    at oracle.apps.fnd.framework.webui.OAWebBeanContainerHelper.processFormRequest(OAWebBeanContainerHelper.java:363)

    at oracle.apps.fnd.framework.webui.beans.form.OAFormBean.processFormRequest(OAFormBean.java:395)

    at oracle.apps.fnd.framework.webui.OAWebBeanHelper.processFormRequestChildren(OAWebBeanHelper.java:995)

    at oracle.apps.fnd.framework.webui.OAWebBeanHelper.processFormRequestChildren(OAWebBeanHelper.java:961)

    at oracle.apps.fnd.framework.webui.OAWebBeanHelper.processFormRequest(OAWebBeanHelper.java:816)

    at oracle.apps.fnd.framework.webui.OAWebBeanContainerHelper.processFormRequest(OAWebBeanContainerHelper.java:363)

    at oracle.apps.fnd.framework.webui.beans.OABodyBean.processFormRequest(OABodyBean.java:363)

    at oracle.apps.fnd.framework.webui.OAPageBean.processFormRequest(OAPageBean.java:2633)

    at oracle.apps.fnd.framework.webui.OAPageBean.preparePage(OAPageBean.java:1659)

    at oracle.apps.fnd.framework.webui.OAPageBean.preparePage(OAPageBean.java:497)

    at oracle.apps.fnd.framework.webui.OAPageBean.preparePage(OAPageBean.java:418)

    at _OA._jspService(OA.jsp:40)

    at com.orionserver.http.OrionHttpJspPage.service(OrionHttpJspPage.java:56)

    at oracle.jsp.runtimev2.JspPageTable.service(JspPageTable.java:317)

    at oracle.jsp.runtimev2.JspServlet.internalService(JspServlet.java:465)

    at oracle.jsp.runtimev2.JspServlet.service(JspServlet.java:379)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

    at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:727)

    at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:306)

    at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:767)

    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:259)

    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:106)

    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:803)

    at java.lang.Thread.run(Thread.java:534)

  3. praveen s says:

    hai

    I am not getting the report output. in the file i am getting the screen shot of oaf page and containing an error

    tmp\xdo0B1mCzOa6n012412_0421360680.fo (The system cannot find the path specified)

    • Sudheer says:

      Hi Praveen, were you able to get a solution for this issue? We are facing the same problem. We tried to set the temporary directory in the XML publisher administrator, made sure that applmgr has full access to this directory, restarted service, bounced apache, but no luck. Any help is greatly appreciated.

  4. Alethea says:

    Barnes Soft is one of the leading top Training and
    Consulting Company in US, with a good placement track record.

    e the project preparation where a vision of the future-state of the
    SAP solution is being created, a sizing and blueprinting
    phase where the solution stack is created and training is being performed
    , a functional development phase and finally a final preparation phase, when the last tests are being performed before the
    actual go live. The module has two important master data – material and vendor.

  5. Hi Praveen, Are you able to solve your issue?

  6. jtalib says:

    Great post, thanks

Leave a comment