Seite 1 von 1

PDF2Text-Prototype via Procedure: IMA (gelöst)

Verfasst: 26.02.2020 23:32
von sibru
Hallo Allerseits,

ich knabbere immer noch am PDF-zu-TXT-Problem.
Ich rufe die via Prototype definierte DLL-Fnc auf: alles klappt wunderbar (kriege den Textanteil einer PDF-Datei ins ClipBoard).
Bei einem indirekten Aufruf via Procedure laufe ich auf einen Invalid Memory Access beim ProcedureReturn
oder "The debugged executable quit unexpectedly." :angry:

Kann mir da jemand ´n Tipp geben ?

Code: Alles auswählen

#PDF2Text_Dir="???" <-- Euer Download-SubDir der DLL-Dateien (siehe unten)

EnableExplicit

Prototype.l PDF_SeitenProto(PDF_File$) ;liefert Seiten-Anzahl einer PDF-Datei
Prototype.l PDF2TextProto(PDF_File$, Ziel, Hash, Quick, TXT_File$, Trim, SeitenPre$, PosShow, Seite);,SandUhr,MultiSpace,Sekunden,WortList)
;PDF_File$= vollständiger Dateiname der ZielDatei (incl.Pfad & Extension {PDF})
;Ziel: 1=TextDatei (siehe Option TXT_File$) (=Vorgabe)
;      2=ClipBoard
;      3=ResultString
;Hash: 0=Result ist kein Hashwert (=Vorgabe)
;      1=Result ist md5-HashWert
;Quick:0=liefert sortierte Strings
;      1=liefert Strings ähnlich der PDF-Position (incl. Leerzeichen...) (=Vorgabe)
;TXT_File$: vollständiger Dateiname der ZielDatei (incl.Pfad & Extension {TXT})
;Trim: 0=führende Leerzeichen bleiben erhalten (=Vorgabe)
;      1=führende Leerzeichen werden entfernt
;SeitenPre$: Text vor Seitenangabe (SeitenPre$ SeitenNr / TotalSeiten)
;PosShow: 0=ohne Positionsangabe der Texte
;         1=vor jedem Text: aktuelle Seite, TotalSeiten, ZeilenNr [pixel] und SpaltenNr [pixel] (nur mit Quik=0)
;Seite:0=alle Seiten aus PDF extrahieren
;     >0:Nur diese Seite  aus PDF extrahieren

Global PDF_Lib = OpenLibrary(#PB_Any, #PDF2Text_Dir+"PDFtext.dll")
Debug "PDF_Lib="+Str(PDF_Lib)

If PDF_Lib
  Global ExtraktPDF_Text.PDF2TextProto = GetFunction(PDF_Lib, "GetPDFText")
  Global PDF_Seiten.PDF_SeitenProto = GetFunction(PDF_Lib, "GetPDFPageCount")
EndIf

Procedure PDF2Text(PDF_File$, TXT_File$ = "", Seite = 0);Parameter-vereinfachter Aufruf
  Protected File, result, Ziel
  If TXT_File$ = "" : Ziel = 2 : Else : Ziel = 1 : EndIf ;ClipBoard oder TextDatei
  Debug "PDF2Text(" + #DQUOTE$ + PDF_File$ + #DQUOTE$ + ", " + #DQUOTE$ + TXT_File$ + #DQUOTE$ + "): Ziel="+Str(Ziel)
  result = ExtraktPDF_Text(PDF_File$, Ziel, 0, 1, TXT_File$ + "", 0, "Seite ", 0, Seite);,0,0,0,0)
  Debug "result=" + Str(result)
  ProcedureReturn result
EndProcedure

DisableExplicit 
PDF$ = #PDF2Text_Dir+"PDFtext.dll.pdf"
TXT$ = #PDF2Text_Dir+"PDFtext.dll.txt"

;Vorprüfung
Seiten = PDF_Seiten(PDF$)
If Seiten=9001 
  Debug "Datei nicht vorhanden: "+PDF$
  End
EndIf
Debug PDF$ + " enthält " + Str(Seiten) + " Seiten"

;direkter Aufruf der Prototype-Funktion
res = ExtraktPDF_Text(PDF$, 2, 0, 1, TXT$, 0, "Seite ", 0, 4)  
Debug "Result=" + Str(res)
Debug GetClipboardText()

;indirekter Aufruf der Prototype-Funktion
res = PDF2Text(PDF$, "", 4) 
Debug "Result=" + Str(res) 
Debug GetClipboardText()
und hier die Dateien:
https://www.file-upload.net/download-13 ... t.dll.html
https://www.file-upload.net/download-13 ... l.pdf.html

Danke im Vorraus :allright:

sibru

Re: PDF2Text-Prototype via Procedure: IMA

Verfasst: 27.02.2020 01:18
von HeX0R

Code: Alles auswählen

Prototype.l PDF_SeitenProto(PDF_File.p-utf8) ;liefert Seiten-Anzahl einer PDF-Datei
Prototype.i PDF2TextProto(PDF_File.p-utf8, Ziel, Hash, Quick, TXT_File.p-utf8, Trim, SeitenPre.p-utf8, PosShow, Seite, clock, blank, ende, wlist)
Wieso lässt Du Parameter einfach weg, die Mandatory sind?
Klar, dass Du damit den Stack verhagelst.

Ausserdem habe ich keine Ahnung, mit welcher Vorkriegsversion von PB Du noch arbeitest, aber ohne die Pseudotypes, funktionierte erst mal überhaupt nichts!

Re: PDF2Text-Prototype via Procedure: IMA (gelöst)

Verfasst: 27.02.2020 12:00
von sibru
Danke, das mit dem verhagelten Stack war´s !!!
(Testweise mal nicht benötigte Parameter weggelassen und vergessen...)