1

itext 7 の現在のリリースでは、一部のセルが数行にまたがるテーブル内のセルの境界線のレンダリングに問題があります。

境界線をレンダリングする正しい (以下のドキュメントによる) 方法では、null ポインター例外が発生します。

.setBorder(Border.NO_BORDER)
.setBorderTop(new SolidBorder(1f))

直感的な方法(以下に示す)は、境界線なしのリクエストを無視し、すべての境界線をレンダリングするだけです。上部の境界線のみを要求します

.setBorderBottom(Border.NO_BORDER)
.setBorderLeft(Border.NO_BORDER)
.setBorderRight(Border.NO_BORDER)
.setBorderTop(new SolidBorder(1f))

これは、最初の行、最後から右側のセル (私の場合は「1.4」というラベルが付いています) でのみ発生します。そうでなければ、iText7 は素晴らしい製品であり、優れたソフトウェア エンジニアリングの例だと思います。ありがとう!

以下は、これら 2 つのケースを示す完全なソース コードです。

import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.border.Border;
import com.itextpdf.layout.border.SolidBorder;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.property.VerticalAlignment;
import java.io.File;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;


public class TableBorderTest {

public static final String OUTPUT_FOLDER = "./target/test/";

@BeforeClass
public static void beforeClass() {
    new File(OUTPUT_FOLDER).mkdirs();
}

@AfterClass
public static void tearDownClass() throws Exception {
}

/**
 * Test of generate method, of class SummaryResultsVsAll.
 * @throws java.lang.Exception
 */
@Test
public void testGenerate1() throws Exception {
    System.out.println("generate");

    String outPdf = OUTPUT_FOLDER + "TableBorderTest.pdf";
    PdfWriter writer = new PdfWriter(outPdf);
    PdfDocument pdfDocument;
    pdfDocument = new PdfDocument(writer);
    Document document = new Document(pdfDocument);

    Table table = new Table(new float[]{10f, 10f, 20.0F, 70.0F});
    table.setWidthPercent(100)
            .setPadding(0)
            .setFontSize(9);

    Cell aCell = new Cell(7, 1);
    aCell.add("1.1").setBorder(Border.NO_BORDER).setBorderBottom(new SolidBorder(1f)).setBorderTop(new SolidBorder(1f));

    table.addCell(aCell);

    //create row
    Cell bCell = new Cell(3, 1);
    Paragraph paragraph = new Paragraph("1.2");
    paragraph.setBold();
    bCell.add(paragraph);
    bCell.setBorder(Border.NO_BORDER).setBorderTop(new SolidBorder(1f));
    table.addCell(bCell);

    //row
    paragraph = new Paragraph("1.3").setFontSize(7).setPaddingTop(10);
    Cell someCell = createTableCellNoBorder();
    someCell.add(paragraph).setBorderTop(new SolidBorder(1f));
    table.addCell(someCell);

    someCell = createTableCellNoBorder();
    someCell.add("1.4").setBorderTop(new SolidBorder(1f));
    table.addCell(someCell);

    // row        
    paragraph = new Paragraph("2.1").setFontSize(7);
    someCell = createTableCellNoBorder();
    someCell.add(paragraph);
    table.addCell(someCell);

    someCell = createTableCellNoBorder();
    someCell.add("2.2");
    table.addCell(someCell);

    //row
    paragraph = new Paragraph("3.1").setFontSize(7);
    someCell = createTableCellNoBorder();
    someCell.add(paragraph);
    table.addCell(someCell);

    someCell = createTableCellNoBorder();
    someCell.add("3.2");
    table.addCell(someCell);

    //row
    someCell = createDoubleTableCell();
    paragraph = new Paragraph("4.1");
    paragraph.setBold();
    someCell.add(paragraph).setBorderBottom(new SolidBorder(1f)).setBorderTop(new SolidBorder(1f));
    table.addCell(someCell);

    someCell = createTableCellWithTopAndBottomBorders();
    someCell.add("4.2");
    table.addCell(someCell);

    //create row
    someCell = createDoubleTableCell();
    paragraph = new Paragraph("5.1");
    paragraph.setBold();
    someCell.add(paragraph).setBorderBottom(new SolidBorder(1f)).setBorderTop(new SolidBorder(1f));
    table.addCell(someCell);

    someCell = createTableCellWithTopAndBottomBorders();

    someCell.add("5.2");
    table.addCell(someCell);

    //create row
    someCell = createDoubleTableCell();
    paragraph = new Paragraph("6.1");
    paragraph.setBold();
    someCell.add(paragraph).setBorderBottom(new SolidBorder(1f)).setBorderTop(new SolidBorder(1f));
    table.addCell(someCell);

    someCell = createTableCellWithTopAndBottomBorders();

    someCell.add("6.2");
    table.addCell(someCell);

    //create row
    someCell = createDoubleTableCell();
    paragraph = new Paragraph("7.1");
    paragraph.setBold();
    someCell.add(paragraph).setBorderBottom(new SolidBorder(1f)).setBorderTop(new SolidBorder(1f));
    table.addCell(someCell);

    someCell = createTableCellWithTopAndBottomBorders();

    someCell.add("7.2");
    table.addCell(someCell);

    document.add(table);

    pdfDocument.close();
    writer.flush();
    writer.close();

}
    /**
 * Test of generate method, of class SummaryResultsVsAll.
 * @throws java.lang.Exception
 */
@Test
public void testGenerate2() throws Exception {
    System.out.println("generate");

    String outPdf = OUTPUT_FOLDER + "TableBorderTest2.pdf";
    PdfWriter writer = new PdfWriter(outPdf);
    PdfDocument pdfDocument;
    pdfDocument = new PdfDocument(writer);
    Document document = new Document(pdfDocument);

    Table table = new Table(new float[]{10f, 10f, 20.0F, 70.0F});
    table.setWidthPercent(100)
            .setPadding(0)
            .setFontSize(9);

    Cell aCell = new Cell(7, 1);
    aCell.add("1.1").setBorder(Border.NO_BORDER).setBorderBottom(new SolidBorder(1f)).setBorderTop(new SolidBorder(1f));

    table.addCell(aCell);

    //create row
    Cell bCell = new Cell(3, 1);
    Paragraph paragraph = new Paragraph("1.2");
    paragraph.setBold();
    bCell.add(paragraph);
    bCell.setBorder(Border.NO_BORDER).setBorderTop(new SolidBorder(1f));
    table.addCell(bCell);

    //row
    paragraph = new Paragraph("1.3").setFontSize(7).setPaddingTop(10);
    Cell someCell = createTableCellNoBorder();
    someCell.add(paragraph).setBorderTop(new SolidBorder(1f));
    table.addCell(someCell);

    someCell = createTableCellWithTopBorder();
    someCell.add("1.4");
    table.addCell(someCell);

    // row        
    paragraph = new Paragraph("2.1").setFontSize(7);
    someCell = createTableCellNoBorder();
    someCell.add(paragraph);
    table.addCell(someCell);

    someCell = createTableCellNoBorder();
    someCell.add("2.2");
    table.addCell(someCell);

    //row
    paragraph = new Paragraph("3.1").setFontSize(7);
    someCell = createTableCellNoBorder();
    someCell.add(paragraph);
    table.addCell(someCell);

    someCell = createTableCellNoBorder();
    someCell.add("3.2");
    table.addCell(someCell);

    //row
    someCell = createDoubleTableCell();
    paragraph = new Paragraph("4.1");
    paragraph.setBold();
    someCell.add(paragraph).setBorderBottom(new SolidBorder(1f)).setBorderTop(new SolidBorder(1f));
    table.addCell(someCell);

    someCell = createTableCellWithTopAndBottomBorders();
    someCell.add("4.2");
    table.addCell(someCell);

    //create row
    someCell = createDoubleTableCell();
    paragraph = new Paragraph("5.1");
    paragraph.setBold();
    someCell.add(paragraph).setBorderBottom(new SolidBorder(1f)).setBorderTop(new SolidBorder(1f));
    table.addCell(someCell);

    someCell = createTableCellWithTopAndBottomBorders();

    someCell.add("5.2");
    table.addCell(someCell);

    //create row
    someCell = createDoubleTableCell();
    paragraph = new Paragraph("6.1");
    paragraph.setBold();
    someCell.add(paragraph).setBorderBottom(new SolidBorder(1f)).setBorderTop(new SolidBorder(1f));
    table.addCell(someCell);

    someCell = createTableCellWithTopAndBottomBorders();

    someCell.add("6.2");
    table.addCell(someCell);

    //create row
    someCell = createDoubleTableCell();
    paragraph = new Paragraph("7.1");
    paragraph.setBold();
    someCell.add(paragraph).setBorderBottom(new SolidBorder(1f)).setBorderTop(new SolidBorder(1f));
    table.addCell(someCell);

    someCell = createTableCellWithTopAndBottomBorders();

    someCell.add("7.2");
    table.addCell(someCell);

    document.add(table);

    pdfDocument.close();
    writer.flush();
    writer.close();

}

