VB.NET PDF erstellen

VB.NET PDF erstellen
VB.NET PDF erstellen

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.

VB.NET PDF erstellen Form Beispiel
VB.NET PDF erstellen Form Beispiel

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 DruckDialog an, Welcher die tiefere Konfiguration wie gewohnt zulässt.

VB.NET PDF erstellen – Windows Druck-Dialog
VB.NET PDF erstellen – Windows Druck-Dialog

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.

VB.NET PDF erstellen Druck-Vorschau-Dialog
VB.NET PDF erstellen Druck-Vorschau-Dialog

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 Vorund 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.

DrawFooter

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

Downloads

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert