2016-09-14 8 views
0

В текущем выпуске itext 7 есть проблема с отображением границ для ячеек в таблице, где некоторые ячейки занимают пару строк.itext 7 table border issue

Правильный (по документации, показанный ниже) способ визуализации границы приводит к исключению нулевого указателя.

.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. –