我在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)
文本现在出现在两个页面上,并在单元格中垂直和水平居中。