...read text from a PDF doc without using ActiveX?

Author: Stefan Wimmer

Category: Files

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 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.

 

printed from
www.swissdelphicenter.ch
developers knowledge base