Подтвердить что ты не робот

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
4b9b3361

Ответ 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.