diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2430ca680aedd6ed53bf48d082f9f787e4225acf..85c680fec18980fc089cb92f0e09f71c7b560f83 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: maven:latest +image: maven:3.9.6-eclipse-temurin-22 variables: # This will supress any download for dependencies and plugins or upload messages which would clutter the console log. @@ -14,6 +14,11 @@ cache: paths: - .m2/repository +stages: + - build + - test + - deploy + build: stage: build script: @@ -23,3 +28,10 @@ test: stage: test script: - mvn test + +deploy: + stage: deploy + rules: + - if: $CI_COMMIT_TAG + script: + - mvn deploy -s ci_settings.xml diff --git a/README.md b/README.md index a91bb66e3935efa5c72746ca9ba6828e7e943fe3..d17f28ec239d8536887f4e7b89d6377ce6f5b373 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ additionally provides a simple LRU cache. Note: Possibly inefficient for large (1000+ pages) and complex documents, because the document is -reparsed after each non-cached page request. +parsed again after each non-cached page request. ## Classes @@ -39,6 +39,7 @@ helper classes ## Setup +Project repository ```xml <repositories> <repository> @@ -47,16 +48,29 @@ helper classes <url>https://ftdev.utu.fi/maven2</url> </repository> </repositories> +``` + +Project dependency: +```xml <dependencies> <dependency> <groupId>fi.utu.tech</groupId> <artifactId>pdfbox-wrapper</artifactId> - <version>1.0.0</version> + <version>1.1.0</version> </dependency> </dependencies> ``` +Module imports + +```java +module demo { + requires transitive javafx.controls; + requires fi.utu.tech.pdfbox; +} +``` + ## Example ```kotlin diff --git a/bench/bench.R b/bench/bench.R index 0b4ba16e7d385692e5c1e6c8644bc3d912343874..6d8e36d5de7326c0e3a3c1944eb0cdef53c34597 100755 --- a/bench/bench.R +++ b/bench/bench.R @@ -12,7 +12,7 @@ runBenchmarks = any(is.element(args, "generate")) # generates the result file with t threads, results the data frame benchRun = function(n, t) { if (runBenchmarks) { - cmd = paste("java -jar pdfbox-benchmark/target/pdfbox-benchmark-1.0.2.jar", opts, "-t", t, "-rff", n) + cmd = paste("java -jar pdfbox-benchmark/target/pdfbox-benchmark-1.1.0.jar", opts, "-t", t, "-rff", n) print(cmd) system(cmd) } diff --git a/ci_settings.xml b/ci_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..59c8c271cb4549ebcad535c1c9e1907839ba440f --- /dev/null +++ b/ci_settings.xml @@ -0,0 +1,16 @@ +<settings xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd"> + <servers> + <server> + <id>gitlab-maven</id> + <configuration> + <httpHeaders> + <property> + <name>Job-Token</name> + <value>${env.CI_JOB_TOKEN}</value> + </property> + </httpHeaders> + </configuration> + </server> + </servers> +</settings> diff --git a/pdfbox-benchmark/pom.xml b/pdfbox-benchmark/pom.xml index e18d8e6fe4cbcb78e5368edcd924d279c4889e2a..4d61a6983298452bc05306f637b727285f86eeb5 100644 --- a/pdfbox-benchmark/pom.xml +++ b/pdfbox-benchmark/pom.xml @@ -2,18 +2,18 @@ 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.0.0-SNAPSHOT</version> + <version>1.1.0</version> <packaging>jar</packaging> <properties> <project.mainclass>org.openjdk.jmh.Main</project.mainclass> - <jmh.version>1.23</jmh.version> + <jmh.version>1.37</jmh.version> </properties> <parent> <groupId>fi.utu.tech</groupId> <artifactId>pdfbox-suite</artifactId> - <version>1.0.2</version> + <version>1.1.0</version> </parent> <dependencies> @@ -36,7 +36,13 @@ <dependency> <groupId>com.github.jbellis</groupId> <artifactId>jamm</artifactId> - <version>0.3.3</version> + <version>0.4.0</version> + </dependency> + <dependency> + <groupId>org.apache.pdfbox</groupId> + <artifactId>pdfbox</artifactId> + <version>3.0.2</version> + <scope>compile</scope> </dependency> </dependencies> @@ -104,4 +110,11 @@ </plugins> </build> + <repositories> + <repository> + <id>maven_central</id> + <name>Maven Central</name> + <url>https://repo.maven.apache.org/maven2/</url> + </repository> + </repositories> </project> diff --git a/pdfbox-benchmark/src/main/java/fi/utu/tech/pdfbox/benchmark/MemoryUse.java b/pdfbox-benchmark/src/main/java/fi/utu/tech/pdfbox/benchmark/MemoryUse.java index 18a17f569290ca389a2a6c876b8e31161d2f0011..bb4e4905569154c56215f3484cd05156465a7988 100644 --- a/pdfbox-benchmark/src/main/java/fi/utu/tech/pdfbox/benchmark/MemoryUse.java +++ b/pdfbox-benchmark/src/main/java/fi/utu/tech/pdfbox/benchmark/MemoryUse.java @@ -5,7 +5,7 @@ import org.github.jamm.MemoryMeter; import java.io.IOException; public class MemoryUse { - static final MemoryMeter meter = new MemoryMeter(); + static final MemoryMeter meter = MemoryMeter.builder().build(); static void analyze(Object o) { try { @@ -13,7 +13,7 @@ public class MemoryUse { System.out.println("Measuring the contents of [" + o.getClass().getCanonicalName() + "]"); System.out.println("Shallow memory consumption: " + m + " bytes."); System.out.println("Deep memory consumption: " + m2 + " bytes."); - System.out.println("Number of child objects : " + meter.countChildren(o)); + //System.out.println("Number of child objects : " + meter.countChildren(o)); } catch (IllegalStateException e) { System.err.println(); System.err.println("If you are starting the app from an IDE, remember to"); diff --git a/pdfbox-benchmark/src/main/java/fi/utu/tech/pdfbox/benchmark/MyBench.java b/pdfbox-benchmark/src/main/java/fi/utu/tech/pdfbox/benchmark/MyBench.java index a458cba0bb787f45f59f9cdd185ab7d2cd9ba39d..bebc97536483047d79599f235f51a3fcde4f6ac6 100644 --- a/pdfbox-benchmark/src/main/java/fi/utu/tech/pdfbox/benchmark/MyBench.java +++ b/pdfbox-benchmark/src/main/java/fi/utu/tech/pdfbox/benchmark/MyBench.java @@ -1,5 +1,6 @@ package fi.utu.tech.pdfbox.benchmark; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDRectangle; @@ -12,7 +13,7 @@ import java.io.IOException; import java.util.ArrayList; public class MyBench { - static final byte[] file = readBytes("/presentation.pdf"); + static final byte[] file = readBytes("presentation.pdf"); static final int width = 1920; static final int height = 1080; @@ -29,7 +30,7 @@ public class MyBench { static public ArrayList<BufferedImage> renderIterator() throws IOException { ArrayList<BufferedImage> images = new ArrayList<>(); - try (PDDocument document = PDDocument.load(file)) { + try (PDDocument document = Loader.loadPDF(file)) { PDFRenderer pdfRenderer = new PDFRenderer(document); int pageCounter = 0; for (PDPage page : document.getPages()) { @@ -55,7 +56,7 @@ public class MyBench { static public ArrayList<BufferedImage> renderSeparately() throws IOException { ArrayList<BufferedImage> images = new ArrayList<>(); - try (PDDocument document = PDDocument.load(file)) { + try (PDDocument document = Loader.loadPDF(file)) { PDFRenderer pdfRenderer = new PDFRenderer(document); int pageCounter = 0; for (int i = 0; i < document.getNumberOfPages(); i++) { diff --git a/pdfbox-benchmark/src/main/resources/presentation.pdf b/pdfbox-benchmark/src/main/resources/fi/utu/tech/pdfbox/bencmark/presentation.pdf similarity index 100% rename from pdfbox-benchmark/src/main/resources/presentation.pdf rename to pdfbox-benchmark/src/main/resources/fi/utu/tech/pdfbox/bencmark/presentation.pdf diff --git a/pdfbox-gui/pom.xml b/pdfbox-gui/pom.xml index 770590bedea8866169688e3fc31629701b918949..6718319581224e928575b8f89dba343cc8c65672 100644 --- a/pdfbox-gui/pom.xml +++ b/pdfbox-gui/pom.xml @@ -2,17 +2,19 @@ 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.0.0-SNAPSHOT</version> + <version>1.1.0</version> <packaging>jar</packaging> <properties> <project.mainclass>fi.utu.tech.pdfbox.gui.Main</project.mainclass> + <project.mainmodule>fi.utu.tech.pdfbox.gui</project.mainmodule> + <project.launcher>pdfbox</project.launcher> </properties> <parent> <groupId>fi.utu.tech</groupId> <artifactId>pdfbox-suite</artifactId> - <version>1.0.2</version> + <version>1.1.0</version> </parent> <dependencies> @@ -35,56 +37,17 @@ <build> <plugins> - <!-- Make a 'fat' jar, that is, jar that contains all its dependencies and runs as is. - See: https://stackoverflow.com/a/57691362 --> <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-shade-plugin</artifactId> - <version>3.2.4</version> - <executions> - <execution> - <phase>package</phase> - <goals> - <goal>shade</goal> - </goals> - <configuration> - <createDependencyReducedPom>false</createDependencyReducedPom> - <filters> - <filter> - <artifact>*:*</artifact> - <excludes> - <exclude>module-info.class</exclude> - <exclude>META-INF/*.SF</exclude> - <exclude>META-INF/*.DSA</exclude> - <exclude>META-INF/*.RSA</exclude> - </excludes> - </filter> - </filters> - <transformers> - <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> - <mainClass>${project.mainclass}</mainClass> - </transformer> - </transformers> - </configuration> - </execution> - </executions> - </plugin> - - <!-- Run this app with exec:java --> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>exec-maven-plugin</artifactId> - <version>3.0.0</version> - <executions> - <execution> - <goals> - <goal>java</goal> - </goals> - </execution> - </executions> + <groupId>org.openjfx</groupId> + <artifactId>javafx-maven-plugin</artifactId> + <version>0.0.8</version> <configuration> - <skip>false</skip> - <mainClass>${project.mainclass}</mainClass> + <mainClass>${project.mainmodule}/${project.mainclass}</mainClass> + <stripDebug>true</stripDebug> + <compress>2</compress> + <noHeaderFiles>true</noHeaderFiles> + <noManPages>true</noManPages> + <launcher>${project.launcher}</launcher> </configuration> </plugin> </plugins> 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 2e82e65e61536c91e3bb82cdd3209223f5feff81..79bfd7a522fecfae253501e86fb952493b9aa0a3 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 @@ -1,7 +1,95 @@ package fi.utu.tech.pdfbox.gui; -public class Main { +import fi.utu.tech.pdfbox.controls.DocumentView; +import fi.utu.tech.pdfbox.document.*; +import javafx.application.Application; +import javafx.application.Platform; +import javafx.beans.binding.Bindings; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.FlowPane; +import javafx.stage.FileChooser; +import javafx.stage.Screen; +import javafx.stage.Stage; + +import java.io.File; +import java.util.function.Consumer; + +public class Main extends Application { + final DocumentView view = new DocumentView(); + + void setDoc(DataSource src) { + view.getDocumentProperty().set( + new CachedDocument(new PDFDocument((int) view.getFitWidth() * 2, (int) view.getFitHeight() * 2, src, null), 3) + ); + } + + void openFile() { + singleFileDialog("Select PDF file", "PDF file", "pdf", false, f -> + setDoc(new FileSource(f)) + ); + } + + public void singleFileDialog(String title, String type, String ext, boolean saveDialog, Consumer<File> handler) { + FileChooser chooser = new FileChooser(); + chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(type + " (." + ext + ")", "*." + ext)); + chooser.setTitle(title); + File selected; + if (saveDialog) { + selected = chooser.showSaveDialog(null); + if (selected == null) return; + String file = selected.getAbsolutePath(); + if (!file.endsWith("." + ext)) + file += "." + ext; + selected = new File(file); + } else { + selected = chooser.showOpenDialog(null); + } + if (selected == null) return; + handler.accept(selected); + } + + @Override + public void start(Stage stage) { + var prev = new Button("Previous"); + prev.setOnAction(e -> view.prev()); + + var next = new Button("Next"); + next.setOnAction(e -> view.next()); + + var open = new Button("Open"); + open.setOnAction(e -> openFile()); + + var exit = new Button("Exit"); + exit.setOnAction(e -> Platform.exit()); + + var pages = new Label(); + pages.textProperty().bind(Bindings.concat( + "Page ", view.getPageProperty(), " / ", view.getPageCountProperty() + )); + + var pane = new BorderPane(view); + var controls = new FlowPane(prev, next, open, exit, pages); + pane.setBottom(controls); + view.fitWidthProperty().bind(pane.widthProperty()); + view.fitHeightProperty().bind(pane.heightProperty().subtract(controls.heightProperty())); + view.setPreserveRatio(true); + + stage.setTitle("PDF viewer"); + stage.setScene(new Scene(pane)); + var screen = Screen.getScreens().get(0).getBounds(); + stage.setWidth(screen.getWidth() * 2 / 3); + stage.setHeight(screen.getHeight() * 2 / 3); + stage.show(); + + var loader = new ResourceSource("presentation.pdf") { + }; + setDoc(loader); + } + public static void main(String[] args) { - MainApp.launch(MainApp.class, args); + Main.launch(Main.class, args); } } diff --git a/pdfbox-gui/src/main/java/fi/utu/tech/pdfbox/gui/MainApp.java b/pdfbox-gui/src/main/java/fi/utu/tech/pdfbox/gui/MainApp.java deleted file mode 100644 index b832bb9a5551b87eb1d791690811d5ed28fff356..0000000000000000000000000000000000000000 --- a/pdfbox-gui/src/main/java/fi/utu/tech/pdfbox/gui/MainApp.java +++ /dev/null @@ -1,90 +0,0 @@ -package fi.utu.tech.pdfbox.gui; - -import fi.utu.tech.pdfbox.controls.DocumentView; -import fi.utu.tech.pdfbox.document.*; -import javafx.application.Application; -import javafx.application.Platform; -import javafx.beans.binding.Bindings; -import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.Label; -import javafx.scene.layout.BorderPane; -import javafx.scene.layout.FlowPane; -import javafx.stage.FileChooser; -import javafx.stage.Screen; -import javafx.stage.Stage; - -import java.io.File; -import java.io.IOException; -import java.util.function.Consumer; - -public class MainApp extends Application { - DocumentView view = new DocumentView(); - - void setDoc(DataSource src) { - view.getDocumentProperty().set( - new CachedDocument(new PDFDocument((int) view.getFitWidth() * 2, (int) view.getFitHeight() * 2, src, null), 3) - ); - } - - void openFile() { - singleFileDialog("Select PDF file", "PDF file", "pdf", false, f -> - setDoc(new FileSource(f)) - ); - } - - public void singleFileDialog(String title, String type, String ext, boolean saveDialog, Consumer<File> handler) { - FileChooser chooser = new FileChooser(); - chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(type + " (." + ext + ")", "*." + ext)); - chooser.setTitle(title); - File selected; - if (saveDialog) { - selected = chooser.showSaveDialog(null); - if (selected == null) return; - String file = selected.getAbsolutePath(); - if (!file.endsWith("." + ext)) - file += "." + ext; - selected = new File(file); - } else { - selected = chooser.showOpenDialog(null); - } - if (selected == null) return; - handler.accept(selected); - } - - @Override - public void start(Stage stage) throws IOException { - var prev = new Button("Previous"); - prev.setOnAction(e -> view.prev()); - - var next = new Button("Next"); - next.setOnAction(e -> view.next()); - - var open = new Button("Open"); - open.setOnAction(e -> openFile()); - - var exit = new Button("Exit"); - exit.setOnAction(e -> Platform.exit()); - - var pages = new Label(); - pages.textProperty().bind(Bindings.concat( - "Page ", view.getPageProperty(), " / ", view.getPageCountProperty() - )); - - var pane = new BorderPane(view); - var controls = new FlowPane(prev, next, open, exit, pages); - pane.setBottom(controls); - view.fitWidthProperty().bind(pane.widthProperty()); - view.fitHeightProperty().bind(pane.heightProperty().subtract(controls.heightProperty())); - view.setPreserveRatio(true); - - stage.setTitle("PDF viewer"); - stage.setScene(new Scene(pane)); - var screen = Screen.getScreens().get(0).getBounds(); - stage.setWidth(screen.getWidth() * 2 / 3); - stage.setHeight(screen.getHeight() * 2 / 3); - stage.show(); - - setDoc(new ResourceSource("/presentation.pdf")); - } -} diff --git a/pdfbox-gui/src/main/java/module-info.java b/pdfbox-gui/src/main/java/module-info.java index 5e5960295552e64076d62b9cc0a97b44ec1c4dc8..2ad1b516f0b24a32bd443439070d718033298eee 100644 --- a/pdfbox-gui/src/main/java/module-info.java +++ b/pdfbox-gui/src/main/java/module-info.java @@ -1,5 +1,4 @@ module fi.utu.tech.pdfbox.gui { - requires transitive javafx.base; requires transitive javafx.controls; requires fi.utu.tech.pdfbox; exports fi.utu.tech.pdfbox.gui; diff --git a/pdfbox-gui/src/main/resources/presentation.pdf b/pdfbox-gui/src/main/resources/fi/utu/tech/pdfbox/gui/presentation.pdf similarity index 100% rename from pdfbox-gui/src/main/resources/presentation.pdf rename to pdfbox-gui/src/main/resources/fi/utu/tech/pdfbox/gui/presentation.pdf diff --git a/pdfbox-wrapper/pom.xml b/pdfbox-wrapper/pom.xml index 9c9e052791bba9f2b401151dc8afc644c87cf354..591c30fdd097ce456d9ab7d63d0857fe7002061e 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.0.2</version> + <version>1.1.0</version> <packaging>jar</packaging> <parent> <groupId>fi.utu.tech</groupId> <artifactId>pdfbox-suite</artifactId> - <version>1.0.2</version> + <version>1.1.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 d0d0c66b31b9fa65aa6219071b124f3b7f0f0a37..a0b6cb486339872842bcf022b3f35d6f08770f73 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,6 +7,8 @@ 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>() @@ -24,13 +26,13 @@ open class DocumentView : ImageView { fun next() { documentProperty.get()?.let { - pageProperty.set(Math.min(it.pageCount(), pageProperty.get() + 1)) + pageProperty.set(min(it.pageCount(), pageProperty.get() + 1)) } } fun prev() { documentProperty.get()?.let { - pageProperty.set(Math.max(0, pageProperty.get() - 1)) + pageProperty.set(max(0, pageProperty.get() - 1)) } } 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 2780a3f103e8014f1306a9b8f291008e0d2920ff..c27321b4f598ee0a606fe4856695185a052f3378 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,8 @@ package fi.utu.tech.pdfbox.document import fi.utu.tech.pdfbox.utils.LRUCache -class CachedDocument(val document: Document, cacheSize: Int) : - Document(document.requestWidth, document.requestWidth) { +open class CachedDocument(val document: Document, cacheSize: Int) : + Document(document.requestWidth, document.requestWidth) { private val cache = LRUCache<Int, PageData>(cacheSize) override fun refresh() { 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 d69227688a7d35cbf9e2eae0f193c57c606bba16..e3c915f7ba5539c6f448903f990d115e1089e440 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 @@ -1,6 +1,7 @@ package fi.utu.tech.pdfbox.document import java.io.File +import java.io.IOException import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths @@ -9,14 +10,19 @@ abstract class DataSource { abstract fun load(): ByteArray } -data class FileSource(val path: Path) : DataSource() { +open class FileSource(val path: Path) : DataSource() { constructor(path: String) : this(Paths.get(path)) constructor(file: File) : this(file.toPath()) - override fun load() = Files.readAllBytes(path)!! + override fun load(): ByteArray = Files.readAllBytes(path) } -data class ResourceSource(val path: String) : DataSource() { - override fun load() = javaClass.getResourceAsStream(path).readAllBytes()!! +open class ResourceSource(val path: String) : DataSource() { + override fun load() = try { + javaClass.getResourceAsStream(path).readAllBytes()!! + } + catch (e: Exception) { + throw IOException("Java resource $path not found!") + } } \ 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 27a1c086f97d8bb54ce63b37e161a54516f78c19..562485edeca2800605345ed53f00c6f741f13214 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 @@ -1,16 +1,16 @@ package fi.utu.tech.pdfbox.document import javafx.embed.swing.SwingFXUtils -import org.apache.pdfbox.pdmodel.PDDocument +import org.apache.pdfbox.Loader import org.apache.pdfbox.rendering.ImageType 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 + val requestWidth: Int, + val requestHeight: Int, + val executor: Executor? = null ) { abstract fun documentData(pageIdx: Int): ByteArray @@ -28,7 +28,7 @@ abstract class Document( // 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) = PDDocument.load(documentData(pageIdx)).use { document -> + open fun renderNow(pageIdx: Int) = Loader.loadPDF(documentData(pageIdx)).use { document -> val renderer = PDFRenderer(document) val renderedPageIdx = documentPage(pageIdx) @@ -44,15 +44,15 @@ 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) + println("Requested: $requestWidth x $requestHeight") + println("Size: $widthPt x $heightPt") + println("Got: ${swingImage.width} x ${swingImage.height}") + println("Scale: $scale") RenderedPage( - swingImage.width, - swingImage.height, - fxImage + swingImage.width, + swingImage.height, + fxImage ) } 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 177c98e0096c90bffef206a4fbe66a3f5f4755a3..a87461ebcf8513c0e76535510d09084d8ada2be7 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 @@ -4,20 +4,19 @@ import java.io.IOException import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths -import java.util.stream.Collectors -class FolderDocument( - requestWidth: Int, - requestHeight: Int, - val rootPath: Path +open class FolderDocument( + requestWidth: Int, + requestHeight: Int, + val rootPath: Path ) : Document(requestWidth, requestHeight) { constructor( - requestWidth: Int, - requestHeight: Int, - rootPath: String + requestWidth: Int, + requestHeight: Int, + rootPath: String ) : this(requestWidth, requestHeight, Paths.get(rootPath)) - protected var directoryContents = readDirectory() + protected var directoryContents: List<Path> = readDirectory() override fun resize(width: Int, height: Int) = FolderDocument(width, height, rootPath) @@ -26,7 +25,8 @@ class FolderDocument( } open fun readDirectory(): List<Path> = - Files.list(rootPath).collect(Collectors.toList()).filter { it.toString().toUpperCase().endsWith(".PDF") }.sortedBy { it.toString() } + Files.list(rootPath).toList().filter { "$it".toUpperCase().endsWith(".PDF") } + .sortedBy { it.toString() } override fun documentData(pageIdx: Int): ByteArray = Files.readAllBytes(directoryContents[pageIdx]) ?: throw IOException("Empty file") 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 f2289ef847b3c84a4f59b6ef9a3fe62b44196236..eddda41cbe9666a09b5020ff037afe64ce3aea7b 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 @@ -1,26 +1,26 @@ package fi.utu.tech.pdfbox.document -import org.apache.pdfbox.pdmodel.PDDocument +import org.apache.pdfbox.Loader import java.util.concurrent.Executor -class PDFDocument( - requestWidth: Int, - requestHeight: Int, - private var documentData: ByteArray, - val source: DataSource? = null, - executor: Executor? = null +open class PDFDocument( + requestWidth: Int, + requestHeight: Int, + private var documentData: ByteArray, + val source: DataSource? = null, + executor: Executor? = null ) : Document(requestWidth, requestHeight, executor) { protected var pageCount = parsePageCount() fun parsePageCount(): Int = - PDDocument.load(documentData).use { it.numberOfPages } + Loader.loadPDF(documentData).use { it.numberOfPages } constructor( - requestWidth: Int, - requestHeight: Int, - source: DataSource, - executor: Executor? = null + requestWidth: Int, + requestHeight: Int, + source: DataSource, + executor: Executor? = null ) : this(requestWidth, requestHeight, source.load(), source, executor) override fun refresh() { diff --git a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/Page.kt b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/Page.kt index af497bc0aee9d641650983a2acb13f5ff6dd084d..c7b296aea00f2ad58fec6e2732b2dbd314d6a15f 100644 --- a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/Page.kt +++ b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/Page.kt @@ -1,6 +1,6 @@ package fi.utu.tech.pdfbox.document -interface Page<X : Page<X>> : Comparable<X>{ +interface Page<X : Page<X>> : Comparable<X> { val pageNum: Int override fun compareTo(other: X) = pageNum.compareTo(other.pageNum) diff --git a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/PageData.kt b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/PageData.kt index 9ac12914ba6412d90aaadc0002c277fe14ba3f75..d23ad0af7065c61ffc37ddccc81a85009474f1d5 100644 --- a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/PageData.kt +++ b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/PageData.kt @@ -3,7 +3,7 @@ package fi.utu.tech.pdfbox.document import java.util.concurrent.CompletableFuture data class PageData( - override val pageNum: Int, - val caption: String, - val rendered: CompletableFuture<RenderedPage> + override val pageNum: Int, + val caption: String, + val rendered: CompletableFuture<RenderedPage> ) : Page<PageData> \ No newline at end of file diff --git a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/RenderedPage.kt b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/RenderedPage.kt index 285956a974698983defc99a7f0b19c5b28b3623f..c61ab7602f9ab3cfe406d99eae5c2a00065e14ff 100644 --- a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/RenderedPage.kt +++ b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/document/RenderedPage.kt @@ -3,7 +3,7 @@ package fi.utu.tech.pdfbox.document import javafx.scene.image.WritableImage data class RenderedPage( - val width: Int, - val height: Int, - val image: WritableImage + val width: Int, + val height: Int, + val image: WritableImage ) \ No newline at end of file diff --git a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/utils/DirectExecutor.kt b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/utils/DirectExecutor.kt index ff618709031305403d38a363b08f6b032b29b1d2..fe8f4ee5e871afd60b7f140f1e3bec15b15e771d 100644 --- a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/utils/DirectExecutor.kt +++ b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/utils/DirectExecutor.kt @@ -7,9 +7,8 @@ import java.util.concurrent.ForkJoinPool // https://github.com/vjames19/kotlin-futures object DirectExecutor : Executor { - override fun execute(command: Runnable) { + override fun execute(command: Runnable) = command.run() - } } object ForkJoinExecutor : ExecutorService by ForkJoinPool.commonPool() \ No newline at end of file diff --git a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/utils/Future.kt b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/utils/Future.kt index 04bfb828d8ca13f42888abc430525eb59d8b65b4..c2dd85b90f94bff8f8a9d59d166c5ce3cd14c51c 100644 --- a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/utils/Future.kt +++ b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/utils/Future.kt @@ -1,5 +1,5 @@ package fi.utu.tech.pdfbox.utils - +/* import java.util.* import java.util.concurrent.CompletableFuture import java.util.concurrent.Executor @@ -133,3 +133,4 @@ object Future { fr.zip(fa, executor) { r, a -> r.add(f(a)); r } }.map(executor) { it.toList() } } +*/ \ No newline at end of file diff --git a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/utils/LRUCache.kt b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/utils/LRUCache.kt index 891b16a28ce65c4b9389b317ea159b4d9a5495a7..2b60104278d6ec4880bb164c641276e46a2d38e8 100644 --- a/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/utils/LRUCache.kt +++ b/pdfbox-wrapper/src/main/java/fi/utu/tech/pdfbox/utils/LRUCache.kt @@ -21,10 +21,10 @@ class LRUCache<K, V>(val capacity: Int, private val onRemove: (V) -> Unit = { }) //Recently accessed, hence move it to the tail operator fun get(key: K): V? = - if (queue.remove(key)) { - queue.add(key) - map[key] - } else null + if (queue.remove(key)) { + queue.add(key) + map[key] + } else null operator fun set(key: K, value: V) { val existing = map[key] diff --git a/pdfbox-wrapper/src/main/java/module-info.java b/pdfbox-wrapper/src/main/java/module-info.java index 44855b04b8d986fd71fc251b09b7a26bf03a022b..0e5272770d23ea6808cf7c4779d6c889f6ab7d07 100644 --- a/pdfbox-wrapper/src/main/java/module-info.java +++ b/pdfbox-wrapper/src/main/java/module-info.java @@ -1,7 +1,6 @@ module fi.utu.tech.pdfbox { requires kotlin.stdlib; requires org.apache.pdfbox; - requires java.desktop; requires javafx.swing; requires transitive javafx.base; exports fi.utu.tech.pdfbox.document; diff --git a/pom.xml b/pom.xml index e50d0e7bee292c6d26bd059eb18bd3ec7a0f7830..4fbfd4f3ee413e264bad4e75d52a23b2d522cc28 100644 --- a/pom.xml +++ b/pom.xml @@ -1,18 +1,17 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project> <modelVersion>4.0.0</modelVersion> <groupId>fi.utu.tech</groupId> <artifactId>pdfbox-suite</artifactId> - <version>1.0.2</version> + <version>1.1.0</version> <packaging>pom</packaging> <properties> - <jdk.version>11</jdk.version> - <kotlin.version>1.4.30</kotlin.version> - <javafx.version>15.0.1</javafx.version> + <jdk.version>17</jdk.version> + <kotlin.version>2.0.0</kotlin.version> + <javafx.version>22</javafx.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <pdfbox.version>2.0.22</pdfbox.version> - <pdfboxwrapper.version>1.0.2</pdfboxwrapper.version> + <pdfbox.version>3.0.2</pdfbox.version> + <pdfboxwrapper.version>1.1.0</pdfboxwrapper.version> </properties> <modules> @@ -31,6 +30,11 @@ <build> <plugins> + <plugin> + <groupId>org.openjfx</groupId> + <artifactId>javafx-maven-plugin</artifactId> + <version>0.0.8</version> + </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> @@ -85,19 +89,15 @@ </executions> </plugin> </plugins> - <extensions> - <extension> - <groupId>org.apache.maven.wagon</groupId> - <artifactId>wagon-ssh</artifactId> - <version>3.4.1</version> - </extension> - </extensions> </build> <distributionManagement> <repository> - <id>ftdev</id> - <name>UTU tech ftdev repository</name> - <url>scp://localhost:2222/var/www/maven2</url> + <id>gitlab-maven</id> + <url>${env.CI_API_V4_URL}/projects/${env.CI_PROJECT_ID}/packages/maven</url> </repository> + <snapshotRepository> + <id>gitlab-maven</id> + <url>${env.CI_API_V4_URL}/projects/${env.CI_PROJECT_ID}/packages/maven</url> + </snapshotRepository> </distributionManagement> </project>