Table and cell events to draw borders
These examples were written in answer to questions such as:
dottedlinecell
JAVA
JAVA
package sandbox.tables;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPCellEvent;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPTableEvent;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import sandbox.WrapToTest;
@WrapToTest
public class DottedLineCell {
public static final String DEST = "results/tables/dotted_line_cell.pdf";
class DottedCells implements PdfPTableEvent {
public void tableLayout(PdfPTable table, float[][] widths,
float[] heights, int headerRows, int rowStart,
PdfContentByte[] canvases) {
PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
canvas.setLineDash(3f, 3f);
float llx = widths[0][0];
float urx = widths[0][widths.length];
for (int i = 0; i < heights.length; i++) {
canvas.moveTo(llx, heights[i]);
canvas.lineTo(urx, heights[i]);
}
for (int i = 0; i < widths.length; i++) {
for (int j = 0; j < widths[i].length; j++) {
canvas.moveTo(widths[i][j], heights[i]);
canvas.lineTo(widths[i][j], heights[i+1]);
}
}
canvas.stroke();
}
}
class DottedCell implements PdfPCellEvent {
public void cellLayout(PdfPCell cell, Rectangle position,
PdfContentByte[] canvases) {
PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
canvas.setLineDash(3f, 3f);
canvas.rectangle(position.getLeft(), position.getBottom(),
position.getWidth(), position.getHeight());
canvas.stroke();
}
}
public static void main(String[] args) throws IOException, DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new DottedLineCell().createPdf(DEST);
}
public void createPdf(String dest) throws IOException, DocumentException {
DottedLineCell app = new DottedLineCell();
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
document.add(new Paragraph("Table event"));
PdfPTable table = new PdfPTable(3);
table.setTableEvent(app.new DottedCells());
table.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
table.addCell("A1");
table.addCell("A2");
table.addCell("A3");
table.addCell("B1");
table.addCell("B2");
table.addCell("B3");
table.addCell("C1");
table.addCell("C2");
table.addCell("C3");
document.add(table);
document.add(new Paragraph("Cell event"));
table = new PdfPTable(1);
PdfPCell cell = new PdfPCell(new Phrase("Test"));
cell.setCellEvent(app.new DottedCell());
cell.setBorder(PdfPCell.NO_BORDER);
table.addCell(cell);
document.add(table);
document.close();
}
}
roundedcorners
JAVA
JAVA
/**
* This example was written by Bruno Lowagie in answer to the following questions:
* http://stackoverflow.com/questions/30106862/left-and-right-top-round-corner-for-rectangelroundrectangle
*/
package sandbox.tables;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPCellEvent;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import sandbox.WrapToTest;
@WrapToTest
public class RoundedCorners {
public static final String DEST = "results/tables/rounded_corners.pdf";
class SpecialRoundedCell implements PdfPCellEvent {
public void cellLayout(PdfPCell cell, Rectangle position,
PdfContentByte[] canvases) {
PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
float llx = position.getLeft() + 2;
float lly = position.getBottom() + 2;
float urx = position.getRight() - 2;
float ury = position.getTop() - 2;
float r = 4;
float b = 0.4477f;
canvas.moveTo(llx, lly);
canvas.lineTo(urx, lly);
canvas.lineTo(urx, ury - r);
canvas.curveTo(urx, ury - r * b, urx - r * b, ury, urx - r, ury);
canvas.lineTo(llx + r, ury);
canvas.curveTo(llx + r * b, ury, llx, ury - r * b, llx, ury - r);
canvas.lineTo(llx, lly);
canvas.stroke();
}
}
public static void main(String[] args) throws IOException, DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new RoundedCorners().createPdf(DEST);
}
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table = new PdfPTable(3);
PdfPCell cell = getCell("These cells have rounded borders at the top.");
table.addCell(cell);
cell = getCell("These cells aren't rounded at the bottom.");
table.addCell(cell);
cell = getCell("A custom cell event was used to achieve this.");
table.addCell(cell);
document.add(table);
document.close();
}
public PdfPCell getCell(String content) {
PdfPCell cell = new PdfPCell(new Phrase(content));
cell.setCellEvent(new SpecialRoundedCell());
cell.setPadding(5);
cell.setBorder(PdfPCell.NO_BORDER);
return cell;
}
}
dottedlineheader
JAVA
JAVA
package sandbox.tables;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPCellEvent;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPTableEvent;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import sandbox.WrapToTest;
@WrapToTest
public class DottedLineHeader {
public static final String DEST = "results/tables/dotted_line_header.pdf";
class DottedHeader implements PdfPTableEvent {
public void tableLayout(PdfPTable table, float[][] widths,
float[] heights, int headerRows, int rowStart,
PdfContentByte[] canvases) {
PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
canvas.setLineDash(3f, 3f);
float x1 = widths[0][0];
float x2 = widths[0][widths.length];
canvas.moveTo(x1, heights[0]);
canvas.lineTo(x2, heights[0]);
canvas.moveTo(x1, heights[headerRows]);
canvas.lineTo(x2, heights[headerRows]);
canvas.stroke();
}
}
class DottedCell implements PdfPCellEvent {
public void cellLayout(PdfPCell cell, Rectangle position,
PdfContentByte[] canvases) {
PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
canvas.setLineDash(3f, 3f);
canvas.moveTo(position.getLeft(), position.getTop());
canvas.lineTo(position.getRight(), position.getTop());
canvas.moveTo(position.getLeft(), position.getBottom());
canvas.lineTo(position.getRight(), position.getBottom());
canvas.stroke();
}
}
public static void main(String[] args) throws IOException, DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new DottedLineHeader().createPdf(DEST);
}
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
document.add(new Paragraph("Table event"));
PdfPTable table = new PdfPTable(3);
table.setTableEvent(new DottedHeader());
table.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
table.addCell("A1");
table.addCell("A2");
table.addCell("A3");
table.setHeaderRows(1);
table.addCell("B1");
table.addCell("B2");
table.addCell("B3");
table.addCell("C1");
table.addCell("C2");
table.addCell("C3");
document.add(table);
document.add(new Paragraph("Cell event"));
table = new PdfPTable(3);
table.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
table.getDefaultCell().setCellEvent(new DottedCell());
table.addCell("A1");
table.addCell("A2");
table.addCell("A3");
table.getDefaultCell().setCellEvent(null);
table.addCell("B1");
table.addCell("B2");
table.addCell("B3");
table.addCell("C1");
table.addCell("C2");
table.addCell("C3");
document.add(table);
document.close();
}
}
customborder
JAVA
JAVA
/**
* Example written by Bruno Lowagie in answer to the following question:
* http://stackoverflow.com/questions/23935566/table-borders-not-expanding-properly-in-pdf-using-itext
*/
package sandbox.tables;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPRow;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPTableEventAfterSplit;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import sandbox.WrapToTest;
@WrapToTest
public class CustomBorder {
public static final String DEST = "results/tables/custom_border.pdf";
public static final String TEXT = "This is some long paragraph that will be added over and over again to prove a point. It should result in rows that are split and rows that aren't.";
public static void main(String[] args) throws IOException, DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new CustomBorder().createPdf(DEST);
}
class BorderEvent implements PdfPTableEventAfterSplit {
protected int rowCount;
protected boolean bottom = true;
protected boolean top = true;
public void setRowCount(int rowCount) {
this.rowCount = rowCount;
}
public void splitTable(PdfPTable table) {
if (table.getRows().size() != rowCount) {
bottom = false;
}
}
public void afterSplitTable(PdfPTable table, PdfPRow startRow, int startIdx) {
if (table.getRows().size() != rowCount) {
// if the table gains a row, a row was split
rowCount = table.getRows().size();
top = false;
}
}
public void tableLayout(PdfPTable table, float[][] width, float[] height,
int headerRows, int rowStart, PdfContentByte[] canvas) {
float widths[] = width[0];
float y1 = height[0];
float y2 = height[height.length - 1];
PdfContentByte cb = canvas[PdfPTable.LINECANVAS];
for (int i = 0; i < widths.length; i++) {
cb.moveTo(widths[i], y1);
cb.lineTo(widths[i], y2);
}
float x1 = widths[0];
float x2 = widths[widths.length - 1];
for (int i = top ? 0 : 1; i < (bottom ? height.length : height.length - 1); i++) {
cb.moveTo(x1, height[i]);
cb.lineTo(x2, height[i]);
}
cb.stroke();
cb.resetRGBColorStroke();
bottom = true;
top = true;
}
}
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table = new PdfPTable(2);
table.setTotalWidth(500);
table.setLockedWidth(true);
BorderEvent event = new BorderEvent();
table.setTableEvent(event);
table.setWidthPercentage(100);
table.getDefaultCell().setBorder(Rectangle.NO_BORDER);
table.setSplitLate(false);
PdfPCell cell = new PdfPCell(new Phrase(TEXT));
cell.setBorder(Rectangle.NO_BORDER);
for (int i = 0; i < 60; ) {
table.addCell("Cell " + (++i));
table.addCell(cell);
}
event.setRowCount(table.getRows().size());
document.add(table);
document.close();
}
}
customborder2
JAVA
JAVA
/**
* Example written by Bruno Lowagie in answer to the following question:
* http://stackoverflow.com/questions/23935566/table-borders-not-expanding-properly-in-pdf-using-itext
*/
package sandbox.tables;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPRow;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPTableEventAfterSplit;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import sandbox.WrapToTest;
@WrapToTest
public class CustomBorder2 {
public static final String DEST = "results/tables/custom_border2.pdf";
public static final String TEXT = "This is some long paragraph that will be added over and over again to prove a point. It should result in rows that are split and rows that aren't.";
public static void main(String[] args) throws IOException, DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new CustomBorder2().createPdf(DEST);
}
class BorderEvent implements PdfPTableEventAfterSplit {
protected boolean bottom = true;
protected boolean top = true;
public void splitTable(PdfPTable table) {
bottom = false;
}
public void afterSplitTable(PdfPTable table, PdfPRow startRow, int startIdx) {
top = false;
}
public void tableLayout(PdfPTable table, float[][] width, float[] height,
int headerRows, int rowStart, PdfContentByte[] canvas) {
float widths[] = width[0];
float y1 = height[0];
float y2 = height[height.length - 1];
float x1 = widths[0];
float x2 = widths[widths.length - 1];
PdfContentByte cb = canvas[PdfPTable.LINECANVAS];
cb.moveTo(x1, y1);
cb.lineTo(x1, y2);
cb.moveTo(x2, y1);
cb.lineTo(x2, y2);
if (top) {
cb.moveTo(x1, y1);
cb.lineTo(x2, y1);
}
if (bottom) {
cb.moveTo(x1, y2);
cb.lineTo(x2, y2);
}
cb.stroke();
cb.resetRGBColorStroke();
bottom = true;
top = true;
}
}
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table = new PdfPTable(2);
table.setTotalWidth(500);
table.setLockedWidth(true);
BorderEvent event = new BorderEvent();
table.setTableEvent(event);
table.setWidthPercentage(100);
table.getDefaultCell().setBorder(Rectangle.NO_BORDER);
table.setSplitLate(false);
PdfPCell cell = new PdfPCell(new Phrase(TEXT));
cell.setBorder(Rectangle.NO_BORDER);
for (int i = 0; i < 60; ) {
table.addCell("Cell " + (++i));
table.addCell(cell);
}
document.add(table);
document.close();
}
}
dottedlinecell2
JAVA
JAVA
package sandbox.tables;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPCellEvent;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import sandbox.WrapToTest;
@WrapToTest
public class DottedLineCell2 {
public static final String DEST = "results/tables/dotted_line_cell2.pdf";
class DottedCell implements PdfPCellEvent {
private int border = 0;
public DottedCell(int border) {
this.border = border;
}
public void cellLayout(PdfPCell cell, Rectangle position,
PdfContentByte[] canvases) {
PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
canvas.saveState();
canvas.setLineDash(0, 4, 2);
if ((border & PdfPCell.TOP) == PdfPCell.TOP) {
canvas.moveTo(position.getRight(), position.getTop());
canvas.lineTo(position.getLeft(), position.getTop());
}
if ((border & PdfPCell.BOTTOM) == PdfPCell.BOTTOM) {
canvas.moveTo(position.getRight(), position.getBottom());
canvas.lineTo(position.getLeft(), position.getBottom());
}
if ((border & PdfPCell.RIGHT) == PdfPCell.RIGHT) {
canvas.moveTo(position.getRight(), position.getTop());
canvas.lineTo(position.getRight(), position.getBottom());
}
if ((border & PdfPCell.LEFT) == PdfPCell.LEFT) {
canvas.moveTo(position.getLeft(), position.getTop());
canvas.lineTo(position.getLeft(), position.getBottom());
}
canvas.stroke();
canvas.restoreState();
}
}
public static void main(String[] args) throws IOException, DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new DottedLineCell2().createPdf(DEST);
}
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table;
PdfPCell cell;
table = new PdfPTable(4);
table.setSpacingAfter(30);
cell = new PdfPCell(new Phrase("left border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new DottedCell(PdfPCell.LEFT));
table.addCell(cell);
cell = new PdfPCell(new Phrase("right border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new DottedCell(PdfPCell.RIGHT));
table.addCell(cell);
cell = new PdfPCell(new Phrase("top border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new DottedCell(PdfPCell.TOP));
table.addCell(cell);
cell = new PdfPCell(new Phrase("bottom border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new DottedCell(PdfPCell.BOTTOM));
table.addCell(cell);
document.add(table);
table = new PdfPTable(4);
table.setSpacingAfter(30);
cell = new PdfPCell(new Phrase("left and top border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new DottedCell(PdfPCell.LEFT | PdfPCell.TOP));
table.addCell(cell);
cell = new PdfPCell(new Phrase("right and bottom border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new DottedCell(PdfPCell.RIGHT | PdfPCell.BOTTOM));
table.addCell(cell);
cell = new PdfPCell(new Phrase("no border"));
cell.setBorder(PdfPCell.NO_BORDER);
table.addCell(cell);
cell = new PdfPCell(new Phrase("full border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new DottedCell(PdfPCell.BOX));
table.addCell(cell);
document.add(table);
document.close();
}
}
customborder3
JAVA
JAVA
package sandbox.tables;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPCellEvent;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import sandbox.WrapToTest;
@WrapToTest
public class CustomBorder3 {
public static final String DEST = "results/tables/custom_border_3.pdf";
interface LineDash {
public void applyLineDash(PdfContentByte canvas);
}
class SolidLine implements LineDash {
public void applyLineDash(PdfContentByte canvas) { }
}
class DottedLine implements LineDash {
public void applyLineDash(PdfContentByte canvas) {
canvas.setLineCap(PdfContentByte.LINE_CAP_ROUND);
canvas.setLineDash(0, 4, 2);
}
}
class DashedLine implements LineDash {
public void applyLineDash(PdfContentByte canvas) {
canvas.setLineDash(3, 3);
}
}
class CustomBorder implements PdfPCellEvent {
protected LineDash left;
protected LineDash right;
protected LineDash top;
protected LineDash bottom;
public CustomBorder(LineDash left, LineDash right,
LineDash top, LineDash bottom) {
this.left = left;
this.right = right;
this.top = top;
this.bottom = bottom;
}
public void cellLayout(PdfPCell cell, Rectangle position,
PdfContentByte[] canvases) {
PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
if (top != null) {
canvas.saveState();
top.applyLineDash(canvas);
canvas.moveTo(position.getRight(), position.getTop());
canvas.lineTo(position.getLeft(), position.getTop());
canvas.stroke();
canvas.restoreState();
}
if (bottom != null) {
canvas.saveState();
bottom.applyLineDash(canvas);
canvas.moveTo(position.getRight(), position.getBottom());
canvas.lineTo(position.getLeft(), position.getBottom());
canvas.stroke();
canvas.restoreState();
}
if (right != null) {
canvas.saveState();
right.applyLineDash(canvas);
canvas.moveTo(position.getRight(), position.getTop());
canvas.lineTo(position.getRight(), position.getBottom());
canvas.stroke();
canvas.restoreState();
}
if (left != null) {
canvas.saveState();
left.applyLineDash(canvas);
canvas.moveTo(position.getLeft(), position.getTop());
canvas.lineTo(position.getLeft(), position.getBottom());
canvas.stroke();
canvas.restoreState();
}
}
}
public static void main(String[] args) throws IOException, DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new CustomBorder3().createPdf(DEST);
}
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table;
PdfPCell cell;
LineDash solid = new SolidLine();
LineDash dotted = new DottedLine();
LineDash dashed = new DashedLine();
table = new PdfPTable(4);
table.setSpacingAfter(30);
cell = new PdfPCell(new Phrase("dotted left border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new CustomBorder(dotted, null, null, null));
table.addCell(cell);
cell = new PdfPCell(new Phrase("solid right border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new CustomBorder(null, solid, null, null));
table.addCell(cell);
cell = new PdfPCell(new Phrase("dashed top border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new CustomBorder(null, null, dashed, null));
table.addCell(cell);
cell = new PdfPCell(new Phrase("bottom border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new CustomBorder(null, null, null, solid));
table.addCell(cell);
document.add(table);
table = new PdfPTable(4);
table.setSpacingAfter(30);
cell = new PdfPCell(new Phrase("dotted left and solid top border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new CustomBorder(dotted, null, solid, null));
table.addCell(cell);
cell = new PdfPCell(new Phrase("dashed right and dashed bottom border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new CustomBorder(null, dashed, null, dashed));
table.addCell(cell);
cell = new PdfPCell(new Phrase("no border"));
cell.setBorder(PdfPCell.NO_BORDER);
table.addCell(cell);
cell = new PdfPCell(new Phrase("full solid border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new CustomBorder(solid, solid, solid, solid));
table.addCell(cell);
document.add(table);
document.close();
}
}
customborder4
JAVA
JAVA
package sandbox.tables;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPCellEvent;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import sandbox.WrapToTest;
@WrapToTest
public class CustomBorder4 {
public static final String DEST = "results/tables/custom_border_4.pdf";
abstract class CustomBorder implements PdfPCellEvent {
private int border = 0;
public CustomBorder(int border) {
this.border = border;
}
public void cellLayout(PdfPCell cell, Rectangle position,
PdfContentByte[] canvases) {
PdfContentByte canvas = canvases[PdfPTable.LINECANVAS];
canvas.saveState();
setLineDash(canvas);
if ((border & PdfPCell.TOP) == PdfPCell.TOP) {
canvas.moveTo(position.getRight(), position.getTop());
canvas.lineTo(position.getLeft(), position.getTop());
}
if ((border & PdfPCell.BOTTOM) == PdfPCell.BOTTOM) {
canvas.moveTo(position.getRight(), position.getBottom());
canvas.lineTo(position.getLeft(), position.getBottom());
}
if ((border & PdfPCell.RIGHT) == PdfPCell.RIGHT) {
canvas.moveTo(position.getRight(), position.getTop());
canvas.lineTo(position.getRight(), position.getBottom());
}
if ((border & PdfPCell.LEFT) == PdfPCell.LEFT) {
canvas.moveTo(position.getLeft(), position.getTop());
canvas.lineTo(position.getLeft(), position.getBottom());
}
canvas.stroke();
canvas.restoreState();
}
public abstract void setLineDash(PdfContentByte canvas);
}
class SolidBorder extends CustomBorder {
public SolidBorder(int border) { super(border); }
public void setLineDash(PdfContentByte canvas) {}
}
class DottedBorder extends CustomBorder {
public DottedBorder(int border) { super(border); }
public void setLineDash(PdfContentByte canvas) {
canvas.setLineCap(PdfContentByte.LINE_CAP_ROUND);
canvas.setLineDash(0, 4, 2);
}
}
class DashedBorder extends CustomBorder {
public DashedBorder(int border) { super(border); }
public void setLineDash(PdfContentByte canvas) {
canvas.setLineDash(3, 3);
}
}
public static void main(String[] args) throws IOException, DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new CustomBorder4().createPdf(DEST);
}
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table;
PdfPCell cell;
table = new PdfPTable(4);
table.setSpacingAfter(30);
cell = new PdfPCell(new Phrase("dotted left border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new DottedBorder(PdfPCell.LEFT));
table.addCell(cell);
cell = new PdfPCell(new Phrase("solid right border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new SolidBorder(PdfPCell.RIGHT));
table.addCell(cell);
cell = new PdfPCell(new Phrase("solid top border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new SolidBorder(PdfPCell.TOP));
table.addCell(cell);
cell = new PdfPCell(new Phrase("dashed bottom border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new DashedBorder(PdfPCell.BOTTOM));
table.addCell(cell);
document.add(table);
table = new PdfPTable(4);
table.setSpacingAfter(30);
cell = new PdfPCell(new Phrase("dotted left and dashed top border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new DottedBorder(PdfPCell.LEFT));
cell.setCellEvent(new DashedBorder(PdfPCell.TOP));
table.addCell(cell);
cell = new PdfPCell(new Phrase("solid right and dotted bottom border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new DottedBorder(PdfPCell.BOTTOM));
cell.setCellEvent(new SolidBorder(PdfPCell.RIGHT));
table.addCell(cell);
cell = new PdfPCell(new Phrase("no border"));
cell.setBorder(PdfPCell.NO_BORDER);
table.addCell(cell);
cell = new PdfPCell(new Phrase("full border"));
cell.setBorder(PdfPCell.NO_BORDER);
cell.setCellEvent(new DottedBorder(PdfPCell.LEFT | PdfPCell.RIGHT));
cell.setCellEvent(new SolidBorder(PdfPCell.TOP));
cell.setCellEvent(new DashedBorder(PdfPCell.BOTTOM));
table.addCell(cell);
document.add(table);
document.close();
}
}
tableborder
JAVA
JAVA
/*
* Example written by Bruno Lowagie in answer to the following question:
* http://stackoverflow.com/questions/35340003
*/
package sandbox.tables;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPTableEvent;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import sandbox.WrapToTest;
/**
* @author Bruno Lowagie (iText Software)
*/
@WrapToTest
public class TableBorder {
public static final String DEST = "results/tables/table_border_outer_only.pdf";
public static void main(String[] args) throws IOException,
DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new TableBorder().createPdf(DEST);
}
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table = new PdfPTable(4);
table.setTableEvent(new BorderEvent());
table.getDefaultCell().setBorder(Rectangle.NO_BORDER);
for(int aw = 0; aw < 16; aw++){
table.addCell("hi");
}
document.add(table);
document.close();
}
public class BorderEvent implements PdfPTableEvent {
public void tableLayout(PdfPTable table, float[][] widths, float[] heights, int headerRows, int rowStart, PdfContentByte[] canvases) {
float width[] = widths[0];
float x1 = width[0];
float x2 = width[width.length - 1];
float y1 = heights[0];
float y2 = heights[heights.length - 1];
PdfContentByte cb = canvases[PdfPTable.LINECANVAS];
cb.rectangle(x1, y1, x2 - x1, y2 - y1);
cb.stroke();
cb.resetRGBColorStroke();
}
}
}
celltitle
JAVA
JAVA
/*
* Example written by Bruno Lowagie in answer to the following question:
* http://stackoverflow.com/questions/35746651
*/
package sandbox.tables;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPCellEvent;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import sandbox.WrapToTest;
/**
* @author Bruno Lowagie (iText Software)
*/
@WrapToTest
public class CellTitle {
public static final String DEST = "results/tables/cell_title.pdf";
class Title implements PdfPCellEvent {
protected String title;
public Title(String title) {
this.title = title;
}
public void cellLayout(PdfPCell cell, Rectangle position,
PdfContentByte[] canvases) {
Chunk c = new Chunk(title);
c.setBackground(BaseColor.LIGHT_GRAY);
PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS];
ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,
new Phrase(c), position.getLeft(5), position.getTop(5), 0);
}
}
public static void main(String[] args) throws IOException, DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new CellTitle().createPdf(DEST);
}
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table = new PdfPTable(1);
PdfPCell cell = getCell("The title of this cell is title 1", "title 1");
table.addCell(cell);
cell = getCell("The title of this cell is title 2", "title 2");
table.addCell(cell);
cell = getCell("The title of this cell is title 3", "title 3");
table.addCell(cell);
document.add(table);
document.close();
}
public PdfPCell getCell(String content, String title) {
PdfPCell cell = new PdfPCell(new Phrase(content));
cell.setCellEvent(new Title(title));
cell.setPadding(5);
return cell;
}
}