Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#3

AW: PDF in Datenbank speichern

  Alt 19. Aug 2013, 12:15
Also ich speichere meine Dokumente in einem Firebird-Blob so:
Delphi-Quellcode:
Function TDatMod.DateiToBlob(Datei: String; Blobfeld: TField): Boolean;
VAR
   S : TStream;
   FileS : TFileStream;

begin
   Result := FALSE;
   S := BlobFeld.DataSet.CreateBlobStream(BlobFeld, bmReadWrite);

   TRY
      FileS := TFileStream.Create(Datei, fmOpenRead);
      S.CopyFrom(FileS, FileS.Size);
      Result := TRUE;
   FINALLY
      FileS.Free;
      S.Free;
   END;
end;
Übergeben wird einfach der Dateiname und das Blobfeld. Zuvor wird natürlich der Datensatz zum Editieren vorbereitet, und auch das Post erfolgt nicht in der Funktion. Die erledigt nur das reine Einlesen einer Datei in ein Blobfeld.

Um eine im Blob gespeicherte PDF- oder HTML-Datei im Embedded WebBrowser anzuzeigen, gehe ich z.B. so vor:
Delphi-Quellcode:
procedure TFormDoku.DokumentLaden;
Var
  PersistStreamInit : IPersistStreamInit;
  StreamAdapter : IStream;
  MemoryStream : TMemoryStream;
  Stream : TStream;
  Blobfeld : TField;

begin
   Blobfeld := DatMod.Qset_NewsLink.FieldByName('INHALT');
   Stream := BlobFeld.DataSet.CreateBlobStream(BlobFeld, bmRead);

   EmbWeb.Navigate('about:blank'); // Leeres HTML-Dokument in Browser laden um ein valites HTML-Dokument zu erzeugen

   // wait until finished loading
   Repeat
    Application.ProcessMessages;
    Sleep(0);
   Until EmbWeb.ReadyState = READYSTATE_COMPLETE;

   // Get IPersistStreamInit - Interface
   IF EmbWeb.Document.QueryInterface(IPersistStreamInit, PersistStreamInit) = S_OK THEN
   BEGIN
      IF PersistStreamInit.InitNew = S_OK THEN // Clear document
      BEGIN
         // Make local copy of the contents of Stream if you want to use Stream directly, you have to
         // consider, that StreamAdapter will destroy it automatically
         MemoryStream:= TMemoryStream.Create;
         Try
           MemoryStream.CopyFrom(Stream, 0);
           MemoryStream.Position:= 0;
         Except
           FreeAndNil(MemoryStream);
           Raise;
         End;
         StreamAdapter:= TStreamAdapter.Create(MemoryStream, soOwned); // Use Stream-Adapter to get IStream Interface to our stream
         PersistStreamInit.Load(StreamAdapter); // Load data from Stream into WebBrowser
      END;
   END;

   IF Assigned(Stream) THEN FreeAndNil(Stream);
   IF Assigned(Blobfeld) THEN FreeAndNil(Blobfeld);
end;
  Mit Zitat antworten Zitat