The solution is to let the GraphicURL point to an internal Graphic.
The problem is that you cannot simply copy a file into the
zip-container since OOo will change the name of the graphic to
some checksum-based Name.
That is where the BitmapTable comes into play. It allows you to
specify an external URL and it will embed the graphic into the
zip-container and allows you to get the internalURL to it.
With that URL, inserting the graphic as embedded is a cakewalk.
/**
* Embeds the given Image into a Textdocument at the given cursor position
* (Anchored as character)
*
* @param grProps OOo-style URL and width & height of the graphic
* @param xMSF the factory to create services from
* @param xCursor the cursor where to insert the graphic
*/
private void embedGraphic(GraphicInfo grProps,
XMultiServiceFactory xMSF, XTextCursor xCursor) {
XNameContainer xBitmapContainer = null;
XText xText = xCursor.getText();
XTextContent xImage = null;
String internalURL = null;
try {
xBitmapContainer = (XNameContainer) UnoRuntime.queryInterface(
XNameContainer.class, xMSF.createInstance(
"com.sun.star.drawing.BitmapTable"));
xImage = (XTextContent) UnoRuntime.queryInterface(
XTextContent.class, xMSF.createInstance(
"com.sun.star.text.TextGraphicObject"));
XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface(
XPropertySet.class, xImage);
// helper-stuff to let OOo create an internal name of the graphic
// that can be used later (internal name consists of various checksums)
xBitmapContainer.insertByName("someID", grProps.unoURL);
internalURL = AnyConverter.toString(xBitmapContainer
.getByName("someID"));
xProps.setPropertyValue("AnchorType",
com.sun.star.text.TextContentAnchorType.AS_CHARACTER);
xProps.setPropertyValue("GraphicURL", internalURL);
xProps.setPropertyValue("Width", (int) grProps.widthOfGraphic);
xProps.setPropertyValue("Height", (int) grProps.heightOfGraphic);
// inser the graphic at the cursor position
xText.insertTextContent(xCursor, xImage, false);
// remove the helper-entry
xBitmapContainer.removeByName("someID");
} catch (Exception e) {
System.out.println("Failed to insert Graphic");
}
}