From ea601ee5c60753c45ff304bec207d846bfee6513 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jari-Matti=20M=C3=A4kel=C3=A4?= <jmjmak@utu.fi>
Date: Wed, 31 Jul 2024 15:48:36 +0300
Subject: [PATCH] -

---
 pdfbox-benchmark/pom.xml                      |  6 +-
 pdfbox-gui/pom.xml                            |  4 +-
 .../java/fi/utu/tech/pdfbox/gui/Main.java     |  7 +--
 pdfbox-wrapper/pom.xml                        |  4 +-
 .../utu/tech/pdfbox/controls/DocumentView.kt  | 13 ++---
 .../tech/pdfbox/document/CachedDocument.kt    | 13 +----
 .../fi/utu/tech/pdfbox/document/DataSource.kt |  8 ++-
 .../fi/utu/tech/pdfbox/document/Document.kt   | 57 ++++++++++++-------
 .../tech/pdfbox/document/FolderDocument.kt    |  2 +-
 .../utu/tech/pdfbox/document/PDFDocument.kt   |  2 +-
 pom.xml                                       |  4 +-
 11 files changed, 60 insertions(+), 60 deletions(-)

diff --git a/pdfbox-benchmark/pom.xml b/pdfbox-benchmark/pom.xml
index 4d61a69..83ecf59 100644
--- a/pdfbox-benchmark/pom.xml
+++ b/pdfbox-benchmark/pom.xml
@@ -2,7 +2,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <artifactId>pdfbox-benchmark</artifactId>
-    <version>1.1.0</version>
+    <version>1.2.0</version>
     <packaging>jar</packaging>
 
     <properties>
@@ -13,7 +13,7 @@
     <parent>
         <groupId>fi.utu.tech</groupId>
         <artifactId>pdfbox-suite</artifactId>
-        <version>1.1.0</version>
+        <version>1.2.0</version>
     </parent>
 
     <dependencies>
@@ -79,7 +79,6 @@
                     <mainClass>fi.utu.tech.pdfbox.benchmark.MemoryUse</mainClass>
                 </configuration>
             </plugin>
-
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>
@@ -107,7 +106,6 @@
                     </execution>
                 </executions>
             </plugin>
-
         </plugins>
     </build>
     <repositories>
diff --git a/pdfbox-gui/pom.xml b/pdfbox-gui/pom.xml
index 6718319..24735ee 100644
--- a/pdfbox-gui/pom.xml
+++ b/pdfbox-gui/pom.xml
@@ -2,7 +2,7 @@
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <artifactId>pdfbox-gui</artifactId>
-    <version>1.1.0</version>
+    <version>1.2.0</version>
     <packaging>jar</packaging>
 
     <properties>
@@ -14,7 +14,7 @@
     <parent>
         <groupId>fi.utu.tech</groupId>
         <artifactId>pdfbox-suite</artifactId>
-        <version>1.1.0</version>
+        <version>1.2.0</version>
     </parent>
 
     <dependencies>
