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