From 381af8166481367934b2f5acf64ebc376b67754e Mon Sep 17 00:00:00 2001
From: Stavros Iliopoulos
Date: Wed, 30 Aug 2023 22:03:20 +0300
Subject: [PATCH] Add stirling-pdf and fix filebrowser. (#1100)
* Add stirling-pdf.
* Delete apps/stirling-pdf/metadata/stirling.png
* Update description.md
* Update description.md
* Update docker-compose.yml
* Update docker-compose.yml
---
README.md | 1 +
apps/filebrowser/docker-compose.yml | 4 +-
apps/filebrowser/metadata/description.md | 4 +-
apps/stirling-pdf/config.json | 20 +++++++
apps/stirling-pdf/docker-compose.yml | 40 ++++++++++++++
apps/stirling-pdf/metadata/description.md | 64 ++++++++++++++++++++++
apps/stirling-pdf/metadata/logo.jpg | Bin 0 -> 18046 bytes
7 files changed, 128 insertions(+), 5 deletions(-)
create mode 100644 apps/stirling-pdf/config.json
create mode 100644 apps/stirling-pdf/docker-compose.yml
create mode 100644 apps/stirling-pdf/metadata/description.md
create mode 100644 apps/stirling-pdf/metadata/logo.jpg
diff --git a/README.md b/README.md
index 1b730980..7ad20717 100644
--- a/README.md
+++ b/README.md
@@ -122,6 +122,7 @@ This is the official repository for the Tipi App Store. It contains all the apps
- [SimpleX SMP](https://github.com/simplex-chat/simplexmq) - A reference implementation of the SimpleX Messaging Protocol for simplex queues over public networks.
- [Sonarr](https://github.com/Sonarr/Sonarr) - TV show manager for Usenet and BitTorrent
- [Sshwifty](https://github.com/nirui/sshwifty/) - Web SSH & Telnet (WebSSH & WebTelnet client)
+- [Stirling-PDF](https://github.com/Frooodle/Stirling-PDF) - Locally hosted web application that allows you to perform various operations on PDF files.
- [Syncthing](https://github.com/syncthing/syncthing) - Continuous File Synchronization
- [Tailscale](https://github.com/tailscale/tailscale) - The easiest, most secure way to use WireGuard and 2FA
- [Tandoor](https://github.com/TandoorRecipes/recipes) - Drop your collection of links and notes. Get Tandoor and never look back onto a time without recipe management, storage, sharing and collaborative cooking!
diff --git a/apps/filebrowser/docker-compose.yml b/apps/filebrowser/docker-compose.yml
index 00cc0598..d3421d18 100644
--- a/apps/filebrowser/docker-compose.yml
+++ b/apps/filebrowser/docker-compose.yml
@@ -5,12 +5,10 @@ services:
image: filebrowser/filebrowser:s6
ports:
- ${APP_PORT}:80
- environment:
- - PUID=1000
- - PGID=1000
volumes:
- ${ROOT_FOLDER_HOST}/app-data:/srv/app-data
- ${ROOT_FOLDER_HOST}/media:/srv/media
+ - ${APP_DATA_DIR}/data/general:/srv/general
- ${APP_DATA_DIR}/data/db:/database
- ${APP_DATA_DIR}/data/config:/config
networks:
diff --git a/apps/filebrowser/metadata/description.md b/apps/filebrowser/metadata/description.md
index 3c7355e1..8160c31e 100644
--- a/apps/filebrowser/metadata/description.md
+++ b/apps/filebrowser/metadata/description.md
@@ -4,9 +4,9 @@ filebrowser provides a file managing interface within a specified directory and
- **username**: admin
- **password**: admin
-
+
## Features
Please refer to our docs at [https://filebrowser.org/features](https://filebrowser.org/features)
-![Preview](https://user-images.githubusercontent.com/5447088/50716739-ebd26700-107a-11e9-9817-14230c53efd2.gif)
\ No newline at end of file
+![Preview](https://user-images.githubusercontent.com/5447088/50716739-ebd26700-107a-11e9-9817-14230c53efd2.gif)
diff --git a/apps/stirling-pdf/config.json b/apps/stirling-pdf/config.json
new file mode 100644
index 00000000..11db4928
--- /dev/null
+++ b/apps/stirling-pdf/config.json
@@ -0,0 +1,20 @@
+{
+ "$schema": "../schema.json",
+ "name": "Stirling-PDF",
+ "port": 8234,
+ "available": true,
+ "exposable": true,
+ "id": "stirling-pdf",
+ "tipi_version": 1,
+ "version": "0.13.0",
+ "categories": [
+ "data",
+ "utilities"
+ ],
+ "description": "Locally hosted web application that allows you to perform various operations on PDF files.",
+ "short_desc": "Powerful locally hosted web based PDF manipulation tool.",
+ "author": "Frooodle",
+ "source": "https://github.com/Frooodle/Stirling-PDF/",
+ "form_fields": []
+ }
+
\ No newline at end of file
diff --git a/apps/stirling-pdf/docker-compose.yml b/apps/stirling-pdf/docker-compose.yml
new file mode 100644
index 00000000..ec57f2ff
--- /dev/null
+++ b/apps/stirling-pdf/docker-compose.yml
@@ -0,0 +1,40 @@
+version: "3.7"
+services:
+ stirling-pdf:
+ image: ghcr.io/frooodle/s-pdf:0.13.0
+ restart: unless-stopped
+ container_name: stirling-pdf
+ privileged: true
+ ports:
+ - ${APP_PORT}:8080
+ volumes:
+ - ${APP_DATA_DIR}/datatrainingData:/usr/share/tesseract-ocr/4.00/tessdata #Required for extra OCR languages
+ - ${APP_DATA_DIR}/dataextraConfigs:/configs
+ - ${APP_DATA_DIR}/datacustomFiles:/customFiles/
+ networks:
+ - tipi_main_network
+ labels:
+ # Main
+ traefik.enable: true
+ traefik.http.middlewares.stirling-pdf-web-redirect.redirectscheme.scheme: https
+ traefik.http.services.stirling-pdf.loadbalancer.server.port: 8080
+ # Web
+ traefik.http.routers.stirling-pdf-insecure.rule: Host(`${APP_DOMAIN}`)
+ traefik.http.routers.stirling-pdf-insecure.entrypoints: web
+ traefik.http.routers.stirling-pdf-insecure.service: stirling-pdf
+ traefik.http.routers.stirling-pdf-insecure.middlewares: stirling-pdf-web-redirect
+ # Websecure
+ traefik.http.routers.stirling-pdf.rule: Host(`${APP_DOMAIN}`)
+ traefik.http.routers.stirling-pdf.entrypoints: websecure
+ traefik.http.routers.stirling-pdf.service: stirling-pdf
+ traefik.http.routers.stirling-pdf.tls.certresolver: myresolver
+ # Local domain
+ traefik.http.routers.stirling-pdf-local-insecure.rule: Host(`stirling-pdf.${LOCAL_DOMAIN}`)
+ traefik.http.routers.stirling-pdf-local-insecure.entrypoints: web
+ traefik.http.routers.stirling-pdf-local-insecure.service: stirling-pdf
+ traefik.http.routers.stirling-pdf-local-insecure.middlewares: stirling-pdf-web-redirect
+ # Local domain secure
+ traefik.http.routers.stirling-pdf-local.rule: Host(`stirling-pdf.${LOCAL_DOMAIN}`)
+ traefik.http.routers.stirling-pdf-local.entrypoints: websecure
+ traefik.http.routers.stirling-pdf-local.service: stirling-pdf
+ traefik.http.routers.stirling-pdf-local.tls: true
diff --git a/apps/stirling-pdf/metadata/description.md b/apps/stirling-pdf/metadata/description.md
new file mode 100644
index 00000000..94a53866
--- /dev/null
+++ b/apps/stirling-pdf/metadata/description.md
@@ -0,0 +1,64 @@
+
Stirling-PDF
+
+
+This is a powerful locally hosted web based PDF manipulation tool using docker that allows you to perform various operations on PDF files, such as splitting merging, converting, reorganizing, adding images, rotating, compressing, and more. This locally hosted web application started as a 100% ChatGPT-made application and has evolved to include a wide range of features to handle all your PDF needs.
+
+Stirling PDF makes no outbound calls for any record keeping or tracking.
+
+All files and PDFs are either purely client side, in server memory only during the execution of the task or within a temporay file only for execution of the task.
+Any file which has been downloaded by the user will have already been deleted from the server by that time.
+
+Feel free to request any features or bug fixes either in github issues or our [Discord](https://discord.gg/Cn8pWhQRxZ)
+
+## Features
+- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages.
+- Split PDFs into multiple files at specified page numbers or extract all pages as individual files.
+- Merge multiple PDFs together into a single resultant file
+- Convert PDFs to and from images
+- Reorganize PDF pages into different orders.
+- Add/Generate signatures
+- Format PDFs into a multi-paged page
+- Scale page contents size by set %
+- Adjust Contrast
+- Crop PDF
+- Auto Split PDF (With physically scanned page dividers)
+- Flatten PDFs
+- Repair PDFs
+- Detect and remove blank pages
+- Compare 2 PDFs and show differences in text
+- Add images to PDFs
+- Rotating PDFs in 90 degree increments.
+- Compressing PDFs to decrease their filesize. (Using OCRMyPDF)
+- Add and remove passwords
+- Set PDF Permissions
+- Add watermark(s)
+- Convert Any common file to PDF (using LibreOffice)
+- Convert PDF to Word/Powerpoint/Others (using LibreOffice)
+- Convert HTML to PDF
+- URL to PDF
+- Extract images from PDF
+- Extract images from Scans
+- Add page numbers
+- Auto rename file by detecting PDF header text
+- OCR on PDF (Using OCRMyPDF)
+- PDF/A conversion (Using OCRMyPDF)
+- Edit metadata
+- Dark mode support.
+- Custom download options (see [here](https://github.com/Frooodle/Stirling-PDF/blob/main/images/settings.png) for example)
+- Parallel file processing and downloads
+- API for integration with external scripts
+
+For a overview of the tasks and the technology each uses please view [groups.md](https://github.com/Frooodle/Stirling-PDF/blob/main/Groups.md)
+Hosted instance/demo of the app can be seen [here](https://pdf.adminforge.de/) hosted by the team at adminforge.de
+
+## Technologies used
+- Spring Boot + Thymeleaf
+- PDFBox
+- IText7
+- [LibreOffice](https://www.libreoffice.org/discover/libreoffice/) for advanced conversions
+- [OcrMyPdf](https://github.com/ocrmypdf/OCRmyPDF)
+- HTML, CSS, JavaScript
+- Docker
+- PDF.js
+- PDF-LIB.js
+
diff --git a/apps/stirling-pdf/metadata/logo.jpg b/apps/stirling-pdf/metadata/logo.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..5ee8682a909ccff5d9fc8abfa9e3d7cf688a8612
GIT binary patch
literal 18046
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
F{|D&t%D(^r
literal 0
HcmV?d00001