lo scopo è generale al volo un file pdf secondo la richiesta del client.
Utilizza i componenti synapse.
sock come si può dedurre è il Socket
Sock:TTCPBlockSocket;
Non sono ancora riuscito a capire l'origine del problema :
su Mozilla funzione e visualizza il pdf su IE lo invia al browser come testo, incluso l'header. Il file pdf è poi integro con %PDF etc...
La procedure che genera il pdf e lo invia è qui sotto.
La chiamata di esempio è
http://www.mondobimbi.com:9090/catal...?fornitore=CHE
Codice PHP:
procedure TTCPHttpThrd.Catalogo (URI: string);
var
F : THandle;
size : longInt;
n, p : integer;
buf : pointer;
DIR_PROG, DIR_TETEX : string;
begin
DIR_PROG := iniFile.ReadString('Pdf', 'Directory programmi', '/home/sergio/latex');
if DIR_PROG <> '' then
if DIR_PROG[length(DIR_PROG)] <> '/' then DIR_PROG := DIR_PROG + '/';
DIR_TETEX := iniFile.ReadString('Pdf', 'Directory teTeX', '');
if DIR_TETEX <> '' then
if DIR_TETEX[length(DIR_TETEX)] <> '/' then DIR_TETEX := DIR_TETEX + '/';
// separa l'uri
p := Pos('?', uri);
uri := Copy(uri, p+1, Length(uri)-p);
SetCurrentDir(DIR_PROG);
// genera il file .tex
with TGeneraPdf.Create('pdf') do
begin
Catalogo('Catalogo', uri);
Free;
end;
// chiama il motore teTeX
shell(DIR_TETEX + 'pdflatex prova1.tex');
// sistema l'indice
shell(DIR_TETEX + 'makeindex prova1.tex');
// riavvia il motore in modo che inserisca l'indice
shell(DIR_TETEX + 'pdflatex prova1.tex');
// l'output è il file pdf
F := FileOpen(DIR_PROG + 'prova1.pdf', fmOpenread);
// determino la dimensione
size := FileSeek(F, 0, fsfromEnd);
getmem(buf, size);
FileSeek(F, 0, fsfromBeginning);
FileRead(F, buf^, size);
FileClose(F);
// headers è un TStringList
headers.Add('Content-type: application/pdf');
headers.Add('Content-length: ' + IntTostr(Size));
headers.Add('Content-Disposition: inline; filename=catalogo.pdf');
headers.Add('Connection: close');
headers.Add('Date: ' + Rfc822DateTime(now));
headers.Add('Server: ProSim');
headers.Add('');
// invia l'headear
for n := 0 to headers.count - 1 do
Sock.sendstring(headers[n] + CRLF);
// invia il buffer
Sock.SendBuffer(buf, size);
freemem(buf, size);
end;
spero che qualcuno capisca dove sia l'errore
grazie
sergio