如何使用非中断空间在PdfPTable单元格中具有多行内容。 iTextSharp用空格字符分解单词。
场景是我想要一个表头中的多行内容,例如在第一行它可能会显示“Text1&”在第二行显示“文本”,在渲染PDF时,Text1显示在第一行,然后显示在第二行&显示,第三行显示第一行的长度,并将剩余的字符截断到下一行。
或者我可以为表格的每一列设置特定宽度,以便容纳其中的文本内容,例如文本将在特定宽度内包裹。
答案 0 :(得分:5)
您没有指定语言,所以我会在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"
您也可能会发现non-breaking hyphen (U+2011)也很有帮助。
对于第二个问题,是的,您可以设置每列的宽度。但是,列宽始终设置为相对宽度,因此如果使用:
T.SetTotalWidth(New Single() {2.0F, 1.0F})
你实际上说的是,对于给定的表,第一列应该是第二列的两倍,你是 NOT 说第一列是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