ITextSharp: SplitLate/SplitRows?
У меня проблема, когда у меня есть таблица (PdfPTable), которая может простираться за длину страницы. Я попытался посмотреть, как "разбить" таблицу на несколько страниц, но iTextSharp довольно плохо документирован в этой области. Кто-нибудь знает, как это сделать, не выбирая произвольную позицию Y на странице и предлагая ее разделить, если она там?
Я просмотрел свойства SplitLate
и SplitRows
, но нет документации о том, что они делают. EDIT Они ничего не делают.
Спасибо!
ИЗМЕНИТЬ
Я хочу сократить стол пополам, так как таблица всегда будет соответствовать ширине страницы. Это означает, что я хочу, чтобы строки, которые не соответствуют вертикали, расширяются до следующей страницы ниже.
EDIT2
Вот код:
Public Sub BuildPrintableDocument
Dim doc As New Document(PageSize.LETTER, 0, 0, 0, BOTTOM_MARGIN)
Dim writer As PdfWriter = PdfWriter.GetInstance(doc, _
New FileStream("invoice.pdf", FileMode.Create)
Dim footer As New HeaderFooter(New Phrase("www.columbussupply.com", _
footerFont), False)
footer.Border = Rectangle.NO_BORDER
footer.Alignment = HeaderFooter.ALIGN_CENTER
doc.Footer = footer
doc.Open()
....
Dim items As PdfPTable = NewItemTable()
Dim count As Integer = 0
For Each oi As OrderItem In TheInvoice.Items
If oi.Status <> OrderItem.OrderItemStatus.Cancelled Then
Dim qty As New PdfPCell(New Phrase(oi.Quantity, mainFont))
qty.HorizontalAlignment = Element.ALIGN_CENTER
qty.Padding = ITEMS_PADDING
'...instantiate 3 other cells here (removed for repetitiveness)'
items.AddCell(qty)
items.AddCell(desc)
items.AddCell(price)
items.AddCell(total)
End If
Next
items.WriteSelectedRows(0, -1, LEFT_MARGIN, GetItemsStartY, _
writer.DirectContent)
End Sub
Protected Function NewItemTable() As PdfPTable
Dim items As PdfPTable = New PdfPTable(4)
Dim headers() As String = {"QTY", "DESCRIPTION", "PRICE", "TOTAL"}
For Each s As String In headers
Dim cell As New PdfPCell(New Phrase(s, mainFont))
cell.HorizontalAlignment = Element.ALIGN_CENTER
items.AddCell(cell)
Next
items.TotalWidth = ITEMS_TOTAL_WIDTH
items.SetWidths(New Single() {QTY_COL_WIDTH, DESC_COL_WIDTH, _
PRICE_COL_WIDTH, TOTALS_COL_WIDTH})
Return items
End Function
Ответы
Ответ 1
Вы должны добавить таблицу в документ, используя Document.Add()
, если вы хотите автоматическое разделение строк на разных страницах. Тогда SplitLate
и SplitRows
будут работать как ожидалось.
- Когда
SplitLate = true
(по умолчанию), таблица будет разделена до
следующая строка, которая подходит для этой страницы.
- Когда
SplitLate = false
строка
который не полностью вписывается на страницу, будет разделен.
- Когда
SplitRows =
true
(по умолчанию), строка, которая не помещается на странице, будет разделена.
- Когда
SplitRows = false
строка будет опущена.
So
-
SplitLate && SplitRows
: Строка, которая не помещается на странице, будет запущена на следующей странице и, в конце концов, будет разбита, если она не подходит на этой странице.
-
SplitLate && !SplitRows
: Строка, которая не помещается на странице, будет запущена на следующей странице и опущена, если она не помещается на этой странице.
-
!SplitLate && SplitRows
: Строка, которая не помещается на странице, будет разделена и продолжена на следующей странице и снова будет разбита, если она слишком велика для следующей страницы.
-
!SplitLate && !SplitRows
: Я немного не уверен в этом. Но из источников он выглядит так же, как SplitLate & &! SplitRows: строка, которая не помещается на странице, будет запущена на следующей странице и опущена, если она не подходит на этой странице.
Но что касается вашего вопроса: Document.Add()
будет использоваться только в том случае, если таблица не нужна, чтобы быть абсолютно позиционированной. Но похоже, что есть способ сделать это, добавив таблицу в ColumnText
(это фактически объект ColumnText
, который выполняет все расщепление таблицы), а затем абсолютно позиционирует это ColumnText
. Я еще не заглянул в нее, но как только я получу еще немного времени:)
Ответ 2
Когда я работал с таблицами в iTextSharp, я нашел этот ресурс полезным:
Учебник iTextSharp - Глава 5: Таблицы
См. раздел "Большие таблицы". Учебник включает образец; Надеюсь, вы этого раньше не видели.
Я не помню, чтобы разбивка таблиц на разных страницах была проблемой. Проблема, которая у меня была, была связана с тем, что я хотел, чтобы отдельные строки могли охватывать страницы. Для этого я установил свойство SplitLate
моего PdfPTable
в false.
Edit
Я проверил ваш код и сравнил его с моим. Большая разница, которую я видел, заключалась в том, что я не добавляю свой PdfPTable
к моему Document
с помощью метода PdfPTable.WriteSelectedRows()
. Вместо этого я вызываю метод Document
Add()
, передавая в моем PdfPTable
все установленные ячейки. (BTW мы загружаем наш PdfPCells
аналогичным образом.) Интересно, вызывает ли ваша проблема PdfPTable
, записанная в Document
через WriteSelectedRows()
.
Вы также можете увидеть, работает ли ваш код, если вы не добавляете HeaderFooter
.