Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
WPF: DLL zum Drucken von Rechnungen / Lieferscheinen

Moderationshinweis von michlG (26.08.2010 - 21:43:02):

Abgeteilt von: Drucken: Rechnungen / Lieferscheine

xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

Themenstarter:

WPF: DLL zum Drucken von Rechnungen / Lieferscheinen

beantworten | zitieren | melden

Hallo,

so, nun ist es soweit.
Nun möchte ich mein Versprechen einhalten.

Meine dll ist für den Druck unter WPF bestimmt.


Angehängt befindet sich das ClassDiagram.


PrintProcessor:

Dies kann man als Hauptklasse für den Druck ansehen, denn sie stellt alle Methoden zur Verfügung die zum Druck benötigt werden. Die Klasse ist abstrakt und definiert somit einige Methoden die in der eigenen abgeleiteten Klasse dringends implementiert werden müssen. Diese Methoden stellen dann die Elemente wie Footer, Header, Body ect zur Verfügung.
Der Konstruktor der Klasse ist wie folgt definiert:
protected PrintProcessor(PrintAppendixes printingAppendix = PrintAppendixes.None)

Der Parameter printAppendix nimmt ein Flag-Enum des types PrintAppendixes entgegen und definiert welche zusätzlichen Teile gedruckt werden.
Dazu gehören:

Header,
Footer,
Summary,
Destinator,
Background.


Je nach Auswahl werden diese Teile durch die abstrakten Methoden der PrintProcessor Klasse "abgeholt".

Nun zur Methode ILineItem GetNextItem(). Diese Methode stellt alle Items zur Verfügung die auf die Rechnung drauf sollen.
Der Rückgabewert ist ein Object vom Typ ILineItem das die Methoden IUElement GetLine und double LineHeight zur Verfügung stellt. Aktuell muss die LineHeight noch manuell angegeben werden, aber in Zukunft wäre eine automatische berechnung geplant.

Die Methode Grid GetTable(out double gridTableHeaderHeight) stellt die Tabellenstruktur zur verfügung die als body angezeigt werden soll. Dazu wird der out parameter gridTableHeight wird benutzt damit die dll weiss wie hoch der Header der Tabelle ist um die darunterliegenden Items zu platzieren.

Das Dokument wird mit der öffentlichen Methode Print() gedruckt.

PrintingDimensions:

Diese Klasse definiert Eigenschaften zur Positionierung der Elemente auf der zu druckenden Seite. Nur die statische Eigenschaft Thickness Margin kann gesetzt werden. Dies ist der Abstand zum bedruckbaren Bereich des Druckers. Lesbar sind die Eigenschaften Size PrintablePageSize. Dieser Wert wird je nach Papierauswahl beim PrintDialog gesetzt und enthält die bedruckbare Breite und Höhe. Dies wird mit Hilfe der statischen Margin Eigenschaft berechnet. Dabei wird die bedruckbare Breite wie folgt berechnet:
Seitenbreite - Margin.Left - Margin.Right.

CustomFixedDokument : Fixed Dokument

Kurz gesagt ist das intern die Hauptklasse die alles koordiniert.

PrintableBorder: Border

Ist eigentlich nur für mich eine Klasse die ein UIElement als Parameter, einen optionalen BorderBrush, bzw dessen Thickness entgegennimmt. Der Standardwert ist Brushes.Gray und eine Thickness von 0.5d.

PrintableLabel : Label

Parameter: object content und HorizontalAlignment mit einem Standard Padding von 2.

PrintableBoldedLabel : Label

Abeleitet von PrintableLabel wird per Standard nur die FontWeight auf FontWeights = Bold gestellt

Abschließend ist zu sagen dass es man nicht den XPS Drucker benutzen kann.


Ich freue mich für jede Rückmeldung und auch Verbesserungswünsche/vorschläge

Gruß
Michael
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von xxMUROxx am .
Attachments
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

Themenstarter:

beantworten | zitieren | melden

Die dll mit PDF ist hier angefügt.

Edit: 29.09.2010 Neue Version

Gruß
Michael
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von xxMUROxx am .
Attachments
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
Tam0r
myCSharp.de - Member



Dabei seit:
Beiträge: 138

Ein kleines Sample

beantworten | zitieren | melden

Hallo xxMUROxx,


finde deine Klasse echt gelungen. Vielen dank für deine mühen. Allerdings habe ich es irgendwie nicht ganz verstanden. Könntest du evtl. ein kleines Sample mit posten wie man eine Rechnung erstellen würde ?

Was passiert jetzt eigentlich wenn die Rechnung zu lang wird ? Wird dann automatisch eine zweite Seite hergenommen ?
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

Themenstarter:

beantworten | zitieren | melden

Hallo Tam0r,

danke. Ja ich werde mich heute Nachmittag die Zeit nehmen ein kleines Beispielprojekt anzuhängen.
Zitat von Tam0r
Was passiert jetzt eigentlich wenn die Rechnung zu lang wird ? Wird dann automatisch eine zweite Seite hergenommen ?
Ja, es wird semi-automatisch berechnet ob das Element noch auf der Seite Platz hat.
Semi-automatisch bedeutet in diesem Kontext dass du bis jetzt noch selbst die Höhe des Items angeben musst.
Aber ich werde es im Beispielprojekt anzeigen.
Bis bald.

