Skip to content

Instantly share code, notes, and snippets.

@vandeseer
Created October 9, 2021 20:38
Show Gist options
  • Save vandeseer/5c30e093a197efcf55b4ba22090a1c63 to your computer and use it in GitHub Desktop.
Save vandeseer/5c30e093a197efcf55b4ba22090a1c63 to your computer and use it in GitHub Desktop.
Too long tables on same page instead new page
package org.vandeseer.easytable;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import java.awt.geom.Point2D;
import java.io.IOException;
import java.util.Queue;
import java.util.function.Supplier;
import static org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode.APPEND;
/**
* Experimental drawer!
*/
@SuperBuilder(toBuilder = true)
public class OverflowOnSamePageTableDrawer extends TableDrawer {
@Builder.Default
private final int lanesPerPage = 2;
@Builder.Default
private final float spaceInBetween = 10f;
// This is really a private field.
// Shouldn't bet set via the Builder ...
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private int actualTablePart = 1;
protected void drawPage(PageData pageData) {
drawerList.forEach(drawer ->
drawWithFunction(pageData, new Point2D.Float(this.startX + calculateXOffset(), this.startY), drawer)
);
}
private float calculateXOffset() {
return (actualTablePart - 1) * table.getWidth() + (actualTablePart > 1 ? spaceInBetween : 0);
}
public void draw(Supplier<PDDocument> documentSupplier, Supplier<PDPage> pageSupplier, float yOffset) throws IOException {
final PDDocument document = documentSupplier.get();
// We create one throwaway page to be able to calculate the page data upfront
float startOnNewPage = pageSupplier.get().getMediaBox().getHeight() - yOffset;
determinePageToStartTable(startOnNewPage);
final Queue<PageData> pageDataQueue = computeRowsOnPagesWithNewPageStartOf(startOnNewPage);
for (int i = 0; !pageDataQueue.isEmpty(); i++) {
final PDPage pageToDrawOn = determinePageToDraw(i, document, pageSupplier);
if ((i == 0 && startTableInNewPage) || i > 0 || document.getNumberOfPages() == 0 || actualTablePart != lanesPerPage) {
startTableInNewPage = false;
}
if (i == 0) {
tableStartPage = pageToDrawOn;
}
try (final PDPageContentStream newPageContentStream = new PDPageContentStream(document, pageToDrawOn, APPEND, compress)) {
for (int j = 1; j <= lanesPerPage && !pageDataQueue.isEmpty(); j++) {
actualTablePart = j;
if (actualTablePart > 1) {
this.startY = startOnNewPage;
}
this.contentStream(newPageContentStream)
.page(pageToDrawOn)
.drawPage(pageDataQueue.poll());
}
}
startY(pageToDrawOn.getMediaBox().getHeight() - yOffset);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment