現在の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;
}
}
「NullPointerException」の問題は、本質的に[ここ](http://stackoverflow.com/a/38703730/1729265)と同じバグです。私が正しく思い出すと、開発コードで修正されています。 – mkl
私は、iText 7.0.1-SNAPSHOTを使用してテストコードを実行しましたが、例外的に例外はありませんでした。他の問題に関しては、私が期待している出力とあなたが観測した出力がどれだけ正確かはっきりしていませんが、iText *がすべての境界線をレンダリングするだけのセルではありません*:垂直の枠線はまったくありません。 – mkl
ところで、あなたは実行可能な例を提供してくれたことは素晴らしいことです。 – mkl