Tässä vielä eräs tapa importoida .pdf -tiedostoon upotetun kuvan data piilotetun Draw -projektin välityksellä LibreOffice Basic koodin käyttöön höystettynä kevyellä virityksellä joka haistelee tiedon importoitavan kuvadatan formaatista.
REM ***** BASIC *****
Sub OpenPDF
Dim oDoc As Object
oDoc = thisComponent
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() Then
sFileArray = filepicker.getFiles()
localFile = sFileArray(0)
End If
filepicker = Nothing
If localFile = "" Then
MsgBox "Operation aborted by user", "48", "Open" : Exit Sub
End If
Dim sfa As Object, sResult As String
Dim inpStream As Object, inBytes() As Byte, i As Integer
sfa = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
inpStream = CreateUnoService("com.sun.star.io.DataInputStream")
inpStream = sfa.OpenFileRead(localFile)
inpStream.readSomeBytes(inBytes, 1000)
inpStream.CloseInput()
inpStream = Nothing
sResult = DumpBytes(inBytes, Ubound(inBytes))
Erase inBytes
Dim ext_mtype() As String
ext_mtype = Split(DetectImageType(sResult), "|")
jmp:
sResult = ""
If ext_mtype(1) = "application/octet-stream" Then
MsgBox "No supported image found", "48", "System"
Exit Sub
End If
Dim args(0) As New com.sun.star.beans.PropertyValue
args(0).Name = "Hidden"
args(0).Value =True
Dim pdfDoc As Object
pdfDoc = StarDesktop.loadComponentFromURL(localFile, "_blank", 0, args())
Dim oPages As Object, oPage As Object, oShape As Object
oPages = pdfDoc.getDrawPages()
If oPages.getCount() - 1 > 0 Then
MsgBox "Cannot handle multipage .pdf data", "48", "Sytem"
oPages = Nothing : pdfDoc.setModified(False)
args = Nothing : pdfDoc.dispose() : Exit Sub
End If
Dim j As Integer, oGraphic As Object
For i = 0 To oPages.getCount() - 1
oPage = oPages.getByIndex(i)
For j = 0 To oPage.getCount() - 1
oShape = oPage.getByIndex(j)
If oShape.supportsService("com.sun.star.drawing.GraphicObjectShape") Then
oGraphic = oShape.Graphic : Exit For
End IF
Next j
Next i
pdfDoc.setModified(False)
pdfDoc.dispose()
oDoc.setModified(False)
If IsNull(oGraphic) Then
MsgBox "No supported image found", "48", "System"
Exit Sub
End If
Dim baseUrl As String, destUrl As String
Select Case OSName
Case "WIN"
baseUrl = Environ("userprofile") & "\Desktop\"
Case "LINUX", "MACOSX"
baseUrl = Environ("HOME") & "/Desktop/"
End Select
destUrl = ConvertToUrl(baseUrl & "embedded_image_from_pdf" & ext_mtype(0))
If sfa.Exists(destUrl) Then
sfa.Kill(destUrl)
End If
Dim gPovider As Object
gPovider = CreateUnoService("com.sun.star.graphic.GraphicProvider")
Dim props(1) As New com.sun.star.beans.PropertyValue
Props(0).Name = "URL"
Props(0).Value = destUrl
Props(1).Name = "MimeType"
Props(1).Value = ext_mtype(1)
gPovider.storeGraphic(oGraphic, props)
props = Nothing
Erase ext_mtype
sfa = Nothing
gPovider = Nothing
oGraphic = Nothing
Dim oShellExec As Object
oShellExec = CreateUnoService("com.sun.star.system.SystemShellExecute")
oShellExec.execute(destURL, "", 0)
oShellExec = Nothing
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
Function DumpBytes(inBytes As Variant, count As Long) As String
Dim aBytes(Ubound(inBytes)) As Byte
Dim i As Long, line As String
For i = 0 To count -1
aBytes(i) = IIf(inBytes(i) < 0, 256 + inBytes(i), IIf(inBytes(i) = 0 And inBytes(i+1) = 0, 10, inBytes(i)))
sResult = sResult & ByteToChar(aBytes(i))
Next i
Erase aBytes
DumpBytes = sResult
sResult = ""
End Function
Function ByteToChar(b As Integer) As String
ByteToChar = Chr(b)
End Function
Function DetectImageType(sResult As String) As String
If InStr(sResult, "ÿØÿà") > 0 Or InStr(sResult, "ÿØÿÛ") > 0 Then
DetectImageType = ".jpg|image/jpeg"
ElseIf InStr(sResult, "‰PNG") > 0 Then
DetectImageType = ".png|image/png"
ElseIf InStr(sResult, "GIF8") > 0 Then
DetectImageType = ".gif|image/gif"
ElseIf InStr(sResult, "BM") > 0 Then
DetectImageType = ".bmp|image/bmp"
ElseIf InStr(sResult, "II*") > 0 Or InStr(sResult, "MM") > 0 Then
DetectImageType = ".tiff|image/tiff"
ElseIf InStr(sResult, "RIFF") > 0 Then
DetectImageType = ".webp|image/webp"
ElseIf InStr(sResult, "<svg") > 0 Then
DetectImageType = ".svg|image/svg+xml"
Else
DetectImageType = ".bin|application/octet-stream"
End If
End Function
Function OSName As String
With GlobalScope.Basiclibraries
If Not .IsLibraryLoaded("Tools") Then .LoadLibrary("Tools")
End With
Dim keyNode As Object
keyNode = Tools.Misc.GetRegistryKeyContent("org.openoffice.Office.Common/Help")
OSName = keyNode.GetByName("System")
End Function
Sub OnClose
thisComponent.setModified(False)
End SubHalutessaan valmiin testiprojektin siihen liittyvine .pdf testitiedostoineen voi imaista täältä
HV (hyvää vappua jo etukäteen)