2016-09-14 17 views
0

現在のitext 7のリリースでは、いくつかのセルがいくつかの行にまたがるテーブルのセルのボーダーのレンダリングに問題があります。itext 7テーブルのボーダーの問題

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

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

直感的な方法(以下に示す)は、無境界要求を無視せず、ちょうど右のセルへの最後のすべての境界I only ask for the top border

.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; 
} 

}

+0

「NullPointerException」の問題は、本質的に[ここ](http://stackoverflow.com/a/38703730/1729265)と同じバグです。私が正しく思い出すと、開発コードで修正されています。 – mkl

+0

私は、iText 7.0.1-SNAPSHOTを使用してテストコードを実行しましたが、例外的に例外はありませんでした。他の問題に関しては、私が期待している出力とあなたが観測した出力がどれだけ正確かはっきりしていませんが、iText *がすべての境界線をレンダリングするだけのセルではありません*:垂直の枠線はまったくありません。 – mkl

+0

ところで、あなたは実行可能な例を提供してくれたことは素晴らしいことです。 – mkl

答えて

0

NullPointerException問題は、本質的に、このanswerで分析同じバグです。これに対応して、バグは開発コードで修正されました。

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

さらに、両方の試験方法の結果は同じに次のようになります。したがって

TableBorderTest.png

、iTextのノーボーダーの要求を無視していないし、ちょうどすべての境界線を描画するの問題も固定されているようです。

+0

ありがとう、私はちょうど実行し、両方の問題は7.0.1リリースで修正されることを確認しました。 –

関連する問題