Jas*_*son 13 split page-break itextsharp pdfptable
我有一个问题,我有一个表(PdfPTable)可能会超出页面的长度.我试过查找如何将一个表"拆分"到一个以上的页面,但iTextSharp在这方面的记录非常糟糕.有没有人知道如何做到这一点,而不是在页面上选择一个任意的Y位置并告诉它如果在那里分开?
我查看了SplitLate和SplitRows属性,但没有关于这些做什么的文档.编辑他们什么都不做.
谢谢!
编辑
我希望在宽度方向上将桌子切成两半,因为桌子总是适合页面的宽度.这就是说我希望垂直不适合的行延伸到它下面的下一页.
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将按预期工作.
SplitLate = true(默认)表将在适合页面的下一行之前拆分.SplitLate = false不完全适合页面的行将被拆分.SplitRows =
true(默认)时,将拆分不适合页面的行.SplitRows = false该行将被省略.所以
SplitLate && SplitRows:不适合页面的行将在下一页上启动,如果它也不适合该页面,则最终会拆分.
SplitLate && !SplitRows:不适合页面的行将在下一页开始,如果它也不适合该页面,则省略.
!SplitLate && SplitRows:不适合页面的行将被拆分并在下一页继续,如果它对于下一页太大,则会再次拆分.
!SplitLate && !SplitRows:我对这个有点不确定.但是从源代码来看,它看起来与SplitLate &&相同!SplitRows:在页面上不适合的行将在下一页开始,如果它也不适合该页面则省略.
但至于你的问题:Document.Add()只有在不需要绝对定位表时才能使用.但似乎有一种方法可以通过将表添加到一个ColumnText(它实际上是一个ColumnText完成所有表拆分的对象),然后绝对定位它ColumnText.我还没有调查过,但是我会尽快得到一点时间:)
当我在 iTextSharp 中使用表格时,我发现这个资源很有用:
请参阅标题为“大表”的部分。本教程包括一个示例;我希望你以前没有见过这个。
我不记得跨页面拆分表格是一个问题。但我确实遇到的一个问题是我希望各个行能够跨越页面。为此,我将SplitLatemy 的属性设置PdfPTable为 false。
编辑
我检查了你的代码并将其与我的进行了比较。我看到的最大区别是我没有将我的方法添加PdfPTable到我的Document使用方法中PdfPTable.WriteSelectedRows()。相反,我调用DocumentsAdd()方法,传入 myPdfPTable以及所有单元格集。(顺便说一句,我们PdfPCells以类似的方式加载。)我想知道PdfPTable写入过Document孔是否WriteSelectedRows()会导致您的问题。
如果不添加HeaderFooter.