-
Alexis de Lattre authoredAlexis de Lattre authored
Convertor.java 10.37 KiB
package py3oconverter;
import com.sun.star.bridge.XUnoUrlResolver;
import com.sun.star.beans.PropertyValue;
import com.sun.star.frame.XDesktop;
import java.net.MalformedURLException;
import com.sun.star.beans.XPropertySet;
import com.sun.star.bridge.XBridge;
import com.sun.star.bridge.XBridgeFactory;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.connection.NoConnectException;
import com.sun.star.connection.XConnection;
import com.sun.star.connection.XConnector;
import com.sun.star.io.ConnectException;
import com.sun.star.lang.EventObject;
import com.sun.star.lang.XEventListener;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.frame.XStorable;
import com.sun.star.io.IOException;
import com.sun.star.util.XCloseable;
import com.sun.star.util.CloseVetoException;
import com.sun.star.util.XRefreshable;
import com.sun.star.container.XIndexAccess;
//import com.sun.star.text.XDocumentIndex;
import com.sun.star.lang.IndexOutOfBoundsException;
import com.sun.star.lang.WrappedTargetException;
import com.sun.star.text.XDocumentIndexesSupplier;
import com.sun.star.text.XDocumentIndex;
import java.io.*;
import java.lang.*;
import java.util.Map;
import com.google.gson.*;
public class Convertor {
private XComponentContext xRemoteContext;
private String server_host = null;
private String server_port = null;
public Convertor(String server_host, String server_port) {
xRemoteContext = null;
this.server_host = server_host;
this.server_port = server_port;
}
public void convert(String source_file_path, String target_file_path,
String filter_name, String pdf_options, String pdf_options_types)throws ConnectException, Exception{
XDesktop xDesktop = null;
XComponent xComponent = null;
xDesktop = connect(this.server_host, this.server_port);
xComponent = openDocument(source_file_path, xDesktop);
convert_document(target_file_path, filter_name, xComponent, pdf_options, pdf_options_types);
}
private String createUNOFileURL(String filelocation)
{
java.io.File newfile = new java.io.File(filelocation);
java.net.URL before = null;
try
{
// use the new toURI API because the direct toURL on a java.io.File
// is deprecated
before = newfile.toURI().toURL();
}
catch (MalformedURLException e) {
e.printStackTrace();
}
// Create a URL, which can be used by UNO
String myUNOFileURL = com.sun.star.uri.ExternalUriReferenceTranslator.create(xRemoteContext).translateToInternal(before.toExternalForm());
if (myUNOFileURL.length() == 0 && filelocation.length() > 0)
{
System.out.println("File URL conversion failed. Filelocation " +
"contains illegal characters: " + filelocation);
}
return myUNOFileURL;
}
protected void refreshDocument(XComponent document) {
XRefreshable refreshable = (XRefreshable) UnoRuntime.queryInterface(XRefreshable.class, document);
if (refreshable != null) {
refreshable.refresh();
}
}
protected void refreshIndexes(XComponent document) {
XDocumentIndexesSupplier indexsupplier = (XDocumentIndexesSupplier) UnoRuntime.queryInterface(XDocumentIndexesSupplier.class, document);
XIndexAccess indexaccess = indexsupplier.getDocumentIndexes();
for (int i = 0; i < indexaccess.getCount(); i++) {
try {
XDocumentIndex index = (XDocumentIndex) UnoRuntime.queryInterface(XDocumentIndex.class, indexaccess.getByIndex(i));
if (index != null) {
index.update();
}
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
} catch (WrappedTargetException e) {
e.printStackTrace();
}
}
}
private void convert_document(String targetFilename, String conversionFilter, XComponent xComponent, String pdf_options, String pdf_options_types)
{
// How to get the XComponent, see ../Office/Office.OpenDocumentFromURL.snip
XStorable xStorable = (XStorable)
UnoRuntime.queryInterface(XStorable.class, xComponent);
// refresh document
refreshDocument(xComponent);
// and indexes
refreshIndexes(xComponent);
// Set properties for conversions
PropertyValue[] conversionProperties = new PropertyValue[3];
conversionProperties[0] = new PropertyValue();
conversionProperties[0].Name = "Overwrite";
conversionProperties[0].Value = new Boolean(true);
conversionProperties[1] = new PropertyValue();
conversionProperties[1].Name = "FilterName";
conversionProperties[1].Value = conversionFilter;
Map<String, String> pdf_options_map = new Gson().fromJson(pdf_options, Map.class);
Map<String, String> pdf_options_types_map = new Gson().fromJson(pdf_options_types, Map.class);
PropertyValue[] aFilterData = new PropertyValue[pdf_options_map.size()];
int i = 0;
for (Map.Entry<String, String> entry : pdf_options_map.entrySet()) {
String property_name = entry.getKey();
String property_type = pdf_options_types_map.get(property_name);
String property_value = entry.getValue();
// System.out.println(property_name + "|" + property_value + "|" + property_type);
aFilterData[i] = new PropertyValue();
aFilterData[i].Name = property_name;
if (property_type.equals("boolean") && property_value.equals("true")) {
aFilterData[i].Value = true;
}
else if (property_type.equals("boolean") && property_value.equals("false")) {
aFilterData[i].Value = false;
}
else if (property_type.equals("integer")) {
aFilterData[i].Value = Integer.parseInt(property_value);
}
else if (property_type.equals("string")) {
aFilterData[i].Value = property_value;
}
i++;
}
conversionProperties[2] = new PropertyValue();
conversionProperties[2].Name = "FilterData";
conversionProperties[2].Value = aFilterData;
// Convert
try {
// See ../Office/Office.CreateUNOCompatibleURL.snip for method createUNOFileURL(targetFilename);
xStorable.storeToURL(createUNOFileURL(targetFilename),
conversionProperties);
//try to close using the latest API
XCloseable xCloseable =
(XCloseable)UnoRuntime.queryInterface(XCloseable.class, xStorable);
if ( xCloseable != null ) {
try{
xCloseable.close(false);
} catch (CloseVetoException e) {
// do nothing
}
} else {
// the close API was not implemented, we just dipose()
xComponent.dispose();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private XComponent openDocument(String source_file_path, XDesktop xDesktop) {
XComponentLoader xComponentLoader = (XComponentLoader)
UnoRuntime.queryInterface(XComponentLoader.class, xDesktop);
PropertyValue[] myProperties = new PropertyValue[1];
myProperties[0] = new PropertyValue();
myProperties[0].Name = "Hidden";
// for open document and do not show user interface use "true"
myProperties[0].Value = new Boolean(true);
XComponent xComponent = null;
// Load a given document
try {
String source_file_url = createUNOFileURL(source_file_path);
xComponent = xComponentLoader.loadComponentFromURL(
source_file_url, "_blank", 0, myProperties);
}
catch(Exception e) {
e.printStackTrace();
}
return xComponent;
}
private XDesktop connect(String host, String port) throws ConnectException, Exception{
XMultiComponentFactory xRemoteServiceManager = null;
XDesktop xDesktop = null;
try {
// connect and retrieve a remote service manager and component context
XComponentContext xLocalContext =
com.sun.star.comp.helper.Bootstrap.createInitialComponentContext(null);
XMultiComponentFactory xLocalServiceManager = xLocalContext.getServiceManager();
Object urlResolver = xLocalServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver", xLocalContext );
XUnoUrlResolver xUnoUrlResolver = (XUnoUrlResolver) UnoRuntime.queryInterface(
XUnoUrlResolver.class, urlResolver);
Object initialObject = xUnoUrlResolver.resolve(
"uno:socket,host=" + host + ",port=" + port + ";urp;StarOffice.ServiceManager");
XPropertySet xPropertySet = (XPropertySet)UnoRuntime.queryInterface(
XPropertySet.class, initialObject);
Object context = xPropertySet.getPropertyValue("DefaultContext");
this.xRemoteContext = (XComponentContext)UnoRuntime.queryInterface(
XComponentContext.class, context);
xRemoteServiceManager = this.xRemoteContext.getServiceManager();
// get Desktop instance
Object desktop = xRemoteServiceManager.createInstanceWithContext (
"com.sun.star.frame.Desktop", this.xRemoteContext);
xDesktop = (XDesktop)UnoRuntime.queryInterface(XDesktop.class, desktop);
} catch (NoConnectException connectException) {
throw new ConnectException(
"connection failed for host: "+ host +
", and port: " + port + " : " + connectException.getMessage());
} catch (Exception exception) {
throw new Exception("Open office exception : " + exception);
}
return xDesktop;
}
}