处理或拦截PDF表格上的新页面事件以绘制线条

时间:2016-11-18 14:04:39

标签: vb.net itext

我正在创建一个PDF表格,我可以管理当表格需要多个页面时会发生什么:

iTextsharp - draw a line at the end and start of a page with tables

如果表需要另一页,那么在插入新页面之前,我会在实际页面上绘制最后一行。

现在我需要在新页面上画一条顶线,但我不知道哪个方法调用。我正在尝试这样的事情:

Imports iTextSharp.text.pdf

Public Class LineaBottom
    Implements IPdfPTableEvent

    Public Sub TableLayout(table As PdfPTable, widths As Single()(), heights() As Single, headerRows As Integer, rowStart As Integer, canvases() As PdfContentByte) Implements IPdfPTableEvent.TableLayout
        'Throw New NotImplementedException()

        Dim columns As Integer
        Dim footer As Integer = widths.Length - table.FooterRows
        Dim header As Integer = table.HeaderRows - table.FooterRows + 1
        Dim ultima As Integer = footer - 1

        If last <> -1 Then
            Dim line As PdfContentByte
            line = pdfWrite.DirectContent
            line.SetLineWidth(0.5)
            line.MoveTo(xStart, curY)
            line.LineTo(xEnd, curY)
            line.Stroke()

            'canvases(PdfPTable.BASECANVAS).Rectangle(rect)
        End If
    End Sub
End Class

其中xStart和xEnd是全局变量,左右边距加上或减去一个值。

我不知道如何调整线

canvases(PdfPTable.BASECANVAS).Rectangle(rect)

因为该行来自绘制Rectangle的Java示例,我只需要一行

和行

If last <> -1 Then

检测到网页的最后一行,我需要检测新网页的第一行

1 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解了您的问题,但是:

  • 如果我需要在分割表时添加一些内容并且之前 iTextSharp移动到新页面,我就不会使用IPdfPTableEvent。相反,我会使用IPdfPTableEventSplit
  • 如果我需要在分割表时添加一些内容, iTextSharp移动到新页面之后,之前添加其他表格,我会不要使用IPdfPTableEvent。相反,我会使用IPdfPTableEventAfterSplit

创建事件时,我会传递DocumentPdfWriter对象。我会通过询问当前页面尺寸的Document对象来获取我需要的坐标,并且我会使用PdfWriter来添加线条。

但是,这不是你问题的答案。您似乎知道如何绘制矩形,但您不知道如何绘制线条。这很简单:

PdfContentByte cb = canvases(PdfPTable.BASECANVAS)
cb.MoveTo(x1, y1)
cb.LineTo(x2, y2)
cb.Stroke()

您可以更改各种属性,例如行宽,如下所示:

PdfContentByte cb = canvases(PdfPTable.BASECANVAS)
cb.SaveState()
cb.SetLineDash(8, 4, 0)
cb.SetLineWidth(2.0f)
cb.MoveTo(x1, y1)
cb.LineTo(x2, y2)
cb.Stroke()
cb.RestoreState()

至于x1y1x2y2的值,您必须根据通过{{1}传递给您的值来定义它们}和widths参数。