![]() |
PDF Listing mit SynPDF
Hallo Delphi Gemeinde,
ich bin am experimentieren ob ich eine kleine PDF-Routine für Delphi erstellen kann. Es geht darum von Textpassagen und eventuell auch von Tabellen ein PDF zu erstellen. Dazu habe ich ein kleines PDF Listing mit SynPDF von Youtube bei mir eingegeben. Ich benutze Delphi Tokyo 10.2.2. Beim Start kam aber eine Fehlermeldung. Das Programm war mit Delphi 7 geschrieben. Daher denke ich das es für meine Delphi-Version nicht geeignet ist. Ich selbst habe keine Ahnung wie ich so etwas hinkriegen oder anpassen könnte. Da ich auch kein Englisch kann, sind Beschreibungen in dieser Sprache nutzlos. Vielleicht hat ja einer von Euch eine kleine Routine, die er mir fertig zur Verfügung stellen könnte. Das man erst einmal was hat, dass läuft. Ich würde mich freuen, wenn mir da jemand helfen könnte. Oldmann |
AW: PDF Listing mit SynPDF
Ich habe mir mit SYNPDF etwas gebastelt, das aus einer vorhandenen txt Datei eine PDF erzeugt.
Allerdings immer nur 1 Seite, da ich nicht mehr brauchte/wollte.
Delphi-Quellcode:
unit DoPDFU;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ShellAPI, Jpeg, SynPDF; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} 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 := 'Name.pdf'; PDF := TPDFDocumentGDI.Create(); try PDF.Info.Author := 'Autor'; PDF.Info.CreationDate := now; PDF.Info.Subject := 'Bla'; Pdf.Info.Title := 'Bla'; //-- 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, 'Header'); Pdf.VCLCanvas.Font.Color := clBlack; //--------Header-Ende PDF.VCLCanvas.Font.Size := 20; PDF.VCLCanvas.Font.Style := [fsBold, fsUnderline]; PDF.VCLCanvas.TextOut(325, 65, 'Überschrift'); 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; end. |
AW: PDF Listing mit SynPDF
Wäre es nicht besser die DefaultPaperSize zu setzen, bevor man die neue Seite erstellt (AddPage), oder du wolltest etwas ändern, was sich z.B. irgendwie PaperSize nennt (ohne Default).
Es gibt auch PDF-Drucker, dann brauchst vom PDF im Programm nichts zu haben. Einfach über TPrinter oder sonstwie dort hin. |
AW: PDF Listing mit SynPDF
Hallo Monbas,
danke für Dein Listing. Es erzeugt die gleichen Fehlerneldungen wie das aus Youtube. Hier mal ein Auszug einer Fehlermeldung: function GetDelphiCompilerVersion: RawUTF8; begin result := {$ifdef FPC} 'Free Pascal' {$ifdef VER2_4_0}+' 2.4.0'{$endif} {$ifdef VER2_4_2}+' 2.4.2'{$endif} {$ifdef VER2_4_3}+' 2.4.3'{$endif} {$ifdef VER2_4_4}+' 2.4.4'{$endif} {$ifdef VER2_5_0}+' 2.5.0'{$endif} {$ifdef VER2_5_1}+' 2.5.1'{$endif} {$ifdef VER2_6_0}+' 2.6.0'{$endif} {$ifdef VER2_7_0}+' 2.7.0'{$endif} {$ifdef VER2_7_1}+' 2.7.1'{$endif} {$else} {$ifdef VER90} 'Delphi 2'{$endif} {$ifdef VER100} 'Delphi 3'{$endif} {$ifdef VER120} 'Delphi 4'{$endif} {$ifdef VER130} 'Delphi 5' {$else} {$if defined(VER140)} {$ifdef LINUX}'Kylix 3'{$else}'Delphi 6'{$endif} {$elseif defined(VER150)} 'Delphi 7' {$elseif defined(VER160)} 'Delphi 8' {$elseif defined(VER170)} 'Delphi 2005' {$elseif defined(VER185)} 'Delphi 2007' {$elseif defined(VER180)} 'Delphi 2006' {$elseif defined(VER200)} 'Delphi 2009' {$elseif defined(VER210)} 'Delphi 2010' {$elseif defined(VER220)} 'Delphi XE' {$elseif defined(VER230)} 'Delphi XE2' {$elseif defined(VER240)} 'Delphi XE3' {$elseif defined(VER250)} 'Delphi XE4' {$elseif defined(VER260)} 'Delphi XE5' {$ifend} {$endif} {$endif} {$ifdef CPU64} +' 64 bit' {$endif} end; Die Fehlermeldung lautet:Ausdruck erwartet aber End gefunden. |
AW: PDF Listing mit SynPDF
Zitat:
Delphi-Quellcode:
{$elseif defined(VER260)} 'Delphi XE5'
{$else} 'Delphi unbekannt' {$ifend} |
AW: PDF Listing mit SynPDF
|
AW: PDF Listing mit SynPDF
Danke der Fehler ist ist damit schon mal erledigt.
Es gibt aber 2 weitere:
Delphi-Quellcode:
Die Fehlermeldung in er roten Zeile lautet:
procedure TSynBackgroundThreadAbstract.Execute;
begin while not Terminated do case fProcessEvent.WaitFor(INFINITE) of wrSignaled: case GetPendingProcess of flagDestroying: begin fCallerEvent.SetEvent; break; end; flagStarted: try fBackgroundException := nil; try Process; except {$ifdef DELPHI5OROLDER} on E: Exception do fBackgroundException := Exception.CreateFmt('Redirected %s: "%s"', [PShortString(PPointer(PPtrInt(E)^+vmtClassName)^)^,E.Message]); {$else} [COLOR="Red"]fBackgroundException := AcquireExceptionObject;[/COLOR] {$endif} end; finally SetPendingProcess(flagFinished); fCallerEvent.SetEvent; end; end; end; end; Inkompatiblr Typen: Exception und 'TObjekt'. Eine weitere Fehlermeldung ist in meinem vorherigen Listing: {$ifdef VER2_6_4}+' 2.6.4'{$endif} {$ifdef VER2_7_0}+' 2.7.0'{$endif} {$ifdef VER2_7_1}+' 2.7.1'{$endif} {$else} {$ifdef VER90} 'Delphi 2'{$endif} {$ifdef VER100} 'Delphi 3'{$endif} Bei {Selse} steht: Nicht abgeschlossene bedingte Direktive. Gruss Oldmann |
AW: PDF Listing mit SynPDF
Hallo Hobbycoder,
den folgenden Satz von Dir verstehe ich nicht: In welcher Unit ist denn die Procedure GetDelphiCompilerVesion? Was muss ich da wo nachschauen. Ich habe mir die neue Version heruntergeladen. Es kommen die gleichen 2 Fehler die ich zuletzt beschrieben habe. Ich weiß allerdings nicht ob ich damit alles richtig gemacht habe. Ich habe den Ordner mit den heruntergeladenen Dateien einfach in den Suchpfad bei Delphi eingeben. Ist das richtig. Gruss Oldmann |
AW: PDF Listing mit SynPDF
Zitat:
Zitat:
|
AW: PDF Listing mit SynPDF
Zitat:
Delphi-Quellcode:
fBackgroundException := AcquireExceptionObject as Exception;
|
AW: PDF Listing mit SynPDF
Hallo,
die Fehlerkorrektur von Himitsu räumte den 1. Fehler aus. Danke dafür. Jetzt bleibt noch ein Fehler. Hier ein Ausschnitt aus der Funktion 'function GetDelphiCompilerVersion: RawUTF8;' wo der Fehler auftritt: {$ifdef VER2_6_4}+' 2.6.4'{$endif} {$ifdef VER2_7_0}+' 2.7.0'{$endif} {$ifdef VER2_7_1}+' 2.7.1'{$endif} {$else} {$ifdef VER90} 'Delphi 2'{$endif} {$ifdef VER100} 'Delphi 3'{$endif} Bei dem allein stehenden {Selse} steht: Nicht abgeschlossene bedingte Direktive. Das ist in der Unit 'SynCommons' in der Zeile 34032: Gruss Oldmann |
AW: PDF Listing mit SynPDF
Müsste die Logik nicht so sein (nutze das mit {} aktuell nicht):
Code:
Dein else steht meiner Ansicht nach "alleine" da. Also bei dir:
{$ifdef VER2_7_1}+' 2.7.1'{$else}was anderes {$endif}
Delphi-Quellcode:
Wie himitsu schrieb ist das bei dem kleinen Ausschnitt jedoch schwer zu beurteilen wozu dein else etc. gehören soll.
{$ifdef VER2_6_4}+' 2.6.4'{$endif}
{$ifdef VER2_7_0}+' 2.7.0'{$endif} {$ifdef VER2_7_1}+' 2.7.1'{$else} {$ifdef VER90} 'Delphi 2'{$endif} {$ifdef VER100} 'Delphi 3'{$endif} {$endif} |
AW: PDF Listing mit SynPDF
Das ist nur ein Ausschnitt, von mehreren verschachtelten IF/IFDEFs, was hier ohne das Drumrum und ohne Einrückung noch schlimmer aussieht.
siehe Post #4 |
AW: PDF Listing mit SynPDF
Hallo,
damit man das Listing noch besser sehen kann noch mal mit Delphi Einrückung, so wie es im Original auasiht:
Delphi-Quellcode:
Gruss Oldmann
function GetDelphiCompilerVersion: RawUTF8;
begin result := {$ifdef FPC} 'Free Pascal' {$ifdef VER2_4_0}+' 2.4.0'{$endif} {$ifdef VER2_4_2}+' 2.4.2'{$endif} {$ifdef VER2_4_3}+' 2.4.3'{$endif} {$ifdef VER2_4_4}+' 2.4.4'{$endif} {$ifdef VER2_5_0}+' 2.5.0'{$endif} {$ifdef VER2_5_1}+' 2.5.1'{$endif} {$ifdef VER2_6_0}+' 2.6.0'{$endif} {$ifdef VER2_6_1}+' 2.6.1'{$endif} {$ifdef VER2_6_2}+' 2.6.2'{$endif} {$ifdef VER2_6_3}+' 2.6.3'{$endif} {$ifdef VER2_6_4}+' 2.6.4'{$endif} {$ifdef VER2_7_0}+' 2.7.0'{$endif} {$ifdef VER2_7_1}+' 2.7.1'{$endif} {$else} {$ifdef VER90} 'Delphi 2'{$endif} {$ifdef VER100} 'Delphi 3'{$endif} {$ifdef VER120} 'Delphi 4'{$endif} {$ifdef VER130} 'Delphi 5' {$else} {$if defined(VER140)} {$ifdef LINUX}'Kylix 3'{$else}'Delphi 6'{$endif} {$elseif defined(VER150)} 'Delphi 7' {$elseif defined(VER160)} 'Delphi 8' {$elseif defined(VER170)} 'Delphi 2005' {$elseif defined(VER185)} 'Delphi 2007' {$elseif defined(VER180)} 'Delphi 2006' {$elseif defined(VER200)} 'Delphi 2009' {$elseif defined(VER210)} 'Delphi 2010' {$elseif defined(VER220)} 'Delphi XE' {$elseif defined(VER230)} 'Delphi XE2' {$elseif defined(VER240)} 'Delphi XE3' {$elseif defined(VER250)} 'Delphi XE4' {$elseif defined(VER260)} 'Delphi XE5' {$elseif defined(VER270)} 'Delphi XE6' {$else} 'Delphi unbekannt' {$endif} {$endif} {$ifdef CPU64} +' 64 bit' {$endif} end; |
AW: PDF Listing mit SynPDF
Delphi-Quellcode:
function GetDelphiCompilerVersion: RawUTF8;
begin result := {$ifdef FPC} 'Free Pascal' {$ifdef VER2_4_0}+' 2.4.0'{$endif} {$ifdef VER2_4_2}+' 2.4.2'{$endif} {$ifdef VER2_4_3}+' 2.4.3'{$endif} {$ifdef VER2_4_4}+' 2.4.4'{$endif} {$ifdef VER2_5_0}+' 2.5.0'{$endif} {$ifdef VER2_5_1}+' 2.5.1'{$endif} {$ifdef VER2_6_0}+' 2.6.0'{$endif} {$ifdef VER2_6_1}+' 2.6.1'{$endif} {$ifdef VER2_6_2}+' 2.6.2'{$endif} {$ifdef VER2_6_3}+' 2.6.3'{$endif} {$ifdef VER2_6_4}+' 2.6.4'{$endif} {$ifdef VER2_7_0}+' 2.7.0'{$endif} {$ifdef VER2_7_1}+' 2.7.1'{$endif} {$else} {$ifdef VER90} 'Delphi 2'{$endif} {$ifdef VER100} 'Delphi 3'{$endif} {$ifdef VER120} 'Delphi 4'{$endif} {$ifdef VER130} 'Delphi 5' {$else} {$if defined(VER140)} {$ifdef LINUX}'Kylix 3'{$else}'Delphi 6'{$endif} {$elseif defined(VER150)} 'Delphi 7' {$elseif defined(VER160)} 'Delphi 8' {$elseif defined(VER170)} 'Delphi 2005' {$elseif defined(VER185)} 'Delphi 2007' {$elseif defined(VER180)} 'Delphi 2006' {$elseif defined(VER200)} 'Delphi 2009' {$elseif defined(VER210)} 'Delphi 2010' {$elseif defined(VER220)} 'Delphi XE' {$elseif defined(VER230)} 'Delphi XE2' {$elseif defined(VER240)} 'Delphi XE3' {$elseif defined(VER250)} 'Delphi XE4' {$elseif defined(VER260)} 'Delphi XE5' {$elseif defined(VER270)} 'Delphi XE6' {$else} 'Delphi unbekannt' <-- fehlt hier nicht ein {$endif}? {$endif} {$endif} {$ifdef CPU64} +' 64 bit' {$endif} end; |
AW: PDF Listing mit SynPDF
Das
Delphi-Quellcode:
war von mir, aber da es nur an die vielen
{$else} 'Delphi unbekannt'
Delphi-Quellcode:
angehängt wurde, ist dort kein zusätzliches ENDIF/IFEND nötig.
{$elseif defined(VER270)} 'Delphi XE6'
|
AW: PDF Listing mit SynPDF
Also so?
Delphi-Quellcode:
Und dann fehlt ein {$endif}.
function GetDelphiCompilerVersion: RawUTF8;
begin result := {$ifdef FPC} 'Free Pascal' {$ifdef VER2_4_0}+' 2.4.0'{$endif} {$ifdef VER2_4_2}+' 2.4.2'{$endif} {$ifdef VER2_4_3}+' 2.4.3'{$endif} {$ifdef VER2_4_4}+' 2.4.4'{$endif} {$ifdef VER2_5_0}+' 2.5.0'{$endif} {$ifdef VER2_5_1}+' 2.5.1'{$endif} {$ifdef VER2_6_0}+' 2.6.0'{$endif} {$ifdef VER2_6_1}+' 2.6.1'{$endif} {$ifdef VER2_6_2}+' 2.6.2'{$endif} {$ifdef VER2_6_3}+' 2.6.3'{$endif} {$ifdef VER2_6_4}+' 2.6.4'{$endif} {$ifdef VER2_7_0}+' 2.7.0'{$endif} {$ifdef VER2_7_1}+' 2.7.1'{$endif} {$else} {$ifdef VER90} 'Delphi 2'{$endif} {$ifdef VER100} 'Delphi 3'{$endif} {$ifdef VER120} 'Delphi 4'{$endif} {$ifdef VER130} 'Delphi 5' {$else} {$if defined(VER140)} {$ifdef LINUX}'Kylix 3'{$else}'Delphi 6'{$endif} {$elseif defined(VER150)} 'Delphi 7' {$elseif defined(VER160)} 'Delphi 8' {$elseif defined(VER170)} 'Delphi 2005' {$elseif defined(VER185)} 'Delphi 2007' {$elseif defined(VER180)} 'Delphi 2006' {$elseif defined(VER200)} 'Delphi 2009' {$elseif defined(VER210)} 'Delphi 2010' {$elseif defined(VER220)} 'Delphi XE' {$elseif defined(VER230)} 'Delphi XE2' {$elseif defined(VER240)} 'Delphi XE3' {$elseif defined(VER250)} 'Delphi XE4' {$elseif defined(VER260)} 'Delphi XE5' {$elseif defined(VER270)} 'Delphi XE6' {$else} 'Delphi unbekannt' {$endif} {$endif} {$ifdef CPU64} +' 64 bit' {$endif} end; Und genau das besagt dir von oldmann beschriebene Fehlermeldung. |
AW: PDF Listing mit SynPDF
siehe Post #4
dort waren 3x IFEND/ENDIF danach. In diesen Code hatte ich die Zeile eingefügt. müsste angepasst werden, falls das noch der Code aus einer uralten SynPDF-Version war. |
AW: PDF Listing mit SynPDF
Schön, und wo ist jetzt der Fehler?
Habe nur den Quelltext von oben genommen und versucht den Fehler darin zu finden. Dass Du da was ergänzt hast, habe ich auch verstanden. Und bei der Umsetzung Deines Vorschlages und der damit verbundenen Ergänzung ist bei oldmann nun ein Fehler aufgetreten. Was ist jetzt falsch? Das Original, Deine Ergänzung oder die Art der Umsetzung Deiner Ergänzung? PS: Und vermutlich ist bei der Umsetzung ein {$ifend} verlorengegangen.
Delphi-Quellcode:
Jedenfalls lässt sich das jetzt mit Delphi 7 kompilieren.
// function GetDelphiCompilerVersion: RawUTF8;
function GetDelphiCompilerVersion: String; begin result := {$ifdef FPC} 'Free Pascal' {$ifdef VER2_4_0}+' 2.4.0'{$endif} {$ifdef VER2_4_2}+' 2.4.2'{$endif} {$ifdef VER2_4_3}+' 2.4.3'{$endif} {$ifdef VER2_4_4}+' 2.4.4'{$endif} {$ifdef VER2_5_0}+' 2.5.0'{$endif} {$ifdef VER2_5_1}+' 2.5.1'{$endif} {$ifdef VER2_6_0}+' 2.6.0'{$endif} {$ifdef VER2_6_1}+' 2.6.1'{$endif} {$ifdef VER2_6_2}+' 2.6.2'{$endif} {$ifdef VER2_6_3}+' 2.6.3'{$endif} {$ifdef VER2_6_4}+' 2.6.4'{$endif} {$ifdef VER2_7_0}+' 2.7.0'{$endif} {$ifdef VER2_7_1}+' 2.7.1'{$endif} {$else} {$ifdef VER90} 'Delphi 2'{$endif} {$ifdef VER100} 'Delphi 3'{$endif} {$ifdef VER120} 'Delphi 4'{$endif} {$ifdef VER130} 'Delphi 5' {$else} {$if defined(VER140)} {$ifdef LINUX}'Kylix 3'{$else}'Delphi 6'{$endif} {$elseif defined(VER150)} 'Delphi 7' {$elseif defined(VER160)} 'Delphi 8' {$elseif defined(VER170)} 'Delphi 2005' {$elseif defined(VER185)} 'Delphi 2007' {$elseif defined(VER180)} 'Delphi 2006' {$elseif defined(VER200)} 'Delphi 2009' {$elseif defined(VER210)} 'Delphi 2010' {$elseif defined(VER220)} 'Delphi XE' {$elseif defined(VER230)} 'Delphi XE2' {$elseif defined(VER240)} 'Delphi XE3' {$elseif defined(VER250)} 'Delphi XE4' {$elseif defined(VER260)} 'Delphi XE5' {$elseif defined(VER270)} 'Delphi XE6' {$else} 'Delphi unbekannt' {$ifend} <-- Das gab es am Anfang mal, ist im letzten Post von oldmann aber nicht mehr enthalten. {$endif} {$endif} {$ifdef CPU64} +' 64 bit'{$endif} end; |
AW: PDF Listing mit SynPDF
Das ist ein ältere SynPDF Version. Bei der Aktuellen steht am Ende:
Code:
Vielleicht mal eine neuere Version laden.
...
{$elseif defined(VER330)}'Delphi 10.3 Rio' {$elseif defined(VER340)}'Delphi 10.4 Next' Bis bald... Thomas |
AW: PDF Listing mit SynPDF
Es kann aber nicht schaden, wenn auch dort noch ein ELSE rein kommt,
mit einer "unbekannt"-Konstante oder wenigstens mit einem
Delphi-Quellcode:
,
{$ELSE} {$MESSAGE Fatal 'Delphi-Version not supported'}
damit es nicht bei Version 10.5 schonwieder "unverständlich" abraucht. |
AW: PDF Listing mit SynPDF
Hallo,
mytbo schreibt von einer neuen Version mit ... {$elseif defined(VER330)}'Delphi 10.3 Rio' {$elseif defined(VER340)}'Delphi 10.4 Next' wo kann man die heruterladen ? Gruss Oldmann |
AW: PDF Listing mit SynPDF
![]() |
AW: PDF Listing mit SynPDF
Zitat:
![]() Und in Post ![]() Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 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