Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: LibreOffice Basic Kuva pdf tiedostosta Writer dokumenttiin

neosofta [27.02.2026 14:18:27]

#

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)

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta