iTextSharp:SplitLate/SplitRows?

Jas*_*son 13 split page-break itextsharp pdfptable

我有一个问题,我有一个表(PdfPTable)可能会超出页面的长度.我试过查找如何将一个表"拆分"到一个以上的页面,但iTextSharp在这方面的记录非常糟糕.有没有人知道如何做到这一点,而不是在页面上选择一个任意的Y位置并告诉它如果在那里分开?

我查看了SplitLateSplitRows属性,但没有关于这些做什么的文档.编辑他们什么都不做.

谢谢!

编辑

我希望在宽度方向上将桌子切成两半,因为桌子总是适合页面的宽度.这就是说我希望垂直不适合的行延伸到它下面的下一页.

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
Run Code Online (Sandbox Code Playgroud)

asg*_*las 31

Document.Add()如果要跨页面自动拆分行,则应使用表格将其添加到文档中.然后SplitLate,SplitRows将按预期工作.

  1. SplitLate = true(默认)表将在适合页面的下一行之前拆分.
  2. SplitLate = false不完全适合页面的行将被拆分.
  3. SplitRows = true(默认)时,将拆分不适合页面的行.
  4. SplitRows = false该行将被省略.

所以

  • SplitLate && SplitRows:不适合页面的行将在下一页上启动,如果它也不适合该页面,则最终会拆分.

  • SplitLate && !SplitRows:不适合页面的行将在下一页开始,如果它也不适合该页面,则省略.

  • !SplitLate && SplitRows:不适合页面的行将被拆分并在下一页继续,如果它对于下一页太大,则会再次拆分.

  • !SplitLate && !SplitRows:我对这个有点不确定.但是从源代码来看,它看起来与SplitLate &&相同!SplitRows:在页面上不适合的行将在下一页开始,如果它也不适合该页面则省略.

但至于你的问题:Document.Add()只有在不需要绝对定位表时才能使用.但似乎有一种方法可以通过将表添加到一个ColumnText(它实际上是一个ColumnText完成所有表拆分的对象),然后绝对定位它ColumnText.我还没有调查过,但是我会尽快得到一点时间:)

  • ......两年后:我的意思是"你当然"! (2认同)

Jay*_*ggs 3

当我在 iTextSharp 中使用表格时,我发现这个资源很有用:

iTextSharp 教程 - 第 5 章:表格

请参阅标题为“大表”的部分。本教程包括一个示例;我希望你以前没有见过这个。

我不记得跨页面拆分表格是一个问题。但我确实遇到的一个问题是我希望各个能够跨越页面。为此,我将SplitLatemy 的属性设置PdfPTable为 false。

编辑
我检查了你的代码并将其与我的进行了比较。我看到的最大区别是我没有将我的方法添加PdfPTable到我的Document使用方法中PdfPTable.WriteSelectedRows()。相反,我调用DocumentsAdd()方法,传入 myPdfPTable以及所有单元格集。(顺便说一句,我们PdfPCells以类似的方式加载。)我想知道PdfPTable写入过Document孔是否WriteSelectedRows()会导致您的问题。

如果不添加HeaderFooter.