2009-09-01 10 views
12

Mam problem, w którym mam tabelę (PdfPTable), która może rozciągać się poza długość strony. Próbowałem już sprawdzić, jak "podzielić" tabelę na więcej niż jedną stronę, ale iTextSharp jest dość słabo udokumentowany w tej dziedzinie. Czy ktoś wie, jak to zrobić, nie wybierając arbitralnej pozycji Y na stronie i nakazując jej podzielenie, jeśli tam jest?iTextSharp: SplitLate/SplitRows?

Zajrzałem do właściwości SplitLate i SplitRows, ale nie ma dokumentacji na temat tego, co one robią. EDYCJA Nic nie robią.

Dzięki!

EDIT

szukam przeciąć na pół wszerz tabeli jako tabeli zawsze dopasować szerokość strony. To znaczy, że chcę, aby wiersze, które nie pasują pionowo, rozciągały się na następną stronę pod nim.

EDIT2

Oto niektóre kodu:

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 

Odpowiedz

3

Kiedy pracowałem z tabelami w iTextSharp, znalazłem ten zasób przydatne:

iTextSharp Tutorial - Chapter 5: Tables

patrz rozdział zatytułowany "Duże stoły". Samouczek zawiera próbkę; Mam nadzieję, że nie widziałeś tego wcześniej.

Nie przypominam sobie dzielenia tabel na strony stanowiące problem. Problemem, który miałem, było jednak to, że chciałem, aby poszczególne modele były w stanie rozciągać strony. W tym celu ustawiam SplitLate właściwość mojego PdfPTable na wartość false.

Edit
sprawdziłem przez kod i porównał go do kopalni. Ogromną różnicą, jaką zauważyłem, było to, że nie dodawam mojego PdfPTable do mojego Document przy użyciu metody PdfPTable.WriteSelectedRows(). Zamiast tego wzywam metodę , przekazując w moim PdfPTable wszystkie ustawione komórki. (BTW ładujemy nasze PdfPCells w podobny sposób.) Zastanawiam się, czy PdfPTable napisane na Document przez WriteSelectedRows() powoduje problem.

Możesz również sprawdzić, czy Twój kod działa, jeśli nie dodasz HeaderFooter.

+0

Czy jest jakieś specjalne miejsce, które trzeba w to włożyć? jak po napisaniu wierszy, wcześniej, gdzie? – Jason

+0

Przepraszam Jason, źle zrozumiałem twoje pytanie. Zmontowałem moją odpowiedź, która, mam nadzieję, pomaga. –

+0

dzięki za edycję ... tak, przeżyłem ten samouczek 100x i na próżno. Ten rozdział mówi o używaniu prostych tabel i muszę użyć PdfPTable, aby móc go całkowicie ustawić. W tej chwili tabela, którą właśnie uruchomiłem tuż przy krawędzi strony, jest do bani ...: \ – Jason

29

Powinieneś dodać tabelę do dokumentu, używając Document.Add(), jeśli chcesz automatycznie podzielić wiersze na strony. Wtedy SplitLate i SplitRows będą działać zgodnie z oczekiwaniami.

  1. Kiedy SplitLate = true (domyślne) tabela zostanie podzielona przed następnego wiersza, który nie zmieścił się na stronie.
  2. Po wierszu SplitLate = false wiersz, który nie jest w pełni dopasowany do strony, zostanie podzielony.
  3. Po SplitRows = true (domyślnie) wiersz, który nie mieści się na stronie, zostanie podzielony.
  4. Po SplitRows = false wiersz zostanie pominięty.

Więc

  • SplitLate && SplitRows: wiersz, który nie mieści się na stronie zostanie uruchomiona na następnej stronie i ostatecznie podzielone, jeśli nie mieści się na tej stronie albo.

  • SplitLate && !SplitRows: Wiersz, który nie mieści się na stronie, zostanie uruchomiony na następnej stronie i pominięty, jeśli nie mieści się na tej stronie.

  • !SplitLate && SplitRows: Rząd, który nie mieści się na stronie, zostanie podzielony i będzie kontynuowany na następnej stronie, a następnie ponownie podzielony, jeśli jest zbyt duży również dla następnej strony.

  • !SplitLate && !SplitRows: Nie mam pewności co do tego. Ale ze źródeł wygląda tak samo, jak SplitLate & &! SplitRows: Wiersz, który nie mieści się na stronie, zostanie uruchomiony na następnej stronie i pominięty, jeśli nie mieści się na tej stronie.

Ale jeśli chodzi o Twoje pytanie: Document.Add() będzie użyteczny tylko wtedy, gdy tabela nie jest potrzebne, aby być absolutnie znakomicie. Wygląda jednak na to, że istnieje sposób, aby to zrobić, dodając tabelę do ColumnText (jest to właściwie obiekt ColumnText, który wykonuje wszystkie operacje dzielenia tabel), a następnie absolutnie ustawiając tę ​​wartość na ColumnText. Jeszcze się do tego nie zaglądałem, ale zrobię to, gdy tylko dostanę trochę więcej czasu :)

+0

Tak. To można zrobić. Zobacz metodę AddPTable() klasy PdfDocument w źródłach. Nadzieja, która pomaga. – asgerhallas

+0

dziękuję za tę odpowiedź, ale muszę bezwzględnie ustawić moje tabele. i jak wskazałem w moim ostatnim komentarzu do odpowiedzi @jay'a riggsa, jeśli nie zmniejszę liczby produktów pod konkretną liczbą, ryzykuję, że moja tabela obliczeń zostanie podzielona na dwie strony. więc ... tak, dzięki i tak :) – Jason

+0

Twoje prawo. Do tej pory nie rozumiałem twojego ostatniego komentarza :) ... Ale jeśli chodzi o absolutną pozycję, to można to zrobić, po prostu sprawdź, jak PdfPTable jest dodawany do dokumentu za pomocą ColumnText - który da ci cały automatyczny stół dzielenie i absolutne pozycjonowanie. Ale jeśli nie potrzebujesz, to ... trzymaj to prosto :) – asgerhallas

Powiązane problemy