问题
I am using openoffice sdk to get all info from doc file, what I need now is to be able to extract all images in a doc file and save them as images png or gif.
I am using Java, Is there any working example?
thanks;
回答1:
Here it is example how to extract images from MS Word/OpenOffice documents. It is written in C# but it trivial to convert it to Java.
link: http://blog-of-darius.blogspot.com/2011/03/extract-images-from-word-openoffice.html
Updated: I converted code to Java
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.comp.helper.BootstrapException;
import com.sun.star.container.XNameAccess;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.graphic.XGraphic;
import com.sun.star.graphic.XGraphicProvider;
import com.sun.star.io.IOException;
import com.sun.star.lang.IllegalArgumentException;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.text.XTextDocument;
import com.sun.star.text.XTextGraphicObjectsSupplier;
import com.sun.star.uno.Exception;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.util.XCloseable;
public class Program {
public static void exportGraphicObject(XGraphicProvider xGraphicProvider, XGraphic xGraphic, String fileName) throws Exception {
if (xGraphicProvider == null){
throw new Exception("XGraphicProvider is null.");
}
if (xGraphic == null){
throw new Exception("XGraphic is null.");
}
PropertyValue[] properties = new PropertyValue[2];
properties[0] = new PropertyValue();
properties[0].Name = "URL";
properties[0].Value = fileName;
properties[1] = new PropertyValue();
properties[1].Name = "MimeType";
properties[1].Value = "image/" + fileName.trim().substring(fileName.length() - 3);
xGraphicProvider.storeGraphic(xGraphic, properties);
}
public static void exportAllEmbeddedGraphics(XGraphicProvider xGraphicProvider, XTextDocument xTextDocument, String outDir) throws Exception {
if (xGraphicProvider == null){
throw new Exception("XGraphicProvider is null.");
}
if (xTextDocument == null){
throw new Exception("XTextDocument is null.");
}
XTextGraphicObjectsSupplier xTextGraphicObjectsSupplier = (XTextGraphicObjectsSupplier) UnoRuntime.queryInterface(
XTextGraphicObjectsSupplier.class, xTextDocument);
XNameAccess xNameAccess = xTextGraphicObjectsSupplier.getGraphicObjects();
if (xNameAccess != null && xNameAccess.hasElements()) {
String[] names = xNameAccess.getElementNames();
for (int i = 0; i < names.length; i++) {
Object oGraphics = xNameAccess.getByName(names[i]);
XServiceInfo xServiceInfo = (XServiceInfo)UnoRuntime.queryInterface(
XServiceInfo.class, oGraphics);
if (xServiceInfo != null
&& xServiceInfo.supportsService("com.sun.star.text.TextContent")
&& xServiceInfo.supportsService("com.sun.star.text.TextGraphicObject")) {
XPropertySet xPropertySet = (XPropertySet)UnoRuntime.queryInterface(
XPropertySet.class, oGraphics);
String url = (String) xPropertySet.getPropertyValue("GraphicURL");
PropertyValue[] properties = new PropertyValue[1];
properties[0] = new PropertyValue();
properties[0].Name = "URL";
properties[0].Value = url;
XGraphic xGraphic = xGraphicProvider.queryGraphic(properties);
if (xGraphic != null){
//String fileName = UUID.randomUUID() + ".png";
String fileName = names[i] + ".png";
System.out.println("Export: " + names[i]);
System.out.println("Filename: " + outDir + fileName);
exportGraphicObject(xGraphicProvider, xGraphic, outDir + fileName);
xGraphic = null;
}
xServiceInfo = null;
}
oGraphics = null;
}
names = null;
xNameAccess = null;
}
if (xTextGraphicObjectsSupplier != null)
xTextGraphicObjectsSupplier = null;
}
public static void main(String[] args) throws Exception {
String fileName = "file:///C:/code/_other/java-OOo/test.odt";
String outDir = "file:///C:/code/_other/java-OOo/out/";
XComponentContext xContext = null;
XMultiComponentFactory xMultiComponentFactory = null;
Object oDesktop = null;
XComponentLoader xComponentLoader = null;
XGraphicProvider xGraphicProvider = null;
System.out.println("Starting OOo.");
try {
xContext = Bootstrap.bootstrap();
} catch (BootstrapException e) {
System.out.println("Boostrap failed! Failed to start OpenOffice.");
return;
}
xMultiComponentFactory = (XMultiComponentFactory) xContext.getServiceManager();
oDesktop = xMultiComponentFactory.createInstanceWithContext(
"com.sun.star.frame.Desktop", xContext);
xComponentLoader = (XComponentLoader)UnoRuntime.queryInterface(
com.sun.star.frame.XComponentLoader.class, oDesktop);
if (xComponentLoader == null) {
System.out.println("Failed to create XComponentLoader");
return;
}
try {
Object oGraphicProvider = xMultiComponentFactory.createInstanceWithContext(
"com.sun.star.graphic.GraphicProvider", xContext);
xGraphicProvider = (XGraphicProvider) UnoRuntime.queryInterface(
XGraphicProvider.class, oGraphicProvider);
} catch (Exception e) {
System.out.println("Failed to create XGraphicProvider!");
return;
}
PropertyValue[] properties = new PropertyValue[2];
properties[0] = new PropertyValue();
properties[0].Name = "Hidden";
properties[0].Value = false; // put true to hide OpenOffice window
properties[1] = new PropertyValue();
properties[1].Name = "CharacterSet";
properties[1].Value = "Unicode (UTF-8)";
XComponent document = null;
try {
document = xComponentLoader.loadComponentFromURL(fileName, "_blank", 0, properties);
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
XTextDocument xTextDocument = (XTextDocument) UnoRuntime.queryInterface(
XTextDocument.class, document);
exportAllEmbeddedGraphics(xGraphicProvider, xTextDocument, outDir);
XCloseable xCloseable = (XCloseable)UnoRuntime.queryInterface(
XCloseable.class, xContext);
if(xCloseable != null)
{
xCloseable.close(true);
xCloseable = null;
}
xGraphicProvider = null;
xComponentLoader = null;
oDesktop = null;
xMultiComponentFactory = null;
xContext = null;
try {
Runtime.getRuntime().exec("tskill soffice");
} catch (java.io.IOException e) {
e.printStackTrace();
}
System.out.println("Done.");
}
}
回答2:
Use Apache POI.
A short intro is given here http://poi.apache.org/hwpf/quick-guide.html
library is packed with examples.
来源:https://stackoverflow.com/questions/5014901/export-images-and-graphics-in-doc-files-to-images-in-openoffice