Search code examples
vb.netpdfitext7

VB.net add a header/footer to every page of a PDF using iText7


I am trying to create a PDF with a header and footer. Both header and foot are images. Since my pdf creates a random amount of pages I need to automaticly add it to every page. I know I need to use some sort of eventhandler. Unfortunately I can't find any examples in the vb.net language, I only can find java/C# examples and I am really bad at reading/converting these language to vb.net. I am not a expert yet at programming.

Can anyone point me in the right direction.

Edit4: Removed random stuff no longer need to answer my question.

This piece of code below is all I got on creating the PDF itself.

Imports System.IO

Imports MySql.Data.MySqlClient

Imports iText.Kernel

Imports iText.Kernel.Pdf

Imports iText.Kernel.Font

Imports iText.Kernel.Font.PdfFont

Imports iText.Kernel.Font.PdfFontFactory

Imports iText.IO.Image

Imports iText.IO.Image.ImageData

Imports iText.IO.Image.ImageDataFactory

Imports iText.Layout.Element.Image

Imports iText.Layout

Imports iText.Layout.Element

Imports iText.Layout.Element.Table


Imports iText.Kernel.Events.Event

Imports iText.Kernel.Events.PdfDocumentEvent

Imports iText.Kernel.Geom.PageSize

Imports iText.Kernel.Geom.Rectangle

Imports iText.Kernel.Pdf.PdfDocument


Imports iText.Kernel.Pdf.PdfNumber

Imports iText.Kernel.Pdf.PdfWriter

Imports iText.Kernel.Pdf.Canvas.PdfCanvas

Imports iText.Kernel.Pdf.Canvas.PdfCanvasConstants

Imports iText.Kernel.Pdf.Xobject.PdfFormXObject

Imports iText.Layout.Canvas

Imports iText.Layout.Document

Imports iText.Layout.Style

Imports iText.Layout.Layout.LayoutArea

Imports iText.Layout.Layout.LayoutContext

Imports iText.Layout.Layout.LayoutResult

Imports iText.Layout.Renderer.CellRenderer
Imports iText.Layout.Renderer.DrawContext
Imports iText.Layout.Renderer.TableRenderer
Imports iText.Signatures.PdfSignatureAppearance


Public Sub NewiText7PdfCreation()

'Dim dest As String = "\\test\verkoop\offerte v2\Offerte " & offertenummer2 & "-" & offertenummer & " " & TextBox2.Text & ".pdf"

Dim dest As String = "iText7Test.pdf"


Dim writer As PdfWriter = New PdfWriter(dest)
Dim pdf As PdfDocument = New PdfDocument(writer)
Dim doc As Document = New Document(pdf)

Dim font As PdfFont = PdfFontFactory.CreateFont("C:\Windows\Fonts\calibri.ttf")

'header

Dim headerlocation As String = "Resources\Offerte-NL.png"
Dim headerimage2 As Image = New Image(ImageDataFactory.Create(headerlocation))
doc.Add(headerimage2)


'klant gegevens

doc.Add(New Paragraph("Debiteur gegevens").SetFont(font))

Dim debnr As String = TextBox1.Text
Dim bn As String = TextBox2.Text
Dim adr As String = TextBox3.Text
Dim pcwp As String = TextBox4.Text
Dim cp As String = TextBox5.Text
Dim km As String = TextBox6.Text

Dim klanttable As New Table(2)

klanttable.SetMaxWidth(350)
klanttable.SetHorizontalAlignment(0)
klanttable.SetFont(font)
klanttable.SetFontSize(8)
klanttable.SetWidth(350)
klanttable.SetMinWidth(120)

klanttable.AddCell("Debiteur nr.: ")
klanttable.AddCell(debnr)
klanttable.AddCell("(Bedrijfs)naam:")
klanttable.AddCell(bn)
klanttable.AddCell("Adres:")
klanttable.AddCell(adr)
klanttable.AddCell("Postcode & woonplaats:")
klanttable.AddCell(pcwp)
klanttable.AddCell("Contactpersoon:")
klanttable.AddCell(cp)
klanttable.AddCell("Kenmerk:")
klanttable.AddCell(km)

Dim cell As New Cell

klanttable.SetMarginTop(10)
klanttable.SetMarginBottom(10)

doc.Add(klanttable)

doc.Close()

End Sub

Edit:

Found a nice tutorial on the iText website.

https://developers.itextpdf.com/content/itext-7-jump-start-tutorial-net/chapter-3-using-renderers-and-event-handlers

I just don't quite get how to insert that piece of code into my own piece of code. I think I need to create a new class that handles the event. But how do I need to call this event.

I just add the follow line to my code:

Implements IEventHandler

And this new sub.

  Public Sub HandleEvent([event] As [Event]) Implements IEventHandler.HandleEvent
    Throw New NotImplementedException()
End Sub

How do I adjust the sub to handle the page-start event and page-end event ( if it's even still called that way)

Edit: I just imported all the stuff just to be sure I got everything. When everything is working fine I am just gonna remove everything not being used.


Solution

  • With some efforts, I could implement PAGE_END event in vb.net. Here is the code for you.

    (A) In main module create pdf routine add:

    *Dim HandlerRLA = New VariableHeaderEventHandlerRLA
    PDFfile.AddEventHandler(PdfDocumentEvent.END_PAGE, HandlerRLA)*
    

    (B) Add anlother class after End Class. You may add text/paragraph as per requirement. I have used image as Header and Footer on specific pages.

    Public Class VariableHeaderEventHandlerRLA
        Implements IEventHandler
        Dim header As String
        Dim doc As PdfDocument
        Public Sub TextFooterEventHandler(ByRef doc As PdfDocument)
            Me.doc = doc
        End Sub
        Public Sub HandleEvent([event2] As [Event]) Implements IEventHandler.HandleEvent
            Dim docEvent1 As PdfDocumentEvent = event2
            Dim canvas1 As PdfCanvas = New PdfCanvas(docEvent1.GetPage())
            Dim pageSize1 As iText.Kernel.Geom.Rectangle = docEvent1.GetPage().GetPageSize()
            'Dim canvas As Canvas = New Canvas(docEvent.GetPage(), New iText.Kernel.Geom.Rectangle(0, 0, pageSize.GetWidth(), pageSize.GetHeight))
            Dim PDoc1 As PdfDocument = docEvent1.GetDocument()
            Dim Page1 = docEvent1.GetPage()
            Dim PageNo1 As Integer = PDoc1.GetPageNumber(Page1)
    
            If PageNo1 > 1 Then
                Dim imageFile, BottomImage As String
                imageFile = "path to image folder\secondtop.bmp"
                Dim data3 = ImageDataFactory.Create(imageFile)
    
                BottomImage = "path to image folder\secondbottom2.bmp"
                Dim data4 = ImageDataFactory.Create(BottomImage)
    
                Dim Ratio = data3.GetHeight / data3.GetWidth
                Dim rect As iText.Kernel.Geom.Rectangle = New iText.Kernel.Geom.Rectangle(0, 784, 595, 595 * Ratio)
    
                With canvas1
                    .AddImage(data3, 0, 784, 595, 0)
                    '.AddImageFittedIntoRectangle(data3, rect, 0)
    
                    Ratio = data4.GetHeight / data4.GetWidth
                    rect = New iText.Kernel.Geom.Rectangle(0, 0, 595, 595 * Ratio)
                    '.AddImageFittedIntoRectangle(data4, rect, 0)
                    .AddImage(data4, 0, 0, 595, 0)
                End With
            End If
            'Throw New NotImplementedException()
        End Sub
    End Class