Skip to content

Instantly share code, notes, and snippets.

@vandeseer
Last active May 11, 2023 11:20
Show Gist options
  • Save vandeseer/6758c76fc4070a5bddd016c4311bc359 to your computer and use it in GitHub Desktop.
Save vandeseer/6758c76fc4070a5bddd016c4311bc359 to your computer and use it in GitHub Desktop.
Adding a table to every page of a document
package org.vandeseer.integrationtest.custom;
import lombok.Getter;
import lombok.experimental.SuperBuilder;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.vandeseer.easytable.TableDrawer;
import org.vandeseer.easytable.drawing.Drawer;
import org.vandeseer.easytable.drawing.DrawingContext;
import org.vandeseer.easytable.structure.Row;
import org.vandeseer.easytable.structure.Table;
import org.vandeseer.easytable.structure.cell.TextCell;
import java.awt.geom.Point2D;
import java.io.IOException;
import java.util.function.BiConsumer;
import static org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode.APPEND;
import static org.apache.pdfbox.pdmodel.font.PDType1Font.HELVETICA;
public class Issue59 {
@SuperBuilder
private static class CustomTableDrawer extends TableDrawer {
@Getter
private float finalY;
@Override
protected void drawWithFunction(PageData pageData, Point2D.Float startingPoint, BiConsumer<Drawer, DrawingContext> consumer) {
super.drawWithFunction(pageData, startingPoint, consumer);
finalY = startingPoint.y;
for (int rowIndex = pageData.firstRowOnPage; rowIndex < pageData.firstRowOnNextPage; rowIndex++) {
final Row row = table.getRows().get(rowIndex);
finalY -= row.getHeight();
}
}
}
public static void main(String[] args) throws IOException {
try (final PDDocument document = new PDDocument()) {
for (int i = 0; i < 10; i++) {
final PDPage page = new PDPage(PDRectangle.A4);
try (final PDPageContentStream contentStream = new PDPageContentStream(document, page, APPEND, false)) {
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA, 12);
contentStream.newLineAtOffset(100, 100);
contentStream.showText("text number " + i);
contentStream.endText();
}
document.addPage(page);
}
for (int i = 0; i < document.getNumberOfPages(); i++) {
try (final PDPageContentStream contentStream = new PDPageContentStream(document, document.getPage(i), APPEND, false)) {
CustomTableDrawer tableDrawer = CustomTableDrawer.builder()
.contentStream(contentStream)
.table(createHeaderTableForPage(i))
.startX(50)
.startY(document.getPage(i).getMediaBox().getHeight() - 50)
.build();
tableDrawer.draw();
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA, 12);
contentStream.newLineAtOffset(100, tableDrawer.getFinalY() - 12);
contentStream.showText("text after final y " + tableDrawer.getFinalY());
contentStream.endText();
}
}
document.save("target/issue59.pdf");
}
}
private static Table createHeaderTableForPage(int pageNumber) {
return Table.builder()
.addColumnsOfWidth(100, 100, 100, 100)
.fontSize(8)
.font(HELVETICA)
.addRow(Row.builder()
.add(TextCell.builder().borderWidth(1).text("Header").build())
.add(TextCell.builder().borderWidth(1).text("of").build())
.add(TextCell.builder().borderWidth(1).text("Page").build())
.add(TextCell.builder().borderWidth(1).text(String.valueOf(pageNumber)).build())
.build())
.build();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment