2009-09-01 7 views
12

J'ai un problème où j'ai une table (PdfPTable) qui peut dépasser la longueur de la page. J'ai essayé de "diviser" une table sur plus d'une page, mais iTextSharp est assez mal documenté dans ce domaine. Est-ce que quelqu'un sait comment faire cela sans choisir une position Y arbitraire sur la page et lui dire de se séparer si c'est là? J'ai examiné les propriétés SplitLate et SplitRows, mais il n'y a pas de documentation sur ce qu'elles font. EDIT Ils ne font rien.iTextSharp: SplitLate/SplitRows?

Merci!

EDIT

Je cherche à couper la table en demi-largeur que la table sera toujours adapté à la largeur de la page. C'est-à-dire que je veux que les lignes qui ne tiennent pas verticalement s'étendent à la page suivante en dessous.

EDIT2

Voici quelques 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 

Répondre

3

Quand je travaillais avec des tables à iTextSharp, je trouve cette ressource utile:

iTextSharp Tutorial - Chapter 5: Tables

Voir la section intitulée "Grandes tables". Le tutoriel comprend un échantillon; J'espère que tu n'as pas vu ça avant.

Je ne me souviens pas d'avoir divisé des tables sur plusieurs pages. Un problème que j'ai eu était cependant que je voulais lignes individuelles pour être en mesure d'étendre les pages. Pour cela, j'ai défini la propriété SplitLate de ma PdfPTable sur false.

Modifier
J'ai vérifié votre code et je l'ai comparé au mien. La grande différence que j'ai vu était que je n'ajoute pas mon PdfPTable à mon Document en utilisant la méthode PdfPTable.WriteSelectedRows(). Au lieu de cela, j'appelle la méthode Add() de Document, en passant dans mon PdfPTable avec toutes les cellules définies. (BTW, nous chargeons notre PdfPCells d'une manière similaire.) Je me demande si un PdfPTable écrit à un Document via WriteSelectedRows() est à l'origine de votre problème.

Vous pouvez également voir si votre code fonctionne si vous n'ajoutez pas le HeaderFooter.

+0

Y at-il un endroit spécial où vous devez mettre cela dans le processus? comme après avoir écrit les lignes, avant, où? – Jason

+0

Désolé Jason, j'ai mal compris votre question. J'ai édité ma réponse qui, je l'espère, aide. –

+0

merci pour le montage ... ouais j'ai été à travers ce tutoriel 100x et en vain. Ce chapitre parle d'utiliser des tables simples, et j'ai besoin d'utiliser le PdfPTable pour pouvoir le positionner absolument. En ce moment la table que je viens de courir juste au bord de la page, qui suce ....: \ – Jason

29

Vous devez ajouter la table au document à l'aide de Document.Add() si vous souhaitez diviser automatiquement les lignes sur plusieurs pages. Puis SplitLate et SplitRows fonctionnera comme prévu.

  1. Lorsque SplitLate = true (par défaut), le tableau sera divisé en deux avant la ligne suivante qui ne correspond à la page.
  2. Lorsque SplitLate = false la ligne qui ne correspond pas entièrement à la page sera divisée.
  3. Lorsque SplitRows = true (par défaut) la ligne qui ne tient pas sur une page sera fractionnée.
  4. Lorsque SplitRows = false la ligne sera omise.

Alors

  • SplitLate && SplitRows: Une ligne qui ne tient pas sur la page sera lancée à la page suivante et éventuellement divisé si elle ne correspond pas à cette page soit.

  • SplitLate && !SplitRows: Une ligne qui ne rentre pas sur la page sera démarrée à la page suivante et omise si elle ne rentre pas non plus sur cette page.

  • !SplitLate && SplitRows: Une ligne qui ne rentre pas sur la page sera divisée et poursuivie sur la page suivante et divisée à nouveau si elle est trop grande pour la page suivante.

  • !SplitLate && !SplitRows: Je suis un peu incertain à propos de celui-ci. Mais à partir des sources, il semble que c'est la même chose que SplitLate & &! SplitRows: Une ligne qui ne rentre pas dans la page sera démarrée sur la page suivante et omise si elle ne rentre pas sur cette page non plus.

Mais comme pour votre question: Document.Add() ne sera utilisable que si la table n'est pas nécessaire pour être placé de façon absolue. Mais il semble qu'il y ait un moyen de le faire en ajoutant la table à un ColumnText (c'est en fait un objet ColumnText qui fait tout le fractionnement de la table) et en positionnant absolument ColumnText. Je ne l'ai pas encore examiné, mais je le ferai dès que j'aurai un peu plus de temps :)

+0

Oui. Cela peut être fait. Voir la méthode AddPTable() de la classe PdfDocument dans les sources. J'espère que cela pourra aider. – asgerhallas

+0

merci pour cette réponse mais j'ai besoin de positionner absolument mes tables. et comme je l'ai dit dans mon dernier commentaire pour la réponse de @jay riggs, si je ne coupe pas le nombre de produits à un nombre spécifique, je risque de voir ma table de calcul divisée en deux pages. alors ... oui, merci quand même :) – Jason

+0

Ta droite. Je n'ai pas compris votre dernier commentaire jusqu'à maintenant :) ... Mais quant à la position absolue, cela peut être fait, il suffit de vérifier comment le PdfPTable est ajouté au document en utilisant un ColumnText - qui vous donnera toute la table automatique division et le positionnement absolu. Mais si tu n'en as pas besoin, alors ... reste simple :) – asgerhallas