0

I am trying to integrate open office in java. What I am doing is creating a document, and want to get that document in a pdf as a jsp response.. But i am not able to do that. I am able to create an blank open office document and entire the desired text in it. Then i want that whenever this jsp is run we get that document as a response in pdf format.

Code is

<%@page import="com.sun.star.text.XParagraphCursor"%>
<%@page import="java.io.IOException"%>
<%@page import="org.apache.commons.io.FileUtils"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@page import="com.sun.star.beans.PropertyValue"%>
<%@page import="com.sun.star.beans.XPropertySet"%>
<%@page import="com.sun.star.comp.helper.Bootstrap"%>
<%@page import="com.sun.star.frame.XComponentLoader"%>
<%@page import="com.sun.star.frame.XDesktop"%>
<%@page import="com.sun.star.frame.XStorable"%>
<%@page import="com.sun.star.lang.XComponent"%>
<%@page import="com.sun.star.lang.XMultiComponentFactory"%>
<%@page import="com.sun.star.text.XText"%>
<%@page import="com.sun.star.text.XTextDocument"%>
<%@page import="com.sun.star.uno.UnoRuntime"%>
<%@page import="com.sun.star.uno.XComponentContext"%>
<%@page import="com.sun.star.util.XReplaceDescriptor"%>
<%@page import="com.sun.star.util.XReplaceable"%>
<%@page import="ooo.connector.BootstrapSocketConnector"%>
<%@page import="com.sun.star.text.XText"%>
<%@page import="com.sun.star.text.XTextRange"%>
<%@page import="com.sun.star.lang.XMultiServiceFactory"%>
<%@page import="com.sun.star.text.XTextTable"%>
<%@page import="com.sun.star.table.XCellRange"%>
<%@page import="com.sun.star.table.XCell"%>
<%@page import="com.sun.star.util.XCloseable"%>
<%@page import="com.sun.star.text.XTextCursor"%>

<!DOCTYPE html>

<%

    // Initialise
    String oooExeFolder = "C:/Program Files/OpenOffice 4/program/";
    XComponentContext xContext = BootstrapSocketConnector.bootstrap(oooExeFolder);
    XMultiComponentFactory xMCF = xContext.getServiceManager();

    Object oDesktop = xMCF.createInstanceWithContext(
            "com.sun.star.frame.Desktop", xContext);

    XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface(XDesktop.class, oDesktop);
    XComponentLoader xCLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, oDesktop);
    //----------------------------------

    try {

        // Create a document
        XComponent xdocument = xCLoader.loadComponentFromURL("private:factory/swriter", "_blank", 0, new PropertyValue[0]);

        // Get the textdocument
        XTextDocument aTextDocument = (XTextDocument) UnoRuntime.queryInterface(com.sun.star.text.XTextDocument.class, xdocument);

        // Get its text
        XText xText = aTextDocument.getText();
        XTextRange xTextRange = xText.createTextCursor();
        ((XTextCursor) xTextRange).gotoEnd(true);

        XPropertySet xTextProps = (XPropertySet) UnoRuntime.queryInterface(
                XPropertySet.class, xTextRange);
        xTextProps.setPropertyValue("CharFontName", "Helvetica");
        xTextProps.setPropertyValue("CharWeight",
                new Float(com.sun.star.awt.FontWeight.BOLD));
        xTextProps.setPropertyValue("CharHeight", new Float(16));
        XParagraphCursor xPC = (XParagraphCursor) UnoRuntime.queryInterface(
                XParagraphCursor.class, xTextRange);

        XPropertySet xPS = (XPropertySet) UnoRuntime.queryInterface(
                XPropertySet.class, xPC);

        xPS.setPropertyValue("ParaAdjust", com.sun.star.style.ParagraphAdjust.CENTER);

        xText.insertString(xText.getEnd(), "Records Management Division \n Records Center Statistics \n Weekly Report\n\n", false);

        xText.insertString(xText.getEnd(), "Week :" + month + " " + date + " - " + endmonth + " " + date1 + "," + endyear + "\n\n", false);

        XMultiServiceFactory xMSF = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, xdocument);

        // Creating a table with 3 rows and 4 columns
        XTextTable xTextTable = (XTextTable) UnoRuntime.queryInterface(XTextTable.class, xMSF.createInstance("com.sun.star.text.TextTable"));
        xTextTable.initialize(13, 2); // rows, cols

        // insert table  in the xText
        xText.insertTextContent(xText.getEnd(), xTextTable, false);

        XCellRange xCellRangeHeader = (XCellRange) UnoRuntime.queryInterface(XCellRange.class, xTextTable);
        XCell xCellHeader = null;
        XText xHeaderText = null;

        xCellHeader = xCellRangeHeader.getCellByPosition(0, 0); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("Records Center Total Capacity");

        xCellHeader = xCellRangeHeader.getCellByPosition(1, 0); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("" + RecordCentrecapacity);

        xCellHeader = xCellRangeHeader.getCellByPosition(0, 1); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("Current Inventory For Week Ending");

        xCellHeader = xCellRangeHeader.getCellByPosition(1, 1); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("" + currentTotalInventory);

        xCellHeader = xCellRangeHeader.getCellByPosition(0, 2); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("Open Space / 1.1 Cu. Ft.");

        xCellHeader = xCellRangeHeader.getCellByPosition(1, 2); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("" + CurrentAvailableSpaceS);

        xCellHeader = xCellRangeHeader.getCellByPosition(0, 3); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("Open Space / 2.2 Cu. Ft.");

        xCellHeader = xCellRangeHeader.getCellByPosition(1, 3); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("" + CurrentAvailableSpaceL);

        xCellHeader = xCellRangeHeader.getCellByPosition(0, 4); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("Open Space / 1.1 Cold Room");

        xCellHeader = xCellRangeHeader.getCellByPosition(1, 4); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("" + CurrentAvailableSpaceC);

        xCellHeader = xCellRangeHeader.getCellByPosition(0, 5); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("Boxes Received For Storage/ Cu. Ft.");

        xCellHeader = xCellRangeHeader.getCellByPosition(1, 5); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("" + totalBoxesReceivedforStorage);

        xCellHeader = xCellRangeHeader.getCellByPosition(0, 6); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("Boxes Destroyed From Storage/ Cu. Ft.");

        xCellHeader = xCellRangeHeader.getCellByPosition(1, 6); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("" + totalBoxesDestroyedfromStorage);

        xCellHeader = xCellRangeHeader.getCellByPosition(0, 7); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("Boxes Received For Destruction Only/ Cu. Ft.");

        xCellHeader = xCellRangeHeader.getCellByPosition(1, 7); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("" + BoxesInForDestructionTotalCuFt);

        xCellHeader = xCellRangeHeader.getCellByPosition(0, 8); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("Retrievals");

        xCellHeader = xCellRangeHeader.getCellByPosition(1, 8); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("");

        xCellHeader = xCellRangeHeader.getCellByPosition(0, 9); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("Re-Files");

        xCellHeader = xCellRangeHeader.getCellByPosition(1, 9); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("");

        xCellHeader = xCellRangeHeader.getCellByPosition(0, 10); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("Customer Inquiries");

        xCellHeader = xCellRangeHeader.getCellByPosition(1, 10); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("");

        xCellHeader = xCellRangeHeader.getCellByPosition(0, 11); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("Microfilm Filed (Roll Canister)");

        xCellHeader = xCellRangeHeader.getCellByPosition(1, 11); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("");

        xCellHeader = xCellRangeHeader.getCellByPosition(0, 12); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("Boxes Returned To Departments /Cu. Ft.");

        xCellHeader = xCellRangeHeader.getCellByPosition(1, 12); // cols, rows
        xHeaderText = (XText) UnoRuntime.queryInterface(XText.class, xCellHeader);
        xHeaderText.setString("" + BoxesReturnedToDepartmentSTotalCuFt);

        //close the document
        XCloseable xcloseable = (XCloseable) UnoRuntime.queryInterface(XCloseable.class, xdocument);
        xcloseable.close(false);

%> 

Code for converting is

 byte[] pdf = baos.toByteArray();
             dir = new File(System.getProperty("user.dir")+File.separator+folderName);

                        if(!dir.exists())
                        {    
                             dir.mkdir();
                        }


                        fos = new FileOutputStream(System.getProperty("user.dir")+File.separator+folderName+File.separator+"Records Centre Statistics Weekly Report"+".pdf");
                        fos.write(pdf);
                        fos.close();


                        response.setContentType ("application/pdf");    
                        //set the header and also the Name by which user will be prompted to save
                        response.setHeader ("Content-Disposition", "attachment;filename="+"Records Centre Statistics Weekly Report"+".pdf");

                        File f = new File (System.getProperty("user.dir")+File.separator+folderName+File.separator+"Records Centre Statistics Weekly Report"+".pdf");

                        InputStream inputStream = new FileInputStream(f);
                        ServletOutputStream servletOutputStream = response.getOutputStream();
                        int bit = 256;
                        int i = 0;

                        try 
                        {

                              while ((bit) >= 0) 
                              {
                                    bit = inputStream.read();
                                    servletOutputStream.write(bit);
                              }
                              System.out.println("bit:" +bit);

                         }
                         catch (Exception ioe) 
                         {
                              ioe.printStackTrace(System.out);
                         }

                         servletOutputStream.flush();

                         inputStream.close();   



   }catch (Exception ex)
   {
       System.out.println("exception : "+ex.getMessage());
   }
   finally
              {
                  System.out.println("directory delete");
                  FileUtils.deleteDirectory(dir);
              }
%> 

If you can help me as i am new to this topic.

1 Answers1

1

Wow!!! Scriptlets in a jsp... how old school!!

Normally, you would do this in a Servlet and not a a jsp. Jsp's are usually used to respond with html, in this instance you are wanting to write binary to the response outputstream.

You can do this in a scriptlet in your jsp

<%
response.getOutputStream().write(...);
%>

But I recommend you use a Servlet instead.

Or better yet, stop using technology from 15 years ago, pick a web framework and stop using jsp's, scriptlets and servlets all together

lance-java
  • 25,497
  • 4
  • 59
  • 101
  • if i use servlet then how to get that open office document as a reponse. – Sarthak Jain Aug 23 '17 at 09:46
  • Same as scriptlet. `response.getOutputStream().write(...)` – lance-java Aug 23 '17 at 09:46
  • still not able to that. – Sarthak Jain Aug 23 '17 at 09:54
  • 1
    I notice your jsp is writing ` ` to the response. You must ensure that your jsp writes NOTHING (note even a space character). Reason: You can't write to both `response.getWriter()` and `response.getOuptutStream()` in the same request. This is why I suggest using a `Servlet` to write to the outputstream. It's so easy to accidentally write a space/newline character in a `jsp` – lance-java Aug 23 '17 at 09:57
  • Can you provide me a code snippet for that. – Sarthak Jain Aug 24 '17 at 04:29
  • Every character between scriptlets is written to the response. Eg for `%> <%` a space character is written to `response.getWriter()`. Also ` ` in your example above is written to the response (along with some newline characters). So this is preventing you from writing to `response.getOutputStream()` – lance-java Aug 24 '17 at 08:04