itextsharp 单元格中带下划线的文本落在单元格外

itextsharp underlined text in cell falls outside cell

我已经能够在我的 VB .net 代码中使用 iTextSharp 创建一个 PDF,它看起来几乎和我想要的一样。但是,我正在使用具有一列和多行的 table 来显示使用块和短语组合在一起的长文本字符串。一些块包含带下划线的文本。当短语中有下划线文本时,需要将整个单元格突出显示为灰色,我使用 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)

默认情况下,下划线与文本有一定的偏移量。不幸的是,由于您已经取消了 table 上的填充,因此偏移量与单元格的布局冲突。一种选择是您应该按照人们的建议更改填充。但是,另一种选择是自己手动设置 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