Last active
May 11, 2023 11:20
-
-
Save vandeseer/6758c76fc4070a5bddd016c4311bc359 to your computer and use it in GitHub Desktop.
Adding a table to every page of a document
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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