Heute wollen wir uns mit dem Drucken mehrseitiger Dokumente befassen, das Drucken einseitiger Dokumente ist in diesem Zusammenhang trivial, es wird nicht explizit behandelt.
Als Empfehlung: Wählt einen PDF-Drucker als Standarddrucker aus, da wird bei der Programmenwicklung kein Papier verschwendet.
Zuerst werden wir 3 Kreise verschiedener Durchmesser zu Papier bringen, jeden Kreis auf ein neues Blatt.
Was wir brauchen, ist eine Form mit einem Button ein PrintDocument wowie einen PrintPreviewDialog, auf letzteren kann man auch verzichten und in einer Using-Schleife einen erstellen:
Starten wir diesen Code, werden wir erinnert, dass das Dokument keine Seiten enthält:
Wir müssen dem Dialog mitteilen, welches Dokument zum Drucken verwendet werden soll, außerdem geben wir ihm einen Arbeitstitel, der beim PDF-Druck als Dateiname verwendet wird:
Nun wird uns ein leeres Blatt angeboten:
Um ein Blatt mit Inhalt zu befüllen, benötigen wir den PrintPage-Handler des zu druckenden Dokuments, wir erstellen ihn, indem wir im Designer auf
Auch dieser Code liefert nur ein leeres Dokument.
Zum Test fügen wir eine einfache
Und schon passiert etwas:
Nun bereiten wir die zu zeichnenden Kreise vor, wir geben der Klasse folgende Member:
Dieser wird jedesmal genullt, wenn wir den Dialog aufrufen:
Zuerst geben wir die Seitenzahl aus, entsprechend des Indexes. Seitenzahlen beginnen mit 1, also inkrementieren wir den Index:
Mit Zoom=150% sieht das so aus, jedoch wird momentan nur eine Seite gedruckt:
Wir wollen genau 3 Seiten drucken, dies steuern wir mit der Property
Und schon werden 3 Seiten gedruckt, hier die 3. Seite mit 150 %
Nun wollen wir mal einen ersten Druckversuch wagen.
Ups, hier stimmt was nicht:
Im Preview-Dialog werden 3 Seiten angezeigt, gedruckt wird aber Seite 4.
Ursache ist, dass zum eigentlichen Druck wieder die
Also müssen wir den Index zurücksetzen, wenn ein neuer Druckauftrag gestartet wird:
Hier wird im Parameter
Nun werden 3 Seiten zur Vorschau angezeigt und es werden 3 Seiten gedruckt, wie es sein soll:
Nun wollen wir die Kreise darstellen, das ist nun eigentlich trivial:
Noch ein Ups: Da wir
Die Kreise zentrisch in der
So, dies soll zur Aufwärmung reichen,
im nächsten Beitrag wollen wir ein langes Textdokument drucken.
Als Empfehlung: Wählt einen PDF-Drucker als Standarddrucker aus, da wird bei der Programmenwicklung kein Papier verschwendet.
Zuerst werden wir 3 Kreise verschiedener Durchmesser zu Papier bringen, jeden Kreis auf ein neues Blatt.
Was wir brauchen, ist eine Form mit einem Button ein PrintDocument wowie einen PrintPreviewDialog, auf letzteren kann man auch verzichten und in einer Using-Schleife einen erstellen:
Wir müssen dem Dialog mitteilen, welches Dokument zum Drucken verwendet werden soll, außerdem geben wir ihm einen Arbeitstitel, der beim PDF-Druck als Dateiname verwendet wird:
Um ein Blatt mit Inhalt zu befüllen, benötigen wir den PrintPage-Handler des zu druckenden Dokuments, wir erstellen ihn, indem wir im Designer auf
PrintDocument1
doppelklicken:Zum Test fügen wir eine einfache
DrawString
-Anweisung in die PrintDocument1_PrintPage
-Prozedur ein:Nun bereiten wir die zu zeichnenden Kreise vor, wir geben der Klasse folgende Member:
Zuerst geben wir die Seitenzahl aus, entsprechend des Indexes. Seitenzahlen beginnen mit 1, also inkrementieren wir den Index:
VB.NET-Quellcode
Wir wollen genau 3 Seiten drucken, dies steuern wir mit der Property
HasMorePages
von e (PrintPageEventArgs
-Parameter der PrintPage-Prozedur)Und schon werden 3 Seiten gedruckt, hier die 3. Seite mit 150 %
Nun wollen wir mal einen ersten Druckversuch wagen.
Ups, hier stimmt was nicht:
Im Preview-Dialog werden 3 Seiten angezeigt, gedruckt wird aber Seite 4.
Ursache ist, dass zum eigentlichen Druck wieder die
PrintDocument1_PrintPage
-Prozedur verwendet wird, der Index zählt weiter, e.HasMorePages
ist False
, da der Index größer-gleich 2 ist.Also müssen wir den Index zurücksetzen, wenn ein neuer Druckauftrag gestartet wird:
e.PrintAction
auch das Ziel mitgeteilt: PrintToPreview
oder PrintToPrinter
.Nun werden 3 Seiten zur Vorschau angezeigt und es werden 3 Seiten gedruckt, wie es sein soll:
Nun wollen wir die Kreise darstellen, das ist nun eigentlich trivial:
VB.NET-Quellcode
- Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
- Dim g = e.Graphics
- g.PageUnit = GraphicsUnit.Millimeter ' Alle Positionsangaben erfolgen nun in Millimetern
- g.DrawString(String.Format("Überschrift Seite {0}", index + 1), New Font("arial", 20), Brushes.Black, New Point(30, 30))
- Dim dia = Me.Diameter(index) * 10 ' mm => cm
- Dim rc = New Rectangle(0, 0, dia, dia)
- g.DrawEllipse(Pens.Black, rc)
- e.HasMorePages = index < 2 ' True bei index >= 2
- index += 1 ' nächste Seite
- If index > 2 Then
- index = 0
- End If
- Debug.WriteLine(index.ToString)
- End Sub
Noch ein Ups: Da wir
GraphicsUnit.Millimeter
eingestellt haben, verschiebt sich auch die Position der Überschrift, wir korrigieren dies, indem wir die Position (10, 10)
vorgeben.Die Kreise zentrisch in der
GraphicsUnit.Millimeter
darzustellen ist etwas schwieriger, da sich die GraphicsUnit, im Gegensatz zur MSDN, nicht auf das VisibleClipBound auswirkt.-----Graphics.VisibleClipBounds-Eigenschaft schrieb:
Die Einheit für das sich ergebende Rechteck wird von der PageUnit-Eigenschaft festgelegt. Die Standardeinheit ist Pixel. Ein Graphics ist normalerweise mit einem Steuerelement verbunden, und der Ursprung des Rechtecks ist relativ zum Clientbereich dieses Steuerelements.
So, dies soll zur Aufwärmung reichen,
im nächsten Beitrag wollen wir ein langes Textdokument drucken.
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()