AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Canvas als PDF speichern oder ausdrucken
Thema durchsuchen
Ansicht
Themen-Optionen

Canvas als PDF speichern oder ausdrucken

Ein Thema von Tazidus · begonnen am 16. Jul 2015 · letzter Beitrag vom 20. Jul 2015
Antwort Antwort
Seite 1 von 2  1 2      
Tazidus

Registriert seit: 29. Mär 2005
Ort: Hilchenbach
44 Beiträge
 
#1

Canvas als PDF speichern oder ausdrucken

  Alt 16. Jul 2015, 02:28
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
Es gibt nichts Gutes, außer man tut es!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Canvas als PDF speichern oder ausdrucken

  Alt 16. Jul 2015, 02:36
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Tazidus

Registriert seit: 29. Mär 2005
Ort: Hilchenbach
44 Beiträge
 
#3

AW: Canvas als PDF speichern oder ausdrucken

  Alt 16. Jul 2015, 16:23
Hallo,

vielen Dank für die schnelle Antwort.
Der Lösungsansatz sieht recht gut aus.
Werde ich sofort mal ausprobieren.

Gruß
Daniel
Es gibt nichts Gutes, außer man tut es!
  Mit Zitat antworten Zitat
Tazidus

Registriert seit: 29. Mär 2005
Ort: Hilchenbach
44 Beiträge
 
#4

AW: Canvas als PDF speichern oder ausdrucken

  Alt 16. Jul 2015, 17:53
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
Es gibt nichts Gutes, außer man tut es!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Canvas als PDF speichern oder ausdrucken

  Alt 16. Jul 2015, 18:04
Von welchen Klassen ist denn TPdfCanvas abeleitet?
Suche den gemeinsamen Vorfahren zu TCanvas!
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Canvas als PDF speichern oder ausdrucken

  Alt 16. Jul 2015, 20:21
So wie es aussieht, muss ich dann doch alles doppelt machen.
Schade.
Natürlich nicht... Wir machen das seit Jahren so..
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Canvas als PDF speichern oder ausdrucken

  Alt 16. Jul 2015, 23:57
Da fällt es mir gerade wie Schuppen aus den Haaren, TPdfCanvas wird direkt von TObject abgeleitet (oder was auch immer), auf jeden Fall nicht von TCanvas ...

Also muss eine abstrakte Klasse her und je eine konkrete Ableitung für TCanvas und eine für TPdfCanvas . Dann schreibt man alles nur einmal
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Canvas als PDF speichern oder ausdrucken

  Alt 17. Jul 2015, 01:00
Klingt nach einem Fall für Vererbung.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Canvas als PDF speichern oder ausdrucken

  Alt 17. Jul 2015, 02:35
Klingt nach dem Adapter-Pattern: Adapter mit Delegation (Objektadapter)
Delphi-Quellcode:
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.
und in der Anwendung selber:
Delphi-Quellcode:
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;
Das immer nach dem Motto
Zitat:
Was nicht passt, wird passend gemacht!
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Tazidus

Registriert seit: 29. Mär 2005
Ort: Hilchenbach
44 Beiträge
 
#10

AW: Canvas als PDF speichern oder ausdrucken

  Alt 17. Jul 2015, 15:44
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:
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;
benutzen.

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
Es gibt nichts Gutes, außer man tut es!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:35 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