![]() |
Delphi-Version: 2006
PDF in Datenbank speichern
Hallo zusammen,
ich speichere eine PDF in einer Datenbank folgendermassen:
Delphi-Quellcode:
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 ?
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; Was kann das sein ? Muss ich eventuell beim speichern was anderes machen ? Oder müssen diese Streams dann anders geladen werden ? Gruss Holger |
AW: PDF in Datenbank speichern
Wenn ich das richtig sehe, wo sagst Du dem Stream, dass er etwas speichern soll ?
|
AW: PDF in Datenbank speichern
Also ich speichere meine Dokumente in einem Firebird-Blob so:
Delphi-Quellcode:
Ü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.
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; 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; |
AW: PDF in Datenbank speichern
Zitat:
|
AW: PDF in Datenbank speichern
Zitat:
Wie würdest du das machen? |
AW: PDF in Datenbank speichern
|
AW: PDF in Datenbank speichern
Zitat:
|
AW: PDF in Datenbank speichern
Zitat:
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:
|
AW: PDF in Datenbank speichern
Folgende SQL-Funktion steckt hinter der DM_Main.QueryRaw:
Delphi-Quellcode:
Kann es sein das ich vielleicht hier was verändern muss ? -> outstream.Seek(0, soFromBeginning);
UPDATE
SYSDBP.DBP_AUFTRAGEX SET = :p_pdf WHERE AUFTRAGSNUMMER = :p_auftragsnummer Gruss Holger |
AW: PDF in Datenbank speichern
Habe mir jetzt folgende Funktion gebastelt:
Delphi-Quellcode:
Wie speichere ich aber jetzt die PDF in der Datenbank ?
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz