Uitgewerkt voorbeeld

Werkwijze

Net zoals in MS Office is er in OpenOffice.org een macrotaal. Je kunt OpenOffice.org vanaf de commandoregel starten met de instructie om een macro uit te voeren. Je kunt zelfs bestandsnamen meegeven als parameter voor de macro. Met de --invisible optie kun je OpenOffice.org opstarten zonder de grafische gebruikersinterface. Op die manier kun je een commandoregel programma bouwen om bestanden te converteren van een MS Office-formaat naar een open formaat zoals ODF, PDF of HTML.

Met een Perl script of een script in een andere taal - zoals bijvoorbeeld Python in unoconv - kun je conversies automatiseren.

Conversiemacro's aanmaken

Selecteer in OpenOffice.org ToolsMacrosOrganize MacrosOpenOffice.org Basic.

Klik op de knop Organizer op de New knop. Geef je module een naam, bijvoorbeeld AangepasteOmzettingen en druk op Enter.

De nieuwe module komt onder MyMacros/Standard te staan in de lijst van modules.

Selecteer je nieuwe module en klik op de Edit knop.

Figuur 3.3. Nieuwe macro editeren in OpenOffice

De module staat in de boom MyMacros.

In het editvenster vind je al een aanzet voor een script. Je mag dit verwijderen en vervangen door deze code - die je later naar wens kunt aanpassen:

' Gebaseerd op code van http://www.oooforum.org/forum/viewtopic.phtml?t=3772

' Bewaar het document als Acrobat PDF.
Sub SaveAsPDF( cFile )
   cURL = ConvertToURL( cFile )
   ' Open het document in de blinde veronderstelling dat het van een
   ' type is dat OOo correct zal herkennen, zonder speciale filters.
   oDoc = StarDesktop.loadComponentFromURL( cURL, "_blank", 0, _
            Array(MakePropertyValue( "Hidden", True ),))

   cFile = Left( cFile, Len( cFile ) - 4 ) + ".pdf"
   cURL = ConvertToURL( cFile )
   
   ' Bewaar het document gebruik makend van een filter.
   oDoc.storeToURL( cURL, Array(_
            MakePropertyValue( "FilterName", "writer_pdf_Export" ),)
   
   oDoc.close( True )
End Sub

' Bewaar het document als MS Word.
Sub SaveAsDoc( cFile ) 
   ' Dit is grotendeels hetzelfde als SaveAsPDF
   cURL = ConvertToURL( cFile )
   oDoc = StarDesktop.loadComponentFromURL( cURL, "_blank", 0, (_
            Array(MakePropertyValue( "Hidden", True ),))


   cFile = Left( cFile, Len( cFile ) - 4 ) + ".doc"
   cURL = ConvertToURL( cFile )
   
   oDoc.storeToURL( cURL, Array(_
            MakePropertyValue( "FilterName", "MS WinWord 6.0" ),)
   oDoc.close( True )

End Sub


' Bewaar het document als OpenOffice 2 bestand. 
Sub SaveAsOOO( cFile ) 
   ' Weer grotendeels gelijklopend aan SaveAsPDF. 
   cURL = ConvertToURL( cFile )
   oDoc = StarDesktop.loadComponentFromURL( cURL, "_blank", 0, _
            Array(MakePropertyValue( "Hidden", True ),))

   ' Extenties van het output bestand gebaseerd op 
   ' extentie van input bestand in kleine letters.
   Select Case LCase(Right(cFile,3))
     Case "ppt"         ' PowerPoint
       cFileExt = "odp"
     Case "doc"         ' Word
       cFileExt = "odt"
     Case "xls"         ' Excel
       cFileExt = "ods"
     Case Else
       cFileExt = "xxx"
    End Select
       
   cFile = Left( cFile, Len( cFile ) - 3 ) + cFileExt
   cURL = ConvertToURL( cFile )
   
   oDoc.storeAsURL( cURL, Array() )
   oDoc.close( True )

End Sub


Function MakePropertyValue( Optional cName As String, Optional uValue ) _
   As com.sun.star.beans.PropertyValue
   Dim oPropertyValue As New com.sun.star.beans.PropertyValue
   If Not IsMissing( cName ) Then
      oPropertyValue.Name = cName
   EndIf
   If Not IsMissing( uValue ) Then
      oPropertyValue.Value = uValue
   EndIf
   MakePropertyValue() = oPropertyValue
End Function

Deze versie van Basic is een variant van het origineel, BASIC, die sommigen onder ons ooit leerden als eerste programmeertaal.

Kies FileSave om je macro op te slaan.

Test

Je zou nu je macro moeten kunnen gebruiken, ongeacht of je eerst OpenOffice.org herstart of niet:

ooffice -invisible macro:///Standard.AangepasteOmzettingen.SaveAsOOO(/var/tmp/test.doc)

Dit werkt op dezelfde manier op de commandoregel in MS Windows, maar je zult eventueel naar de OpenOffice.org binary moeten verwijzen met een volledig pad.

Je kunt nu een lijst maken van te converteren bestanden. Batch-omzettingen kunnen zeer eenvoudig zijn, bijvoorbeeld met een shell script of direct op de commandoregel in UNIX.

Denk erom dat je eventueel gecomprimeerde bestanden eerst moet uitpakken, bijvoorbeeld met een klein script:

ooffice -invisible "macro:///Standard.AangepasteOmzettingen.SaveAsOOO($1.doc)"
unzip -o $1.odt content.xml
cp content.xml $1.xml

Het interessante is dat je nu een cross-platform conversietool hebt, waarmee je niet alleen bestanden kunt omzetten van Office-gebruikers, maar nog veel belangrijker: je kunt er ook je oude bestanden mee ontsluiten en de weg vrijmaken voor het ontwikkelen van nieuwe toepassingen voor datamining.