2009-09-01 12 views
12

Tengo un problema donde tengo una tabla (PdfPTable) que puede extenderse más allá de la longitud de la página. He intentado buscar cómo "dividir" una tabla en más de una página, pero iTextSharp está bastante poco documentado en esta área. ¿Alguien sabe cómo hacer esto sin elegir una posición Y arbitraria en la página y decirle que se divida si está allí?iTextSharp: SplitLate/SplitRows?

Revisé las propiedades SplitLate y SplitRows, pero no hay documentación sobre lo que hacen. EDITAR No hacen nada.

Gracias!

EDITAR

Busco para cortar la tabla por la mitad a lo ancho como la tabla siempre se ajuste a lo ancho de la página. Esto quiere decir que quiero que las filas que no se ajustan verticalmente se extiendan a la siguiente página debajo de él.

Edit2

Aquí hay algo de código:

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 

Respuesta

3

Cuando estaba trabajando con mesas en iTextSharp, he encontrado este recurso útil:

iTextSharp Tutorial - Chapter 5: Tables

consulte la sección titulada 'Mesas grandes'. El tutorial incluye una muestra; Espero que no hayas visto esto antes.

No recuerdo que dividir tablas entre las páginas sea un problema. Sin embargo, un problema que tuve fue que quería filas individuales para poder abarcar páginas. Para esto, establecí la propiedad SplitLate de mi PdfPTable en falso.

Editar
Comprobé el código y lo comparé con el mío. La gran diferencia que vi fue que no estoy agregando mi PdfPTable a mi Document usando el método PdfPTable.WriteSelectedRows(). En su lugar, llamo al Document 'Add() método, pasando en mi PdfPTable con todas las células establecidas. (Por cierto cargamos nuestro PdfPCells de manera similar). Me pregunto si un PdfPTable escrito en Document a través de WriteSelectedRows() está causando su problema.

También puede ver si su código funciona si no agrega el HeaderFooter.

+0

¿Hay algún lugar especial que deba poner eso en el proceso? como después de escribir las filas, antes, ¿dónde? – Jason

+0

Lo siento, Jason, he entendido mal tu pregunta. Edité mi resonse, que espero sirva de ayuda. –

+0

gracias por la edición ... sí, he pasado por ese tutorial 100 veces y fue en vano. Ese capítulo habla sobre el uso de tablas simples, y necesito usar el PdfPTable para poder posicionarlo absolutamente. En este momento la tabla que acabo de ejecutar justo al borde de la página, que es una mierda ...: \ – Jason

29

Debe agregar la tabla al documento usando Document.Add() si desea la división automática de las filas en las páginas. Luego, SplitLate y SplitRows funcionarán como se esperaba.

  1. Cuando SplitLate = true (por defecto) de la mesa se dividirá antes de la siguiente fila que no cabe en la página.
  2. Cuando SplitLate = false la fila que no encaja completamente en la página se dividirá.
  3. Cuando SplitRows = true (predeterminado) se dividirá la fila que no se ajusta a una página.
  4. Cuando SplitRows = false se omitirá la fila.

Así

  • SplitLate && SplitRows: Una fila que no cabe en la página se iniciará en la página siguiente y, finalmente, se dividió si no encaja en esa página tampoco.

  • SplitLate && !SplitRows: Una fila que no se ajusta a la página se iniciará en la página siguiente y se omitirá si no cabe en esa página tampoco.

  • !SplitLate && SplitRows: Una fila que no se ajusta a la página se dividirá y continuará en la página siguiente y se dividirá nuevamente si es demasiado grande para la página siguiente también.

  • !SplitLate && !SplitRows: Estoy un poco inseguro acerca de esto. Pero desde las fuentes parece que es lo mismo que SplitLate & &! SplitRows: una fila que no cabe en la página se iniciará en la página siguiente y se omite si no cabe en esa página tampoco.

Pero en cuanto a su pregunta: Document.Add() solo se podrán utilizar si no se necesita la mesa para ser absolutamente posicionado. Pero parece que hay una forma de hacerlo agregando la tabla a un ColumnText (en realidad es un objeto ColumnText que divide toda la tabla) y luego colocando ese ColumnText. No lo he investigado aún, pero lo haré tan pronto como tenga un poco más de tiempo :)

+0

Sí. Eso se puede hacer. Vea el método AddPTable() de la clase PdfDocument en las fuentes. Espero que ayude. – asgerhallas

+0

gracias por esta respuesta, pero necesito posicionar absolutamente mis tablas. y como indiqué en mi último comentario para la respuesta de @jay riggs, si no corto el número de productos en un número específico, corro el riesgo de que mi tabla de cálculos se divida en dos páginas. así que ... sí, gracias de todos modos :) – Jason

+0

Su derecho. No entendí tu último comentario hasta ahora :) ... Pero en cuanto a la posición absoluta, eso se puede hacer, solo mira cómo se agrega el documento PDF al documento usando un texto de columna, que te dará toda la tabla automática división Y el posicionamiento absoluto. Pero si no lo necesita, entonces ... manténgalo simple :) – asgerhallas