Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi PDF in DB speichern und öffnen danach Proggi-Abstutz (https://www.delphipraxis.net/168187-pdf-db-speichern-und-oeffnen-danach-proggi-abstutz.html)

blondervolker 9. Mai 2012 09:54

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;

DeddyH 9. Mai 2012 09:56

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?

blondervolker 9. Mai 2012 09:59

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:

DP-Maintenance 9. Mai 2012 10:07

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.

mkinzler 9. Mai 2012 10:14

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.

DP-Maintenance 9. Mai 2012 10:21

Dieses Thema wurde am "09. May 2012, 11:21 Uhr" von "mkinzler" aus dem Forum "Library: Datenbanken" in das Forum "Datenbanken" verschoben.

DeddyH 9. Mai 2012 10:27

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.

blondervolker 9. Mai 2012 10:32

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:

DeddyH 9. Mai 2012 10:39

AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
 
ADO ist nicht meine Welt, aber versuch mal
Delphi-Quellcode:
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;
Ungetestet, da direkt im Editor getippt.

mkinzler 9. Mai 2012 10:50

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.

blondervolker 9. Mai 2012 11:01

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);

mkinzler 9. Mai 2012 11:05

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?

DeddyH 9. Mai 2012 11:10

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.

blondervolker 9. Mai 2012 11:12

AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
 
hab absolut keine Ahnung wie das geht.Ich hab schon gelesen und gegoogelt...

p80286 9. Mai 2012 11:41

AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
 
Delphi-Quellcode:
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;
So sollte das Schreiben funktionieren.
Dann diese Datei an Adobe übergeben und hinterher löschen nicht vergessen.

Gruß
K-H

blondervolker 11. Mai 2012 10:17

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;

DeddyH 11. Mai 2012 10:20

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.

p80286 11. Mai 2012 10:36

AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
 
Zitat:

Zitat von DeddyH (Beitrag 1166054)
Das sollte wohl SizeOf(Char) heißen.

'Tschulligung das war meine Tastatur schuld
Zitat:

Zitat von DeddyH (Beitrag 1166054)
Aber wieso der umständliche Weg über String, statt wie vorher direkt das BLOB-Feld zu benutzen?

der "String" war vorgegeben, und als Buffer find ich Strings meistens sehr schön, weil da ist die Größe gleich dabei.
Aber wo wurde vorher das BLOB-Feld genutzt? Ich hab's nochmal durchgelesen aber nichts gesehen.

Gruß
K-H

DeddyH 11. Mai 2012 10:38

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.

blondervolker 11. Mai 2012 10:40

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;

DeddyH 11. Mai 2012 10:45

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.

Klaus01 11. Mai 2012 10:47

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

blondervolker 11. Mai 2012 10:51

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.');

DeddyH 11. Mai 2012 11:08

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
  ...

Sir Rufo 11. Mai 2012 22:36

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:

DeddyH 12. Mai 2012 05:43

AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
 
Nicht wundern, nur staunen :zwinker:

blondervolker 13. Mai 2012 10:34

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:

Sir Rufo 13. Mai 2012 12:22

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 ;)

DeddyH 13. Mai 2012 12:50

AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
 
Wenn Stützen nicht hilft, muss man es halt mit Schubsen versuchen :mrgreen:

mkinzler 13. Mai 2012 13:09

AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
 
In die richtige Richtung, aber nicht vor das nächste Auto :stupid:

DeddyH 14. Mai 2012 08:46

AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
 
Jaja :stupid:, letzter Vorschlag (ungetestet):
Delphi-Quellcode:
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;
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.

Andreas L. 14. Mai 2012 08:59

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;

DeddyH 14. Mai 2012 09:02

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;

p80286 14. Mai 2012 10:12

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

DeddyH 14. Mai 2012 10:17

AW: PDF in DB speichern und öffnen danach Proggi-Abstutz
 
Prinzipiell waren ja beide Methoden im Ausgangspost falsch. Das haben wir nur (hoffentlich) korrigiert.

octonet 6. Okt 2016 23:28

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 12:48 Uhr.

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