Mega Code Archive

 
Categories / Delphi / Activex OLE
 

Read text from a PDF doc without using ActiveX

Title: read text from a PDF doc without using ActiveX? {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ So jetzt hab ich endlich eine Lösung gefunden wie man den gesamten Text aus einer PDF Datei (auch mit mehreren Seiten möglich) auslesen kann. Ich muss mich schon gleich mal im vorherein für meine unsaubere Programmierung entschuldigen, aber ich hoffe ihr könnt trotzdem was damit anfangen! Das Formular beinhaltet ein TMemo, 5 TLabel, 1 TButton und einen OpenDialog ach ja, ihr müsst vorher noch eine Typbibliothek einfügen, öffnet dazu den Typbibliothek Importieren Dialog (unter Projekt zu finden) und Wählt beim Hinzufügen den Ordner von Adobe Acrobat aus. Dort solltet ihr eine Datei namens Acrobat.tbl finden, wenn nicht dann einfach mal suchen. Jetzt noch die Unit Anlegen dann Installieren und fertig. viel spass ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ This tip show the way to cath the whole text of a PDF document. You will need: - 1 TMemo, 5 TLabel, 1 TButton and 1 OpenDialog - to import the typelibrary from Adobe Acrobat (look fo Acrobat.tbl) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++} unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, acrobat_tlb; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; OpenDialog1: TOpenDialog; GroupBox1: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation uses ComObj; {$R *.dfm} {$TYPEDADDRESS OFF} //muss so sein (this have to be) var PDDoc: Acrobat_TLB.CAcroPDDoc; PDPage: Variant; PDHili: Variant; PDTextS: Variant; acrobat: Variant; Result: Boolean; NTL, i, j, Pagecount: Integer; zeilen: string; stichwortcounter: Integer; Size: Integer; gesamtstring: AnsiString; zwreal: Real; procedure TForm1.Button1Click(Sender: TObject); function removecrlf(workstring: string): string; var i: Integer; begin removecrlf := ''; for i := 0 to Length(workstring) do begin if workstring[i] = #13 then workstring[i] := ' '; if workstring[i] = #10 then workstring[i] := ' '; end; removecrlf := workstring; end; begin if not opendialog1.Execute then Exit; memo1.Clear; gesamtstring := ''; stichwortcounter := 0; Size := 0; try //Object erstellen acrobat := CreateOleObject('AcroExch.pdDoc'); //PDF Datei in Object öffnen Result := acrobat.Open(opendialog1.FileName); if Result = False then begin messagedlg('Kann Datei nicht öffnen', mtWarning, [mbOK], 0); Exit; end; for j := 0 to acrobat.GetNumPages - 1 do begin memo1.Lines.Add('----------------------------------------------'); //Erste Seite des Dokuments aktiv setzen (first page) PDPage := acrobat.acquirePage(j); //Ein Highlight Object mit 2000 Elementen erzeugen PDHili := CreateOleObject('AcroExch.HiliteList'); Result := PDHili.Add(0, 4096); //Erzeuge eine Markierung über den ganzen Text PDTextS := PDPage.CreatePageHilite(PDHili); ntl := PDTextS.GetNumText; for i := 0 to ntl - 1 do begin zeilen := PDTextS.GetText(i); if (Length(zeilen) 0) and (zeilen '') then memo1.Lines.Add(removecrlf(zeilen)); gesamtstring := gesamtstring + removecrlf(zeilen); //nur für statistik Size := Size + SizeOf(zeilen); Inc(stichwortcounter); Application.ProcessMessages; end; //Wieder freigeben pdhili := Unassigned; pdtextS := Unassigned; pdpage := Unassigned; label2.Caption := IntToStr(stichwortcounter); label4.Caption := IntToStr(Size); label2.Refresh; label4.Refresh; end; //for i to pagecount except on e: Exception do begin messagedlg('Fehler: ' + e.Message, mtError, [mbOK], 0); Exit; end; end; if Size 1024 then begin zwreal := Size / 1024; str(zwreal: 2: 1,zeilen); label4.Caption := zeilen; label5.Caption := 'KB'; end; memo1.Lines.SaveToFile(Extractfilepath(Application.exename) + '\debug.txt'); end; end.