Как использовать неразрывный пробел в iTextSharp - PullRequest
3 голосов
/ 15 ноября 2011

Как можно использовать неразрывный пробел, чтобы иметь многострочный контент в ячейке PdfPTable.iTextSharp разбивает слова на пробелы.

Сценарий заключается в том, что я хочу многострочный контент в заголовке таблицы, например, в первой строке может отображаться «Text1 &», а во второй строке - «Текст ", при рендеринге PDF текст1 отображается в первой строке, затем во второй строке и отображается &, а в третьей он принимает длину первой строки и усекает оставшиеся символы до следующей строки.

ИлиМогу ли я установить конкретную ширину для каждого столбца таблицы, чтобы вместить в нее текстовое содержимое, например текст, обернутый в пределах этой определенной ширины.

1 Ответ

5 голосов
/ 15 ноября 2011

Вы не указали язык, поэтому я отвечу на VB.Net, но вы можете легко конвертировать его в C #, если это необходимо.

На ваш первый вопрос, чтобы использовать неразрывный пробел, просто используйте соответствующую кодовую точку Unicode U+00A0:

В VB.Net вы бы объявили это как:

Dim NBSP As Char = ChrW(&HA0)

А в C #:

Char NBSP = '\u00a0';

Тогда вы можете просто объединить его, где это необходимо:

Dim Text2 As String = "This is" & NBSP & "also" & NBSP & "a test"

Также вам может пригодиться неразрывный дефис (U + 2011) .

На ваш второй вопрос, да, вы можете установить ширину каждого столбца. Однако ширина столбцов всегда задается как относительная ширина, поэтому, если вы используете:

T.SetTotalWidth(New Single() {2.0F, 1.0F})

На самом деле вы говорите, что для данной таблицы первый столбец должен быть в два раза больше второго столбца, вы НЕ , говоря, что первый столбец имеет ширину 2px и второй 1px . Это очень важно понять. Приведенный выше код точно такой же, как следующие две строки:

T.SetTotalWidth(New Single() {4.0F, 2.0F})
T.SetTotalWidth(New Single() {100.0F, 50.0F})

Ширина столбцов относительно ширины таблицы, которая по умолчанию (если я правильно помню) составляет 80% ширины доступной для записи страницы. Если вы хотите установить абсолютную ширину таблицы, вам нужно установить два свойства:

''//Set the width
T.TotalWidth = 200.0F
''//Lock it from trying to expand
T.LockedWidth = True

Собрав все вышеперечисленное, ниже приведено полнофункциональное приложение WinForms для iTextSharp 5.1.1.0:

.
Option Explicit On
Option Strict On

Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf

Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ''//File that we will create
        Dim OutputFile As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "TableTest.pdf")

        ''//Standard PDF init
        Using FS As New FileStream(OutputFile, FileMode.Create, FileAccess.Write, FileShare.None)
            Using Doc As New Document(PageSize.LETTER)
                Using writer = PdfWriter.GetInstance(Doc, FS)
                    Doc.Open()

                    ''//Create our table with two columns
                    Dim T As New PdfPTable(2)
                    ''//Set the relative widths of each column
                    T.SetTotalWidth(New Single() {2.0F, 1.0F})
                    ''//Set the table width
                    T.TotalWidth = 200.0F
                    ''//Lock the table from trying to expand
                    T.LockedWidth = True

                    ''//Our non-breaking space character
                    Dim NBSP As Char = ChrW(&HA0)

                    ''//Normal string
                    Dim Text1 As String = "This is a test"
                    ''//String with some non-breaking spaces
                    Dim Text2 As String = "This is" & NBSP & "also" & NBSP & "a test"

                    ''//Add the text to the table
                    T.AddCell(Text1)
                    T.AddCell(Text2)

                    ''//Add the table to the document
                    Doc.Add(T)

                    Doc.Close()
                End Using
            End Using
        End Using

        Me.Close()
    End Sub
End Class
...