    private Cell createTableCellNoBorder() {
    Cell someCell;
    someCell = new Cell()
            .setPadding(0)
            .setBorder(Border.NO_BORDER)
            .setVerticalAlignment(VerticalAlignment.TOP);
    return someCell;
}
 private Cell createTableCellWithTopBorder() {
    Cell someCell;
    someCell = new Cell()
            .setPadding(0)
            .setBorderBottom(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderRight(Border.NO_BORDER).setBorderTop(new SolidBorder(1f))
            .setVerticalAlignment(VerticalAlignment.TOP);
    return someCell;
}

private Cell createTableCellWithTopAndBottomBorders() {
    Cell someCell;
    someCell = new Cell()
            .setPadding(0)
            .setBorder(Border.NO_BORDER).setBorderBottom(new SolidBorder(1f)).setBorderTop(new SolidBorder(1f))
            .setVerticalAlignment(VerticalAlignment.TOP);
    return someCell;
}

private Cell createDoubleTableCell() {
    Cell someCell;
    someCell = new Cell(1, 2)
            .setPadding(0)
            .setBorder(Border.NO_BORDER)
            .setVerticalAlignment(VerticalAlignment.TOP);
    return someCell;
}

}

4

1 に答える 1

0

この問題は、本質的にこの回答NullPointerExceptionで分析されたものと同じバグです。それに応えて、開発コードでバグを修正しました。

したがって、現在の iText 開発コード (現在の 7.0.1-SNAPSHORT) を使用してテスト クラスを実行しても例外が発生しなかったことは驚くことではありません。

さらに、両方のテスト方法の結果は同じように次のようになります。

TableBorderTest.png

したがって、境界線なしの要求を無視してすべての境界線をレンダリングするだけの itext の問題も修正されたようです。

于 2016-09-15T11:24:27.230 に答える