VB.NET PDF erstellen
Inhaltsverzeichnis
VB.NET PDF erstellen
Lerne in diesem Beitrag eine VB.NET PDF zu erstellen und anschließend über den „Microsoft Print To PDF„-Drucker kinderleicht in eine PDF-Datei umwandeln kannst.
Besonders toll finde ich, dass für diese Variante keinerlei weitere Bibliotheken von Fremdanbietern benötigt werden und alles mit Windows-Bordmitteln erledigt werden kann.
Falls Du hingegen lediglich wissen möchtest, wie Du eine PDF-Datei öffnen kannst, schau am besten in meinem anderen Beitrag vorbei.
Eine Story aus meinem Alltag
Ich kann mich noch sehr gut an eine Aufgabe eines ehemaligen Arbeitgebers, bzw. unseres Kunden erinnern, wo ich auch mit PDF-Dateien arbeiten musste.
Es ging darum, eine Liste von zusammengefassten Artikeln mit Produktbildern, Bestand und Bezeichnungen zu drucken, damit die Mitarbeiter des Kunden im Lager, ihre Arbeit einfacher und effizienter gestalten konnten.
Dabei ging es in erster Linie um die Vermeidung von doppelten Wegen, also einer Art Weg-Optimierung und dabei um die Zusammenfassung von Produkten aus verschiedenen Bestellungen.
Code – VB.NET PDF erstellen
Es gibt verschiedene Möglichkeiten in VB.NET eine PDF zu erstellen, ich habe mich hier für die Demonstration der meiner Meinung nach einfachsten Methode entschieden.
Wir erstellen daher einfach eine simple Form wo wir einen Button namens „btnPrint“ hinzufügen, Welcher natürlich für den letztendlichen Druck unseres Dokuments zuständig ist.
Ebenso benötigen wir zwei TextBoxen und zwei Labels, um die TextBoxen – wie wir es gelernt haben – vernünftig zu beschriften und somit zu beschreiben.
Die beiden TextBoxen dienen nur als Beispiel, um dem Druckvorgang ggf. einige Daten zu übergeben und somit zu demonstrieren wie dies funktionieren könnte.
Button-Code
Bevor wir mit dem Dokument bzw. der von der PrintDocument erbenden Klasse beginnen, erkläre ich schonmal vorher den Form-Code, Welchen wir benötigen werden.
Private Sub btnPrint_Click(sender As Object, e As EventArgs) Handles btnPrint.Click Dim firstName = tbFirstName.Text.Trim() Dim lastName = tbLastName.Text.Trim() Dim document = New MyPdfFile(firstName, lastName) ' option A ' document.PrinterSettings.PrinterName = "Microsoft Print To PDF" ' document.Print() ' option B ' ShowPrinterSelection(document) ' option C ' good for previewing your dev work without printing ShowPreviewDialog(document) End Sub
In den ersten beiden Zeilen fischen wir uns wie oben angesprochen den Vor- und Nachnamen, um sie beispielhaft an das PrintDocument zu übergeben.
Danach erstellen wir eine Instanz unserer von PrintDocument erbenden Klasse namens MyPdfFile, Welche wir für jedes der folgenden Beispiele verwenden können.
Druck ohne Dialog
Der einfachste Weg wird vermutlich der direkte Druck ohne eine Art Dialog sein, dort geben wir dann den Drucker explizit an und rufen final die Print-Methode auf.
Standard Druck-Dialog
Bei der Option, bzw. Variante B zeigen wir den gängigen, von Windows kommenden Druck–Dialog an, Welcher die tiefere Konfiguration wie gewohnt zulässt.
Dialog mit visueller Vorschau
Option C ist vermutlich auch während der Entwicklungszeit sehr wichtig, da wir so eine schnelle Vorschau des erstellten Dokuments erhalten und unserer Code fix anpassen können.
MyPdfFile-Klasse
Diese Klasse spiegelt das zu druckende Dokument wieder und ist somit der Kern des ganzen Tutorials.
Imports System.Drawing.Printing Public Class MyPdfFile Inherits PrintDocument Private ReadOnly LogoFont As Font Private ReadOnly BodyFont As Font Public Property FirstName As String Public Property LastName As String Sub New(firstName As String, lastName As String) Me.FirstName = firstName Me.LastName = lastName LogoFont = New Font("Segoe UI", 18, FontStyle.Bold) BodyFont = New Font("Segoe UI", 12) SetDefaultPrinter() End Sub Private Sub SetDefaultPrinter() PrinterSettings.PrinterName = "Microsoft Print To PDF" End Sub Private Sub MyPdfFile_BeginPrint(sender As Object, e As PrintEventArgs) Handles Me.BeginPrint Debug.WriteLine("Started printing") End Sub Private Sub MyPdfFile_PrintPage(sender As Object, e As PrintPageEventArgs) Handles Me.PrintPage Debug.WriteLine("PrintPage") DrawHeader(e.Graphics) DrawBody(e.Graphics) DrawFooter(e.Graphics) End Sub Private Sub DrawHeader(g As Graphics) g.DrawString("My Company", LogoFont, Brushes.Black, New Point(50, 50)) End Sub Private Sub DrawBody(g As Graphics) g.DrawString($"Hello, {FirstName} {LastName}", BodyFont, Brushes.Black, New Point(50, 250)) End Sub Private Sub DrawFooter(g As Graphics) End Sub Private Sub MyPdfFile_EndPrint(sender As Object, e As PrintEventArgs) Handles Me.EndPrint Debug.WriteLine("Ended printing") End Sub End Class
Vererbung
Die Klasse MyPdfFile erbt von der PrintDocument Klasse auf dem „System.Drawing.Printing“-Namespace um schon viele Druck-Funktionalitäten zu erhalten.
Member
Die Klasse besitzt zwei Fonts als Member um nicht bei jedem Druck-Step immer wieder neue Instanzen der Fonts erstellen zu müssen.
Eigenschaften
An Eigenschaften bietet unsere eigene PrintDocument-Ableitung testweise zwei Eigenschaften aus der Form, also den Vor– und den Nachnamen.
Konstruktoren
Den einzigen Konstruktor den wir zum aktuellen Moment brauchen, ist der, der unter anderem die Namen aus den Parametern an die Eigenschaften übergibt.
Im nächsten Schritt initialisieren wir unsere beiden Fonts und zu guter Letzte setzen wir noch den Standarddrucker passend für dieses Tutorial auf den „Microsoft Print To PDF“-Drucker.
Methoden
SetDefaultPrinter
Setzt den für dieses Beispiel sinnige Standarddrucker auf den „Microsoft Print To PDF“-Drucker.
MyPdfFile_BeginPrint
Ein Ereignishandler für das BeginPrint-Ereignis unserer Klasse, Welches beim Start des Druckvorgangs aufgerufen wird.
MyPdfFile_PrintPage
Ein Handler für das PrintPage-Ereignis, Welcher für jede einzelne verfügbare Seite ausgelöst wird.
Hier wird die ganze Magic für uns getriggert, also das ein Header, der Content und der Footer der aktuellen Seite gezeichnet werden soll.
DrawHeader
Hier siehst Du eine beispielhafte Methode, um einen Header zu zeichnen, jedoch in der simpelsten Form, also nur einen Firmennamen im Beispiel.
DrawBody
Dieser Methode solltest Du vermutlich die meiste Aufmerksamkeit schenken, denn hier wird vermutlich das meiste passieren.
Du musst mit den einzelnen Seiten umgehen, also auf Welcher Du Dich gerade befindest z. B. und ob es noch weitere Seiten gibt.
Wie man unschwer erraten kann, wird hier der Code platziert, um einen Footer zu zeichnen.
Dieser könnte wie häufig ja z. B. die aktuelle und die maximale Seitenzahl unten rechts beinhalten, usw.
MyPdfFile_EndPrint
An letzter Stelle folgt der EndPrint-Ereignishandler, Welcher das Ende eines Druckvorgangs signalisiert.
Kompletter Code – VB.NET PDF erstellen
Imports System.Drawing.Printing Public Class MyPdfFile Inherits PrintDocument Private ReadOnly LogoFont As Font Private ReadOnly BodyFont As Font Public Property FirstName As String Public Property LastName As String Sub New(firstName As String, lastName As String) Me.FirstName = firstName Me.LastName = lastName LogoFont = New Font("Segoe UI", 18, FontStyle.Bold) BodyFont = New Font("Segoe UI", 12) SetDefaultPrinter() End Sub Private Sub SetDefaultPrinter() PrinterSettings.PrinterName = "Microsoft Print To PDF" End Sub Private Sub MyPdfFile_BeginPrint(sender As Object, e As PrintEventArgs) Handles Me.BeginPrint Debug.WriteLine("Started printing") End Sub Private Sub MyPdfFile_PrintPage(sender As Object, e As PrintPageEventArgs) Handles Me.PrintPage Debug.WriteLine("PrintPage") DrawHeader(e.Graphics) DrawBody(e.Graphics) DrawFooter(e.Graphics) End Sub Private Sub DrawHeader(g As Graphics) g.DrawString("My Company", LogoFont, Brushes.Black, New Point(50, 50)) End Sub Private Sub DrawBody(g As Graphics) g.DrawString($"Hello, {FirstName} {LastName}", BodyFont, Brushes.Black, New Point(50, 250)) End Sub Private Sub DrawFooter(g As Graphics) End Sub Private Sub MyPdfFile_EndPrint(sender As Object, e As PrintEventArgs) Handles Me.EndPrint Debug.WriteLine("Ended printing") End Sub End Class Imports System.Drawing.Printing Public Class Form1 Private Sub btnPrint_Click(sender As Object, e As EventArgs) Handles btnPrint.Click Dim firstName = tbFirstName.Text.Trim() Dim lastName = tbLastName.Text.Trim() Dim document = New MyPdfFile(firstName, lastName) ' option A ' document.PrinterSettings.PrinterName = "Microsoft Print To PDF" ' document.Print() ' option B ' ShowPrinterSelection(document) ' option C ' good for previewing your dev work without printing ShowPreviewDialog(document) End Sub Private Sub ShowPrinterSelection(document As PrintDocument) Using pdlg As New PrintDialog() With pdlg .Document = document ' or customize more settings.. If .ShowDialog() = DialogResult.OK Then document.Print() End If End With End Using End Sub Private Sub ShowPreviewDialog(document As PrintDocument) Using pdlg As New PrintPreviewDialog() With pdlg .Document = document ' or customize more settings.. If .ShowDialog() = DialogResult.OK Then document.Print() End If End With End Using End Sub End Class