Skip to content

Commit 170a375

Browse files
committed
enhancement: support for landscape pages
1 parent 8a2970a commit 170a375

File tree

4 files changed

+56
-15
lines changed

4 files changed

+56
-15
lines changed

src/main/java/be/quodlibet/boxable/BaseTable.java

+14-7
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,25 @@
1313
*/
1414
public class BaseTable extends Table<PDPage> {
1515

16-
public BaseTable(float yStart, float yStartNewPage, float bottomMargin, float width, float margin, PDDocument document, PDPage currentPage, boolean drawLines, boolean drawContent) throws IOException {
17-
super(yStart, yStartNewPage, 0, bottomMargin, width, margin, document, currentPage, drawLines, drawContent, new DefaultPageProvider(document, currentPage.getMediaBox()));
16+
public BaseTable(float yStart, float yStartNewPage, float bottomMargin, float width, float margin,
17+
PDDocument document, PDPage currentPage, boolean drawLines, boolean drawContent) throws IOException {
18+
this(yStart, yStartNewPage, 0, bottomMargin, width, margin, document, currentPage, drawLines, drawContent, newPageProvider(document, currentPage));
1819
}
19-
20-
public BaseTable(float yStart, float yStartNewPage, float pageTopMargin, float bottomMargin, float width, float margin, PDDocument document, PDPage currentPage, boolean drawLines, boolean drawContent) throws IOException {
21-
super(yStart, yStartNewPage, pageTopMargin, bottomMargin, width, margin, document, currentPage, drawLines, drawContent, new DefaultPageProvider(document, currentPage.getMediaBox()));
20+
21+
public BaseTable(float yStart, float yStartNewPage, float pageTopMargin, float bottomMargin, float width, float margin,
22+
PDDocument document, PDPage currentPage, boolean drawLines, boolean drawContent) throws IOException {
23+
this(yStart, yStartNewPage, pageTopMargin, bottomMargin, width, margin, document, currentPage, drawLines, drawContent, newPageProvider(document, currentPage));
2224
}
23-
24-
public BaseTable(float yStart, float yStartNewPage, float pageTopMargin, float bottomMargin, float width, float margin, PDDocument document, PDPage currentPage, boolean drawLines, boolean drawContent, final PageProvider<PDPage> pageProvider) throws IOException {
25+
26+
public BaseTable(float yStart, float yStartNewPage, float pageTopMargin, float bottomMargin, float width, float margin,
27+
PDDocument document, PDPage currentPage, boolean drawLines, boolean drawContent, PageProvider<PDPage> pageProvider) throws IOException {
2528
super(yStart, yStartNewPage, pageTopMargin, bottomMargin, width, margin, document, currentPage, drawLines, drawContent, pageProvider);
2629
}
2730

31+
protected static DefaultPageProvider newPageProvider(final PDDocument doc, final PDPage page) {
32+
return new DefaultPageProvider(doc, page.getMediaBox(), page.getRotation());
33+
}
34+
2835
@Override
2936
protected void loadFonts() {
3037
// Do nothing as we don't have any fonts to load

src/main/java/be/quodlibet/boxable/Table.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.apache.pdfbox.pdmodel.PDDocument;
1818
import org.apache.pdfbox.pdmodel.PDPage;
1919
import org.apache.pdfbox.pdmodel.PDPageContentStream;
20+
import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
2021
import org.apache.pdfbox.pdmodel.font.PDFont;
2122
import org.apache.pdfbox.pdmodel.font.PDType0Font;
2223
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageXYZDestination;
@@ -344,7 +345,7 @@ private void drawRow(Row<T> row) throws IOException {
344345
*
345346
* @return
346347
*/
347-
private T createNewPage() {
348+
private T createNewPage() throws IOException {
348349
if (pageProvider != null) {
349350
return pageProvider.nextPage();
350351
}

src/main/java/be/quodlibet/boxable/page/DefaultPageProvider.java

+35-4
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,34 @@
11
package be.quodlibet.boxable.page;
22

3+
import java.io.IOException;
4+
35
import org.apache.pdfbox.pdmodel.PDDocument;
46
import org.apache.pdfbox.pdmodel.PDPage;
7+
import org.apache.pdfbox.pdmodel.PDPageContentStream;
8+
import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
59
import org.apache.pdfbox.pdmodel.common.PDRectangle;
10+
import org.apache.pdfbox.util.Matrix;
611

712
public class DefaultPageProvider implements PageProvider<PDPage> {
813

14+
public static final int ANG_PORTRAIT = 0;
15+
public static final int ANG_LANDSCAPE = 90;
16+
917
private final PDDocument document;
1018

1119
private final PDRectangle size;
20+
private final int rotation;
1221

1322
private int currentPageIndex = -1;
1423

1524
public DefaultPageProvider(final PDDocument document, final PDRectangle size) {
25+
this(document, size, 0);
26+
}
27+
28+
public DefaultPageProvider(final PDDocument document, final PDRectangle size, final int rotation) {
1629
this.document = document;
1730
this.size = size;
31+
this.rotation = rotation;
1832
}
1933

2034
@Override
@@ -23,13 +37,13 @@ public PDDocument getDocument() {
2337
}
2438

2539
@Override
26-
public PDPage createPage() {
40+
public PDPage createPage() throws IOException {
2741
currentPageIndex = document.getNumberOfPages();
2842
return getCurrentPage();
2943
}
3044

3145
@Override
32-
public PDPage nextPage() {
46+
public PDPage nextPage() throws IOException {
3347
if (currentPageIndex == -1) {
3448
currentPageIndex = document.getNumberOfPages();
3549
} else {
@@ -40,7 +54,7 @@ public PDPage nextPage() {
4054
}
4155

4256
@Override
43-
public PDPage previousPage() {
57+
public PDPage previousPage() throws IOException {
4458
currentPageIndex--;
4559
if (currentPageIndex < 0) {
4660
currentPageIndex = 0;
@@ -49,14 +63,31 @@ public PDPage previousPage() {
4963
return getCurrentPage();
5064
}
5165

52-
private PDPage getCurrentPage() {
66+
private PDPage getCurrentPage() throws IOException {
5367
if (currentPageIndex >= document.getNumberOfPages()) {
5468
final PDPage newPage = new PDPage(size);
69+
newPage.setRotation(rotation);
70+
if (rotation == ANG_LANDSCAPE) { // => change ref. for drawing
71+
addContStrmRot(newPage);
72+
}
5573
document.addPage(newPage);
5674
return newPage;
5775
}
5876

5977
return document.getPage(currentPageIndex);
6078
}
6179

80+
protected void addContStrmRot(final PDPage pg) throws IOException {
81+
final PDPageContentStream cont = new PDPageContentStream(getDocument(), pg, AppendMode.APPEND, true);
82+
cont.transform(newTransfMtxOrientL(pg));
83+
cont.close();
84+
}
85+
86+
protected Matrix newTransfMtxOrientL(final PDPage pg) {
87+
return newTransfMtxOrientL(pg.getMediaBox().getWidth());
88+
}
89+
90+
protected Matrix newTransfMtxOrientL(final float w) {
91+
return new Matrix(0, 1, -1, 0, w, 0);
92+
}
6293
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
package be.quodlibet.boxable.page;
22

3+
import java.io.IOException;
4+
35
import org.apache.pdfbox.pdmodel.PDDocument;
46
import org.apache.pdfbox.pdmodel.PDPage;
57

68
public interface PageProvider<T extends PDPage> {
79

8-
T createPage();
10+
T createPage() throws IOException;
911

10-
T nextPage();
12+
T nextPage() throws IOException;
1113

12-
T previousPage();
14+
T previousPage() throws IOException;
1315

1416
PDDocument getDocument();
1517
}

0 commit comments

Comments
 (0)