Salve ragazzi ...
Come suggerito sto utilizzando l'utility pdftotext.exe ,
e devo dire anche con successo...ho solo un piccolo problema ,
una volta creato il file di testo controllo l'effettiva esistenza e
purtroppo a volte la creazione del file
è tardiva rispetto al controllo ....e quindi non esegue tutte le istruzioni.
cosa mi posso inventare per risolvere il problema?
grazie
Proc := TProcess.Create(nil);
Proc.CommandLine := 'pdftotext.exe ' + nomefilepdf_new;
Proc.Execute;
Proc.Free;
if (FileExists(nomefilepdf_new.txt)) then
begin
//qualcosa
end;
Devi rendere sincrona l'esecuzione.
Altrimenti speri nella poderosa botta di sedere.
:)
Ti mando un esempio:
type
{ TPdfToTextProcess }
TPdfToTextProcess = class
private
FPDFFile: TFileName;
procedure SetPDFFile(AValue: TFileName);
protected
FMemoryBuffer: TMemoryStream;
FProcess: TProcess;
FOutput: TInputPipeStream;
public
constructor Create;
destructor Destroy; override;
procedure Execute; virtual;
property PDFFile: TFileName read FPDFFile write SetPDFFile;
function getOutputText: string;
end;
{ TPdfToTextProcess }
procedure TPdfToTextProcess.SetPDFFile(AValue: TFileName);
begin
if FPDFFile = AValue then
begin
Exit;
end;
FPDFFile := AValue;
end;
constructor TPdfToTextProcess.Create;
begin
inherited Create;
FProcess := TProcess.Create(nil);
FProcess.Options := [poUsePipes, poStderrToOutPut];
FMemoryBuffer := TMemoryStream.Create;
end;
destructor TPdfToTextProcess.Destroy;
begin
FMemoryBuffer.Free;
FProcess.Free;
inherited Destroy;
end;
procedure TPdfToTextProcess.Execute;
const
READ_BYTES = 4096;
var
n, BytesRead: longint;
begin
BytesRead := 0;
N := 0;
FMemoryBuffer.Clear;
FMemoryBuffer.SetSize(READ_BYTES);
FProcess.CommandLine := 'pdftotext -simple -clip ' + FPDFFile + ' -';
FProcess.Execute;
while FProcess.Running do
begin
FMemoryBuffer.SetSize(BytesRead + READ_BYTES);
n := FProcess.Output.Read((FMemoryBuffer.Memory + BytesRead)^, READ_BYTES);
if n > 0 then
begin
Inc(BytesRead, n);
end
else
begin
Sleep(50);
end;
end;
repeat
FMemoryBuffer.SetSize(BytesRead + READ_BYTES);
n := FProcess.Output.Read((FMemoryBuffer.Memory + BytesRead)^, READ_BYTES);
if n > 0 then
begin
Inc(BytesRead, n);
end;
until n <= 0;
FMemoryBuffer.SetSize(BytesRead);
end;
function TPdfToTextProcess.getOutputText: string;
begin
SetString(Result, PChar(FMemoryBuffer.Memory), FMemoryBuffer.Size div SizeOf(char));
end;