iTextSharp: SplitLate / SplitRows?
J'ai un problème lorsque j'ai une table (PdfPTable) qui peut s'étendre au-delà de la longueur de la page. J'ai essayé de regarder comment "split" une table sur plus d'une page, mais iTextSharp est assez mal documentée dans ce domaine. Personne ne sait comment le faire sans le choix d'un arbitraire Y position sur la page, et le raconter à split si il y a quelqu'un?
J'ai regardé dans le SplitLate
et SplitRows
propriétés, mais il n'y a pas de documentation sur ce que ces faire. MODIFIER Ils ne font rien.
Merci!
MODIFIER
Je suis à la recherche de couper le tableau en demi-sens de la largeur comme la table sera toujours s'adapter à la largeur de la page. C'est-à-dire que je veux les lignes qui ne correspondent pas à la verticale pour s'étendre à la page suivante ci-dessous.
EDIT2
Voici un 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
source d'informationauteur Jason | 2009-09-01
Vous devez vous connecter pour publier un commentaire.
Vous devez ajouter de la table pour le document à l'aide de
Document.Add()
si vous souhaitez automatique de fractionnement des lignes sur plusieurs pages. PuisSplitLate
etSplitRows
fonctionnera comme prévu.SplitLate = true
(par défaut), le tableau sera split avant lela ligne suivante qui ne s'ajuster à la page.
SplitLate = false
la lignequi n'est pas en pleine forme sur la page de split.
SplitRows =
(par défaut) la ligne qui ne tient pas sur une page sera divisé.true
SplitRows = false
la ligne sera omis.Donc
SplitLate && SplitRows
: Une ligne qui ne tient pas sur la page sera lancé sur la page suivante et, éventuellement fractionné si elle ne tient pas sur cette page.SplitLate && !SplitRows
: Une ligne qui ne tient pas sur la page sera lancé sur la page suivante et omis si elle ne convient pas sur cette page.!SplitLate && SplitRows
: Une ligne qui ne tient pas sur la page de split et a continué sur la page suivante et de diviser à nouveau si elle trop grande pour la page suivante.!SplitLate && !SplitRows
: J'ai un peu de doute à ce sujet. Mais à partir des sources, on dirait que c'est la même chose que SplitLate && !SplitRows: Une ligne qui ne tient pas sur la page sera lancé sur la page suivante et omis si elle ne convient pas sur cette page.Mais pour votre question:
Document.Add()
ne seront utilisables si le tableau n'est pas nécessaire d'être en position absolue. Mais il semble qu'il y est un moyen de le faire, mais par l'ajout de la table pour unColumnText
(c'est en fait unColumnText
objet qui fait tout le tableau de fractionnement) et puis absolument positionnement de laColumnText
. Je n'ai pas regardé encore, mais je le ferai dès que j'ai un peu plus de temps 🙂Lorsque je travaillais avec des tables en iTextSharp, j'ai trouvé cette ressource utile:
iTextSharp Tutoriel - Chapitre 5: les Tableaux
Voir la section intitulée "les Grandes tables". Le tutoriel comprend un échantillon; j'espère que vous n'avez pas vu cela avant.
Je ne me souviens pas de fractionnement de tableaux sur plusieurs pages d'un problème. Un problème, j'ai bien étais-je souhaitais que les lignes pour être en mesure de durée de pages. Pour cela, j'ai mis le
SplitLate
propriété de monPdfPTable
à false.Modifier
J'ai vérifié à l'aide de votre code et l'a comparé à la mienne. La grosse différence que j'ai vu, c'est que je ne suis pas l'ajout de mon
PdfPTable
à monDocument
à l'aide de laPdfPTable.WriteSelectedRows()
méthode. Au lieu de cela, j'appelle laDocument
'sAdd()
méthode, en passant dans monPdfPTable
avec toutes les cellules ensemble. (BTW nous charger de notrePdfPCells
d'une manière similaire.) Je me demande si unPdfPTable
écrit à unDocument
viaWriteSelectedRows()
est à l'origine de votre problème.Vous pouvez également voir si votre code fonctionne si vous n'ajoutez pas de
HeaderFooter
.