9

Javaを使用してitext 5に取り組んでいます。動的行を持つ複数のテーブルを含むページがあります。場合によっては、テーブルの最後の行が、次のヘッダーを持つ次のページに分割されます。次のページの続きを管理するためにsetHeaderRows()andを使用しています。setSkipFirstHeader()最後の行には、前のページに収まる十分なスペースがあります。次のページではなく、最後の行を同じページに収めたいと思います。

たとえば、1 ページ目では、最後の行が次のページの最初の行に分割されます。代わりに、その行をページ 1 に収めたいので、すべて空白のページを 1 ページ余分に保存します。

を使ってみsetExtendLastRow()ましたが、うまくいきません。この問題を解決する方法を知っている人はいますか。動作サンプルコードを添付しています。

public class ProposalItextSplitLastRow {
 public static void main(String[] args) {
    try {
        Document document = new Document();
        document.setPageSize(PageSize.LETTER);
        document.setMargins(16, 14, 14, 14);
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C:/SplitLastRow.pdf"));
        document.open();
        document.setPageSize(PageSize.LETTER);
        document.setMargins(16, 14, 42, 38);

        for (int m = 1; m < 20; m++) {

            int row = 0;
            PdfPTable table = new PdfPTable(1);
            table.setSpacingAfter(0);
            table.setSpacingBefore(0);
            table.setWidthPercentage(100);

            table.setHeaderRows(1);
            table.setSkipFirstHeader(true);
            add(table, "Header Row continued " + m, BaseColor.LIGHT_GRAY, row++);
            add(table, "Header Row normal " + m, BaseColor.LIGHT_GRAY, row++);

            add(table, "Text Row 1 ", BaseColor.WHITE, row++);
            add(table, "Text Row 2 ", BaseColor.WHITE, row++);
            add(table, "Text Row 3 ", BaseColor.WHITE, row++);

            addPadding(table);

            document.add(table);
        }

        document.close();
    } catch (Exception de) {
        de.printStackTrace();
    }
}

private static void add(PdfPTable table, String text, BaseColor color, int row) {
    PdfPCell pdfCellHeader = new PdfPCell();
    pdfCellHeader.setBackgroundColor(color);
    pdfCellHeader.addElement(new Paragraph(new Phrase(text)));
    table.addCell(pdfCellHeader);
}

private static void addPadding(PdfPTable table) {
    PdfPCell cell = new PdfPCell();
    cell.setFixedHeight(2f);
    cell.setBorder(Rectangle.NO_BORDER);
    cell.setColspan(table.getNumberOfColumns());
    table.addCell(cell);
}
}
4

3 に答える 3

10

あなたはできるtable.setKeepRowsTogather(true);

table.setHeaderRows(1)それも一緒に

setKeepRowsTogather()ページ内のすべての行を保持できるかどうかを確認しますが、テーブルが複数のページにまたがる場合は行を分割します。その場合setHeaderRows(1)、ヘッダー行を次のページに再度配置します。

于 2013-07-23T05:51:20.687 に答える
7

あなたの質問を理解するために、例を実行する必要がありました。あなたはヘッダーではないヘッダーについて話して私を混乱させました (「ヘッダー行通常」の行はヘッダー行ではありません!) への参照setExtendLastRow()も役に立ちませんでした (その方法に言及しても意味がありません) ; とても紛らわしいです)。

そうは言っても、あなたの問題の解決策は簡単です。メインクラスを書き直しました:

public static void main(String[] args) {
    try {
        Document document = new Document();
        document.setPageSize(PageSize.LETTER);
        document.setMargins(16, 14, 14, 14);
        PdfWriter writer = PdfWriter.getInstance(document,
                new FileOutputStream("SplitLastRow.pdf"));
        document.open();
        document.setPageSize(PageSize.LETTER);
        document.setMargins(16, 14, 42, 38);

        for (int m = 1; m < 20; m++) {

            int row = 0;
            PdfPTable table = new PdfPTable(1);
            table.setSpacingAfter(0);
            table.setSpacingBefore(0);
            table.setTotalWidth(document.right() - document.left());
            table.setLockedWidth(true);

            table.setHeaderRows(1);
            table.setSkipFirstHeader(true);
            add(table, "Header Row continued " + m, BaseColor.LIGHT_GRAY, row++);
            add(table, "Header Row normal " + m, BaseColor.LIGHT_GRAY, row++);

            add(table, "Text Row 1 ", BaseColor.WHITE, row++);
            add(table, "Text Row 2 ", BaseColor.WHITE, row++);
            add(table, "Text Row 3 ", BaseColor.WHITE, row++);

            addPadding(table);
            if (writer.getVerticalPosition(true) - table.getRowHeight(0) - table.getRowHeight(1) < document.bottom()) {
                document.newPage();
            }
            document.add(table);
        }

        document.close();
    } catch (Exception de) {
        de.printStackTrace();
    }
}

幅のパーセンテージではなく合計幅を定義し、幅をロックしてください。文書化されているように (そして常識的に言えば)、幅のパーセンテージを定義した場合、オブジェクトは実際の幅を知りません。言うまでもなく、実際の幅がわからないテーブルの高さを計算することはできません。PdfPTable

次に、getVerticalPosition()メソッドを使用してカーソルの現在の位置を取得し、最初の 2 行がページに収まるかどうかを確認します。テーブルを追加する前に新しいページに移動しない場合。テーブル全体が収まるかどうかを確認したい場合は、getTotalHeight()メソッドの代わりに メソッドを使用してくださいgetRowHeight()

于 2013-05-18T15:56:32.313 に答える
-1

できるよ

table.setSplitRows(false);

しかし、収まらない行があると、それは表示されないと思います。一見の価値はあるけど

于 2013-05-18T04:39:09.770 に答える