Jens-Erich Lange
2008-04-08 15:48:41 UTC
Moin,
sollte ja gar nicht so schwer sein, dachte ich mir. Einfach
alle Binärdaten zwischen den Worten "stream" und "endstream"
mit zlib entpacken und den Plain-Text nach "BT" und "ET"
parsen...
So jedenfalls lautet die Anleitung hier:
http://www.codeproject.com/KB/cpp/ExtractPDFText.aspx
Ich habe folgendes Delphi-Interface für zlib verwendet:
http://www.dellapasqua.com/delphizlib/
mein Versuch sieht bislang so aus:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
uses
ZlibEx;
function TForm1.DecodeText(Data: string): string;
begin
// Hier kommt die eigentliche Auswertung des
// dekomprimierten PDF Objektes
Result := '';
end;
function TForm1.PDFread(FileName: string): string;
var
f: file;
i: longint;
Source: string;
Stream: string;
begin
Result := '';
AssignFile(f, FileName);
Reset(f, 1);
i := FileSize(f);
SetLength(Source, i);
Blockread(f, Source[1], i);
CloseFile(f);
repeat
i := pos('stream', Source);
if (i > 0) then
begin
delete(Source, 1, i + 5);
i := pos('endstream', Source);
if (i > 0) then
begin
Stream := copy(Source, 1, i - 1);
delete(Source, 1, i + 8);
if (length(Stream) > 1) and (Stream[1] = #13) and (Stream[2] = #10) then delete(Stream, 1,
2)
else if (length(Stream) > 0) and (Stream[1] = #10) then delete(Stream, 1, 1);
if (length(Stream) > 1) and (Stream[length(Stream) - 1] = #13) and (Stream[length(Stream)] =
#10) then delete(Stream, length(Stream) - 1, 2)
else if (length(Stream) > 0) and (Stream[length(Stream)] = #10) then delete(Stream,
length(Stream), 1);
ZFastDecompressString(Stream);
if (Result <> '') then Result := Result + #13 + #10;
Result := Result + DecodeText(Stream);
end;
end;
until (i = 0);
end;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Das Entpacken des PDF streams scheitert immer mit einem EConversion
Error.
Das Packen und Entpacken mit zlib hat in anderen Anwendungen immer
gut funktioniert, nur mit dem PDF-Stream klappt es irgendwie nicht...
Danke für Eure Tipps,
Jens
P.S. Ach ja ich möchte die Funktion wirklich gern in mein Programm
integrieren. Dienstprogramme dafür(auch kostenlose) gibt es ja wie
Sand am Meer).
Notfalls werde ich auf die DLL-Lösung von Ingo Schmoekel zurückkommen.
sollte ja gar nicht so schwer sein, dachte ich mir. Einfach
alle Binärdaten zwischen den Worten "stream" und "endstream"
mit zlib entpacken und den Plain-Text nach "BT" und "ET"
parsen...
So jedenfalls lautet die Anleitung hier:
http://www.codeproject.com/KB/cpp/ExtractPDFText.aspx
Ich habe folgendes Delphi-Interface für zlib verwendet:
http://www.dellapasqua.com/delphizlib/
mein Versuch sieht bislang so aus:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
uses
ZlibEx;
function TForm1.DecodeText(Data: string): string;
begin
// Hier kommt die eigentliche Auswertung des
// dekomprimierten PDF Objektes
Result := '';
end;
function TForm1.PDFread(FileName: string): string;
var
f: file;
i: longint;
Source: string;
Stream: string;
begin
Result := '';
AssignFile(f, FileName);
Reset(f, 1);
i := FileSize(f);
SetLength(Source, i);
Blockread(f, Source[1], i);
CloseFile(f);
repeat
i := pos('stream', Source);
if (i > 0) then
begin
delete(Source, 1, i + 5);
i := pos('endstream', Source);
if (i > 0) then
begin
Stream := copy(Source, 1, i - 1);
delete(Source, 1, i + 8);
if (length(Stream) > 1) and (Stream[1] = #13) and (Stream[2] = #10) then delete(Stream, 1,
2)
else if (length(Stream) > 0) and (Stream[1] = #10) then delete(Stream, 1, 1);
if (length(Stream) > 1) and (Stream[length(Stream) - 1] = #13) and (Stream[length(Stream)] =
#10) then delete(Stream, length(Stream) - 1, 2)
else if (length(Stream) > 0) and (Stream[length(Stream)] = #10) then delete(Stream,
length(Stream), 1);
ZFastDecompressString(Stream);
if (Result <> '') then Result := Result + #13 + #10;
Result := Result + DecodeText(Stream);
end;
end;
until (i = 0);
end;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Das Entpacken des PDF streams scheitert immer mit einem EConversion
Error.
Das Packen und Entpacken mit zlib hat in anderen Anwendungen immer
gut funktioniert, nur mit dem PDF-Stream klappt es irgendwie nicht...
Danke für Eure Tipps,
Jens
P.S. Ach ja ich möchte die Funktion wirklich gern in mein Programm
integrieren. Dienstprogramme dafür(auch kostenlose) gibt es ja wie
Sand am Meer).
Notfalls werde ich auf die DLL-Lösung von Ingo Schmoekel zurückkommen.
--
Dynamo Software, Jens-Erich Lange e.K.
Seestraße 17, D-23829 Wittenborn, Germany
Tel (04554) 7052-10, Fax (04554) 7052-11, Mobil (0170) 407 29 96
HR A613, Amtsgericht Bad Segeberg, USt ID: DE 134331669
Dynamo Software, Jens-Erich Lange e.K.
Seestraße 17, D-23829 Wittenborn, Germany
Tel (04554) 7052-10, Fax (04554) 7052-11, Mobil (0170) 407 29 96
HR A613, Amtsgericht Bad Segeberg, USt ID: DE 134331669