![]() |
Canvas als PDF speichern oder ausdrucken
Hallo,
ich suche ein Möglichkeit dem Benutzer die Wahl zu bieten, einen Canvas (Text/Tabelle) wahlweise als PDF zu speichern oder auszudrucken. PDF's erstellen funktioniert über synpdf (Synopse). Das drucken funktioniert auch über Printers. Nun habe ich das Problem, dass der "Canvas" gleich sein soll. Also der Text, den ich ausgeben will, nur einmal erstellen möchte. Meine Idee war, eine Radiobutton oder eine Combobox zu nehmen und dann während des eigentlichen Druck-Erstellungs-Vorgang eine Unterscheidung vorzunehmen. Die Erstellung von PDF und Druck-Canvas sind etwas unterschiedlich aber soweit kein Problem. Das eigentliche Erstellen will ich aber nicht doppelt anlegen. Meine Idee daher eine Fallunterscheidung zu realisieren. Beispiel: PDF: lPdf.Canvas.TextOut( 300, 700, 'Dies ist ein Test-Text'); Drucker: Printer.Canvas.TextOut( 300, 700, 'Dies ist ein Test-Text'); Ich habe schon etwas rum experimentiert, weiß aber nicht mehr weiter. Daher meine Frage: Kann mir einer helfen, wie ich die Fallunterscheidung hin bekomme und den Canvas nur einmal erstellen muss? Danke Gruß Daniel |
AW: Canvas als PDF speichern oder ausdrucken
Vielleicht so?
Delphi-Quellcode:
procedure PrintOnCanvas(ACanvas: TCanvas);
begin ACanvas.TextOut( 300, 700, 'Dies ist ein Test-Text'); end; procedure PrintPdf; begin PrintOnCanvas( lPdf.Canvas ); end; procedure PrintOnPrinter; begin PrintOnCanvas( Printer.Canvas ); end; |
AW: Canvas als PDF speichern oder ausdrucken
Hallo,
vielen Dank für die schnelle Antwort. Der Lösungsansatz sieht recht gut aus. Werde ich sofort mal ausprobieren. Gruß Daniel |
AW: Canvas als PDF speichern oder ausdrucken
Hallo,
die Lösung sah gut aus, leider kommt eine Fehlermeldung E2010 Inkompatible Typen: 'TCanvas' und 'TPdfCanvas' So wie es aussieht, muss ich dann doch alles doppelt machen. Schade. Oder hat noch einer eine Lösung? Gruß Daniel |
AW: Canvas als PDF speichern oder ausdrucken
Von welchen Klassen ist denn TPdfCanvas abeleitet?
Suche den gemeinsamen Vorfahren zu TCanvas! |
AW: Canvas als PDF speichern oder ausdrucken
Zitat:
|
AW: Canvas als PDF speichern oder ausdrucken
Da fällt es mir gerade wie Schuppen aus den Haaren,
Delphi-Quellcode:
wird direkt von
TPdfCanvas
Delphi-Quellcode:
abgeleitet (oder was auch immer), auf jeden Fall nicht von
TObject
Delphi-Quellcode:
...
TCanvas
Also muss eine abstrakte Klasse her und je eine konkrete Ableitung für
Delphi-Quellcode:
und eine für
TCanvas
Delphi-Quellcode:
. Dann schreibt man alles nur einmal ;)
TPdfCanvas
|
AW: Canvas als PDF speichern oder ausdrucken
Klingt nach einem Fall für Vererbung.
|
AW: Canvas als PDF speichern oder ausdrucken
Klingt nach dem
![]()
Delphi-Quellcode:
und in der Anwendung selber:
unit Unit1;
interface uses System.Classes, Vcl.Graphics, SynPdf; type ICanvas = interface ['{F4E825EF-5ADF-42AB-B5E1-8CF82BA5DCDB}'] procedure TextOut( X: Integer; Y: Integer; const Text: string ); end; TVclCanvas = class( TInterfacedObject, ICanvas ) private FCanvas: TCanvas; public constructor Create( ACanvas: TCanvas ); procedure TextOut( X: Integer; Y: Integer; const Text: string ); end; TSynPdfCanvas = class( TInterfacedObject, ICanvas ) private FCanvas: TPdfCanvas; public constructor Create( ACanvas: TPdfCanvas ); procedure TextOut( X: Integer; Y: Integer; const Text: string ); override; end; implementation { TVclCanvas } constructor TVclCanvas.Create( ACanvas: TCanvas ); begin inherited Create; FCanvas := ACanvas; end; procedure TVclCanvas.TextOut( X, Y: Integer; const Text: string ); begin FCanvas.TextOut( X, Y, Text ); end; { TSynPdfCanvas } constructor TSynPdfCanvas.Create( ACanvas: TPdfCanvas ); begin inherited Create; FCanvas := ACanvas; end; procedure TSynPdfCanvas.TextOut( X, Y: Integer; const Text: string ); begin FCanvas.TextOut( X, Y, Text ); end; end.
Delphi-Quellcode:
Das immer nach dem Motto
procedure PrintOnCanvas(ACanvas: ICanvas);
begin ACanvas.TextOut( 300, 700, 'Dies ist ein Test-Text'); end; procedure PrintPdf; var LCanvas: ICanvas; begin LCanvas := TSynPdfCanvas.Create( lPdf.Canvas ); PrintOnCanvas( LCanvas ); end; procedure PrintOnPrinter; var LCanvas: ICanvas; begin LCanvas := TVclCanvas.Create( lPdf.Canvas ); PrintOnCanvas( LCanvas ); end; Zitat:
|
AW: Canvas als PDF speichern oder ausdrucken
Hallo,
vielen Dank für die vielen Anregungen. Die Lösung - Teil 1: TPdfDocumentGDI.VCLCanvas Wenn ich nun lPdf:TPdfDocumentGDI setze/definiere, und lPdf mit TPdfDocumentGDI.Create erzeuge, gibt es mit lPDF.VCLCanvas ein Konstrukt, welches TCanvas ist. Somit kann ich nun die gleichen Sachen machen mit lPDF.VCLCanvas und Printer.Canvas. So kann man dann in etwas anderer Form
Code:
benutzen.
procedure PrintOnCanvas(ACanvas: TCanvas);
begin ACanvas.TextOut( 300, 700, 'Dies ist ein Test-Text'); end; procedure PrintPdf; begin PrintOnCanvas( lPdf.VCLCanvas ); end; procedure PrintOnPrinter; begin PrintOnCanvas( Printer.Canvas ); end; Nun stehe ich aber vor dem nächsten Problem. PageBreak / NewPage oder wie es auch heißt ist nicht Methode von einem Canvas. Lösung hier: derzeit noch offen. Gruß Daniel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:05 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