16

我有一个问题,我有一个可能超出页面长度的表格 (PdfPTable)。我曾尝试查找如何将表格“拆分”到多个页面上,但 iTextSharp 在这方面的文档记录很差。有谁知道如何做到这一点而不选择页面上的任意 Y 位置并告诉它是否存在拆分?

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

谢谢!

编辑

我希望将表格横向切成两半,因为表格将始终适合页面的宽度。这就是说我希望垂直不适合的行扩展到它下面的下一页。

编辑2

这是一些代码:

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
4

2 回答 2

34

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

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

所以

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

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

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

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

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

于 2009-11-07T20:51:26.780 回答
3

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

iTextSharp 教程 - 第 5 章:表格

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

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

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

如果您不添加HeaderFooter.

于 2009-09-01T20:25:11.003 回答