[C# OpenOffice] Invoegen van een plaatje aan Calc

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben nog steeds bezig met mijn C# WinForm applicatie een Calc document te maken.
Het meeste lukt inmiddels, alleen het invoegen van een plaatje krijg ik niet voor elkaar.

Na een hele dag zoeken, heb ik wel veel voorbeelden gevonden, maar die lopen allemaal fout om het moment dat ik het graphic object aanmaak.
createInstance("com.sun.star.drawing.BitmapTable") en createInstance("com.sun.star.drawing.GraphicObjectShape") geven alle twee NULL terug.
En dan werkt het niet |:(

Hier de code die ik probeer:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public void EmbedGraphic(String imgUrl, XSpreadsheet xSpreadsheet) 
{
    var xDrawPageSupplier = (XDrawPageSupplier)xSpreadsheet;
    var xPage = xDrawPageSupplier.getDrawPage();
    var xBitmapContainer = (XNameContainer)this.mxMSFactory.createInstance("com.sun.star.drawing.BitmapTable");

    var graphicObject = this.mxMSFactory.createInstance("com.sun.star.drawing.GraphicObjectShape");
    var xGraphicShape = (XShape)graphicObject;

    xGraphicShape.setSize(new unoidl.com.sun.star.awt.Size(3104, 1093));

    xGraphicShape.setPosition(new unoidl.com.sun.star.awt.Point(10,10));

    var xProps = (XPropertySet)xGraphicShape;

    // 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("imgID", new Any(imgUrl));

    xProps.setPropertyValue(
        "AnchorType", new Any(typeof (TextContentAnchorType), TextContentAnchorType.AS_CHARACTER));
    xProps.setPropertyValue("GraphicURL", new Any(typeof(string), xBitmapContainer.getByName("imgID")));
    xProps.setPropertyValue("Width", new Any(4000)); // original: 88 px
    xProps.setPropertyValue("Height", new Any(1550)); // original: 31 px
    xProps.setPropertyValue("Name", new Any("ccoo:image"));

    // inser the graphic at the cursor position
    xPage.add(xGraphicShape);
            
    // remove the helper-entry
    xBitmapContainer.removeByName("imgID");
}


Zoals gezegd geven regel 5 en 7 NULL terug.

Heeft iemand een idee?

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 17-09 10:59

Ventieldopje

I'm not your pal, mate!

Kleine gok, bestaat "com.sun.star.drawing.BitmapTable" niet meer?

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@Ventieldopje: Dat zou een aannemelijke verklaring zijn, maar hoe kom ik daar achter?
Als ik de pagina 'What's new in OpenOffice.org 3.3 SDK?' (http://development.openoffice.org/releases/3.3_sdk.html) lees, zie ik niets vermeld hierover.

Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 17-09 16:09

NetForce1

(inspiratie == 0) -> true

Volgens de IDL reference bestaat die service nog wel: http://api.openoffice.org.../drawing/BitmapTable.html
Weet je zeker dat je de goede service factory hebt?

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik begin zo in mijn class:
C#:
1
2
XComponentContext m_xContext = Bootstrap.bootstrap();
XMultiServiceFactory mxMSFactory = m_xContext.getServiceManager();

Dit komt uit een van de voorbeelden die ik heb gebruikt.
Hoe kan ik uitzoeken welke service factory ik nodig heb?

Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 17-09 16:09

NetForce1

(inspiratie == 0) -> true

Probeer dit eens:
C#:
1
var xBitmapContainer = (XNameContainer)this.mxMSFactory.createInstanceWithContext("com.sun.star.drawing.BitmapTable", m_xContext);

Zo gebruiken wij het iig vanuit Java.
Ik weet niet hoe de .Net-bridge werkt, maar moet je voor je de service cast niet ook nog de goede interface querien? [code=C#]UnoRuntime.queryInterface(iface, instance)[/]
edit: ik zie dat queryInterface niet nodig is: http://wiki.services.open..._and_Obtaining_Interfaces

[ Voor 19% gewijzigd door NetForce1 op 04-03-2011 16:48 ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Deze code compileert, maar geeft nog steeds NULL:
C#:
1
var xBitmapContainer = (XNameContainer)this.m_xContext.getServiceManager().createInstanceWithContext("com.sun.star.drawing.BitmapTable", this.m_xContext);


Ik vond nu wel de methode
C#:
1
this.m_xContext.getServiceManager().getAvailableServiceNames()

Die heb ik naar het debug venster laten printen en dan zit er ook geen BitmapTable tussen.
Moet ik nog iets aanzetten of zo?

In de lijst vond ik wel com.sun.star.graphic.GraphicObject als ik die gebruik:
C#:
1
var xGraphicObject = this.mxMSFactory.createInstance("com.sun.star.graphic.GraphicObject");

krijg ik wel een object. Nu eens kijken of ik daar mee kan doen wat ik wil: een plaatje op een specifieke positie plaatsten.

[Edit:]
Het volgende compileert inmiddels en alle vars zijn gevuld:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void EmbedGraphic(String imgUrl, XSpreadsheet xSheet)
{
    var xGraphicProvider =
        (XGraphicProvider)this.mxMSFactory.createInstance("com.sun.star.graphic.GraphicProvider");

    var xMediaProps = new PropertyValue[2];
    xMediaProps[0] = new PropertyValue {Name = "URL", Value = new Any(PathConverter(imgUrl))};
    xMediaProps[1] = new PropertyValue {Name = "AsLink", Value = new Any(false)};

    var xNewGraphic = xGraphicProvider.queryGraphic(xMediaProps);

    // Assign the new graphic image to existent page object
    var xPropSet = (XPropertySet)xSheet;
    xPropSet.setPropertyValue("Graphic", new Any(xNewGraphic));
}


Het gaat alleen fout bij de laatste regel. Bovenstaande komt uit een JAVA voorbeeld en dan kun je een property eenvoudiger setten. In C# moet dan via de Any struct en die snapt niets van xNewGraphic.

Ik heb geen .NET voorbeelden kunnen vinden, dus ik weet niet eens of bovenstaande werkt.
Ik ga nu maar verder met mijn work-around: Het opslaan van de blob uit de database en die vervolgens met de hand (1170 keer!) toevoegen.

OpenOffice: 'Goedkoper kunnen we het maken, niet makkelijker'

[ Voor 44% gewijzigd door Verwijderd op 04-03-2011 20:08 ]


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 17-09 16:09

NetForce1

(inspiratie == 0) -> true

Heb je OOo volledig geinstalleerd?
Post anders je probleem op de mailing lists (dev, extensions of api) van OOo (of van LibreOffce), daar zitten ook developers.

Misschien heb je hier nog wat aan: http://blog.oio.de/2010/0...fice-org-writer-document/. O, wacht, die gebruik je al...

Volgens mij moet je aan Any ook het type meegeven van je property, dus
C#:
1
new Any(typeof(XGraphic), xNewGraphic)

[ Voor 48% gewijzigd door NetForce1 op 04-03-2011 20:43 ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb net nog even gekeken en ik heb OOo v3.3 NL volledig geinstalleerd.
Ik had al een post op het OOo forum geplaatst, maar nog geen bericht terug.

Dat met Any, had ik al geprobeerd, maar dan krijg ik een 'UnknownPropertyException'.
Wat overigens wel logisch is omdat Any een Struct is met een aantal gedefinieerde properties, zoals string, bool, int, etc. maar geen XGraphic.
Wel raar dat het met JAVA wel moet lukken.

Ik heb inmiddels mijn work-around klaar. Ik heb mijn plaatjes in een mapje opgeslagen en ga ze nu 1 voor 1 handmatig toevoegen. Dan heb ik in ieder geval mijn document klaar, want daar wordt al een paar dagen opgewacht.
Ondertussen zoek ik wel verder uit hoe dit op te lossen. Het lijkt me niet dat ik de enige ben die met C# een plaatje wil toevoegen aan een Calc document ;)

Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 17-09 16:09

NetForce1

(inspiratie == 0) -> true

Verwijderd schreef op vrijdag 04 maart 2011 @ 21:31:
Dat met Any, had ik al geprobeerd, maar dan krijg ik een 'UnknownPropertyException'.
Wat overigens wel logisch is omdat Any een Struct is met een aantal gedefinieerde properties, zoals string, bool, int, etc. maar geen XGraphic.
Wel raar dat het met JAVA wel moet lukken.
Volgens de documentatie zou het toch zo moeten werken: http://wiki.services.open.../ProUNO/CLI/Type_Mappings
UknownPropertyException wil zeggen dat "the property name is unknown to the implementation", je zet de property dus op het verkeerde object. Hier, of hier heb je wellicht nog wat aan.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"

Pagina: 1