2009-09-01 4 views
12

페이지 길이보다 길어질 수있는 테이블 (PdfPTable)이있는 문제가 있습니다. 나는 하나 이상의 페이지에 테이블을 "분할"하는 방법을 찾아 보았지만 iTextSharp는이 영역에서 제대로 문서화되지 않았습니다. 누군가가 페이지에서 임의의 Y 위치를 선택하지 않고 이것을 수행하고 거기에 있다면 분할하도록 지시하는 방법을 알고 있습니까?iTextSharp : SplitLate/SplitRows?

나는 SplitLateSplitRows 속성을 살펴 보았지만, 이것들에 대한 문서는 없습니다. EDIT 그들은 아무것도하지 않습니다.

감사합니다.

나는 테이블로 항상 페이지의 폭을 맞는 폭의 절반에 테이블을 잘라 찾고 있어요

편집 할 수 있습니다. 즉, 세로로 맞지 않는 행을 그 아래의 다음 페이지까지 확장하고 싶습니다. 내가 iTextSharp의 테이블로 작업 한

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 

답변

3

, 내가 도움이 자원을 발견 :

iTextSharp Tutorial - Chapter 5: Tables

이 단원을 참조하십시오 여기에

EDIT2은 일부 코드입니다 '대형 테이블'. 튜토리얼에는 샘플이 포함되어 있습니다. 전에 보지 못했 으면 좋겠네.

페이지가 문제가되는 페이지를 분할하는 것을 기억하지 않습니다. 문제는 내가 개별 페이지를 스팬 수 싶었 을까. 이를 위해 PdfPTableSplitLate 속성을 false로 설정했습니다.

편집
코드를 검사하여 내 것과 비교했습니다. 내가 본 큰 차이점은 PdfPTable.WriteSelectedRows() 메서드를 사용하여 PdfPTable을 내 Document에 추가하지 않는다는 것입니다. 대신 DocumentAdd() 메서드를 호출하고 모든 셀을 설정하고 PdfPTable을 전달합니다. (우리는 우리가 PdfPCells 비슷한 방식으로로드 할 때). 을 통해 PdfPTable을 쓰면 WriteSelectedRows()을 통해 문제가 발생하는지 궁금합니다.

HeaderFooter을 추가하지 않으면 코드가 작동하는지 확인할 수도 있습니다.

+0

당신은 그 과정에 그 특별한 위치를 두어야합니까? 당신이 행을 쓰고 나면, 전에, 어디서? – Jason

+0

미안 제이슨, 나는 당신의 질문에 대해 오해했습니다. 나는 내가 원했던 나의 감동을 편집했다. –

+0

편집 해 주셔서 감사합니다 ... 예 100x 튜토리얼을 끝까지 사용해 보았지만 아무 소용이 없습니다. 이 장에서는 간단한 테이블 사용에 대해 이야기하고 PdfPTable을 사용하여 절대적으로 위치를 지정할 수있게해야합니다. 지금 당장은 테이블의 가장자리에서 곧바로 실행되는 테이블이 있습니다. \ – Jason

29

페이지 전체에 걸쳐 행을 자동으로 분할하려면 Document.Add()을 사용하여 테이블을 문서에 추가해야합니다. 그런 다음 SplitLateSplitRows이 예상대로 작동합니다. SplitLate = true (기본값) 테이블이 페이지에 맞지 않는 다음 행하기 전에 분할됩니다

  1. .
  2. SplitLate = false 페이지에 완전히 맞지 않는 행 이 나뉘어집니다.
  3. SplitRows = true (기본값)은 페이지에 맞지 않는 행이 분할됩니다.
  4. SplitRows = false 행이 생략됩니다.

그래서

  • SplitLate && SplitRows

    : 페이지에 맞지 않는 행은 다음 페이지에서 시작하고 그 중 하나 페이지에 맞지 않으면 결국 분할됩니다.

  • SplitLate && !SplitRows : 페이지에 맞지 않는 행은 다음 페이지에서 시작되고 해당 페이지에 맞지 않으면 생략됩니다.

  • !SplitLate && SplitRows : 페이지에 맞지 않는 행은 분할되어 다음 페이지에서 계속되며 다음 페이지에도 너무 큰 경우 다시 분할됩니다.

  • !SplitLate && !SplitRows : 나는 이것에 대해 조금 확신하지 못합니다. SplitRows : 페이지에 맞지 않는 행은 다음 페이지에서 시작되고 해당 페이지에 맞지 않으면 생략됩니다. 소스에서부터 SplitLate와 같습니다. & &!

질문 : Document.Add()은 테이블을 절대적으로 배치 할 필요가없는 경우에만 사용할 수 있습니다. 그러나 실제로 테이블을 ColumnText에 추가하여 (모든 테이블 분할을 수행하는 ColumnText 개체) 그 다음에 절대적으로 그 위치를 지정하는 방법이있는 것처럼 보입니다. ColumnText. 나는 아직 그것을 들여다 보지 못했지만, 조금 더 시간을들이 자마자 곧 바뀔 것이다. :)

+0

예. 그렇게 할 수 있습니다. 소스에서 PdfDocument 클래스의 AddPTable() 메서드를 참조하십시오. 희망이 도움이됩니다. – asgerhallas

+0

이 답변을 주셔서 감사하지만 내 테이블을 절대적으로 배치해야합니다. 그리고 @ jay riggs의 대답에 대한 나의 마지막 코멘트에서 언급했듯이, 특정 숫자의 제품 수를 줄이지 않으면 계산 테이블을 두 페이지로 나눌 위험이 있습니다. 그래서 ... 그래, 어쨌든 고마워. – Jason

+0

너의 권리. 나는 지금까지 귀하의 마지막 코멘트를 이해하지 못했습니다 :) ...하지만 절대 위치에 관해서는, 할 수있는, 그냥 체크 PdtPTable 어떻게 ColumnText를 사용하여 문서에 추가 - 그게 당신에게 모든 자동 테이블을 줄 것이다 분할 및 절대 위치. 하지만 당신이 필요하지 않다면 ... 간단하게 유지하십시오 :) – asgerhallas