Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Cómo extraer un documento pdf de una tabla (https://www.clubdelphi.com/foros/showthread.php?t=72583)

GustavoCruz 28-02-2011 16:07:24

Cómo extraer un documento pdf de una tabla
 
Hola amigos del foro.

Mi pregunta es si ya tengo almacenado un documento pdf en una tabla, el campo es un blob sub_type 0, (no sé si está bien definido); cómo hago para extraerlo y mostrarlo en el programa pdf predeterminado en la máquina del cliente.

No estoy utilizando ningún componente, bueno sería tener uno; pero me gustaría más cómo estraerlo y visualizarlo en otro programa.


Mil Gracia por vuestro tiempo

GustavoCruz

cecam 28-02-2011 17:12:07

Por ejemplo

Guardando el contenido del campo

Código:

    TBlobField(campo).SaveToFile(archivo);
y después abriendo el archivo

Código:

ShellExecute(0,nil,PChar(archivo),nil,nil,SW_NORMAL);
Saludos!

GustavoCruz 28-02-2011 18:27:18

Gracias cecam, por tu rápida respuesta.

La variable "archivo" es de tipo String?,

Gracias por tu tiempo


Gustavo Cruz

cecam 01-03-2011 09:32:40

Cita:

Empezado por GustavoCruz (Mensaje 392210)
La variable "archivo" es de tipo String?,

Si.

Mirate la ayuda de TField.SaveTofile y de ShellExecute . . . verás todas las opciones y parametros.

Saludos!

Neftali [Germán.Estévez] 01-03-2011 12:25:14

Segúramente ayudaría sabe cómo lo has guardado, para realizar la extracción de forma análoga.

GustavoCruz 01-03-2011 14:23:32

Hola Neftali, gracias por tu respueta.

la inserción la logré realizar de la siguiente manera
Código Delphi [-]
with fDatos do
        begin
          qArchivos.Open;
          qArchivos.Append;
          qArchivosARCCODIGO.AsString:= hvccodigo.Text;
          TBlobField(qArchivosARCARCHIVO).LoadFromFile(hvcarchivo.FileName);
          qArchivos.Post;
        end;

Muchas gracias por tu coloboración


Gustavo Cruz

Casimiro Noteví 01-03-2011 14:34:18

Pues la respuesta de cecam te viene perfecta.

Lo guardas en un fichero en tu disco:

Código Delphi [-]
TBlobField(campo).SaveToFile(archivo);

Y luego lo abres con el programa predeterminado:

Código Delphi [-]
ShellExecute(0,nil,pchar(archivo),nil,nil,SW_NORMAL):

GustavoCruz 01-03-2011 14:44:28

Gracias por tu respuesta Casimiro Notevi pero eso no me está funcionando.
y no entiendo en dónde pueda estar el problema.

El mensaje de error que me muestra es: Unable to create file "".

este es el código:

Código Delphi [-]
var
  archivo: String;
begin
  with fDatos do
    begin
      //archivo := nil;
      qArchivos.Open;
      TBlobField(qArchivosARCARCHIVO).SaveToFile(archivo);
//      ShellExecute(0, nil, nil, nil, SW_NORMAL);
      ShowMessage(archivo);
      ShellExecute(0, 'Open', PChar(archivo), '', '', SW_SHOW)
    end;

Gracias por vuestro tiempo


Gustavo Cruz

Casimiro Noteví 01-03-2011 14:57:40

A ver...

Código Delphi [-]
procedure TFrameDocumentosEscaner.grImagenesDblClick(Sender: TObject);
const
    _rundll32exe_           = 'RunDll32.exe';
    _ImageView_Fullscreen_  = 'ImageView_Fullscreen';
    _Shimgvwdll_            = 'SHIMGVW.DLL';
var
    cFile,
    cProgramaVisor, cRun, cParam : string;
    mFile : TFileName;
begin
  inherited;
    if qrImagenes.RecordCount=0 then
        exit;
    //
    cFile:='';
    cProgramaVisor:='';
    cRun:='';
    cParam:='';
    //
    // Cogemos el nombre del fichero y lo guardamos en disco para su posterior visionado
    if qrImagenes.FieldByName('NOMBREFICHERO').asString='' then // cogido del escaner y no tiene nombre fichero
        cFile := ExtractFilePath(ParamStr(0))+'tmp.jpg'
    else // codigo de fichero
        cFile := ExtractFilePath(ParamStr(0))+'tmp'+ExtractFileExt(qrImagenes.FieldByName('NOMBREFICHERO').asString);
    TBlobField(qrImagenes.FieldByName('IMAGEN')).SaveToFile( cFile );
    cProgramaVisor := BuscarEjecutableAsociado(cFile);
    //
    mFile := TFileName( #34+cFile+#34 );
    //
    if pos(_Shimgvwdll_,AnsiUpperCase(cProgramaVisor))>0 then
    begin
        cRun := cProgramaVisor;
        cProgramaVisor := ExtractFilePath(cProgramaVisor)+_rundll32exe_;
        cParam := cRun + ' '+_ImageView_Fullscreen_+' ';
        mFile := TFileName( cFile );    // con el visor por defecto de windows no admite las comillas
    end;
    //
    // mFile := TFileName( #34+cFile+#34 );
    if cRun<>'' then
        RunAndWaitShell( cProgramaVisor, cParam+mFile, Sw_ShowNormal )
    else
        RunAndWaitShell( cProgramaVisor, mFile,        Sw_ShowNormal );
    //
    // ahora lo borramos
    DeleteFile(cFile);
end;

Ahora a quitar cosas y a cambiar :D

GustavoCruz 01-03-2011 15:02:42

Muchas gracias Casimiro Notevi, probaré y luego te comento.


Gustavo Cruz

Neftali [Germán.Estévez] 01-03-2011 16:01:59

Cita:

Empezado por GustavoCruz (Mensaje 392303)
El mensaje de error que me muestra es: Unable to create file "".

Asegúrate de que el path del fichero es correcto. PArece que te está diciendo que lo puede extraer, pero no lo puede guardar.

GustavoCruz 01-03-2011 16:05:01

Nada compañeros definitivamente no he podido hacerlo.

Así que como dijo Kiko. "Me doy..."

Gracias a todos por sus comentarios y respuestas. Quizás lo intente después

Gustavo Cruz

GustavoCruz 01-03-2011 16:08:55

Cita:

Empezado por Neftali (Mensaje 392317)
Asegúrate de que el path del fichero es correcto. PArece que te está diciendo que lo puede extraer, pero no lo puede guardar.

No, es eso ya medí cuenta el error lo muestra es al descargar los datos en la variable "archivo"

Gracis por vuestra ayuda

Casimiro Noteví 01-03-2011 16:20:01

Pon el código que estás usando, basicamente sólo es localizar el registro, luego extraer el pdf a un fichero en disco y ejecutarlo.

Una vez posicionado en el registro, olvida todo lo que te he copiado antes, usa sólo esto:

TBlobField(qrArchivosARCARCHIVO).SaveToFile( FileName );
o bien
TBlobField(qrArchivos.FieldByName('ARCARCHIVO')).SaveToFile( FileName ); <-- como se llame tu campo

Asegúrate que en FileName llevas un nombre correcto.

Luego lo abres con el shellexecute(...);

GustavoCruz 02-03-2011 14:53:18

Hola compañero foreros este es el código que tengo y según las indicaciones que me han dado pues debería funcionar.

Código Delphi [-]
procedure TfPrincipal.acListarClick(Sender: TObject);
var
    cFile : string;
    mFile : TFileName;
begin
  inherited;
    with fDatos do
      begin
        qArchivos.Open;
        TBlobField(qArchivos.FieldByName('arcarchivo')).SaveToFile( cFile );
        mFile := TFileName( #34+cFile+#34 );
      end;
end;

pero me sigue mostrando el error.
Y si se carga en un Stream. Aunque tampoco sé cómo se hace eso:confused:

Gracias por vuestro tiempo


Gustavo Cruz

Casimiro Noteví 02-03-2011 15:12:17

Cita:

Empezado por GustavoCruz
pero me sigue mostrando el error.

¿Pero qué error te sale? y exactamente dónde? :confused:

GustavoCruz 02-03-2011 15:57:01

Cita:

Empezado por Casimiro Notevi (Mensaje 392420)
¿Pero qué error te sale? y exactamente dónde? :confused:

El mensaje de error que me muestra es: Unable to create file "".

dónde?

aquí:
Código Delphi [-]
TBlobField(qArchivos.FieldByName('arcarchivo')).SaveToFile( cFile )

y no entiendo por qué sucede...:confused:

Casimiro Noteví 02-03-2011 16:12:19

Cita:

Empezado por GustavoCruz (Mensaje 392430)
El mensaje de error que me muestra es: Unable to create file "".

Normal, si no le has puesto un nombre :), asígnale uno:
Código Delphi [-]
cFile := 'c:\unnombre.pdf';

GustavoCruz 02-03-2011 17:02:48

Gracias a Clubdelphi, por existir.

Porque si no, qué hariamos nosotros:D:D:D:D:D los que sufrimos de segera
nunca ví lo del nombre del archivo y así jamás me iba a mostrar el archivo.

Atentamente, y muy agradecido


GustavoCruz


La franja horaria es GMT +2. Ahora son las 05:36:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi