LibHaru Wrapper-UDF - PDFs erstellen mit der libHaru-DLL

  • Hallo,
    ich habe mich nun endlich entschlossen die LibHaru-DLL (http://libharu.org/) in AutoIt zu wrappen. Damit können sehr schnell mittels Code PDF-Dateien erstellt werden. Anbei die UDF, ein Beispiel und die DLL. Bisher habe ich ca. 40% der 200 Funktionen gewrappt. Jeder ist eingeladen daran weiterzuarbeiten, damit die Bibliothek vollständig in AutoIt genutzt werden kann. Ich habe die DLL bereits genutzt, um einen CSV2PDF-Generator zu machen. Es gibt zwar bereits eine PDF-UDF komplett in AutoIt (http://www.autoitscript.com/forum/topic/11…ur-application/), aber die konnte ich aufgrund der langsamen Geschwindigkeit nicht nutzen.

    Happy Coding!

  • Eukalyptus hat da ein paar Funktionen schon umgesetzt ;)

    Spoiler anzeigen
    [autoit]

    Func _HPDF_Page_SetRotate($hPage, $iAngle)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_SetRotate", "ptr", $hPage, "uint", $iAngle)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_SetRotate

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

    Func _HPDF_Page_Concat($hPage, $a, $b, $c, $d, $X, $Y)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_Concat", "ptr", $hPage, "float", $a, "float", $b, "float", $c, "float", $d, "float", $X, "float", $Y)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_Concat

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

    Func _HPDF_SetPageMode($hPage, $iMode)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_SetPageMode", "ptr", $hPage, "dword", $iMode)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_SetPageMode

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

    Func _HPDF_Page_Stroke($hPage)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_Stroke", "ptr", $hPage)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_Stroke

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

    Func _HPDF_Page_SetRGBStroke($hPage, $nRed, $nGreen, $nBlue)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_SetRGBStroke", "ptr", $hPage, "float", $nRed, "float", $nGreen, "float", $nBlue)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_SetRGBStroke

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

    Func _HPDF_Page_Fill($hPage)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_Fill", "ptr", $hPage)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_Fill

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

    Func _HPDF_Page_SetRGBFill($hPage, $nRed, $nGreen, $nBlue)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_SetRGBFill", "ptr", $hPage, "float", $nRed, "float", $nGreen, "float", $nBlue)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_SetRGBFill

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

    Func _HPDF_Page_MoveTo($hPage, $nX, $nY)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_MoveTo", "ptr", $hPage, "float", $nX, "float", $nY)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_MoveTo

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

    Func _HPDF_Page_LineTo($hPage, $nX, $nY)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_LineTo", "ptr", $hPage, "float", $nX, "float", $nY)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_LineTo

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

    Func _HPDF_Page_SetLineWidth($hPage, $nW)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_SetLineWidth", "ptr", $hPage, "float", $nW)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_SetLineWidth

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

    Func _HPDF_Page_Rectangle($hPage, $nX, $nY, $nW, $nH)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_Rectangle", "ptr", $hPage, "float", $nX, "float", $nY, "float", $nW, "float", $nH)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_Rectangle

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

    Func _HPDF_Page_Circle($hPage, $nX, $nY, $nRadius)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_Circle", "ptr", $hPage, "float", $nX, "float", $nY, "float", $nRadius)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_Circle

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

    Func _HPDF_Page_SetWidth($hPage, $nWidth)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_SetWidth", "ptr", $hPage, "float", $nWidth)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_SetWidth

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

    Func _HPDF_Page_SetHeight($hPage, $nHeight)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_SetHeight", "ptr", $hPage, "float", $nHeight)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_SetHeight

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

    Func _HPDF_Page_SetSize($hPage, $iSize, $iDirection)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Page_SetSize", "ptr", $hPage, "dword", $iSize, "dword", $iDirection)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Page_SetSize

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

    Func _HPDF_Free($hPdf)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_Free", "ptr", $hPdf)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_Free

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

    Func _HPDF_AddPage($hPdf)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_AddPage", "ptr", $hPdf)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_AddPage

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

    Func _HPDF_SaveToFile($hPdf, $sFilename)
    Local $aReturn
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_SaveToFile", "ptr", $hPdf, "str", $sFilename)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_SaveToFile

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

    Func _HPDF_New()
    Local $aReturn
    Local $error_handler = DllStructCreate("ulong error_no;ulong detail_no;ptr* user_data")
    $aReturn = DllCall($libhpdfdll, "int", "HPDF_New", "ptr", $error_handler, "ptr", 0)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aReturn[0]
    EndFunc ;==>_HPDF_New

    [/autoit]
  • Danke Leute!
    Hab die zusätzlichen Funktionen in die UDF eingefügt, noch einige weitere gewrappt und im Post#1 angehängt.
    Nun sind wir bei ca. 70 von 200 fertigen Funktionen.

    Falls jemand Lust hat ein weiteres Beispiel zu machen, dann am bestem gleich loslegen ;)

  • Wird an dieser UDF noch gearbeitet? Leider erhalte ich auch einen Stack Hash Error beim ausführen.

    Ich wäre sehr dankbar wenn jemand die UDF weiterführen würde. Ich habe bisher keine zufriedenstellende Lösung für die UDF Erstellung gefunden.

  • @NOTHING,

    wer hindert dich daran, selbst Funktionen zu erstellen / zu erweitern und hier der Allgemeinheit zur kostenlosen Verfügung zu stellen?
    Und bei dieser Gelegenheit den Error zu fixen?!
    Dein Problem der PDF-Erstellung kann demnach so groß nicht sein, ansonsten hättest du schon einige Stunden Programmiererei in die UDF investiert und hier zur Diskussion gestellt, statt für dich "zufriedenstellende" Lösungen zu suchen....

  • Ich habe mir gerade die oben zur Verfügung gestellten drei Dateien "gezogen" und mir, weil ich auch eine Ausgabe die bestimmt nicht so gedacht ist.
    Erst die Versionsangabe, dann mit einem Time 20.0149 das Exit mit dem Code -1073741819.
    Sieht so aus:

    Spoiler anzeigen
    [autoit]


    Version: 2.0.8
    !>15:19:33 AutoIt3.exe ended.rc:-1073741819
    >Exit code: -1073741819 Time: 20.149

    [/autoit]


    Okay, da dachte ich dann, schau dir mal die DLL an. und ich finde die ist ganz schön leeeeeer, oder wie kommt es, das mit nur das angezeicht wird, was auf dem beiliegenden Foto zu sehen ist?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • @Andy

    Was mich daran hindert ist die fehlende Zeit und die fehlenden Kenntnisse im Umgang mit DLL's. Ich wollte eigentlich nur nachfragen ob funkey daran noch arbeitet und vielleicht den Fehler beheben kann.
    Aber du hast schon recht, ich sollte mich nicht immer auf andere Leute verlassen und hoffen das diese meine Probleme lösen.
    Und ich finde es auch echt klasse, dass Leute ihre Arbeit hier kostenlos zu Verfügung stellen.

    Allerdings war meine Hoffnung, dass der Fehler von einer Person mit mehr Ahnung schneller beseitigt werden kann, sodass ich die UDF ausprobieren kann.

    Es ist aber auch wirklich Zeit, dass ich mich mal mit Dll's auseinandersetze. Ich werde mal schauen ob ich in den nächsten Wochen ein wenig Zeit finde mich damit zu beschäftigen.
    Wenn jemand gute Literatur zu dem Thema empfehlen kann, wäre ich auch dafür sehr dankbar.

  • @NOTHING,
    :thumbup:
    wenn du konkrete Hilfe brauchst, sag Bescheid!
    Manchmal sieht man den Wald vor lauter Bäumen nicht, und dann benötigt man nur einen kleinen "Stupser". Wenn man sieht, dass sich jemand mit einem konkreten Problem beschäftigt, ist man wesentlich motivierter zu helfen...

    Im umgekehrten Fall ist es aber so, dass hier kaum ein User eine "spezielle" UDF komplett von oben bis unten durchkaut, nur um jemandem "den Arm aus der Sonne zu legen" ;) . Das zeigt die Erfahrung hier im Forum.
    Wenn du dein Problem beschreibst, bleibt die Hilfe sicher nicht aus!


    @Alina,
    ich weiß nicht, mit welchem Programm du die Funktionen innerhalb einer DLL darstellst.Ich benutze dafür entweder einen Debugger, bspw. die Free-Version von IDA PRO, oder einen Viewer.
    Da ich aber mit dem Debugger direkt die Aufrufkonventionen bzw. auch die Anzahl und den Datentyp der Parameter "sehen" kann, ist das mein Favorit.

    Ein 08/15-Viewer zeigt mir bspw. folgende Funktionen innerhalb einer DLL:autoit.de/wcf/attachment/24971/

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (7. Dezember 2014 um 13:12)

  • Hab mal die UDF überarbeitet. Die Funktionen brauchten noch die 'cdecl' Aufrufkonvention. Wahrscheinlich hatte ich damals zum testen eine andere DLL oder so. Das Beispiel sollte nun funktionieren.

    BTW: Ich kann keine rar-files mehr anhängen, sondern nur noch zip. Ist kein Problem, wollte es nur anmerken.

  • Jetzt bekomme ich keine Fehlermeldung mehr.
    Mit dem DLL Viewer von nirsoft.net finde ich alles aus der DLL jetzt.
    Danke allen !

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    Einmal editiert, zuletzt von Alina (7. Dezember 2014 um 14:32)

  • All diese Anhänge sind korrupt.

    Nana, nicht übertreiben. Sind nur 3 von 5 defekt.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.