diff --git a/pdfbox-gui/src/main/java/fi/utu/tech/pdfbox/gui/Main.java b/pdfbox-gui/src/main/java/fi/utu/tech/pdfbox/gui/Main.java
index 79bfd7a..e89e6e4 100644
--- a/pdfbox-gui/src/main/java/fi/utu/tech/pdfbox/gui/Main.java
+++ b/pdfbox-gui/src/main/java/fi/utu/tech/pdfbox/gui/Main.java
@@ -22,7 +22,7 @@ public class Main extends Application {
 
     void setDoc(DataSource src) {
         view.getDocumentProperty().set(
-                new CachedDocument(new PDFDocument((int) view.getFitWidth() * 2, (int) view.getFitHeight() * 2, src, null), 3)
+                new CachedDocument(new PDFDocument((int) view.getFitWidth() * 2, (int) view.getFitHeight() * 2, src, null), 5)
         );
     }
 
@@ -67,7 +67,7 @@ public class Main extends Application {
 
         var pages = new Label();
         pages.textProperty().bind(Bindings.concat(
-                "Page ", view.getPageProperty(), " / ", view.getPageCountProperty()
+                "Page ", view.getPageProperty().add(1), " / ", view.getPageCountProperty()
         ));
 
         var pane = new BorderPane(view);
@@ -84,8 +84,7 @@ public class Main extends Application {
         stage.setHeight(screen.getHeight() * 2 / 3);
         stage.show();
 
-        var loader = new ResourceSource("presentation.pdf") {
-        };
+        var loader = new ResourceSource("presentation.pdf", getClass());
         setDoc(loader);
     }
 
diff --git a/pdfbox-wrapper/pom.xml b/pdfbox-wrapper/pom.xml
index 591c30f..3c8e7ce 100644
--- a/pdfbox-wrapper/pom.xml
+++ b/pdfbox-wrapper/pom.xml
@@ -2,13 +2,13 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <artifactId>pdfbox-wrapper</artifactId>
-    <version>1.1.0</version>
+    <version>1.2.0</version>
     <packaging>jar</packaging>
 
     <parent>
         <groupId>fi.utu.tech</groupId>
         <artifactId>pdfbox-suite</artifactId>
-        <version>1.1.0</version>
+        <version>1.2.0</version>
     </parent>
 
     <dependencies>
diff --git a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/controls/DocumentView.kt b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/controls/DocumentView.kt
index a0b6cb4..fef8723 100644
--- a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/controls/DocumentView.kt
+++ b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/controls/DocumentView.kt
@@ -7,8 +7,6 @@ import javafx.beans.Observable
 import javafx.beans.property.SimpleIntegerProperty
 import javafx.beans.property.SimpleObjectProperty
 import javafx.scene.image.ImageView
-import kotlin.math.max
-import kotlin.math.min
 
 open class DocumentView : ImageView {
     val documentProperty = SimpleObjectProperty<Document>()
@@ -25,15 +23,12 @@ open class DocumentView : ImageView {
     }
 
     fun next() {
-        documentProperty.get()?.let {
-            pageProperty.set(min(it.pageCount(), pageProperty.get() + 1))
-        }
+        val doc = documentProperty.get()
+        if (doc != null && pageProperty.value < doc.pageCount() - 1) pageProperty.value++
     }
 
     fun prev() {
-        documentProperty.get()?.let {
-            pageProperty.set(max(0, pageProperty.get() - 1))
-        }
+        if (pageProperty.value > 0) pageProperty.value--
     }
 
     open fun renderCallback(page: RenderedPage) {
@@ -47,7 +42,7 @@ open class DocumentView : ImageView {
             pageCountProperty.set(it.pageCount())
             val page = pageProperty.get()
             if (it.pageCount() > page && page >= 0)
-            it.render(page).rendered.thenAccept(::renderCallback)
+                it.render(page).rendered.thenAccept(::renderCallback)
         }
     }
 }
\ No newline at end of file
diff --git a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/CachedDocument.kt b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/CachedDocument.kt
index c27321b..89abe66 100644
--- a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/CachedDocument.kt
+++ b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/CachedDocument.kt
@@ -2,8 +2,7 @@ package fi.utu.tech.pdfbox.document
 
 import fi.utu.tech.pdfbox.utils.LRUCache
 
-open class CachedDocument(val document: Document, cacheSize: Int) :
-    Document(document.requestWidth, document.requestWidth) {
+open class CachedDocument(val document: Document, cacheSize: Int) : Document by document {
     private val cache = LRUCache<Int, PageData>(cacheSize)
 
     override fun refresh() {
@@ -11,16 +10,6 @@ open class CachedDocument(val document: Document, cacheSize: Int) :
         cache.clear()
     }
 
-    override fun resize(width: Int, height: Int) = document.resize(width, height)
-
-    override fun documentData(pageIdx: Int) = document.documentData(pageIdx)
-
-    override fun pageCount() = document.pageCount()
-
-    override fun caption(pageIdx: Int) = document.caption(pageIdx)
-
-    override fun renderNow(pageIdx: Int) = document.renderNow(pageIdx)
-
     override fun render(pageIdx: Int): PageData {
         val cached = cache[pageIdx]
         if (cached != null) return cached
diff --git a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/DataSource.kt b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/DataSource.kt
index e3c915f..25bbbed 100644
--- a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/DataSource.kt
+++ b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/DataSource.kt
@@ -2,6 +2,7 @@ package fi.utu.tech.pdfbox.document
 
 import java.io.File
 import java.io.IOException
+import java.io.InputStream
 import java.nio.file.Files
 import java.nio.file.Path
 import java.nio.file.Paths
@@ -18,11 +19,14 @@ open class FileSource(val path: Path) : DataSource() {
     override fun load(): ByteArray = Files.readAllBytes(path)
 }
 
-open class ResourceSource(val path: String) : DataSource() {
+open class ResourceSource(val path: String, private val classDef: Class<*>) : DataSource() {
     override fun load() = try {
-        javaClass.getResourceAsStream(path).readAllBytes()!!
+        classDef.getResourceAsStream(path)?.readAllBytes()!!
     }
     catch (e: Exception) {
         throw IOException("Java resource $path not found!")
     }
+}
+open class StreamSource(private val stream: InputStream) : DataSource() {
+    override fun load() = stream.readAllBytes()
 }
\ No newline at end of file
diff --git a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/Document.kt b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/Document.kt
index 562485e..8a9befa 100644
--- a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/Document.kt
+++ b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/Document.kt
@@ -7,28 +7,40 @@ import org.apache.pdfbox.rendering.PDFRenderer
 import java.util.concurrent.CompletableFuture
 import java.util.concurrent.Executor
 
-abstract class Document(
-    val requestWidth: Int,
-    val requestHeight: Int,
-    val executor: Executor? = null
-) {
-    abstract fun documentData(pageIdx: Int): ByteArray
+interface Document {
+    val requestWidth: Int
+
+    val requestHeight: Int
+
+    fun documentData(pageIdx: Int): ByteArray
+
+    fun pageCount(): Int
+
+    fun caption(pageIdx: Int): String
 
-    abstract fun pageCount(): Int
+    fun resize(width: Int, height: Int): Document
 
-    abstract fun caption(pageIdx: Int): String
+    fun refresh()
 
-    abstract fun resize(width: Int, height: Int): Document
+    fun documentPage(pageIdx: Int) = pageIdx
 
-    abstract fun refresh()
+    fun renderNow(pageIdx: Int): RenderedPage
 
-    protected fun documentPage(pageIdx: Int) = pageIdx
+    fun render(pageIdx: Int): PageData
+}
+
+abstract class DocumentBase(
+    override val requestWidth: Int,
+    override val requestHeight: Int,
+    val executor: Executor? = null
+) : Document {
+    var debugMode = false
 
     // parsing the document is not thread-safe
     // PDDocument.getPage docs recommend reusing the iterator for large (> 1000 pg) documents
     // presentations typically have < 100 pages
     // https://pdfbox.apache.org/docs/2.0.13/javadocs/org/apache/pdfbox/pdmodel/PDDocument.html
-    open fun renderNow(pageIdx: Int) = Loader.loadPDF(documentData(pageIdx)).use { document ->
+    override fun renderNow(pageIdx: Int): RenderedPage = Loader.loadPDF(documentData(pageIdx)).use { document ->
         val renderer = PDFRenderer(document)
 
         val renderedPageIdx = documentPage(pageIdx)
@@ -44,10 +56,13 @@ abstract class Document(
 
         val fxImage = SwingFXUtils.toFXImage(swingImage, null)
 
-        println("Requested: $requestWidth x $requestHeight")
-        println("Size:      $widthPt x $heightPt")
-        println("Got:       ${swingImage.width} x ${swingImage.height}")
-        println("Scale:     $scale")
+        if (debugMode) {
+            println("Document $this")
+            println("Requested: $requestWidth x $requestHeight")
+            println("Size:      $widthPt x $heightPt")
+            println("Got:       ${swingImage.width} x ${swingImage.height}")
+            println("Scale:     $scale")
+        }
 
         RenderedPage(
             swingImage.width,
@@ -56,12 +71,12 @@ abstract class Document(
         )
     }
 
-    open fun render(pageIdx: Int): PageData {
-        val renderedPage = if (executor == null)
+    override fun render(pageIdx: Int): PageData = PageData(
+        pageNum = pageIdx,
+        caption = caption(pageIdx),
+        rendered =if (executor == null)
             CompletableFuture.supplyAsync { renderNow(pageIdx) }
         else
             CompletableFuture.supplyAsync({ renderNow(pageIdx) }, executor)
-
-        return PageData(pageIdx, caption(pageIdx), renderedPage)
-    }
+    )
 }
diff --git a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/FolderDocument.kt b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/FolderDocument.kt
index a87461e..03fedc9 100644
--- a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/FolderDocument.kt
+++ b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/FolderDocument.kt
@@ -9,7 +9,7 @@ open class FolderDocument(
     requestWidth: Int,
     requestHeight: Int,
     val rootPath: Path
-) : Document(requestWidth, requestHeight) {
+) : DocumentBase(requestWidth, requestHeight) {
     constructor(
         requestWidth: Int,
         requestHeight: Int,
diff --git a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/PDFDocument.kt b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/PDFDocument.kt
index eddda41..902e48a 100644
--- a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/PDFDocument.kt
+++ b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/PDFDocument.kt
@@ -9,7 +9,7 @@ open class PDFDocument(
     private var documentData: ByteArray,
     val source: DataSource? = null,
     executor: Executor? = null
-) : Document(requestWidth, requestHeight, executor) {
+) : DocumentBase(requestWidth, requestHeight, executor) {
 
     protected var pageCount = parsePageCount()
 
diff --git a/pom.xml b/pom.xml
index 4fbfd4f..1f87129 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>fi.utu.tech</groupId>
     <artifactId>pdfbox-suite</artifactId>
-    <version>1.1.0</version>
+    <version>1.2.0</version>
     <packaging>pom</packaging>
 
     <properties>
@@ -11,7 +11,7 @@
         <javafx.version>22</javafx.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <pdfbox.version>3.0.2</pdfbox.version>
-        <pdfboxwrapper.version>1.1.0</pdfboxwrapper.version>
+        <pdfboxwrapper.version>1.2.0</pdfboxwrapper.version>
     </properties>
 
     <modules>
-- 
GitLab