VB.net 使用 iText7 将 header/footer 添加到 PDF 的每一页

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

我正在尝试创建带有页眉和页脚的 PDF。页眉和脚都是图像。由于我的 pdf 创建了随机数量的页面,因此我需要将其自动添加到每个页面。我知道我需要使用某种事件处理程序。不幸的是,我找不到 vb.net 语言的任何示例,我只能找到 java/C# 个示例,而且我真的不擅长 reading/converting 这些语言到 vb.net。我还不是编程专家。

任何人都可以指出正确的方向。

Edit4:删除随机内容不再需要回答我的问题。

下面这段代码是我创建 PDF 本身的全部内容。

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

编辑:

在 iText 网站上找到了一个不错的教程。

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

我只是不太明白如何将该段代码插入到我自己的代码段中。我想我需要创建一个新的 class 来处理该事件。 但是我需要怎么调用这个事件。

我只是将以下行添加到我的代码中:

Implements IEventHandler

还有这个新子

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

如何调整 sub 以处理页面开始事件和页面结束事件(如果它仍然这样调用)

编辑:我刚刚导入了所有内容,以确保我得到了所有内容。当一切正常时,我将删除所有未使用的东西。

通过一些努力,我可以在 vb.net 中实现 PAGE_END 事件。这是给你的代码。

(A) 在主模块中创建 pdf 例程添加:

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

(B) 在 End Class 之后添加另一个 class。您可以根据需要添加 text/paragraph。我在特定页面上使用图像作为页眉和页脚。

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