单元格中的itextsharp带下划线的文本位于单元格

时间:2015-10-15 18:33:17

标签: vb.net itextsharp pdfptable

我已经能够在我的VB .net代码中使用iTextSharp创建一个PDF,它看起来几乎与我想要的完全一样。但是,我使用一个包含一列和多行的表来显示使用块和短语放在一起的长文本字符串。一些块包含带下划线的文本。当短语中带下划线的文本时,整个单元格需要以灰色突出显示,并且我正在使用PdfPCell的BackgroundColor属性。

我遇到的问题是下划线落在单元格边界之外(突出显示之外)。我已经尝试了很多东西来解决这个问题,比如设置一个固定的单元格高度,然后将cell.VerticalAlignment设置为Element.ALIGN_TOP;使用具有各种值的SetLeading,包括(0,0)只会使问题变得更糟;设置cell.Ascender为True;并更改填充值。我可能也尝试了其他的东西,但出于某种原因,无论我尝试什么,下划线文本的行都不在突出显示之内。并且,突出显示直到上面单元格中文本的底部(这就是我尝试使用SetLeading值进行播放的原因。)

图像显示了我生成的PDF的第2页。 PDF with table

以下是实现此功能的代码部分示例 - " outString1"和" outString2"是附加到单行的输出文本字符串。有一个布尔值用于确定是否需要加下划线的文本块,以及一个确定是否需要单元格突出显示的布尔值 - 在某些情况下,单元格可能会突出显示但文本没有加下划线。关于我如何解决这个问题的任何建议?

Dim pdfTable As PdfPTable = New PdfPTable(1)
pdfTable.WidthPercentage = 100

    'the next section is within a loop to create and load each cell
    Dim P As New Phrase()
    'Slisted is a Boolean value to determine need for underlining
    If Slisted Then
        P.Add(New Chunk(outString1, myULfont))
    Else
        P.Add(New Chunk(outString1, myfont))
    End If
    P.Add(New Chunk(outString2, myfont))
    Dim cell As PdfPCell = New PdfPCell(P)
    cell.Border = 0
    cell.Padding = 0
    'hilite is a Boolean value to determine whether 
    If hilite Then
        cell.BackgroundColor = BaseColor.LIGHT_GRAY
    End If
    pdfTable.AddCell(cell)

'out of loop, load table into document
pdfDoc.Add(pdfTable)

1 个答案:

答案 0 :(得分:0)

默认情况下,下划线是远离文本的特定偏移量。不幸的是,因为你已经杀掉了桌子上的填充物,所以偏移量与单元格的布局相冲突。一种选择是你应该像人们建议的那样改变填充。但是,另一个选择是手动设置Chunk的下划线偏移量。以下是一个示例:

Dim T As New PdfPTable(1)

For I = 1 To 10

    ''//Your chunk
    Dim Ch As New Chunk("Hello", DocFont)

    ''//Wrap the chunk in a phrase
    Dim p As New Phrase(Ch)

    ''//Wrap the phrase in a cell
    Dim cell As PdfPCell = New PdfPCell(p)

    ''//Optional borders and padding
    cell.Border = 0
    cell.Padding = 0

    ''//This is just an example to do every other cell
    If I Mod 2 = 0 Then
        cell.BackgroundColor = BaseColor.LIGHT_GRAY

        ''//Set the thickness and offset from the text
        Ch.SetUnderline(0.1, 0)
    End If

    T.AddCell(cell)

Next