iTextSharp: SplitLate/SplitRows?
Ich habe ein Problem ich habe eine Tabelle (PdfPTable), die möglicherweise erstrecken sich die Vergangenheit der Länge der Seite. Ich habe versucht, auf der Suche, wie man "split", eine Tabelle auf mehr als eine Seite, aber iTextSharp ist ziemlich schlecht dokumentiert in diesem Bereich. Weiß jemand, wie dies zu tun, ohne Wahl einer beliebigen Y-position auf der Seite und ihm sagen, es zu teilen wenn es da ist?
Schaute ich in das SplitLate
und SplitRows
Eigenschaften, aber es gibt keine Dokumentation, was diese tun. BEARBEITEN Sie nichts zu tun.
Dank!
BEARBEITEN
Ich bin auf der Suche, um schneiden Sie die Tabelle in der Hälfte horizontal wie aus der Tabelle wird immer die Breite der Seite. Dies ist zu sagen, dass ich will, dass die Zeilen, die nicht passen, vertikal zu erweitern, um die nächste Seite unten.
EDIT2
Hier einige code:
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
InformationsquelleAutor Jason | 2009-09-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie die Tabelle, um das Dokument mit
Document.Add()
wenn Sie möchten, dass die automatische Aufteilung von Zeilen über mehrere Seiten. DannSplitLate
undSplitRows
wie erwartet funktionieren wird.SplitLate = true
(default) wird die Tabelle geteilt werden, bevor dienächste Zeile nicht auf die Seite passen.
SplitLate = false
die Zeilenicht ganz fit auf der Seite aufgeteilt werden soll.
SplitRows =
(Standard) die Zeile, die passt nicht auf eine Seite aufgeteilt werden soll.true
SplitRows = false
wird die Zeile weggelassen werden.So
SplitLate && SplitRows
: Eine Zeile, die passt nicht auf die Seite, gestartet wird auf der nächsten Seite und trennten sich schließlich, wenn es nicht passen auf dieser Seite.SplitLate && !SplitRows
: Eine Zeile, die passt nicht auf die Seite, gestartet wird auf der nächsten Seite und weggelassen, wenn es nicht passen auf dieser Seite.!SplitLate && SplitRows
: Eine Zeile, die passt nicht auf die Seite aufgeteilt werden soll und Fortsetzung auf der nächsten Seite und teilen Sie Sie erneut, wenn es zu groß ist, um die nächste Seite zu.!SplitLate && !SplitRows
: Ich bin ein wenig unsicher über diese. Aber aus den Quellen, wie es aussieht ist es das gleiche wie SplitLate && !SplitRows: Eine Zeile, die passt nicht auf die Seite, gestartet wird auf der nächsten Seite und weggelassen, wenn es nicht passen auf dieser Seite.Aber für deine Frage:
Document.Add()
nur verwendbar, wenn der Tisch nicht benötigt werden absolut positioniert. Aber es scheint, wie es ist ein Weg, es zu tun, obwohl das hinzufügen der Tabelle einenColumnText
(es ist eigentlich einColumnText
Objekt, dass nicht alle die splitting-Tabelle) und dann absolut positionieren, dassColumnText
. Ich habe nicht hingeschaut, aber ich werde sobald ich ein wenig mehr Zeit 🙂vielen Dank für diese Antwort, aber ich brauche unbedingt meine position von Tabellen. und wie ich bereits in meinem letzten Kommentar für @jay riggs' Antwort, wenn ich nicht schneiden Sie die Anzahl der Produkte, die-off an eine bestimmte Nummer, ich Laufe Gefahr, dass meine Berechnungen Tabelle aufgeteilt auf zwei Seiten. so... ja, trotzdem danke 🙂
Ihr Recht. Ich Verstand nicht, Ihren letzten Kommentar erst jetzt 🙂 ... Aber für die absolute position, die gemacht werden können, nur überprüfen, wie sich die PdfPTable wird Hinzugefügt, um das Dokument mit einem ColumnText - das wird Ihnen allen automatischen Tisch-splitting UND die absolute Positionierung. Aber wenn Sie nicht brauchen, dann ... halten Sie es einfach 🙂
... zwei Jahre später: ich meinte "du bist" natürlich!
Ich denke, es braucht eine Korrektur, um
SplitRows
wie "WennSplitRows = true
wenn eine Zeile am Ende einer Seite kann nicht passen Sie innerhalb es, es verteilt ist auf der nächsten Seite. Besonders deutlich wird dies in Fällen von Zeilen, die mehrere Zeilen von Daten, da diese Daten bekommt, verteilt über mehrere Seiten."InformationsquelleAutor asgerhallas
Wenn ich auf Arbeit mit Tabellen in iTextSharp, ich fand diese Ressource nützlich:
iTextSharp-Tutorial - Kapitel 5: Tabellen
Finden Sie im Abschnitt mit dem Titel "Große Tabellen'. Das Lernprogramm beinhaltet eine Probe; ich hoffe, dass Sie noch nicht mal gesehen.
Ich erinnere mich nicht aufteilen von Tabellen über mehrere Seiten ein Problem. Ein problem, das ich habe, allerdings wollte ich die einzelnen Zeilen zu können, werden mehrere Seiten erstrecken. Für diese, habe ich den
SplitLate
Eigentum meinesPdfPTable
auf false.Bearbeiten
Ich überprüfte durch Ihren code und den Vergleich zu mir. Der große Unterschied, den ich sah, war, dass ich nicht hinzufügen meine
PdfPTable
zu meinemDocument
mit derPdfPTable.WriteSelectedRows()
Methode. Stattdessen nenne ich dieDocument
'sAdd()
- Methode auf, wobei in meinemPdfPTable
mit allen Zellen gesetzt. (BTW laden wir unserePdfPCells
in ähnlicher Weise.) Ich Frage mich, ob einPdfPTable
geschriebenDocument
überWriteSelectedRows()
ist die Ursache Ihres Problems.Können Sie auch sehen, ob Ihr code funktioniert, wenn Sie nicht hinzufügen die
HeaderFooter
.Sorry Jason, ich habe deine Frage missverstanden. Ich habe mein edit Reaktionen, die ich hoffe hilft.
danke für das edit... ja ich habe durch das tutorial 100x und ohne Erfolg. Das Kapitel spricht über die Verwendung von einfachen Tabellen, und ich muss an die PdfPTable so, dass ich absolut positionieren. Jetzt die Tabelle, ich habe gerade läuft rechts aus dem Rand der Seite, das nervt.... :\
Setzen Sie die Seitenränder Ihres Dokuments?
yep:
Dim doc As New Document(PageSize.LETTER, 0, 0, 0, BOTTOM_MARGIN)
woBOTTOM_MARGIN
36InformationsquelleAutor Jay Riggs