Gruß
Michael
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
Tam0r
myCSharp.de - Member



Dabei seit:
Beiträge: 138

beantworten | zitieren | melden

Bin mal gespannt. Sehr nett von dir.

Mfg Tamer
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

Themenstarter:

beantworten | zitieren | melden

Hallo,

als Anhang befindet sich mein Beispielsprojekt.
Ich versuche hier kurz einige Stellen des Codes zu beschreiben:

als Basisklasse des Druckens ist die Printer Klasse verfügbar. In dieser Klasse werde alle Teile die schlussendlich auf den Druck kommen ausprogrammiert. Im grunde genommen sind nur ILineItem GetNextItem(), Grid GetTable(out double tableHeaderHeight), Grid GetTable(out double tableHeaderHeight) und string FileNameSuggestion zwingend notwendig zu überschreiben, die folgenden Methoden:
  • UIElement GetHeader()
  • UIElement GetSummary()
  • UIElement GetHeaderDescription()
  • UIElement GetDestinator()
  • PrintProcessorBackground GetBackgound()

sind wahlweise zu überschreiben. Diese Wahl hängt davon ab welche Teile auf den fertigen Druck kommen.
Welche oben genannten Elemente gedruckt werden sollten wird mit dem als zwingender Parameter des Types MmPrinting.PrintAppendixes der Print Überklasse PrintProcessor gesetzt werden. Durch diesen Parameter wird auch bestimmt welche der oben genannten Methoden aufgerufen wird und welche nicht.
Das Enum MmPrinting.PrintAppendixes beinhaltet folgende Aufzählungen:
  • PrintAppendixes.Destinator
  • PrintAppendixes.Footer
  • PrintAppendixes.Header
  • PrintAppendixes.None
  • PrintAppendixes.Summary
  • PrintAppendixes.PageNumbers
Aber Achtung: Wenn diese Elemente gesetzt werden muss dafür gesorgt werden dass die dazugehörigen Höhen eingestellt werden. D.h. wenn das Flag Header gesetzt wird, muss in der von PrintProcessor erbenden Klasse das Feld HeaderHeight zwingend gesetzt werden. Dasselbe ist für alle anderen Felder. Falls dies nicht geschieht wird beim Versuch zu drucken eine InvalidOperationException geschmissen.
Dies geschieht auch falls versucht wird z.b. HeaderHeight ohne das Flag Header zu setzen.
Die Methode Grid GetTable(out double tableHeaderHeight) erstellt die Grundtabelle auf der die Elemente der Rechnung kommen. Diese Tabelle beinhaltet einen Header, den man manuell definiert und dessen Höhe man auch angeben muss damit die Druckbibliothek weiß wo sie das erste Element der Rechnung zu platzieren hat.

Nun möchte ich kurz auf die Methode ILineItem GetNextItem() eingehen.
Das Interface ILineItem stellt folgende Methoden zur Verfügung:
  • UIElement GetLine()
  • double LineHeight{get;}

zur Verfügung.
Die GetLine Methode erstellt die einzelne Linie und LineHeight soll als Wert für die Höhe der Linie gesetzt werden.

Jegliche Methode die den Rückgabewert UIElement hat muss zwingend ein Element zurückgeben. NULL ist nicht erlaubt. Ob dieses UIElement ein Grid, StackPanel, Label, Button ist ist egal.

Achtung: Bis jetzt ist es noch nicht möglich mit dieser dll den XPS-Drucker bzw OnNote zu verwenden.

Gruß
Michael
Attachments
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
Tam0r
myCSharp.de - Member



Dabei seit:
Beiträge: 138

beantworten | zitieren | melden

Vielen dank für die schnelle Umsetzung. Werde mir deinen Code mal in Ruhe anschauen.

Eine frage hätte ich aber noch, wäre es möglich auch dies ganze mit asp.net umzusetzen ? Oder ist es zwigend erforderlich das es eine Desktopanwendung ist ?
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

Themenstarter:

beantworten | zitieren | melden

Zitat von Tam0r
Eine frage hätte ich aber noch, wäre es möglich auch dies ganze mit asp.net umzusetzen ? Oder ist es zwigend erforderlich das es eine Desktopanwendung ist ?
Habe mich leider noch nie mit asp.net beschäftigt.
Ich kann nur so viel dazu sagen dass zwingend die drei Hauptbibliotheken für WPF erfolderlich sind:
  • PresentationCore
  • PresentationFramework
  • WindowsBase

Gruß
Michael
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
daeve
myCSharp.de - Member



Dabei seit:
Beiträge: 2

beantworten | zitieren | melden

Das sieht mir sehr interessant und spannend aus!

Danke mal !

werde mir das ganze genauer ansehen.
private Nachricht | Beiträge des Benutzers