Created
October 9, 2021 20:38
-
-
Save vandeseer/5c30e093a197efcf55b4ba22090a1c63 to your computer and use it in GitHub Desktop.
Too long tables on same page instead new page
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.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