Yksinkertainen testiviritelmä yksisivuisen ainoastaan yhden kuva objektin sisältävän .pdf -tiedoston kuvan tuomisesta LibreOffice Writer dokumentin kuva -objektiin [Star]Basic koodin ja Python scriptin yhdistelmällä.
' Module1 (Basic koodi)
Sub OpenPDF
If Not IsNull(thisComponent.URL) Then
baseUrl = Left(thisComponent.URL, InStrReverse(thisComponent.URL, "/"))
Else
MsgBox "Please save your project first and try again."
Exit Sub
End If
' --- PDF-tiedoston valinta ---
Dim filepicker As Object, localFile As String, sFileArray As Variant
filepicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
filepicker.setDisplayDirectory(Left(thisComponent.URL, InStrReverse(thisComponent.URL, "/") - 1))
filepicker.appendFilter("Portable Document Format", "*.pdf")
filepicker.setMultiSelectionMode(False)
If filepicker.Execute = com.sun.star.ui.dialogs.ExecutableDialogResults.OK Then
sFileArray = filepicker.getFiles()
localFile = sFileArray(0)
Else
Exit Sub
End If
ClearDocument
GetPdfInfo localFile
End Sub
Sub GetPdfInfo(pdfUrl As string)
Dim oDoc As Object, oScript As Object
Dim res As Variant
oDoc = ThisComponent
oScript = ThisComponent.getScriptProvider().getScript( _
"vnd.sun.star.script:graphic_to_basic.py$get_pdf_image_and_geometry?language=Python&location=document")
res = oScript.invoke(Array(pdfUrl), Array(), Array())
Dim oGraphic As Object : oGraphic = res(0)
Dim nX As Long : nX = res(1)
Dim nY As Long : nY = res(2)
Dim nW As Long : nW = res(3)
Dim nH As Long : nH = res(4)
Dim oGraphicObject As Object
oGraphicObject = oDoc.createInstance("com.sun.star.text.TextGraphicObject")
oGraphicObject.Graphic = oGraphic
oGraphicObject.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE
oGraphicObject.HoriOrientPosition = nX
oGraphicObject.VertOrientPosition = nY
oGraphicObject.Width = nW
oGraphicObject.Height = nH
oDoc.lockControllers
oDoc.Text.insertTextContent(oDoc.Text.createTextCursor(), oGraphicObject, False)
oDoc.unlockControllers
oDoc.setModified(False)
End Sub
Sub ClearDocument
Dim oDoc As Object, oText As Object
oDoc = ThisComponent
oText = oDoc.Text
oDoc.Text.String = ""
Dim oEnum As Object, oElement As Object
oEnum = oText.createEnumeration()
While oEnum.hasMoreElements()
oElement = oEnum.nextElement()
oText.removeTextContent(oElement)
Wend
End Sub
Function InStrReverse(sText As String, search As String) As Long
If sText = "" Or search = "" Or Len(search) > Len(sText) Then
InStrReverse = 0
Exit Function
End If
Dim i As Long
For i = Len(sText) To 1 Step -1
If Mid(sText, i, Len(search)) = search Then
InStrReverse = i : Exit Function
End If
Next i
End Function
Sub OnClose
ThisComponent.setModified(False)
End Sub
' Valitse valikkoriviltä: Työkalut -> Mukauta
' Valitse vasemmalta ylhäältä välilehti: Valikot
' Valitse oikealta ylhäältä: Rajaus alasvetolaatikko
' Valitse projektisi nimi
' Sen alta: Kohde ja klikkaa oikealla pikku täppää (kolme viivaa alekkain)
' Klikkaa: Lisää
' Kirjoita ylimpään tekstiruutuun Uusi valikko 1 tillalle: PDF FILE ja klikkaa OK
' Valitse vasemmalta ylhäältä Luokka alasvetolaatikko ja valitse laatikosta
' projektisi nimi, hae makro ja tuplaklikkaa sen päällä
' OpenPDF ilmestyy oikealle alempaan laatikkoon (Assigned Commands)
' Valitse OpenPDF ja klikkaa alhaalta Muuta nappia -> Nimeä uudelleen
' ja kirjoita: Avaa, klikkaa OK nappia ja taas OK nappia ja tallenna projektisi
' Valitse valikkoriviltä: Työkalut -> Mukauta
' Valitse Rajaus alasvetolaatikosta projektisi nimi
' Valitse välilehti: Tapahtumat
' Valitse: Avaa asiakirja, klikkaa oikealla Makro nappia
' Laajenna vasemmalla (Kirjasto) projektisi nimi puuu -> laajenna Standard,
' klikkaa Module1, Valitse oikealta ClearDocument -> klikkaa OK
' Valitse: Asiakirjaa ollaan sulkemassa, klikkaa oikealla Makro nappia
' Laajenna vasemmalla (Kirjasto) projektisi nimi laajenna puuu -> laajenna Standard,
' klikkaa Module1, Valitse oikealta OnClose -> klikkaa OK
' Klikkaa lopuksi Tapahtumat välilehdellä OK ja tallenna projektisi.# graphic_to_basic.py
# projektipakettiin injektoitu tiedosto
import uno
from com.sun.star.beans import PropertyValue
def url_to_local_path(url):
raw = url[8:]
raw = raw.replace("%20", " ")
raw = (raw.replace("%C3%A4", "ä")
.replace("%C3%B6", "ö")
.replace("%C3%A5", "å")
.replace("%C3%84", "Ä")
.replace("%C3%96", "Ö")
.replace("%C3%85", "Å"))
return raw.replace("/", "\\")
def get_pdf_image_and_geometry(url):
local_path = url_to_local_path(url)
uno_url = "file:///" + local_path.replace("\\", "/")
ctx = uno.getComponentContext()
smgr = ctx.getServiceManager()
desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
p = PropertyValue()
p.Name = "Hidden"
p.Value = True
doc = desktop.loadComponentFromURL(uno_url, "_blank", 0, (p,))
page = doc.getDrawPages().getByIndex(0)
shape = page.getByIndex(0)
graphic = shape.Graphic
pos = shape.getPosition()
size = shape.getSize()
doc.close(True)
return (graphic, pos.X, pos.Y, size.Width, size.Height)Halutessaan testiprojektin voi imaista täältä
HUOM! Mikäli poistata Writer -projektin kirjoitussuojauksen ja tallennat menetät Python scriptin.
HV (hyvää vappua jo etukäteen)