ich arbeite immer mal wieder mit PDF-Dateien und setze dafür die PDFIUM.DLL ein.
Die alter Version der DLL (Stand 2015) die ich bisher nutze wollte ich mal aktualisieren, weil sie immer mal wieder merkwürdige Fehler produziert.
Also habe ich von GitHub eine kompilierte aktuelle Version heruntergeladen.
Merkwürdigerweise kommt es alle paar Aufrufe zu einem ungültigen Speicherzugriff, den ich mir nicht erklären kann, vielleicht könnt Ihr helfen.
Code: Alles auswählen
; Quelle PDFIUM.DLL : https://github.com/bblanchon/pdfium-binaries
; Dokumentation PDFium: http://cdn01.foxitsoftware.com/pub/foxit/manual/enu/FoxitPDF_SDK20_Guide.pdf
EnableExplicit
Define dateiname.s ; Name der PDF-Datei
Define pdf_dll.i ; Handle für die DLL
Define pdf_doc.i ; Handle für die PDF-Datei
Define buflen.i ; Buffer-Länge für ausgelesenen Meta-Informationen (Text)
Define *buffer ; Buffer für ausgelesenen Meta-Informationen (Text)
Define ret.i ; Rückgabewert
Define version.l ; PDF-Version
Prototype protoInitLibrary()
Prototype protoDestroyLibrary()
Prototype.i protoGetLastError()
Prototype.i protoLoadDocument(documentpath.p-utf8,password.p-utf8)
Prototype protoCloseDocument(document.i)
Prototype.i protoGetMetaText(document.i, tag.p-ascii, *buffer=#Null, buflen.i=0)
Prototype.i protoGetFileVersion(document.i, *version.long)
; DLL öffnen
pdf_dll = OpenLibrary(#PB_Any, "pdfium.dll")
If pdf_dll = 0
Debug "Fehler beim Laden der DLL"
End
EndIf
Define InitLibrary.protoInitLibrary = GetFunction(pdf_dll, "FPDF_InitLibrary")
Define DestroyLibrary.protoDestroyLibrary = GetFunction(pdf_dll, "FPDF_DestroyLibrary")
Define GetLastError.protoGetLastError = GetFunction(pdf_dll, "FPDF_GetLastError")
Define LoadDocument.protoLoadDocument = GetFunction(pdf_dll, "FPDF_LoadDocument")
Define CloseDocument.protoCloseDocument = GetFunction(pdf_dll, "FPDF_CloseDocument")
Define GetMetaText.protoGetMetaText = GetFunction(pdf_dll, "FPDF_GetMetaText")
Define GetFileVersion.protoGetFileVersion = GetFunction(pdf_dll, "FPDF_GetFileVersion")
; Library initialisieren
InitLibrary()
buflen = 8152
*buffer = AllocateMemory(buflen)
dateiname = OpenFileRequester("PDF auswählen...", "", "PDF-Datei|*.pdf|Alle Dateien|*.*", 0)
If dateiname = ""
End
EndIf
pdf_doc = LoadDocument(dateiname, "")
If pdf_doc = 0
Debug "Fehler beim Laden der PDF-Datei: " + dateiname
Select GetLastError()
Case 0
Debug "Kein Fehler"
Case 1
Debug "Unbekannter Fehler"
Case 2
Debug "Datei nicht gefunden / Datei konnte nicht geöffnet werden"
Case 3
Debug "Datei nicht im PDF-Format oder defekt"
Case 4
Debug "Passwort wird benötigt / falsches Passwort"
Case 5
Debug "Sicherheitsschema nicht unterstützt"
Case 6
Debug "Seite nicht gefunden / Fehler im Seiteninhalt"
Default
Debug "Sonstiger Fehler"
EndSelect
End
EndIf
; PDF-Titel
ret = GetMetaText(pdf_doc, "Title", *buffer, buflen) ; <---- hier kommt es zum Speicherfehler
Debug "PDF-Titel: " + PeekS(*buffer, ret, #PB_Unicode)
; PDF-Autor
ret = GetMetaText(pdf_doc,"Author",*buffer, buflen)
Debug "Autor: " + PeekS(*buffer, ret)
; PDF-Ersteller
ret = GetMetaText(pdf_doc,"Creator",*buffer, buflen)
Debug "Ersteller: " + PeekS(*buffer, ret)
; PDF-Version
ret = GetFileVersion(pdf_doc, @version)
Debug "PDF-Version: " + StrF(version/10, 2)
CloseDocument(pdf_doc)
DestroyLibrary()
End