Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi PDF in Datenbank speichern (https://www.delphipraxis.net/176199-pdf-datenbank-speichern.html)

HolgerCW 19. Aug 2013 11:42

Delphi-Version: 2006

PDF in Datenbank speichern
 
Hallo zusammen,

ich speichere eine PDF in einer Datenbank folgendermassen:

Delphi-Quellcode:
procedure Datensatz_speichern_Pictures_PDF(Tabelle, Spalte, Filter_Spalte, Filter_Wert, Pfad:String; PDF_loeschen: Boolean);
var
 ms, outstream: TMemoryStream;
begin

 ms := TMemoryStream.Create;
 outstream := TMemoryStream.Create;
 outstream.LoadFromFile(Pfad);
 outstream.Seek(0, soFromBeginning);

 DM_Main.QueryRaw.Close;
 DM_Main.QueryRaw.SQL[1] := Tabelle;
 DM_Main.QueryRaw.SQL[3] := Spalte;
 DM_Main.QueryRaw.SQL[5] := 'WHERE ' + Filter_Spalte;
 DM_Main.QueryRaw.ParamByName('p_pdf').SetBlobData(outstream.Memory, outstream.Size);
 DM_Main.QueryRaw.ParamByName('p_auftragsnummer').asstring := Filter_Wert;
 DM_Main.QueryRaw.ExecSQL;

 ms.Free;
 outstream.Free;

 if PDF_loeschen = true then
 begin

  DeleteFile(Pfad);

 end;

end;
Es gibt aber bei uns Rechner, da wird mit dieser Funktion zwar ein Stream in der Datenbank erzeugt, aber dieser lässt sich nicht mehr laden ?

Was kann das sein ?

Muss ich eventuell beim speichern was anderes machen ? Oder müssen diese Streams dann anders geladen werden ?

Gruss

Holger

RWarnecke 19. Aug 2013 11:45

AW: PDF in Datenbank speichern
 
Wenn ich das richtig sehe, wo sagst Du dem Stream, dass er etwas speichern soll ?

Perlsau 19. Aug 2013 12:15

AW: PDF in Datenbank speichern
 
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;

Bernhard Geyer 19. Aug 2013 13:00

AW: PDF in Datenbank speichern
 
Zitat:

Zitat von Perlsau (Beitrag 1225314)
Um eine im Blob gespeicherte PDF- oder HTML-Datei im Embedded WebBrowser anzuzeigen, gehe ich z.B. so vor

Bei PDFs mag das noch gut gehen. Was machst du aber bei realen HTML-Dateien die noch zig JS/CSS/...-Dateien realtiv ansprechen?

Perlsau 19. Aug 2013 13:15

AW: PDF in Datenbank speichern
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1225322)
Zitat:

Zitat von Perlsau (Beitrag 1225314)
Um eine im Blob gespeicherte PDF- oder HTML-Datei im Embedded WebBrowser anzuzeigen, gehe ich z.B. so vor

Bei PDFs mag das noch gut gehen. Was machst du aber bei realen HTML-Dateien die noch zig JS/CSS/...-Dateien realtiv ansprechen?

Keine Ahnung, bislang hatte ich diesen Fall noch nicht. Das Projekt, in dem ich diese Methode verwende, speichert HTML- und PDF-Dateien, die in einem Info-Letter verlinkt wurden, der regelmäßig von der Anwendung aus dem Postfach heruntergeladen wird. Da kamen bislang keine weiteren verlinkten Dateien vor, die mitgespeichert werden müßten.

Wie würdest du das machen?

hstreicher 19. Aug 2013 20:18

AW: PDF in Datenbank speichern
 
MHT

http://de.wikipedia.org/wiki/MIME_En...HTML_Documents

ist da wohl der richtige Weg

Perlsau 19. Aug 2013 23:11

AW: PDF in Datenbank speichern
 
Zitat:

Zitat von hstreicher (Beitrag 1225393)
MHT ist da wohl der richtige Weg

Richtig! Wenn ich das in diesem Fall benötigen würde, wäre das der richtige Weg. Aber bei mir geht's nur um Textinformation, die Darstellung in den gespeicherten HTML-Dokumenten stimmt mit der Darstellung auf der Ursprungshomepage überein und genügt, um den Anwender zu informieren. Grafiken und sonstige weitere Elemente spielen in diesem Fall keine Rolle.

Bernhard Geyer 20. Aug 2013 06:11

AW: PDF in Datenbank speichern
 
Zitat:

Zitat von hstreicher (Beitrag 1225393)

Nicht unbedingt.
Stell dir vor du hast 10.000 Dokumente. Alle basieren auf das gleiche Layout. Verwenden also gleiche CSS/HTML/JS-Elemente.
Mit dem MIME-Ansatz werden die mehrfach verwendeten Elemente 10.000* kopiert und in 10.000 Blob-Felder gespeichert. Im Rahmen eines Redesigns der HTML-Seiten wird z.B. eine CSS-Angepasst. Man muss also 10.000 Blob-Felder aktualisieren (bzw. prüfen).

Zitat:

Zitat von Perlsau (Beitrag 1225328)
Wie würdest du das machen?

In diesem Fall würde ich eine externe Speicherung im Dateisystem vorsehen. In der DB steht nur der relative Link auf die Datei basierend auf einem Rootverzeichnis.

HolgerCW 20. Aug 2013 08:02

AW: PDF in Datenbank speichern
 
Folgende SQL-Funktion steckt hinter der DM_Main.QueryRaw:

Delphi-Quellcode:
UPDATE
SYSDBP.DBP_AUFTRAGEX
SET
PDF
= :p_pdf
WHERE AUFTRAGSNUMMER
= :p_auftragsnummer
Kann es sein das ich vielleicht hier was verändern muss ? -> outstream.Seek(0, soFromBeginning);

Gruss

Holger

HolgerCW 20. Aug 2013 10:04

AW: PDF in Datenbank speichern
 
Habe mir jetzt folgende Funktion gebastelt:

Delphi-Quellcode:
function Datensatz_speichern_Pictures_PDF2(Tabelle, Spalte, Filter_Spalte, Filter_Wert, Pfad:String; PDF_loeschen: Boolean):Boolean;
var
 blob : TStream;
 FileS : TFileStream;
begin

 Result := FALSE;

 DM_Main.TableRaw.Close;
 DM_Main.TableRaw.TableName := Tabelle;
 DM_Main.TableRaw.Filter := Filter_Spalte + '=' + Filter_Wert;
 DM_Main.TableRaw.Filtered := TRUE;
 DM_Main.TableRaw.Open;

 blob := DM_Main.TableRaw.CreateBlobStream(DM_Main.TableRaw.FieldByName(Spalte), bmRead);
 blob.Seek(0, soFromBeginning);

 try

  FileS := TFileStream.Create(Pfad, fmCreate);
  FileS.CopyFrom(blob, blob.Size);

 finally

  FileS.Free;
  blob.Free;

 end;

 if PDF_loeschen = true then
 begin

  DeleteFile(Pfad);

 end;

 Result := TRUE;

end;
Wie speichere ich aber jetzt die PDF in der Datenbank ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz