16

ページの長さを超えるテーブル (PdfPTable) があるという問題があります。テーブルを複数のページに「分割」する方法を調べてみましたが、iTextSharp はこの分野でほとんど文書化されていません。ページ上の任意の Y 位置を選択せず​​にこれを行う方法を知っている人はいますか?

SplitLateとプロパティを調べましたが、SplitRowsこれらが何をするかについてのドキュメントはありません。編集彼らは何もしません。

ありがとう!

編集

テーブルは常にページの幅に収まるため、テーブルを半分の幅にカットしようとしています。これは、垂直方向に収まらない行をその下の次のページに拡張したいということです。

EDIT2

ここにいくつかのコードがあります:

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
4

2 に答える 2

34

Document.Add()ページ間で行を自動的に分割する場合は、を使用してドキュメントにテーブルを追加する必要があります。その後SplitLateSplitRows期待どおりに動作します。

  1. When SplitLate = true(デフォルト) テーブルは、ページに収まる次の行の前に分割されます。
  2. SplitLate = falseページに完全に収まらない行が分割される場合。
  3. When SplitRows = true(デフォルト) ページに収まらない行は分割されます。
  4. SplitRows = false行が省略される場合。

そう

  • SplitLate && SplitRows: ページに収まらない行は次のページから開始され、そのページにも収まらない場合は最終的に分割されます。

  • SplitLate && !SplitRows: ページに収まらない行は次のページから開始され、そのページにも収まらない場合は省略されます。

  • !SplitLate && SplitRows: ページに収まらない行は分割されて次のページに続き、次のページにも大きすぎる場合は再度分割されます。

  • !SplitLate && !SplitRows:これについては少し自信がありません。しかし、ソースからは、SplitLate && !SplitRows と同じように見えます: ページに収まらない行は次のページで開始され、そのページにも収まらない場合は省略されます。

しかし、あなたの質問に関してDocument.Add()は、テーブルを絶対に配置する必要がない場合にのみ使用できます。しかし、テーブルを に追加してColumnText(実際にColumnTextはすべてのテーブル分割を行うオブジェクトです)、それを絶対に配置する方法があるようColumnTextです。私はまだそれを調べていませんが、もう少し時間があればすぐに調べます:)

于 2009-11-07T20:51:26.780 に答える
3

iTextSharp でテーブルを操作していたとき、このリソースが役立つことがわかりました。

iTextSharp チュートリアル - 第 5 章: テーブル

「大きなテーブル」というタイトルのセクションを参照してください。チュートリアルにはサンプルが含まれています。これまでに見たことがないことを願っています。

ページ間でテーブルを分割することが問題だったことを思い出しません。私が抱えていた問題は、個々のが複数のページにまたがるようにしたいということでした。このためにSplitLate、my のプロパティPdfPTableを false に設定します。

編集
私はあなたのコードをチェックし、それを私のものと比較しました。私が見た大きな違いは、メソッドを使用してmyPdfPTableに myを追加していないことです。代わりに、のメソッドを呼び出して、すべてのセルを設定した my を渡します。(ところで、同様の方法でロードします。)ビアへの書き込みが問題を引き起こしているのではないかと思います。DocumentPdfPTable.WriteSelectedRows()DocumentAdd()PdfPTablePdfPCellsPdfPTableDocumentWriteSelectedRows()

.を追加しない場合でも、コードが機能するかどうかを確認できますHeaderFooter

于 2009-09-01T20:25:11.003 に答える