itextsharp подчеркнутый текст в ячейке выходит за пределы ячейки

Мне удалось создать PDF-файл с помощью iTextSharp в моем коде VB .net, который выглядит почти так, как я хочу. Однако я использую таблицу с одним столбцом и несколькими строками для отображения длинных текстовых строк, собранных вместе с помощью фрагментов и фраз. Некоторые фрагменты содержат подчеркнутый текст. Когда во фразе есть подчеркнутый текст, вся ячейка должна быть выделена серым цветом, и для этого я использую свойство BackgroundColor PdfPCell.

Проблема, с которой я столкнулся, заключается в том, что линия подчеркивания выходит за границы ячейки (за пределами выделения). Я пробовал много вещей, чтобы исправить это, например, установил фиксированную высоту ячейки, а затем установил для cell.VerticalAlignment значение Element.ALIGN_TOP; использование SetLeading с различными значениями, включая (0, 0), что только усугубило проблему; установка для cell.Ascender значения True; и изменение значений заполнения. Возможно, я пробовал и другие вещи, но по какой-то причине, что бы я ни пытался, строка для подчеркнутого текста выходит за рамки выделения. И выделение идет прямо до нижней части текста в ячейке выше (поэтому я попытался поиграть со значениями SetLeading.)

На изображении показана вторая страница моего получившегося PDF-файла. PDF с таблицей

Ниже приведен пример разделов кода, реализующих это - «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)

person jencarta    schedule 15.10.2015    source источник
comment
Вы пытались изменить шрифт, любой другой шрифт, такой как Arial (это нарушит настройку фиксированной ширины Courier New, но просто попробуйте). Еще одна вещь, касающаяся setLeading, применялась ли она только к ячейкам? В составном режиме вы должны также установить интерлиньяж на добавляемом элементе, например установить интерлиньяж абзаца перед добавлением его в ячейку.   -  person haraman    schedule 15.10.2015
comment
попробуйте установить padding для этих ячеек, если Вы согласны.   -  person nelek    schedule 15.10.2015


Ответы (1)


Подчеркивание по умолчанию представляет собой определенное смещение от текста. К сожалению, поскольку вы убрали заполнение в таблице, это смещение противоречит макету ячейки. Один из вариантов - просто изменить отступ, как предлагают люди. Другой вариант, однако, - вручную установить смещение подчеркивания 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
person Chris Haas    schedule 15.10.2015
comment
Спасибо, Крис. Мне пришлось на время отложить эту проблему, но сейчас я вернусь к ней и дам вам знать, как она работает для меня. Я действительно хочу попробовать убрать прокладку, так как она лучше подходит для моих целей. - person jencarta; 16.11.2015
comment
Поскольку я уже использовал фрагменты в своем коде, я использовал SetUnderline, как вы предложили, и это очень помогло. Это не полное решение, но я поиграю с отступом, как было предложено выше, вместо того, чтобы убивать его. Главное, что когда есть соседние ячейки, которым нужен серый фон, я не хочу, чтобы между ними было какое-то разделение / похоже, я очень близко подхожу к точному результату, который я хочу. Спасибо! - person jencarta; 17.11.2015