![]() |
Pdf erzeugen mit SynPdf
Hallo Zusammen,
ich versuche mit SynPDF eine Pdf mit den Komponenten meines Programms zu erzeugen. Problem 1: Mein ausgefülltes Memo-Feld soll auf die Pdf mit Absätzen erzeugt werden, jedoch steht alles in einer Reihe:
Delphi-Quellcode:
//Memo erzeugen
Memo1.Lines.Add('Sie heizen aktuell mit: ' + Namealt ); Memo1.Lines.Add('Sie wollen zukünftig heizen mit: ' + Nameneu); Memo1.Lines.Add('Die Warmwasserbereitung wird ' + NameWW + ' der Heizung betrieben!'); Memo1.Lines.Add('Die Wohnfläche ihres Gebäudes beträgt: ' + FloattoStr(Wohnflaeche)+' m²'); Memo1.Lines.Add('In ihrem Haus wohnen: ' + InttoStr(Personen)+' Personen'); Memo1.Lines.Add('Baujahr des Gebäudes: ' + Bauj); Memo1.Lines.Add('Die Heizlast des Gebäudes beträgt: '+FloattoStr(Heizlast)+ ' Watt');
Delphi-Quellcode:
// Übergabe PDF
procedure TForm1.Button7Click(Sender: TObject); var PDF:TPDFDocumentGDI; metafile:Tmetafile; Page:TPdfPage; begin PDF:=TpdfDocumentGDI.Create(); metafile:=TMetafile.Create; try PDF.Info.Author :='andloer'; PDF.Info.CreationDate := now; PDF.Info.Creator:= 'andloer'; PDF.Info.Subject := 'Delphi'; PDF.Info.Title := ' Heizkosten Rechner '; Page:=PDF.AddPage; Page.PageLandscape:=false; PDF.DefaultPaperSize:=psA4; PDF.VCLCanvas.TextOut(100,100,Memo1.Text); Chart1.CopyToClipboardmetafile(true); metafile.assign(clipboard); pdf.VCLCanvas.Draw(100,200,metafile); PDF.SaveToFile(filename); finally PDF.Free;Metafile.Free end; Shellexecute(Handle,'Open',pchar(filename),'','',SW_Normal); Problem 2: Ich erzeuge beim Erstellen der PDF eine Datei die im Projektordner abgelegt wird, sobald diese jedoch einmal erstellt ist, kommt beim nächsten Durchlauf eine Fehlermeldung. Mir ist auch nicht ganz klar wie ich das mit einem SaveDialog hinbekomme.
Delphi-Quellcode:
Habe den Quelltext zum erzeugen der PDF auch aus einem Youtube-Video, weiß also nicht, ob das so alles stimmig ist, funktioniert jedoch auf dem ersten Blick
procedure TForm1.FormCreate(Sender: TObject);
var Monat:Integer; begin filename :=extractfilepath(paramstr(0)) + 'Kosten.pdf'; for MOnat:= 1 to 12 do //Stringgrid beschriften Stringgrid1.Cells[0,Monat] :=InttoStr(Monat); Stringgrid1.Cells[1,0] := 'Alt'; Stringgrid1.Cells[0,0] := 'Monat'; Stringgrid1.Cells[2,0] := 'Neu'; end; Ich hoffe die Infos reichen aus, um eine Antwort zu finden.. Freundliche Grüße und vielen Dank vorab André |
AW: Pdf erzeugen mit SynPdf
Ich habe das damals mit einer Stringlist gemacht, hat wunderbar funktioniert. Evtl. fehlt dir der Zeilenumbruch (sLinebreak bzw. #10#13) in den Memolines.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var //TXT TXT : TStringlist; I : integer; searchResult : TSearchRec; counter : integer; switch : string; pdffile: string; PDF : TPDFDocumentGDI; Page : TPDFPage; Image : TBitmap; begin // ReportMemoryLeaksOnShutdown := True; TXT := TStringList.Create; try findfirst(ExtractFilePath(ParamStr(0)) + '*.txt', faAnyFile, searchResult); TXT.LoadFromFile(searchResult.Name); pdffile := copy(searchResult.Name, 1, length(searchResult.Name)-3) + 'pdf'; PDF := TPDFDocumentGDI.Create(); try PDF.Info.Author := 'Company Name'; PDF.Info.CreationDate := now; PDF.Info.Subject := 'Subject'; Pdf.Info.Title := 'Title'; //-- Page := PDF.AddPage; Page.PageLandscape := False; PDF.DefaultPaperSize := psA4; //--------Seite1-Start //--------Header-Start Pdf.VCLCanvas.Font.Color := cLHotLight; PDF.VCLCanvas.Font.Size := 10; PDF.VCLCanvas.TextOut(325, 25, 'Title'); Pdf.VCLCanvas.Font.Color := clBlack; //--------Header-Ende PDF.VCLCanvas.Font.Size := 20; PDF.VCLCanvas.Font.Style := [fsBold, fsUnderline]; PDF.VCLCanvas.TextOut(325, 65, 'Headline'); PDF.VCLCanvas.Font.Size := 14; PDF.VCLCanvas.Font.Height:= PDF.VCLCanvas.Font.Height + 5; PDF.VCLCanvas.Font.Style := []; PDF.VCLCanvas.Font.Name := 'Courier New'; TXT[1] := copy(TXT[1], 23, length(TXT[1])); for I := 1 to TXT.Count - 1 do begin if (TXT[I] <> '') and (I <> 2) then begin if I = 1 then PDF.VCLCanvas.Font.Color := clRed else PDF.VCLCanvas.Font.Color := clBlack; PDF.VCLCanvas.TextOut(75, 115 + (I * 14), TXT[I]); end; end; //--------Footer-Start Pdf.VCLCanvas.Font.Color := cLHotLight; PDF.VCLCanvas.Font.Size := 10; PDF.VCLCanvas.Font.Height:= PDF.VCLCanvas.Font.Height - 5; PDF.VCLCanvas.TextOut(225, 1085, 'Erstellt am: ' + datetimetostr(now)); Pdf.VCLCanvas.Font.Color := clBlack; //--------Footer-Ende //--------Seite1-Ende //--------PDF-Ende PDF.SaveToFile(pdffile); finally PDF.Free; shellexecute(handle, 'open', PChar(pdffile),'','',SW_Normal); end; finally deletefile(searchResult.Name); TXT.Free; Application.Terminate; end; end; |
AW: Pdf erzeugen mit SynPdf
Du kannst auch Dein Memo Zeile für Zeile drucken. In etwa so (ungetestet):
Delphi-Quellcode:
Je nachdem, wieviele Zeilen Dein Memo beinhaltet, müsstest Du natürlich bei jedem Ausdruck auf einen eventuell notwenig werdenden Zeilenumbruch prüfen.
const LineHeight = 30; //eine x-beliebige Zeilenhöhe definieren
var i : integer; //und jetzt statt PDF.VCLCanvas.TextOut(100,100,Memo1.Text); for i := 0 to Memo1.Lines.Count - 1 do begin PDF.VCLCanvas.TextOut(100,100 + i*LineHeight,Memo1.Lines[I]); end; Zu deinem zweiten Problem passt irgendwie nicht der gepostete Code, oder du müsstest bbitte genauer beschreiben, welcher Fehler wann genau kommt |
AW: Pdf erzeugen mit SynPdf
Guten Morgen,
Zitat:
Zum zweiten Problem, gibt es auch kein Problem mehr.. weiß nicht warum es erst nicht ging. Funktioniert jetzt aber, also passt alles. :-D Freundliche Grüße André |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 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-2025 by Thomas Breitkreuz