【问题标题】:iTextSharp: SplitLate/SplitRows?iTextSharp:SplitLate/SplitRows?
【发布时间】:2010-11-24 18:23:46
【问题描述】:

我有一个问题,我的表格 (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

【问题讨论】:

    标签: split itextsharp page-break pdfptable


    【解决方案1】:

    如果您想跨页自动拆分行,您应该使用Document.Add() 将表格添加到文档中。然后SplitLateSplitRows 将按预期工作。

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

    所以

    • SplitLate &amp;&amp; SplitRows:不适合页面的行将从下一页开始,如果该页面也不适合,则最终拆分。

    • SplitLate &amp;&amp; !SplitRows:不适合该页面的行将从下一页开始,如果该行也不适合该页面,则将其省略。

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

    • !SplitLate &amp;&amp; !SplitRows:我有点不确定这个。但从消息来源看来,它与 SplitLate && !SplitRows 相同:不适合页面的行将从下一页开始,如果也不适合该页面,则将其省略。

      李>

    但至于您的问题:Document.Add() 仅在不需要绝对定位表格的情况下才可用。但似乎有一种方法可以通过将表添加到ColumnText(它实际上是一个执行所有表拆分的ColumnText 对象)然后绝对定位ColumnText。我还没有研究它,但我会尽快获得更多时间:)

    【讨论】:

    • 是的。这是可以做到的。请参阅源代码中 PdfDocument 类的 AddPTable() 方法。希望对您有所帮助。
    • 感谢您的回答,但我需要绝对定位我的桌子。正如我在对@jay riggs 回答的最后评论中所说的那样,如果我不将产品数量减少到特定数量,我就会冒着将计算表分成两页的风险。所以...是的,无论如何谢谢:)
    • 您的权利。直到现在我才理解您的最后评论:) ...但是至于绝对位置,可以这样做,只需检查如何使用 ColumnText 将 PdfPTable 添加到文档中-这将为您提供所有自动表格分裂和绝对定位。但如果你不需要,那么......保持简单:)
    • @asgerhallas - 我认为需要将SplitRows 更正为“当SplitRows = true 时,如果页面末尾的一行无法放入其中,则将其拆分为到下一页。这在包含多行数据的行的情况下很明显,因为这些数据被拆分到多个页面中。"
    • @bPratik 我不确定我是否理解有什么不同。它是“只是”澄清/更好的措辞还是当前文本中的实际事实错误?我完全赞成解决这两个问题:)
    【解决方案2】:

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

    iTextSharp Tutorial - Chapter 5: Tables

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

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

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

    如果不添加HeaderFooter,您也可以查看您的代码是否有效。

    【讨论】:

    • 在这个过程中有什么特别的地方你必须把它放进去吗?比如你写了行之后,之前,在哪里?
    • 对不起,杰森,我误解了你的问题。我确实编辑了我的共鸣,希望对您有所帮助。
    • 感谢您的编辑...是的,我已经通过该教程 100 倍,但无济于事。那一章讲的是使用简单的表格,我需要使用 PdfPTable 才能绝对定位它。现在我刚刚运行的表格就在页面边缘,这很糟糕....:\
    • 您是否设置了文档的边距?
    • 是的:Dim doc As New Document(PageSize.LETTER, 0, 0, 0, BOTTOM_MARGIN) 其中BOTTOM_MARGIN 是 36