2009-09-01 9 views
12

Ho un problema in cui ho una tabella (PdfPTable) che possono estendersi oltre la lunghezza della pagina. Ho provato a cercare come "dividere" un tavolo su più di una pagina, ma iTextSharp è piuttosto scarsamente documentato in quest'area. Qualcuno sa come farlo senza scegliere una posizione Y arbitraria sulla pagina e dirgli di dividere se è lì?iTextSharp: SplitLate/SplitRows?

Ho esaminato le proprietà SplitLate e SplitRows, ma non c'è documentazione su ciò che fanno. EDIT Non fanno nulla.

Grazie!

EDIT

sto cercando di tagliare il tavolo a metà nel senso della larghezza della tabella sarà sempre in base alla larghezza della pagina. Questo per dire che voglio che le righe che non si adattano verticalmente si estendano alla pagina successiva sotto di essa.

EDIT2

Ecco po 'di codice:

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 

risposta

3

Quando lavoravo con tavoli in iTextSharp, ho trovato questa risorsa utile:

iTextSharp Tutorial - Chapter 5: Tables

vedere la sezione intitolata 'Grandi tavoli'. Il tutorial include un esempio; Spero che tu non l'abbia visto prima.

Non ricordo le tabelle di divisione tra le pagine di essere un problema. Un problema che ho avuto, però, era che volevo individuale righe siano in grado di estendersi su più pagine. Per questo, ho impostato la proprietà SplitLate del mio PdfPTable su false.

Modifica
Ho controllato attraverso il vostro codice e confrontato al mio. La grande differenza che ho visto è che non sto aggiungendo il mio PdfPTable alla mia Document utilizzando il metodo PdfPTable.WriteSelectedRows(). Invece io chiamo il metodo 's il DocumentAdd(), passando nel mio PdfPTable con tutte le cellule set. (A proposito, carichiamo il nostro PdfPCells in modo simile.) Mi chiedo se uno PdfPTable scritto su un Document tramite WriteSelectedRows() causi il tuo problema.

si può anche vedere se il codice funziona se non si aggiunge il HeaderFooter.

+0

c'è qualche posto speciale in cui devi metterlo? come dopo aver scritto le righe, prima, dove? – Jason

+0

Scusa Jason, ho frainteso la tua domanda. Ho modificato la mia risposta che spero aiuti. –

+0

grazie per la modifica ... sì, ho passato il tutorial a 100x e senza risultati. Questo capitolo parla dell'utilizzo di tabelle semplici e ho bisogno di usare PdfPTable in modo da poterlo posizionare in modo assoluto. In questo momento il tavolo è appena uscito dal bordo della pagina, il che fa schifo ....: \ – Jason

29

È necessario aggiungere la tabella al documento utilizzando Document.Add() se si desidera dividere automaticamente le righe tra le pagine. Quindi SplitLate e SplitRows funzioneranno come previsto.

  1. Quando SplitLate = true (default) la tabella verrà diviso prima del riga successiva che non rientra nella pagina.
  2. Quando SplitLate = false la riga non si adatta completamente alla pagina verrà divisa.
  3. Quando SplitRows = true (impostazione predefinita) la riga che non rientra in una pagina verrà suddivisa.
  4. Quando SplitRows = false la riga verrà omessa.

Così

  • SplitLate && SplitRows: sarà avviato Una riga che non si adatta alla pagina nella pagina successiva e alla fine dividere, se non si adatta in quella pagina sia.

  • SplitLate && !SplitRows: Una riga che non si adatta alla pagina verrà avviata nella pagina successiva e omessa se non si adatta anche a quella pagina.

  • !SplitLate && SplitRows: una riga che non si adatta alla pagina verrà divisa e continuata nella pagina successiva e divisa nuovamente se troppo grande per la pagina successiva.

  • !SplitLate && !SplitRows: Sono un po 'incerto su questo. Ma dalle fonti sembra che sia lo stesso di SplitLate & &! SplitRows: una riga che non si adatta alla pagina verrà avviata nella pagina successiva e omessa se non si adatta anche a quella pagina.

Ma per quanto riguarda la tua domanda: Document.Add() sarà solo utilizzabile se la tabella non è necessario per essere posizionato in modo assoluto. Ma sembra che ci sia un modo per farlo anche aggiungendo la tabella ad un ColumnText (in realtà è un oggetto ColumnText che fa tutto il dividere la tabella) e quindi posizionando assolutamente quello ColumnText. Non l'ho ancora esaminato, ma lo farò non appena avrò ancora un po 'di tempo :)

+0

Sì. Questo può essere fatto. Vedere il metodo AddPTable() della classe PdfDocument nei sorgenti. Spero possa aiutare. – asgerhallas

+0

grazie per questa risposta, ma ho bisogno di posizionare assolutamente i miei tavoli. e come ho affermato nel mio ultimo commento per la risposta di @jay riggs, se non taglio il numero di prodotti ad un numero specifico, corro il rischio di dividere la mia tabella di calcoli su due pagine. quindi ... sì, grazie comunque :) – Jason

+0

Il tuo diritto. Non ho capito il tuo ultimo commento fino ad ora :) ... Ma per quanto riguarda la posizione assoluta, che può essere fatto, basta controllare come PdfPTable viene aggiunto al documento usando un ColumnText - che ti darà tutta la tabella automatica splitting AND il posizionamento assoluto. Ma se non ti serve, allora ... tienilo semplice :) – asgerhallas