2013-12-03 1 views
0

У меня есть полностью обоснованный текст Chunk (строка различной длины), за которым следует Chunk, содержащий объект DottedLineSeparator. То, что мне нужно знать, это то, что строка переменной длины обертывается во вторую строку (теоретически она может обернуть 3-ю строчку, но это очень маловероятно)., если текст, заключенный в абзац/ячейку

Я знаком с использованием метода GetWidthPoint() (я читал this question) на объекте Chunk, который я использую; но он не работает со 100% -ной точностью, которую я считаю из-за полного обоснования текста ... что означает, что пробелы могут различаться по фактической ширине.

Что я надеялся, был бы какой-то способ определить высоту абзаца, содержащего эти два куска, или объект PdfPCell, с которым я пользуюсь .AddElement(), чтобы добавить объект Paragraph или даже в этом отношении объект PdfPTable, к которому я добавляю объект PdfPCell. Я знаю, что могу получить высоту таблицы после Я пишу объект PdfPTable в документ (используя .TotalHeight). Это запутанно, потому что я могу вызвать cell.GetMaxHeight(), но он всегда возвращает 8.75 ... независимо от того, достаточно ли текста для обертывания или нет!

К сожалению, мне нужно знать, какова высота для 1-й ячейки, прежде чем я смогу создать контент для остальных ячеек, что является дилеммой.

Любые идеи/указатели/руководство?

Вот код для иллюстрации:

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

даже сейчас я подумал, может быть, если бы у меня не было пункта, а ячейка HorizontalAlignment установлена ​​на Element.ALIGN_JUSTIFIED, это может сработать, но это не так ... – CHarmon

ответ

0

я, наконец, нашел способ ... это 100% хак, и я, вероятно, следует перейти от использования таблицы в 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 

Я называю эту функцию для каждого пункта добавляется в ячейку в таблице; это необходимо, потому что я должен сделать размещение в других ячейках в таблице после этого. Clunky, но он работает (по крайней мере, до сих пор) в 100% случаев. Моя прежняя методология только работала примерно в 95% случаев :)

Смежные вопросы