我有完全对齐的文本Chunk(不同长度的字符串),后跟一个包含DottedLineSeparator对象的Chunk。我需要知道的是,如果不同长度的字符串换行到第二行(理论上它可以换行到第3行但是它非常不可能)。
我熟悉在Chunk对象上使用GetWidthPoint()方法(我读this question),这就是我正在使用的;但是我认为由于文本的完全合理性而无法100%准确地工作......这意味着空间可能在实际宽度上有所不同。
我希望有一些方法可以确定包含这两个块的Paragraph的高度,或者我正在使用的PdfPCell对象.AddElement()来添加Paragraph对象,甚至是这个问题我添加PdfPCell对象的PdfPTable对象。我知道我可以在之后获得表格的高度我将PdfPTable对象写入文档(使用.TotalHeight)。这是令人困惑的,因为我可以调用cell.GetMaxHeight()但它总是返回8.75 ...无论文本是否足够长以包裹!
不幸的是,在我为其余细胞生成内容之前,我需要知道第一个细胞的高度是什么 - 这就是两难选择。
任何想法/指针/指导?
以下是一些代码来说明:
Dim c As PdfPCell
Dim t As PdfPTable
Dim p As Paragraph
Dim textWrapsAround As Boolean = False
Dim amendedTextWrapsAround As Boolean = False
t = New PdfPTable(3)
t.SetWidths({40, 12, 12})
t.WidthPercentage = 95.0F
t.HorizontalAlignment = Element.ALIGN_CENTER
p = New Paragraph("", DEFAULTFONT)
p.SetLeading(0.5F, 1.0F)
c = New PdfPCell() With {.Border = 0}
c.MinimumHeight = PdfDocument.LineHeightPts
p.Add(New Chunk(name.Trim(), DEFAULTFONT))
p.Add(New Chunk(leaderLine))
p.Alignment = Element.ALIGN_JUSTIFIED
If p.Chunks(0).GetWidthPoint >= 216 Then textWrapsAround = True
c.AddElement(p)
c.HorizontalAlignment = Element.ALIGN_JUSTIFIED
c.PaddingTop = 0
t.SetExtendLastRow(True, False)
t.AddCell(c)
c = emitPdfColumnCell(col1, lFormat, textWrapsAround)
c.MinimumHeight = PdfDocument.LineHeightPts
c.HorizontalAlignment = Element.ALIGN_RIGHT
c.PaddingTop = If(textWrapsAround AndAlso col2.Contains(vbCrLf), top_padding, 0)
t.SetExtendLastRow(True, False)
t.AddCell(c)
c = emitPdfColumnCell(col2, lFormat, textWrapsAround)
c.MinimumHeight = PdfDocument.LineHeightPts
c.HorizontalAlignment = Element.ALIGN_RIGHT
c.PaddingTop = If(textWrapsAround AndAlso col2.Contains(vbCrLf), top_padding, 0)
t.SetExtendLastRow(True, False)
t.AddCell(c)
t.KeepTogether = True
pdf_doc.Add(t)
答案 0 :(得分:0)
我终于找到了一种方法......它是100%的黑客,我可能应该从使用Table切换到ColumnText,因为这就是我如何确定多少行但 ...这是解决方案:
'returns # of lines
Private Function CheckParagraphTextWrap(ByVal p As Paragraph) As Integer
Dim ct As New ColumnText(Me.pdf_writer.DirectContent)
ct.SetIndent(2.0F, True)
ct.RightIndent = 1.5F
Dim show As Boolean = False
Dim x1, x2, y1, y2 As Double
Dim phrase As New Phrase()
phrase.AddAll(p.Chunks)
'hard-coded to match the EXACT width of the cell... this is essential and
x1 = 104.25 : y1 = 580 : x2 = 320.72 : y2 = 620
ct.SetSimpleColumn(phrase, x1, y1, x2, y2, 1.0F, Element.ALIGN_JUSTIFIED)
ct.SetLeading(0.5F, 1.0F) 'also has to match what was being done for the cell
ct.Go(Not show) 'simulate mode
Return ct.LinesWritten
End Function
我为每个被添加到表格中的单元格的段落调用此函数;这是必要的,因为我必须在这之后为表格中的其他单元格做好准备。笨重,但它有效(至少到目前为止)100%的时间。我之前的方法仅在95%的时间内起作用:)