pdf Viewer UDF -> Sumatra

  • Hallo community !!

    Ich habe relativ häufig Projekte in denen ich ein PDF in einer GUI anzeigen will.
    Bisher habe ich das immer über das Acrobar Reader Object realisiert.

    Funktioniert auch recht gut, leider stürzt mir der aus ungeklärter Ursache hin und wieder ab.
    ( bei Laufzeiten über 6 Stunden )
    Auch das zusätzliche installieren des Readers ist finde ich etwas nervig.

    Deshalb habe ich mir jetzt mal die Mühe gemacht ein UDF zu schreiben, mit dem man PDF Files in eine GUI einbinden kann, OHNE den Acrobat Reader zu verwenden.
    Die läuft über das Open Source Project Sumatra -> http://blog.kowalczyk.info/software/sumat…-reader-de.html

    Im Anhang findet ihr eine ZIP mit allen benötigten Dateien.

    Der Sumatra Reader wird bei mir als Portable Version verwendet. d.h. es ist keine gesonderte Installation notwendig.

    Aus Zeitgründen habe ich nur die Funktionen implementiert, welche ich persönlich auch brauche,
    Wenn jetzt hier aber jemand noch eine Funktion zwingend braucht, werde ich diese natürlich noch einbauen. ( möglichst zeitnah )

    mit dabei habe ich auch ein ganz ganz kleines Sample .. ^^

    würde mich über Feedback freuen.

    BYE Vi

    -> _sumatraPDF_udf-Release 2013.03.04 V1
    Da der Upload auf maximal 1,5 MB beschränkt ist sind es leider 4 Teile

    wer das nicht runter laden möchte, hier die Source

    Spoiler anzeigen
    [autoit]

    #include-Once
    Global Static $_sumatraPDF_UDF_Version = 1
    Global Static $_sumatraPDF_UDF_ReleaseDatum = "2013.03.03"
    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.8.1
    Author: Marc Neininger

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    UDF um das Open Source Project Sumatra als Portable Version in eine Eigene Gui einzubinden.
    ( somit wird Autoit um die PDF Anzeige erweitert )

    [/autoit] [autoit][/autoit] [autoit]

    Quelle Sumatra -> http://blog.kowalczyk.info/software/sumat…-viewer-de.html

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ;-Funktionen --------------------------------------------------------------------------------------------------------------------
    ;Settings
    ; _SumatraPDF_UDF_clear()
    ; _SumatraPDF_UDF_generateObject()
    ; _SumatraPDF_UDF_run(ByRef $ThisStructHandle,$ViewMode, $PDFFilePath = "0")
    ; _SumatraPDF_UDF_loadFile(ByRef $ThisStructHandle, $PDFFilePath)
    ; _SumatraPDF_UDF_inset($ThisGUI, ByRef $ThisStructHandle, $Mode = 0, $x_Start = 0, $y_Start = 0, $width = 0, $height = 0)
    ; _SumatraPDF_UDF_visibility(ByRef $ThisStructHandle, $visibility = 0)
    ; _SumatraPDF_UDF_resize(ByRef $ThisStructHandle, $x_Start = 0, $y_Start = 0, $width = 0, $height = 0)
    ; _SumatraPDF_UDF_loadFile(ByRef $ThisStructHandle, $PDFFilePath)
    ; _SumatraPDF_UDF_PageUp(ByRef $ThisStructHandle)
    ; _SumatraPDF_UDF_PageDown(ByRef $ThisStructHandle)
    ; _SumatraPDF_UDF_Print(ByRef $ThisStructHandle)
    ; _SumatraPDF_UDF_Close(ByRef $ThisStructHandle)
    ; _SumatraPDF_UDF_ShowObjectData($thisStruct, $Promt = "0")
    ; =====================================================

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <File.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Constants.au3>
    #include <GuiMenu.au3>

    [/autoit] [autoit][/autoit] [autoit]

    FileInstall(".\SumatraPDF.exe", ".\SumatraPDF.exe")
    FileInstall(".\_sumatraPDF_UDF.au3", ".\_sumatraPDF_UDF.au3")
    FileInstall(".\_sumatraPDF_UDF.pdf", ".\_sumatraPDF_UDF.pdf")

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    ;###################### simple sample ###################################################################
    #include <_sumatraPDF_UDF.au3>

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{ESC}", "Terminate")

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode , damit gui protokoll anderst abgearbeitet wird ( mit funktionen , nicht case )

    [/autoit] [autoit][/autoit] [autoit]

    Global $dpfFullPath = "c:\1.pdf"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _SumatraPDF_UDF_clear()
    Global $SUMObject1 = _SumatraPDF_UDF_generateObject()

    [/autoit] [autoit][/autoit] [autoit]

    _SumatraPDF_UDF_run($SUMObject1,$__SV_VM_facing)
    ;_SumatraPDF_UDF_run($SUMObject2,$__SV_VM_facing, $dpfFullPath)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGUI = GUICreate("Pdf Test", 1000, 1000, -1, -1, BitOR($WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_CLIPCHILDREN, $WS_SIZEBOX))
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") ; wenn event $GUI_EVENT_CLOSE aktiviert wird, wird funktion "CLOSEClicked" aufgerufen

    [/autoit] [autoit][/autoit] [autoit]

    _SumatraPDF_UDF_inset($hGUI, $SUMObject1, $__SV_MenueHide, 100, 0, 150, 150,$GUI_HIDE)
    ;_SumatraPDF_UDF_inset($hGUI, $SUMObject2, 1, 100, 500, 150, 150)

    [/autoit] [autoit][/autoit] [autoit]

    $alabel = GUICtrlCreateLabel("Line 1 Cell 1", 10, 30) ; first cell 70 width
    $button_P = GUICtrlCreateButton("P", 10, 100)
    $button_N = GUICtrlCreateButton("N", 10, 150)
    GUICtrlSetOnEvent($button_P, "Button_P")
    GUICtrlSetOnEvent($button_N, "Button_N")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Global $zaehler = 0

    [/autoit] [autoit][/autoit] [autoit]

    ;_SumatraPDF_UDF_loadFile($SUMObject1, $dpfFullPath)

    [/autoit] [autoit][/autoit] [autoit]

    _SumatraPDF_UDF_visibility($SUMObject1,$GUI_SHOW )

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    If $msg = -3 Then ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    $zaehler = $zaehler + 1

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($alabel, $zaehler)

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(10)

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func CLOSEClicked()
    Terminate()
    EndFunc ;==>CLOSEClicked

    [/autoit] [autoit][/autoit] [autoit]

    ;-------------------------------------------------------------------------------------------------------------------------------
    Func Button_P()

    [/autoit] [autoit][/autoit] [autoit]

    ;_SumatraPDF_UDF_resize($SUMObject1,300,0,500,0)
    ;_SumatraPDF_UDF_Close($SUMObject1)
    _SumatraPDF_UDF_PageUp($SUMObject1)
    ;_SumatraPDF_UDF_PageDown($SUMObject1)
    ;_SumatraPDF_UDF_loadFile($SUMObject1, $dpfFullPath)
    ;_SumatraPDF_UDF_visibility($SUMObject1,$GUI_SHOW )
    ;_SumatraPDF_UDF_ShowObjectData($SUMObject1)
    ;_SumatraPDF_UDF_ShowObjectData($SUMObject2)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>Button_P
    ;-------------------------------------------------------------------------------------------------------------------------------
    Func Button_N()
    ;_SumatraPDF_UDF_PageUp($SUMObject1)
    ;_SumatraPDF_UDF_visibility($SUMObject1, $GUI_HIDE)
    _SumatraPDF_UDF_PageDown($SUMObject1)
    EndFunc ;==>Button_N
    ;-------------------------------------------------------------------------------------------------------------------------------
    Func Terminate()
    Exit 0
    EndFunc ;==>Terminate
    ;-------------------------------------------------------------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;###################### simple sample END ###################################################################
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    ;-Strukturen für ObjectHandle
    ;------------------------------------------------------------------------------------------------------------------------------------
    Global $__SV_State = "Status"
    Global $__SV_Headline = "Headline"
    Global $__SV_FullPath = "FullPath"
    Global $__SV_X_POS = "XPOS"
    Global $__SV_Y_POS = "YPOS"
    Global $__SV_Width = "Width"
    Global $__SV_Height = "Height"
    Global $__SV_WHandle = "WHandle"
    Global $__SV_ProcessID = "ProcessID"
    Global $__SV_ParentHandle = "ParentGuiHandle"
    Global $__SV_MenueState = "MenueState"
    Global $__SV_ViewMode = "ViewMode"

    [/autoit] [autoit][/autoit] [autoit]

    Global $__sumatraPDF_UDF_StructString = "int " & $__SV_State & ";char " & $__SV_Headline & "[512];char " & $__SV_FullPath & "[512];" _
    & "int " & $__SV_X_POS & ";int " & $__SV_Y_POS & ";int " & $__SV_Width & ";int " & $__SV_Height & ";" _
    & "HWND " & $__SV_WHandle & ";HWND " & $__SV_ProcessID & ";HWND " & $__SV_ParentHandle & ";int " & $__SV_MenueState & ";" _
    & "char " & $__SV_ViewMode & "[512]"

    [/autoit] [autoit][/autoit] [autoit]

    ;------------------------------------------------------------------------------------------------------------------------------------
    Global Static $__sumatraPDF_UDF_StartUpFile = @ScriptDir & "\_sumatraPDF_UDF.pdf"
    Global Static $__sumatraPortablePath = @ScriptDir & "\SumatraPDF.exe"
    Global Const $__SV_VM_facing = '-view "facing"'
    Global Const $__SV_VM_single = '-view "single page"'
    Global Const $__SV_VM_bookView = '-view "book view"'
    Global Const $__SV_VM_contSingle = '-view "continuous single page"'
    Global Const $__SV_VM_contFacing = '-view "continuous facing"'
    Global Const $__SV_VM_contBook = '-view "continuous book view"'
    Global Const $__SV_MenueShow = @SW_SHOW
    Global Const $__SV_MenueHide = @SW_HIDE

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: löscht die sumatra setup Datei welche beim beenden abgespeichert wird.
    ; Parameter(s):
    ;
    ;===============================================================================
    Func _SumatraPDF_UDF_clear()
    FileDelete(@ScriptDir & '\sumatrapdfprefs.dat') ; Deletes the defualt setting file that is created when SumatraPDF.exe is closed
    EndFunc ;==>_SumatraPDF_UDF_clear
    ;===============================================================================
    ; Description: gibt als rückgabewert die benötigte Struktur für das Sumatra Object zurück.
    ; Parameter(s):
    ;
    ; Return Value(s): ein neues Sumatra Object
    ;
    ;===============================================================================
    Func _SumatraPDF_UDF_generateObject()
    $Struct = DllStructCreate($__sumatraPDF_UDF_StructString)
    If @error Then
    MsgBox(0, "", "Error in DllStructCreate " & @error);
    MsgBox(0, "the Struct String", $__sumatraPDF_UDF_StructString)
    Exit
    EndIf
    DllStructSetData($Struct, $__SV_State, -9) ; ststus des Objectes auf 1 setzen
    Return $Struct
    EndFunc ;==>_SumatraPDF_UDF_generateObject

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: Startet sumatra im Hintergrund
    ; Parameter(s): ByRef $ThisStructHandle = das betroffenen Sumatra Object
    ; $PDFFilePath=0 = das File welches geöfnet werden soll.
    ; wenn kein Pfad angegeben wird, wird das Standart File geladen
    ;
    ; Return Value(s): keins ( das Object wird aktualisiert )
    ;
    ;===============================================================================
    Func _SumatraPDF_UDF_run(ByRef $ThisStructHandle, $sPDFViewMode, $PDFFilePath = "0")
    ;MsgBox(0, "debug", $PDFFilePath)
    If $PDFFilePath = "0" Then
    $PDFFilePath = $__sumatraPDF_UDF_StartUpFile
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $szDrive, $szDir, $szFName, $szExt
    Local $TestPath = _PathSplit($PDFFilePath, $szDrive, $szDir, $szFName, $szExt)
    Local $HeadlineName = $TestPath[3] & $TestPath[4] ;"Test.pdf"

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($ThisStructHandle, $__SV_Headline, $HeadlineName)
    DllStructSetData($ThisStructHandle, $__SV_FullPath, $PDFFilePath)
    DllStructSetData($ThisStructHandle, $__SV_ViewMode, $sPDFViewMode)

    [/autoit] [autoit][/autoit] [autoit]

    ;_SumatraPDF_UDF_ShowObjectData($ThisStructHandle)

    [/autoit] [autoit][/autoit] [autoit]

    Local $sPDFFileToOpen = '-reuse-instance "' & $PDFFilePath & '"'
    ;Local $sPDFViewMode = '-view "facing"'

    [/autoit] [autoit][/autoit] [autoit]

    ;$sPDFFile = "Test.pdf"
    ;$sPDFFileToOpen = ' -reuse-instance "' & FileGetShortName(@ScriptDir & '\' & $sPDFFile & '"')
    ;ShellExecute(@ProgramFilesDir & "\SumatraPDF.exe", $sPDFFileToOpen, @ScriptDir, "",@SW_HIDE)
    ;ShellExecute("c:\SumatraPDF.exe", $sPDFFileToOpen, @ScriptDir, "", @SW_HIDE)
    $PID = Run($__sumatraPortablePath & " " & $sPDFViewMode & " " & $sPDFFileToOpen, "", @SW_HIDE)
    DllStructSetData($ThisStructHandle, $__SV_ProcessID, $PID)

    [/autoit] [autoit][/autoit] [autoit]

    WinWait(DllStructGetData($ThisStructHandle, $__SV_Headline))
    $hWnd = WinGetHandle(DllStructGetData($ThisStructHandle, $__SV_Headline))
    DllStructSetData($ThisStructHandle, $__SV_WHandle, $hWnd)

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($ThisStructHandle, $__SV_State, 0) ; ststus des Objectes auf 0 setzen
    EndFunc ;==>_SumatraPDF_UDF_run

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: fügt das sumatra handle ( die instance ) in die gui ein .. an gewünschter position
    ; Parameter(s): ByRef $hGUI = die gui in die das sumatra eingesetzt werden soll
    ; ByRef $ThisStructHandle = das betroffenen Sumatra Object
    ; $MainMenueStatus = soll Menue des sumatra angezeigt werden oder nciht.
    ; $x_Start=0 = die Position in der $hGUI von X ( Startpos )
    ; $y_Start=0 = die Position in der $hGUI von y ( Startpos )
    ; $width=0 = die breite | wenn 0 dann max breite von Gui | wenn kleiner 0 wird entsprechender wert von Max breite abgezogen
    ; $height=0 = die höhe | wenn 0 dann max höhe von Gui | wenn kleiner 0 wird entsprechender wert von Max höhe abgezogen
    ; $sumatravisibility = beim einfügen gleich anzeigen oder noch im Hintergrund lassen
    ;
    ; Return Value(s):
    ;===============================================================================
    ;--------------------------------------------------------------------------------------------------------------------
    Func _SumatraPDF_UDF_inset($ThisGUI, ByRef $ThisStructHandle, $MainMenueStatus = 0, $x_Start = 0, $y_Start = 0, $width = 0, $height = 0, $sumatravisibility = 0)
    $state = DllStructGetData($ThisStructHandle, $__SV_State) ; ststus des Objectes auf 1 setzen
    If $state < 0 Then
    Return
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $MainMenueStatus = 0 Then
    $MainMenueStatus = @SW_HIDE

    [/autoit] [autoit][/autoit] [autoit]

    Else
    $MainMenueStatus = @SW_SHOW

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; das eingesetzte sumatra sichbar oder unsichtbar starten
    If $sumatravisibility = 0 Or $sumatravisibility = $GUI_HIDE Then
    $sumatravisibility = $SWP_HIDEWINDOW
    Else
    $sumatravisibility = $SWP_SHOWWINDOW

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $hMain = _GUICtrlMenu_GetMenu(DllStructGetData($ThisStructHandle, $__SV_WHandle))
    $hView = _GUICtrlMenu_GetItemSubMenu($hMain, 1)
    ;WinMenuSelectItem($sPDFFile, "", "&View", "Continuous") ; sets view to continuos page
    WinMenuSelectItem(DllStructGetData($ThisStructHandle, $__SV_Headline), "", "&View", "Continuous") ; sets view to continuos page
    ;_GUICtrlMenu_SetItemChecked($hView, 11,$MainMenueStatus)
    If _GUICtrlMenu_GetItemChecked($hView, 11) Then WinMenuSelectItem(DllStructGetData($ThisStructHandle, $__SV_Headline), "", "&View", "Show toolbar") ; hides the toolbar
    _GUICtrlMenu_SetMenu(DllStructGetData($ThisStructHandle, $__SV_WHandle), $MainMenueStatus) ; hides the menu
    _WinAPI_SetWindowLong(DllStructGetData($ThisStructHandle, $__SV_WHandle), $GWL_STYLE, BitOR($WS_CLIPCHILDREN, $WS_CLIPSIBLINGS, $WS_VISIBLE)) ; removes borders from SumatraPDF.exe

    [/autoit] [autoit][/autoit] [autoit]

    $ThisHandle = DllStructGetData($ThisStructHandle, $__SV_WHandle)
    _WinAPI_SetParent($ThisHandle, $ThisGUI) ; parent the SumatraPDF.exe window into an autoit window

    [/autoit] [autoit][/autoit] [autoit]

    $aWinSize = WinGetClientSize($ThisGUI)

    [/autoit] [autoit][/autoit] [autoit]

    If $width = 0 Then
    $width = $aWinSize[0]
    ElseIf $width < 0 Then
    $width = $aWinSize[0] + $width

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $height = 0 Then
    $height = $aWinSize[1]
    ElseIf $height < 0 Then
    $height = $aWinSize[1] + $height

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_SetWindowPos($ThisHandle, $HWND_TOP, $x_Start, $y_Start, $width, $height, $sumatravisibility) ; size SumatraPDF.exe window to fit inside the autoit window

    [/autoit] [autoit][/autoit] [autoit]

    ; werte in ObjectStruktur speichern

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($ThisStructHandle, $__SV_X_POS, $x_Start)
    DllStructSetData($ThisStructHandle, $__SV_Y_POS, $y_Start)
    DllStructSetData($ThisStructHandle, $__SV_Width, $width)
    DllStructSetData($ThisStructHandle, $__SV_Height, $height)

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($ThisStructHandle, $__SV_ParentHandle, $ThisGUI) ; ststus des Objectes auf 1 setzen
    DllStructSetData($ThisStructHandle, $__SV_MenueState, $MainMenueStatus) ; Menue Status speichern

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($ThisStructHandle, $__SV_State, 1) ; ststus des Objectes auf 1 setzen

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_SumatraPDF_UDF_inset

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: fügt das sumatra handle ( die instance ) in die gui ein .. an gewünschter position
    ; Parameter(s): ByRef $hGUI = die gui in die das sumatra eingesetzt werden soll
    ; ByRef $ThisStructHandle = das betroffenen Sumatra Object
    ; $x_Start=0 = die Position in der $hGUI von X ( Startpos )
    ; $y_Start=0 = die Position in der $hGUI von y ( Startpos )
    ; $width=0 = die breite | wenn 0 dann max breite von Gui | wenn kleiner 0 wird entsprechender wert von Max breite abgezogen
    ; $height=0 = die höhe | wenn 0 dann max höhe von Gui | wenn kleiner 0 wird entsprechender wert von Max höhe abgezogen
    ;
    ; Return Value(s):
    ;===============================================================================
    ;--------------------------------------------------------------------------------------------------------------------
    Func _SumatraPDF_UDF_visibility(ByRef $ThisStructHandle, $visibility = 0)
    $state = DllStructGetData($ThisStructHandle, $__SV_State) ; ststus des Objectes auf 1 setzen
    If $state < 0 Then
    Return
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $visibility = 0 Or $visibility = $GUI_HIDE Then
    $sumatravisibility = $SWP_HIDEWINDOW
    ElseIf $visibility = 1 Or $visibility = $GUI_SHOW Then
    $sumatravisibility = $SWP_SHOWWINDOW
    Else
    $sumatravisibility = $visibility
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $ThisHandle = DllStructGetData($ThisStructHandle, $__SV_WHandle)
    $x_Start = DllStructGetData($ThisStructHandle, $__SV_X_POS)
    $y_Start = DllStructGetData($ThisStructHandle, $__SV_Y_POS)
    $width = DllStructGetData($ThisStructHandle, $__SV_Width)
    $height = DllStructGetData($ThisStructHandle, $__SV_Height)

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_SetWindowPos($ThisHandle, $HWND_TOP, $x_Start, $y_Start, $width, $height, $sumatravisibility) ; size SumatraPDF.exe window to fit inside the autoit window

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_SumatraPDF_UDF_visibility

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: verändert die Größe und position des handels
    ; Parameter(s):
    ; ByRef $ThisStructHandle = das betroffenen SumatraObject
    ; $x_Start=0 = die Position in der $hGUI von X ( Startpos )
    ; $y_Start=0 = die Position in der $hGUI von y ( Startpos )
    ; $width=0 = die breite | wenn 0 dann max breite von Gui | wenn kleiner 0 wird entsprechender wert von Max breite abgezogen
    ; $height=0 = die höhe | wenn 0 dann max höhe von Gui | wenn kleiner 0 wird entsprechender wert von Max höhe abgezogen
    ;
    ; Return Value(s):
    ;===============================================================================
    ;--------------------------------------------------------------------------------------------------------------------
    Func _SumatraPDF_UDF_resize(ByRef $ThisStructHandle, $x_Start = 0, $y_Start = 0, $width = 0, $height = 0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $ThisHandle = DllStructGetData($ThisStructHandle, $__SV_WHandle)

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    GUIRegisterMsg($WM_SIZE, "resize")
    Func resize($h, $m, $w, $p)
    If $h = $hGUI Then
    $aWinSize = WinGetClientSize($hGUI)
    WinMove($hWnd1, "", 0, 0, $aWinSize[0], $aWinSize[1])
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>resize
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    ;$aWinSize = WinGetClientSize($ThisGUI)

    [/autoit] [autoit][/autoit] [autoit]

    If $x_Start = 0 Then
    $x_Start = DllStructGetData($ThisStructHandle, $__SV_X_POS)
    ElseIf $x_Start < 0 Then
    $x_Start = DllStructGetData($ThisStructHandle, $__SV_X_POS) + $x_Start
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $y_Start = 0 Then
    $y_Start = DllStructGetData($ThisStructHandle, $__SV_Y_POS)
    ElseIf $y_Start < 0 Then
    $y_Start = DllStructGetData($ThisStructHandle, $__SV_Y_POS) + $y_Start
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $width = 0 Then
    $width = DllStructGetData($ThisStructHandle, $__SV_Width)
    ElseIf $width < 0 Then
    $width = DllStructGetData($ThisStructHandle, $__SV_Width) + $width
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $height = 0 Then
    $height = DllStructGetData($ThisStructHandle, $__SV_Height)
    ElseIf $height < 0 Then
    $height = DllStructGetData($ThisStructHandle, $__SV_Height) + $height
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    WinMove($ThisHandle, "", $x_Start, $y_Start, $width, $height)

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($ThisStructHandle, $__SV_X_POS, $x_Start)
    DllStructSetData($ThisStructHandle, $__SV_Y_POS, $y_Start)
    DllStructSetData($ThisStructHandle, $__SV_Width, $width)
    DllStructSetData($ThisStructHandle, $__SV_Height, $height)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_SumatraPDF_UDF_resize

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: Öffnet ein neues File 8 dabei wir das Alte Handel geschlossen, ein neues erstelt und an die Alte Position eingesetzt
    ; Parameter(s):
    ; ByRef $ThisStructHandle = das betroffenen SumatraObject
    ; $PDFFilePath=0 = das File welches geöfnet werden soll.
    ;
    ; Return Value(s): keine
    ;
    ;===============================================================================
    Func _SumatraPDF_UDF_loadFile(ByRef $ThisStructHandle, $PDFFilePath)

    [/autoit] [autoit][/autoit] [autoit]

    _SumatraPDF_UDF_Close($ThisStructHandle)

    [/autoit] [autoit][/autoit] [autoit]

    _SumatraPDF_UDF_run($ThisStructHandle, DllStructGetData($ThisStructHandle, $__SV_ViewMode), $PDFFilePath)

    [/autoit] [autoit][/autoit] [autoit]

    $Mode = DllStructGetData($ThisStructHandle, $__SV_MenueState)
    $x_Start = DllStructGetData($ThisStructHandle, $__SV_X_POS)
    $y_Start = DllStructGetData($ThisStructHandle, $__SV_Y_POS)
    $width = DllStructGetData($ThisStructHandle, $__SV_Width)
    $height = DllStructGetData($ThisStructHandle, $__SV_Height)
    _SumatraPDF_UDF_inset(DllStructGetData($ThisStructHandle, $__SV_ParentHandle), $ThisStructHandle, $Mode, $x_Start, $y_Start, $width, $height)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_SumatraPDF_UDF_loadFile

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: blättert eine Seite hoch
    ; Parameter(s):
    ; ByRef $ThisStructHandle = das betroffenen SumatraObject
    ;===============================================================================
    Func _SumatraPDF_UDF_PageUp(ByRef $ThisStructHandle)
    ControlSend(DllStructGetData($ThisStructHandle, $__SV_WHandle), "", "", "{RIGHT}") ; can be use to open print dialog box
    EndFunc ;==>_SumatraPDF_UDF_PageUp

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: blättert eine Seite runter
    ; Parameter(s):
    ; ByRef $ThisStructHandle = das betroffenen SumatraObject
    ;===============================================================================
    Func _SumatraPDF_UDF_PageDown(ByRef $ThisStructHandle)
    ControlSend(DllStructGetData($ThisStructHandle, $__SV_WHandle), "", "", "{LEFT}") ; can be use to open print dialog box
    EndFunc ;==>_SumatraPDF_UDF_PageDown

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: druckt das Dokument
    ; Parameter(s):
    ; ByRef $ThisStructHandle = das betroffenen SumatraObject
    ;===============================================================================
    Func _SumatraPDF_UDF_Print(ByRef $ThisStructHandle)
    ControlSend(DllStructGetData($ThisStructHandle, $__SV_WHandle), "", "", "^p") ; can be use to open print dialog box
    EndFunc ;==>_SumatraPDF_UDF_Print

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: schließt das Sumatra Object
    ; Parameter(s):
    ; ByRef $ThisStructHandle = das betroffenen SumatraObject
    ;===============================================================================
    Func _SumatraPDF_UDF_Close(ByRef $ThisStructHandle)
    ControlSend(DllStructGetData($ThisStructHandle, $__SV_WHandle), "", "", "^q") ; can be use to open print dialog box
    DllStructSetData($ThisStructHandle, $__SV_State, -1)
    EndFunc ;==>_SumatraPDF_UDF_Close

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: zeigt den gespeicherten inhalt des Sumatra Objectes
    ; Parameter(s):
    ; ByRef $ThisStructHandle = das betroffenen SumatraObject
    ;===============================================================================
    Func _SumatraPDF_UDF_ShowObjectData($thisStruct, $Promt = "0")
    If $Promt = 0 Then
    $Promt = "values in " & $thisStruct
    Else
    $Promt = "values in " & $thisStruct & "->" & $Promt
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $seperatet = StringSplit($__sumatraPDF_UDF_StructString, ";")
    For $i = 1 To $seperatet[0]
    $retval = StringSplit($seperatet[$i], " ")
    $seperatet[$i] = $retval[2]
    Next
    For $i = 1 To $seperatet[0]
    $retval = StringSplit($seperatet[$i], "[")
    $seperatet[$i] = $retval[1]
    Next
    $valueString = ""
    For $i = 1 To $seperatet[0]
    $valueString = $valueString & $seperatet[$i] & "=" & DllStructGetData($thisStruct, $seperatet[$i]) & " |" & @CRLF
    Next
    MsgBox(0, $Promt, $valueString)
    EndFunc ;==>_SumatraPDF_UDF_ShowObjectData

    [/autoit]

    die Portable Version des Sumatra muss man sich halt dann gesondert auf den HP runter laden.


    ;-------------------------------------
    wer dennoch lieber mit dem Acrobat Reader arbeiten möchte hier meine entsprechende Acrobat Reader UDF

    Spoiler anzeigen
    [autoit]

    #include-Once
    FileInstall(".\LOAD.pdf", ".\LOAD.pdf")

    [/autoit] [autoit][/autoit] [autoit]

    Global Static $_Acro_UDF_Version = 1
    Global Static $_Acro_UDF_ReleaseDatum = "2013.01.17"

    [/autoit] [autoit][/autoit] [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.8.1
    Author: Marc Neininger

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    Acrobar_Reader_UDF erleichert den Umgang mit der AcrobatReader OLE

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;-Funktionen --------------------------------------------------------------------------------------------------------------------
    ; _Acro_UDF_initialization()
    ; _Acro_UDF_CreateCtrl($AcrobatObj, $width = 100, $height = 100, $left = 0, $top = 0)
    ; _Acro_UDF_loadPdfFile($AcrobatObj, $PDF_File)

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    ;###################### simple sample ###################################################################
    HotKeySet("{ESC}", "Terminate")

    [/autoit] [autoit][/autoit] [autoit]

    #include "_Acrobat_Reader_UDF.au3"

    [/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode , damit gui protokoll anderst abgearbeitet wird ( mit funktionen , nicht case )

    [/autoit] [autoit][/autoit] [autoit]

    $gui_Width = @DesktopWidth / 2
    $gui_Height = @DesktopHeight / 2
    $Start_Position_X = 0
    $Start_Position_Y = 0

    [/autoit] [autoit][/autoit] [autoit]

    Global $mainwindow = GUICreate(@ScriptName, $gui_Width, $gui_Height, $Start_Position_X, $Start_Position_Y)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") ; wenn event $GUI_EVENT_CLOSE aktiviert wird, wird funktion "CLOSEClicked" aufgerufen
    Global $AcroObject1 = _Acro_UDF_initialization()
    Global $AcroOb1_Ctrl = _Acro_UDF_CreateCtrl($AcroObject1,$gui_Width,$gui_Height,10,10)
    GUISetState(@SW_SHOW) ; anzeigen des gui

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(2000)

    [/autoit] [autoit][/autoit] [autoit]

    $PDF_File = "I:\Pruefmittel\3210_PK\Prüfgeräte_Projekte\Pruefgeraete\4019-147-000_Dislpaytest SC28pro\Software\OpenCVreferencemanual.pdf"

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"load PDF","load PDF="&_Acro_UDF_loadPdfFile($AcroObject1, $PDF_File))

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(2000)
    MsgBox(0,"load PDF","set dual fit="&_Acro_UDF_setDualFit($AcroObject1))

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(2000)
    MsgBox(0,"load PDF","set PageTo="&_Acro_UDF_setPageTo($AcroObject1,3))

    [/autoit] [autoit][/autoit] [autoit]

    While 1

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(400)

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func CLOSEClicked()
    Terminate()
    EndFunc ;==>CLOSEClicked

    [/autoit] [autoit][/autoit] [autoit]

    Func Terminate()
    Exit 0
    EndFunc ;==>Terminate

    [/autoit] [autoit][/autoit] [autoit]

    ;###################### simple sample ###################################################################
    #ce

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; ===============================================================================================================================
    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global Static $_Acro_UDF_firstLoad_File = @ScriptDir & "\load.pdf"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: generiert ein Object auf den Acrobat reader
    ; Parameter(s): keine
    ;
    ; Return Value(s): das Acrobat Object
    ;
    ;===============================================================================
    Func _Acro_UDF_initialization()
    $AcrobatObj = ObjCreate("AcroPDF.PDF.1")
    $AcrobatObj.src = $_Acro_UDF_firstLoad_File
    Return $AcrobatObj
    EndFunc ;==>_Acro_UDF_initialization

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: generiert ein GUI-Controle von einem Object
    ; Parameter(s): $AcrobatObj -> das Object
    ; $width = 100 -> die breite
    ; $height = 100 -> die höhe
    ; $left = 0 -> startkoordinate in X
    ; $top = 0 -> startkoordinate in Y
    ;
    ; Return Value(s): das Control Handle
    ;===============================================================================
    Func _Acro_UDF_CreateCtrl($AcrobatObj, $width = 100, $height = 100, $left = 0, $top = 0)
    $AcrobatObj_ctrl = GUICtrlCreateObj($AcrobatObj, $left, $top, $width, $height)
    GUICtrlSetState($AcrobatObj_ctrl, $GUI_SHOW)
    Return $AcrobatObj_ctrl
    EndFunc ;==>_Acro_UDF_CreateCtrl

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: läd ein pdf file in ein Object
    ; Parameter(s): $AcrobatObj -> das Object
    ; $PDF_File -> das file ( kompletter pfad )
    ;
    ; Return Value(s): =1 -> alles ok file geladen
    ; =-1 -> Object wurde nicht gefunden
    ; =-2 -> File wurde nicht gefunden
    ;===============================================================================
    Func _Acro_UDF_loadPdfFile($AcrobatObj, $PDF_File)
    If IsObj($AcrobatObj) Then
    ; $AcrobatObj ist ein Object
    If FileExists($PDF_File) Then
    ; file exists
    $AcrobatObj.src = $PDF_File
    Return 1
    Else
    ; dpf nicht gefunden
    Return -2
    EndIf
    EndIf
    ;$AcrobatObj ist kein object
    Return -1
    EndFunc ;==>_Acro_UDF_loadPdfFile

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: DPF ansicht auf -> an bildschirm anpassen und -> 2Seitenansicht setzen
    ; Parameter(s): $AcrobatObj -> das Object
    ;
    ; Return Value(s): =1 -> alles ok file geladen
    ; =-1 -> Object wurde nicht gefunden
    ;===============================================================================
    Func _Acro_UDF_setDualFit($AcrobatObj)
    If IsObj($AcrobatObj) Then
    ; $AcrobatObj ist ein Object
    ; Object Controlls !!!!!!!! siehe iac_api_reference.pdf
    $AcrobatObj.SetView("Fit")
    $AcrobatObj.setLayoutMode("TwoColumnLeft")
    Return 1
    EndIf
    ;$AcrobatObj ist kein object
    Return -1
    EndFunc ;==>_Acro_UDF_setDualFit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: set current page to
    ; Parameter(s): $AcrobatObj -> das Object
    ; $page=1 -> Seite
    ;
    ; Return Value(s): =1 -> alles ok
    ; =-1 -> Object wurde nicht gefunden
    ;===============================================================================
    Func _Acro_UDF_setPageTo($AcrobatObj, $page = 1)
    If IsObj($AcrobatObj) Then
    ; $AcrobatObj ist ein Object
    ; Object Controlls !!!!!!!! siehe iac_api_reference.pdf
    $AcrobatObj.setCurrentPage($page);
    Return 1
    EndIf
    ;$AcrobatObj ist kein object
    Return -1
    EndFunc ;==>_Acro_UDF_setPageTo

    [/autoit] [autoit][/autoit] [autoit][/autoit]