当一行被分割时,我可以使用iTextSharp单元格事件在下一页上重复数据吗?



我在pdfptable中有一个非常深的行。本行左侧的列包含一个子表,其中包含许多行。我希望深行拆分到一个以上的页面,如果它太深,以适应一页。我可以将SplitLate设置为false以确保行分割。但是,右侧深列的数据只显示在第一页上,我希望在第二页上重复它。

稍作调查表明,我可以使用单元格事件将文本放入单元格中,并在第二页上重复。所以我创建了一个单元格事件,如下所示:

Public Class PdfPCellEvent
Implements iTextSharp.text.pdf.IPdfPCellEvent
Private m_text As String
Private m_font As text.pdf.BaseFont
Public Sub New(ByVal text As String, font As text.pdf.BaseFont)
    MyBase.New()
    m_text = text
    m_font = font
End Sub
Public Sub CellLayout(cell As PdfPCell, position As text.Rectangle, canvases() As PdfContentByte) Implements IPdfPCellEvent.CellLayout
    Dim cb As PdfContentByte = canvases(PdfPTable.TEXTCANVAS)
    cb.BeginText()
    cb.SetFontAndSize(m_font, 8)
    cb.ShowText(m_text)
    cb.EndText()
End Sub
End Class

然后我这样调用它:

Dim cell As PdfPCell = New PdfPCell()
Dim bfReport As BaseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, False)
Dim cellEvent As New PdfPCellEvent("Text", bfReport)
cell.CellEvent = cellEvent
mainTable.AddCell(cell)
document.Add(mainTable)

这一切都运行。我可以看到,在mainTable被添加到文档之后,单元格事件被调用了两次。我假定该行出现在的每一页都会调用它一次。我还可以看到,正确的文本被传递到CellLayout。但是,生成的pdf中不显示任何文本。我做错了什么?我已经尝试了各种方法在CellLayout中添加文本,但没有一个工作。

这段代码片段中缺少一些内容:

Dim cb As PdfContentByte = canvases(PdfPTable.TEXTCANVAS)
cb.BeginText()
cb.SetFontAndSize(m_font, 8)
cb.ShowText(m_text)
cb.EndText()

您正在创建一个文本块,但是您忘记指定坐标。我怀疑BT/ET序列被添加到内容流中,但是没有办法告诉文本将在页面上显示在哪里。

在单元格布局中,您可以访问position As text.Rectangle。您可以向position变量询问坐标。您可以在代码片段中使用这些坐标(使用SetTextMatrix()方法),但是如果您不使用 cb.BeginText(), cb.SetFontAndSize(), cb.SetTextMatrix(), cb.ShowText(), cb.EndText(),这对您来说会更容易。使用ColumnText.ShowTextAligned()代替。您可以将cb实例作为参数传递给Phrase、对齐方式(左、右、中)、X、Y坐标和角度。

谢谢,现在可以正常工作了:

Public Class PdfPCellEvent
Implements iTextSharp.text.pdf.IPdfPCellEvent
Private m_phrase As text.Phrase
Public Sub New(ByVal phrase As text.Phrase)
    MyBase.New()
    m_phrase = phrase
End Sub
Public Sub CellLayout(cell As PdfPCell, position As text.Rectangle, canvases() As PdfContentByte) Implements IPdfPCellEvent.CellLayout
    Dim cb As PdfContentByte = canvases(PdfPTable.TEXTCANVAS)
    Dim CenterX As Single = position.GetLeft(0) + (position.Width() / 2)
    Dim CenterY As Single = position.GetBottom(0) + (position.Height() / 2)
    ColumnText.ShowTextAligned(cb, text.Element.ALIGN_CENTER, m_phrase, CenterX, CenterY, 0)
End Sub
End Class

我这样称呼它:

phrase = New text.Phrase("Text", fontSmaller)
Dim cell As PdfPCell = New PdfPCell()
Dim cellEvent As New PdfPCellEvent(phrase)
cell.CellEvent = cellEvent
mainTable.AddCell(cell)
document.Add(mainTable)

文本现在出现在两个页面上,并在单元格中垂直和水平居中。

最新更新