![]() |
PDF in DB speichern und öffnen danach Proggi-Abstutz
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
hab versucht eine kleine PDF-Datei in einem DBMemo(Felddatentyp=Oleobject) in einer Access Datenbank zu speichern. Das ging auch.Hab denn versucht diese PDF aus dem DB Eintrag zu speichern in einem anderen Ordner,aber die PDF Datei war da,aber ohne Endung und lässt sich nich mit dem Reader öffnen.:oops: Beim Beenden des Programms hatte ich die A-Karte... Programmabstutz... Siehe Abbildung 1 Kann bitte jemand helfen:oops: Hier ist der Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin ADOTable1.Edit; OpenDialog1.Filter:='*.pdf|*.pdf'; if OpenDialog1.Execute then try TBlobField(ADOTable1.FieldByName('PDFFILE')). //PDF Datei im DBMemo10 Blob speichern LoadFromFile(OpenDialog1.FileName); EXCEPT ShowMessage ('Fehler beim Öffnen der Datei!'); ADOTable1.Post; end; end; procedure TForm1.Button3Click(Sender: TObject); begin ADOTable1.Edit; SaveDialog1.Filter:='*.pdf|*.pdf'; if SaveDialog1.Execute then TRY TBlobField(ADOTable1.FieldByName('PDFFILE')). // gespeicherte PDF aus DBMemo10 Blob speichern unter SavetoFile(SaveDialog1.Filename); EXCEPT ShowMessage ('Fehler beim Speichern der Datei!'); end; end; |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Du weißt schon, wozu diese Sparte gedacht ist? Wieso stellst Du Deine Fragen eigentlich alle hier?
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Hallo,
ich wollte es unter "Sonstiges" eingeben.Da kam die Meldung Kontrollzentrum.Hab ich auch gemacht.:oops: |
Dieses Thema wurde am "09. May 2012, 11:07 Uhr" von "mkinzler" aus dem Forum "Neuen Beitrag zur Code-Library hinzufügen" in das Forum "Library: Datenbanken" verschoben.
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Liste der Anhänge anzeigen (Anzahl: 2)
Ich weiss nicht, wie du s schaffst konsequent in dieser Rubrik zu Posten. Im Alten Forum, war diese automatisch ausgewählt, da konnte man es ja verstehn. Aber im neuen Forum ist das eigentlich nicht der Fall.
Beim nächsten Mal gehe einfach in die Rubrik, in der du ein neues Thema erstellen willst, dann wird der Beitrag automatisch dort erstellt. Bitte ergänze nun den 1. Beitrag um die fehlenden Informatioen zur verwendeten Datenbank usw., in dem du den 1. Beitrag editierst. So wird die Beantwortung der Frage auch leichter. |
Dieses Thema wurde am "09. May 2012, 11:21 Uhr" von "mkinzler" aus dem Forum "Library: Datenbanken" in das Forum "Datenbanken" verschoben.
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Back to topic: wenn Du Daten abfragen willst, setzt Du die Datenmenge in den Editiermodus? Wozu soll das gut sein? Versuch es stattdessen einmal so:
- Datenmenge öffnen - Inhalt des Feldes auf NULL prüfen - wenn nicht NULL, Inhalt in Datei kopieren - ggf. Datenmenge wieder schließen Das sollte eigentlich funktionieren, wenn ich nichts vergessen habe. |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Wie kann ich den Inhalt auf Null prüfens.Das ist mein zigs`ter Versuch,aber ich bin leider noch zu Blöde.:oops:
Kannst bitte diesen Code vervollständigen? Ich würde mich freuen,wenn ich endlich mal einen kleinen Erfolg hätte...:oops: |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
ADO ist nicht meine Welt, aber versuch mal
Delphi-Quellcode:
Ungetestet, da direkt im Editor getippt.
procedure TForm1.Button3Click(Sender: TObject);
var PDFField: TBlobField; begin ADOTable1.Open; SaveDialog1.Filter:='*.pdf|*.pdf'; if SaveDialog1.Execute then TRY PDFField := ADOTable1.FieldByName('PDFFILE') as TBlobField; if not PDFField.IsNull then PDFField.SaveToFile(SaveDialog1.Filename); EXCEPT on E: Exception do ShowMessage('Fehler beim Speichern der Datei: ' + E.Message); end; end; |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Liste der Anhänge anzeigen (Anzahl: 1)
Ich meinte das du die Angaben zur verwendeten Datenbank, Zugriffskompos usw. in den entsprechend dafür vorgesehenen Feldern ergänzt.
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
DeddyH,
es hat sofort funktioniert!!! Danke für die Mühe:-D Ich hab nun versucht die gespeicherte PDF mit dem Adobe Reader aus der Datenbank herauszuholen,aber da kommt kein Mux,keine Meldung und nix passiert.
Delphi-Quellcode:
var
myPDF : String; begin myPDF := ADOTable1.FieldByName ('PDFFILE').AsString; shellexecute(application.Handle,'open',PChar (myPDF),nil,nil, sw_show); |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Lass mal den ersten Parameter ller (NULL),
Und wenn du die gespeicherte Datei mal manuell im Reader öffnest? |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Wie soll denn Adobe auf Deine Datenbank zugreifen? Speichere doch einfach den Feldinhalt in einer temporären Datei und öffne die dann.
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
hab absolut keine Ahnung wie das geht.Ich hab schon gelesen und gegoogelt...
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Delphi-Quellcode:
So sollte das Schreiben funktionieren.
var
myPDF : String; fs : TFileStream; begin fs:=TFileStream.Create(MeineTempDatei,fmCreate or fmShareExclusive); myPDF := ADOTable1.FieldByName ('PDFFILE').AsString; fs.Write(mypdf[1],length(mypdf)*Sizeofchar); fs.Free; Dann diese Datei an Adobe übergeben und hinterher löschen nicht vergessen. Gruß K-H |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Hallo,
jetzt meckert Delphi: Berufe.pas(614): E2003 Undefinierter Bezeichner: 'Sizeofchar' Hab keinen Plan.Was ist da wieder falsch?:oops:
Delphi-Quellcode:
procedure TForm17.Button2Click(Sender: TObject);
var myPDF : String; fs : TFileStream; begin fs:=TFileStream.Create('Temp\Dok.pdf',fmCreate or fmShareExclusive); myPDF := ADOTable1.FieldByName ('PDFFILE').AsString; fs.Write(mypdf[1],length(mypdf)*Sizeofchar); fs.Free; end; |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Das sollte wohl SizeOf(Char) heißen. Aber wieso der umständliche Weg über String, statt wie vorher direkt das BLOB-Feld zu benutzen? Du brauchst doch nur den "%Temp%"-Pfad, kannst dann mit GetTempFilename einen temporären Dateinamen generieren lassen und speicherst unter diesem Namen ab. Nun kannst Du den installierten Reader öffnen, warten, bis der wieder geschlossen wird und dann die temporäre Datei wieder löschen.
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Zitat:
Zitat:
Aber wo wurde vorher das BLOB-Feld genutzt? Ich hab's nochmal durchgelesen aber nichts gesehen. Gruß K-H |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Im Ausgangspost und in #9 haben wir TBlobField.SaveToFile benutzt, deshalb war ich über den String als Puffer etwas verwundert.
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Danke nochmal:thumb::thumb::thumb:
Hab es so gemacht:
Delphi-Quellcode:
procedure TForm17.Button2Click(Sender: TObject);
var myPDF : String; fs : TFileStream; begin fs:=TFileStream.Create('Temp\Dok.pdf',fmCreate or fmShareExclusive); myPDF := ADOTable1.FieldByName ('PDFFILE').AsString; fs.Write(mypdf[1],length(mypdf)*Sizeof(char)); fs.Free; if ShellExecute(Application.Handle, 'open', PChar('Temp\Dok.pdf'), nil, nil, SW_NORMAL) <= 32 then ShowMessage('Es ist ein Fehler aufgetreten,da in der Datenbank keine Pdf Datei gefunden wurde.'); end; |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Da fehlt aber noch mindestens ein try-finally-Block. Den Dateinamen solltest Du in einer Variablen oder Konstanten ablegen und dann die benutzen, außerdem sind relative Pfade böse.
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
vielleicht solltest Du die Datei noch da ablegen, wo es allgemein üblich ist.
Im Temp Folder des Users oder im AppData Verzeichnis. Stichwort dazu: SpecialFolders. Grüße Klaus |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Ist es so richtig?:gruebel:
Delphi-Quellcode:
procedure TForm17.Button2Click(Sender: TObject);
var myPDF : String; fs : TFileStream; begin fs:=TFileStream.Create('c:Temp\Dok.pdf',fmCreate or fmShareExclusive); myPDF := ADOTable1.FieldByName ('PDFFILE').AsString; fs.Write(mypdf[1],length(mypdf)*Sizeof(char)); fs.Free; if ShellExecute(Application.Handle, 'open', PChar('c:Temp\Dok.pdf'), nil, nil, SW_NORMAL) <= 32 then ShowMessage('Es ist ein Fehler aufgetreten,da in der Datenbank keine Pdf Datei gefunden wurde.'); |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Versuch mal
Delphi-Quellcode:
procedure TForm17.Button2Click(Sender: TObject);
const FILENAME = 'Dok.pdf'; var myPDF, TempPath : String; fs : TFileStream; begin SetLength(TempPath, GetTempPath(0, nil)); GetTempPath(Length(TempPath), PChar(TempPath)); SetLength(TempPath, StrLen(PChar(TempPath))); TempPath := IncludeTrailingPathDelimiter(TempPath) + FILENAME; fs:=TFileStream.Create(TempPath,fmCreate or fmShareExclusive); try myPDF := ADOTable1.FieldByName ('PDFFILE').AsString; fs.Write(mypdf[1],length(mypdf)*Sizeof(char)); finally fs.Free; end; if ShellExecute(Application.Handle, 'open', PChar(TempPath), nil, nil, SW_NORMAL) <= 32 then ... |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Hauahauaha, das brennt beim Lesen ja richtig in den Augen.
Gestartet wurde der Thread mit einem Blob-Feld, dessen Inhalt direkt über eine Methode in eine Datei gespeichert wurde. Dann die blonde Versuchung den PDF Reader direkt damit zu füttern - als Parameter einen String - kein Problem, eben fix mal die PDF-Rohdaten in einen String gepackt und dem PDF-Reader zum Fressen gegeben. Und jetzt wundern warum der meckert. :-D Sehr cool auch der Vorschlag die Daten aus dem String in einen Stream zu schreiben (dabei liegen die Daten eines BlobFields als Stream vor). Und mit der Methode SaveToFile (siehe erster Beitrag) wäre es noch simpler gewesen. Sehr amüsant das Ganze ;) - der Start als Codelib Vorschlag ist ja auch schon ein Running Gag :mrgreen: |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Nicht wundern, nur staunen :zwinker:
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
hallo,
brennende augen?naja,recht hast du...:-D immer lacht mich aus, ist ja auch ok :-D trotzdem freue ich mich,wenn mir jemand über die strasse hilft :thumb: |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Aber diese Hilfe sieht so aus, als wenn du am stolpern bist und dir gibt dann noch jemand einen Schuppser ;)
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Wenn Stützen nicht hilft, muss man es halt mit Schubsen versuchen :mrgreen:
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
In die richtige Richtung, aber nicht vor das nächste Auto :stupid:
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Jaja :stupid:, letzter Vorschlag (ungetestet):
Delphi-Quellcode:
Wobei man das ganze ShellExecuteEx-Geraffel (und auch das Ermitteln des Temp-Verzeichnisses) natürlich besser in eine eigene Routine auslagert, in der man dann auch auf das Schließen des PDF-Readers warten könnte, um die temporäre Datei im Anschluss wieder zu löschen. Beispiele gibt es ja genug im Forum oder der Codelib.
procedure TForm17.Button2Click(Sender: TObject);
const FILENAME = 'Dok.pdf'; var PDFField: TBlobField; TempPath : String; ExecuteInfo: SHELLEXECUTEINFO; begin ADOTable1.Open; PDFField := ADOTable1.FieldByName('PDFFILE') as TBlobField; if not PDFField.IsNull then begin SetLength(TempPath, GetTempPath(0, nil)); GetTempPath(Length(TempPath), PChar(TempPath)); SetLength(TempPath, StrLen(PChar(TempPath))); TempPath := IncludeTrailingPathDelimiter(TempPath) + FILENAME; try PDFField.SaveToFile(TempPath); ZeroMemory(@ExecuteInfo, SizeOf(ExecuteInfo)); ExecuteInfo.cbSize := SizeOf(ExecuteInfo); ExecuteInfo.fMask := SEE_MASK_NOCLOSEPROCESS; ExecuteInfo.lpVerb := 'open'; ExecuteInfo.lpFilename := PChar(TempPath); ExecuteInfo.nShow := SW_SHOWNORMAL; if ShellExecuteEx(@ExecuteInfo) then CloseHandle(ExecuteInfo.hProcess) else raise Exception.Create(SysErrorMessage(GetLastError)); except on E: Exception do ShowMessage('Fehler beim Öffnen der Datei: ' + E.Message); end; end else ShowMessage('Kein PDF im aktuellen Datensatz enthalten.'); end; |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Ich kenne mich mit ADO nicht aus aber kann es sein das keine Daten in die Datenbank geschrieben werden weil ADOTable1.Post im except-Abschnitt steht?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin ADOTable1.Edit; OpenDialog1.Filter:='*.pdf|*.pdf'; if OpenDialog1.Execute then try TBlobField(ADOTable1.FieldByName('PDFFILE')).LoadFromFile(OpenDialog1.FileName); EXCEPT ShowMessage ('Fehler beim Öffnen der Datei!'); ADOTable1.Post; // <-- Aufruf in Except-Bereich? end; end; |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Das ist noch keinem aufgefallen (mir auch nicht) :lol:. OK, wenn wir eh schon dabei sind:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin OpenDialog1.Filter:='*.pdf|*.pdf'; if OpenDialog1.Execute then try ADOTable1.Edit; TBlobField(ADOTable1.FieldByName('PDFFILE')).LoadFromFile(OpenDialog1.FileName); ADOTable1.Post; except on E: Exception do ShowMessage ('Fehler beim Speichern der Daten: ' + E.Message); end; end; |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Darf ich mal vorsichtig fragen um was es hier jetzt noch geht?
Lesen einer Datei und abspeichern in DB? oder DB-Wert in Datei Speichern? oder doch Bahnhof,Kofferklauen? Gruß K-H |
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Prinzipiell waren ja beide Methoden im Ausgangspost falsch. Das haben wir nur (hoffentlich) korrigiert.
|
AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
Danke, das hat mir alles sehr geholfen...
Grüße Robert |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 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