I have a template in .odt extension and want to populate data in the same by replacing patterned text and save it into pdf or doc.
Have no issue in replacing text by the text and saving into doc/pdf but having trouble to replace text by an image.
For example:
Template having following patterns to be replaced by image and text
//------some static content-------
**&<**signature will be replaced by image.png**>&**
**&<**name of person will be replaced by normal text**>&**
*&<*
, *>&*
are pattern identifiers in template.
Sample java code to replace text with image (Signature) in odt template and generate doc/pdf file.
package com.newgen.doc;
import com.sun.star.awt.Point;
import com.sun.star.awt.Size;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.bridge.XUnoUrlResolver;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.container.XNameContainer;
import com.sun.star.drawing.XShape;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XController;
import com.sun.star.frame.XStorable;
import com.sun.star.io.IOException;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.text.XPageCursor;
import com.sun.star.text.XText;
import com.sun.star.text.XTextContent;
import com.sun.star.text.XTextCursor;
import com.sun.star.text.XTextDocument;
import com.sun.star.text.XTextRange;
import com.sun.star.text.XTextViewCursor;
import com.sun.star.text.XTextViewCursorSupplier;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.uno.XInterface;
import com.sun.star.util.CloseVetoException;
import com.sun.star.util.XCloseable;
import com.sun.star.util.XReplaceDescriptor;
import com.sun.star.util.XReplaceable;
import com.sun.star.util.XSearchDescriptor;
import com.sun.star.util.XSearchable;
public class GenerateDocWithSignature {
public static void main(String args[]) {
String templateUrl = "File:///C:/temp/Test.odt";
String signatureImg = "file:///C:/temp/signature.jpg";
GenerateDocWithSignature graphicExample = new GenerateDocWithSignature();
boolean pdfFlag = true;
try {
graphicExample.addSignature(templateUrl, signatureImg, pdfFlag);
} catch (java.lang.Exception e) {
System.out.println("Please check Exception::" + e);
} finally {
System.exit(0);
}
}
protected void addSignature(String templateUrl, String signatureImg, boolean pdfFlag) {
XMultiComponentFactory xRemoteServiceManager = null;
XTextRange xTextRange = null;
XTextViewCursorSupplier supTextViewCursor = null;
XController xController = null;
Object obj = null;
XComponent xComp = null;
String openOfficePort = "8100";//"2001";
String conDesc = "uno:socket,host=localhost,port=" + openOfficePort + ";urp;StarOffice.ServiceManager";
XComponentContext xContext = getXComponentContext();
xRemoteServiceManager = xContext.getServiceManager();
try {
obj = xRemoteServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", xContext);
XUnoUrlResolver xUnoUrlResolver = (XUnoUrlResolver) UnoRuntime.queryInterface(XUnoUrlResolver.class, obj);
obj = xUnoUrlResolver.resolve(conDesc);
xRemoteServiceManager = (XMultiComponentFactory) UnoRuntime.queryInterface(XMultiComponentFactory.class, obj);
Object desktop = xRemoteServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", xContext);
XComponentLoader xComponentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, desktop);
PropertyValue[] loadProps = new PropertyValue[1];
loadProps[0] = new PropertyValue();
loadProps[0].Name = "Hidden";
loadProps[0].Value = true;
xComp = xComponentLoader.loadComponentFromURL(templateUrl, "_blank", 0, loadProps);
}catch(Exception e){
System.out.println("Exception::"+e);
}
// Get XTextDocument from template
XTextDocument xTextDoc = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, xComp);
// Get Current Controller
xController = xTextDoc.getCurrentController();
supTextViewCursor = (XTextViewCursorSupplier) UnoRuntime.queryInterface(XTextViewCursorSupplier.class, xController);
XTextViewCursor curTextView = supTextViewCursor.getViewCursor();
// Get page cursor and assigns XTextViewCursor cursor to page
XPageCursor curPage = (XPageCursor) UnoRuntime.queryInterface(XPageCursor.class, curTextView);
System.out.println("The current page number is " + curPage.getPage());
// Querying for the interface XMultiServiceFactory on the XTextDocument
XMultiServiceFactory xMSFDoc = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, xTextDoc);
// Get XText
XText xText = xTextDoc.getText();
XReplaceDescriptor xReplaceDescr = null;
XSearchDescriptor xSearchDescr = null;
XReplaceable xReplaceable = null;
XSearchable xSearchable = null;
XStorable xStorable = null;
xReplaceable = (XReplaceable) UnoRuntime.queryInterface(XReplaceable.class, xTextDoc);
xReplaceDescr = xReplaceable.createReplaceDescriptor();
xSearchable = (XSearchable) UnoRuntime.queryInterface(XSearchable.class, xTextDoc);
xSearchDescr = xSearchable.createSearchDescriptor();
xSearchDescr.setSearchString("Signature");
Point point = null;
// Search String and get its first occurrence and get XInterface
XInterface xInterface = (XInterface) xSearchable.findFirst(xSearchDescr);
System.out.println("XInterface=" + xInterface);
if (xInterface != null) {
System.out.println("XInterface-->" + xInterface.toString());
xTextRange = (com.sun.star.text.XTextRange) UnoRuntime.queryInterface(
com.sun.star.text.XTextRange.class, xInterface);
System.out.println("xTextRange-->" + xTextRange.getString());
curTextView.gotoRange(xTextRange, false);
//get cursor position
point = curTextView.getPosition();
System.out.println("Point X=" + point.X + " Y=" + point.Y);
}
XTextCursor xTextCursor = (com.sun.star.text.XTextCursor) UnoRuntime.queryInterface(
com.sun.star.text.XTextCursor.class, xInterface);
try {
// Creating graphic shape service
Object graphicObjShape = null;
graphicObjShape = xMSFDoc.createInstance("com.sun.star.drawing.GraphicObjectShape");
// Customizing graphic shape position and size
XShape shapeSettings = (XShape) UnoRuntime.queryInterface(XShape.class, graphicObjShape);
shapeSettings.setSize(new Size(600, 600));
//shapeSettings.setPosition(point);
// Creating bitmap container service
XNameContainer bitmapContainer = UnoRuntime.queryInterface(XNameContainer.class,
xMSFDoc.createInstance("com.sun.star.drawing.BitmapTable"));
// Inserting test image to the container
bitmapContainer.insertByName("Signature", signatureImg);
// Querying for the interface XPropertySet on the graphic object
XPropertySet xPropSet = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, graphicObjShape);
System.out.println("Test img url is" + bitmapContainer.getByName("Signature"));
// Setting Signature image internal URL to graphic shape property
xPropSet.setPropertyValue("GraphicURL", bitmapContainer.getByName("Signature"));
// Convert graphic shape to the text content item
XTextContent xTextContent = (XTextContent) UnoRuntime.queryInterface(XTextContent.class, graphicObjShape);
// Embed image into the document text with replacement
System.out.println("Inserting image...");
xText.insertTextContent(xTextCursor, xTextContent, true);
} catch (Exception e) {
System.out.println("Exception::" + e);
}
//close
PropertyValue[] storeProps = null;
String fileName = null;
String newFileName = null;
try {
xStorable = (XStorable) UnoRuntime.queryInterface(XStorable.class, xTextDoc);
if (!pdfFlag) {
if (templateUrl.substring(templateUrl.lastIndexOf('.') + 1).equalsIgnoreCase("doc")) {
xStorable.store();
} else {
fileName = templateUrl.substring(0, templateUrl.lastIndexOf('.'));
storeProps = new PropertyValue[1];
storeProps[0] = new PropertyValue();
storeProps[0].Name = "FilterName";
storeProps[0].Value = "MS Word 97";
xStorable.storeToURL(fileName + ".doc", storeProps);
newFileName = fileName + ".doc";
}
} else {
fileName = templateUrl.substring(0, templateUrl.lastIndexOf('.'));
storeProps = new PropertyValue[1];
storeProps[0] = new PropertyValue();
storeProps[0].Name = "FilterName";
storeProps[0].Value = "writer_pdf_Export";
xStorable.storeToURL(fileName + ".pdf", storeProps);
newFileName = fileName + ".pdf";
}
System.out.println("Document generated-->" + newFileName);
XCloseable xCloseable = (XCloseable) UnoRuntime.queryInterface(XCloseable.class, xTextDoc);
xCloseable.close(true);
} catch (IOException | CloseVetoException e) {
System.out.println("Exception::"+e);
}
}
private XComponentContext getXComponentContext() {
XComponentContext xContext = null;
XMultiComponentFactory xRemoteServiceManager = null;
String openOfficePort = "";
try {
xContext = Bootstrap.createInitialComponentContext(null);
System.out.println("xContext=" + xContext);
openOfficePort = "8100";//"2001";
String DefCon = "uno:socket,host=localhost,port=" + openOfficePort + ";urp;StarOffice.ServiceManager";
xRemoteServiceManager = xContext.getServiceManager();
Object obj = xRemoteServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", xContext);
XUnoUrlResolver xUnoUrlResolver = (XUnoUrlResolver) UnoRuntime.queryInterface(XUnoUrlResolver.class, obj);
obj = xUnoUrlResolver.resolve(DefCon);
xRemoteServiceManager = (XMultiComponentFactory) UnoRuntime.queryInterface(XMultiComponentFactory.class, obj);
XPropertySet xPropertySet = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRemoteServiceManager);
obj = xPropertySet.getPropertyValue("DefaultContext");
xContext = (XComponentContext) UnoRuntime.queryInterface(XComponentContext.class, obj);
} catch (Exception e) {
System.out.println("Exception::"+e);
}
System.out.println("xContext="+xContext);
return xContext;
}
}