diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index 2e9be9a1..30a5ce23 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,6 +1,6 @@
# These are supported funding model platforms
-github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
+github: Frooodle # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
diff --git a/README.md b/README.md
index 719cc8ae..e66c3595 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,7 @@
[![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/frooodle/s-pdf/latest)](https://github.com/Frooodle/Stirling-PDF/)
[![GitHub Repo stars](https://img.shields.io/github/stars/frooodle/stirling-pdf?style=social)](https://github.com/Frooodle/stirling-pdf)
[![Paypal Donate](https://img.shields.io/badge/Paypal%20Donate-yellow?style=flat&logo=paypal)](https://www.paypal.com/paypalme/froodleplex)
+[![Github Sponser](https://img.shields.io/badge/Github%20Sponsor-yellow?style=flat&logo=github)](https://github.com/sponsors/Frooodle)
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.
@@ -42,6 +43,8 @@ Feel free to request any features of bug fixes either in github issues or our [D
- [OcrMyPdf](https://github.com/ocrmypdf/OCRmyPDF)
- HTML, CSS, JavaScript
- Docker
+- PDF.js
+- PDF-LIB.js
## How to use
@@ -95,4 +98,4 @@ Stirling PDF allows easy customization of the visible application name.
Simply use environment variables APP_HOME_NAME, APP_HOME_DESCRIPTION and APP_NAVBAR_NAME with Docker or Java.
If running Java directly, you can also pass these as properties using -D arguments.
-Using the same method you can also change the default language by providing APP_LOCALE with values like de-DE fr-FR or ar-AR to select your default language (Will always default to English on invalid locale)
\ No newline at end of file
+Using the same method you can also change the default language by providing APP_LOCALE with values like de-DE fr-FR or ar-AR to select your default language (Will always default to English on invalid locale)
diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties
index 396b794b..e054d3f1 100644
--- a/src/main/resources/messages_es_ES.properties
+++ b/src/main/resources/messages_es_ES.properties
@@ -88,8 +88,8 @@ home.pdfToPDFA.desc=Convierte PDF to PDF/A para almacenamiento a largo plazo
home.PDFToWord.title=PDF a Word
home.PDFToWord.desc=Convertir formatos PDF a Word (DOC, DOCX y ODT)
-home.PDFToPresentation.title=PDF a presentación
-home.PDFToPresentation.desc=Convertir PDF a formatos de presentación (PPT, PPTX y ODP)
+home.PDFToPresentation.title=PDF a presentación
+home.PDFToPresentation.desc=Convertir PDF a formatos de presentación (PPT, PPTX y ODP)
home.PDFToText.title=PDF a texto/RTF
home.PDFToText.desc=Convertir PDF a texto o formato RTF
@@ -117,16 +117,16 @@ settings.zipThreshold=Ficheros Zip cuando excede el número de ficheros descarga
#OCR
ocr.title=OCR / Escaneo de limpieza
ocr.header=Escaneos de limpieza / OCR (Reconocimiento óptico de caracteres)
-ocr.SeleccionaText.1=Selecciona los idiomas que se detectarán en el PDF (Los enumerados son los detectados actualmente):
-ocr.SeleccionaText.2=Produzca un archivo de texto que contenga texto OCR junto con el PDF editado con OCR
-ocr.SeleccionaText.3=Corrija las páginas que se escanearon en un ángulo torcido girándolas nuevamente a su lugar
-ocr.SeleccionaText.4=Limpie la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo. (Sin cambio de salida)
-ocr.SeleccionaText.5=Limpie la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo, mantiene la limpieza en la salida.
-ocr.SeleccionaText.6=Ignora las páginas que tienen texto interactivo, solo las páginas OCR que son imágenes
-ocr.SeleccionaText.7=Fuerza OCR, OCR eliminará en cada página todo el texto original
-ocr.SeleccionaText.8=Normal (Se producirá un error si el PDF contiene texto)
-ocr.SeleccionaText.9=Ajustes Adicionales
-ocr.SeleccionaText.10=Modo OCR
+ocr.selectText.1=Selecciona los idiomas que se detectarán en el PDF (Los enumerados son los detectados actualmente):
+ocr.selectText.2=Produzca un archivo de texto que contenga texto OCR junto con el PDF editado con OCR
+ocr.selectText.3=Corrija las páginas que se escanearon en un ángulo torcido girándolas nuevamente a su lugar
+ocr.selectText.4=Limpie la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo. (Sin cambio de salida)
+ocr.selectText.5=Limpie la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo, mantiene la limpieza en la salida.
+ocr.selectText.6=Ignora las páginas que tienen texto interactivo, solo las páginas OCR que son imágenes
+ocr.selectText.7=Fuerza OCR, OCR eliminará en cada página todo el texto original
+ocr.selectText.8=Normal (Se producirá un error si el PDF contiene texto)
+ocr.selectText.9=Ajustes Adicionales
+ocr.selectText.10=Modo OCR
ocr.help=Lea esta documentación sobre cómo usar esto para otros idiomas y/o no usarlo en docker
ocr.credit=Este servicio utiliza OCRmyPDF y Tesseract para OCR.
ocr.submit=Procesa PDF con OCR
@@ -135,7 +135,7 @@ ocr.submit=Procesa PDF con OCR
extractImages.title=Extraer imágenes
extractImages.header=Extraer imágenes
-extractImages.SeleccionaText=Selecciona el formato de imagen para convertir las imágenes extraÃdas
+extractImages.selectText=Selecciona el formato de imagen para convertir las imágenes extraÃdas
extractImages.submit=Extraer
@@ -151,13 +151,13 @@ fileToPDF.submit=Convertir a PDF
compress.title=Comprimir
compress.header=Comprimir PDF
compress.credit=Este servicio usa OCRmyPDF para la Compresión/Optimizatión del PDF.
-compress.SeleccionaText.1=Nivel de Optimización:
-compress.SeleccionaText.2=0 (Sin optimización)
-compress.SeleccionaText.3=1 (Por defecto, optimización sin pérdidas)
-compress.SeleccionaText.4=2 (Optimización con pérdida)
-compress.SeleccionaText.5=3 (Optimización con pérdida, más agresiva)
-compress.SeleccionaText.6=Habilita la vista web rápida (linealizar PDF)
-compress.SeleccionaText.7=Habilita la codificación JBIG2 con pérdida
+compress.selectText.1=Nivel de Optimización:
+compress.selectText.2=0 (Sin optimización)
+compress.selectText.3=1 (Por defecto, optimización sin pérdidas)
+compress.selectText.4=2 (Optimización con pérdida)
+compress.selectText.5=3 (Optimización con pérdida, más agresiva)
+compress.selectText.6=Habilita la vista web rápida (linealizar PDF)
+compress.selectText.7=Habilita la codificación JBIG2 con pérdida
compress.submit=Comprimir
@@ -169,9 +169,9 @@ addImage.submit=Añade imagen
#merge
-merge.title=Mezcla
-merge.header=Mezcla múltiples PDFs (2+)
-merge.submit=Mezcla
+merge.title=Une
+merge.header=Une múltiples PDFs (2+)
+merge.submit=Une
#pdfOrganiser
pdfOrganiser.title=Organizador de páginas
@@ -199,13 +199,13 @@ split.title=Dividir PDF
split.header=Dividir PDF
split.desc.1=Los números que selecciona son el número de página en el que desea hacer una división
split.desc.2=Como tal, seleccionar 1,3,7-8 dividirÃa un documento de 10 páginas en 6 archivos PDF separados con:
-split.desc.3=Documento #1: Page 1
-split.desc.4=Documento #2: Page 2 and 3
-split.desc.5=Documento #3: Page 4, 5 and 6
-split.desc.6=Documento #4: Page 7
-split.desc.7=Documento #5: Page 8
-split.desc.8=Documento #6: Page 9 and 10
-split.splitPages=Introduzca las páginas para dividir en:
+split.desc.3=Documento #1: Página 1
+split.desc.4=Documento #2: Páginas 2 y 3
+split.desc.5=Documento #3: Páginas 4, 5 y 6
+split.desc.6=Documento #4: Página 7
+split.desc.7=Documento #5: Página 8
+split.desc.8=Documento #6: Páginas 9 y 10
+split.splitPages=Introduzca las páginas para dividir:
split.submit=Dividir
@@ -213,16 +213,16 @@ split.submit=Dividir
imageToPDF.title=Imagen a PDF
imageToPDF.header=Imagen a PDF
imageToPDF.submit=Convertir
-imageToPDF.SeleccionaText.1=Estirar para ajustar
-imageToPDF.SeleccionaText.2=Auto rotación PDF
-imageToPDF.SeleccionaText.3=Lógica de archivos múltiples (Únicamente activado si funciona con multiples imágenes)
-imageToPDF.SeleccionaText.4=Une en un único PDF
-imageToPDF.SeleccionaText.5=Convertir a PDFs separados
+imageToPDF.selectText.1=Estirar para ajustar
+imageToPDF.selectText.2=Auto rotación PDF
+imageToPDF.selectText.3=Lógica de archivos múltiples (Únicamente activado si funciona con multiples imágenes)
+imageToPDF.selectText.4=Une en un único PDF
+imageToPDF.selectText.5=Convertir a PDFs separados
#pdfToImage
pdfToImage.title=PDF a Imagen
pdfToImage.header=PDF a Imagen
-pdfToImage.SeleccionaText=Formato de Imagen
+pdfToImage.selectText=Formato de Imagen
pdfToImage.singleOrMultiple=Tipo resultante de imagen
pdfToImage.single=Imagen Grande Única
pdfToImage.multi=Múltiples Imágenes
@@ -235,68 +235,68 @@ pdfToImage.submit=Convertir
#addPassword
addPassword.title=Añade Contraseña
addPassword.header=Añade contraseña (Encripta)
-addPassword.SeleccionaText.1=Selecciona PDF para encriptar
-addPassword.SeleccionaText.2=Contraseña
-addPassword.SeleccionaText.3=Longitud de la clave de cifrado
-addPassword.SeleccionaText.4=Valores altos son más fuertes, pero valores bajos tienen mejor compatibilidad.
-addPassword.SeleccionaText.5=Permisos para establecer
-addPassword.SeleccionaText.6=Impedir el ensamblaje del documento
-addPassword.SeleccionaText.7=Impedir la extracción de contenido
-addPassword.SeleccionaText.8=Impedir la extracción para la accesibilidad
-addPassword.SeleccionaText.9=Impedir rellenar formulario
-addPassword.SeleccionaText.10=Impedir modificación
-addPassword.SeleccionaText.11=Impedir modificación de anotaciones
-addPassword.SeleccionaText.12=Impedir imprimir
-addPassword.SeleccionaText.13=Impedir imprimir diferentes formatos
+addPassword.selectText.1=Selecciona PDF para encriptar
+addPassword.selectText.2=Contraseña
+addPassword.selectText.3=Longitud de la clave de cifrado
+addPassword.selectText.4=Valores altos son más fuertes, pero valores bajos tienen mejor compatibilidad.
+addPassword.selectText.5=Permisos para establecer
+addPassword.selectText.6=Impedir el ensamblaje del documento
+addPassword.selectText.7=Impedir la extracción de contenido
+addPassword.selectText.8=Impedir la extracción para la accesibilidad
+addPassword.selectText.9=Impedir rellenar formulario
+addPassword.selectText.10=Impedir modificación
+addPassword.selectText.11=Impedir modificación de anotaciones
+addPassword.selectText.12=Impedir imprimir
+addPassword.selectText.13=Impedir imprimir diferentes formatos
addPassword.submit=Encripta
#watermark
watermark.title=Añade marca de agua
watermark.header=Añade marca de agua
-watermark.SeleccionaText.1=Selecciona PDF para añadir marca de agua:
-watermark.SeleccionaText.2=Texto de la marca de agua:
-watermark.SeleccionaText.3=Tamaño de la Fuente:
-watermark.SeleccionaText.4=Rotación (0-360):
-watermark.SeleccionaText.5=Ancho (Espacio entre cada marca de agua horizontalmente):
-watermark.SeleccionaText.6=Alto (Espacio entre cada marca de agua verticalmente):
-watermark.SeleccionaText.7=Opacidad (0% - 100%):
+watermark.selectText.1=Selecciona PDF para añadir marca de agua:
+watermark.selectText.2=Texto de la marca de agua:
+watermark.selectText.3=Tamaño de la Fuente:
+watermark.selectText.4=Rotación (0-360):
+watermark.selectText.5=Ancho (Espacio entre cada marca de agua horizontalmente):
+watermark.selectText.6=Alto (Espacio entre cada marca de agua verticalmente):
+watermark.selectText.7=Opacidad (0% - 100%):
watermark.submit=Añade marca de agua
#remove-watermark
remove-watermark.title=Elimina marca de agua
remove-watermark.header=Elimina marca de agua
-remove-watermark.SeleccionaText.1=Selecciona PDF para eliminar la marca de agua:
-remove-watermark.SeleccionaText.2=Texto de la marca de agua:
+remove-watermark.selectText.1=Selecciona PDF para eliminar la marca de agua:
+remove-watermark.selectText.2=Texto de la marca de agua:
remove-watermark.submit=Elimina marca de agua
#Change permissions
permissions.title=Cambiar Permisos
permissions.header=Cambiar Permisos
permissions.warning=Advertencia para que estos permisos no se puedan cambiar, se recomienda configurarlos con una contraseña a través de la página de cambio de contraseña
-permissions.SeleccionaText.1=Selecciona PDF para cambiar los permisos
-permissions.SeleccionaText.2=Permisos a establecer
-permissions.SeleccionaText.3=Impedir el ensamblaje del documento
-permissions.SeleccionaText.4=Impedir la extracción de contenido
-permissions.SeleccionaText.5=Impedir la extracción para la accesibilidad
-permissions.SeleccionaText.6=Impedir rellenar formulario
-permissions.SeleccionaText.7=Impedir modificación
-permissions.SeleccionaText.8=Impedir modificación de anotaciones
-permissions.SeleccionaText.9=Impedir imprimir
-permissions.SeleccionaText.10=Impedir imprimir diferentes formatos
+permissions.selectText.1=Selecciona PDF para cambiar los permisos
+permissions.selectText.2=Permisos a establecer
+permissions.selectText.3=Impedir el ensamblaje del documento
+permissions.selectText.4=Impedir la extracción de contenido
+permissions.selectText.5=Impedir la extracción para la accesibilidad
+permissions.selectText.6=Impedir rellenar formulario
+permissions.selectText.7=Impedir modificación
+permissions.selectText.8=Impedir modificación de anotaciones
+permissions.selectText.9=Impedir imprimir
+permissions.selectText.10=Impedir imprimir diferentes formatos
permissions.submit=Cambiar
#remove password
removePassword.title=Elimina contraseña
removePassword.header=Elimina contraseña (Desencripta)
-removePassword.SeleccionaText.1=Selecciona PDF para Desencriptar
-removePassword.SeleccionaText.2=Contraseña
+removePassword.selectText.1=Selecciona PDF para Desencriptar
+removePassword.selectText.2=Contraseña
removePassword.submit=Elimina
changeMetadata.title=Cambia Metadatos
changeMetadata.header=Cambia Metadatos
-changeMetadata.SeleccionaText.1=Edite las variables que desea cambiar
-changeMetadata.SeleccionaText.2=Elimina todos los metadatos
-changeMetadata.SeleccionaText.3=Mostrar metadatos personalizados:
+changeMetadata.selectText.1=Edite las variables que desea cambiar
+changeMetadata.selectText.2=Elimina todos los metadatos
+changeMetadata.selectText.3=Mostrar metadatos personalizados:
changeMetadata.author=Autor:
changeMetadata.creationDate=Fecha de Creación (yyyy/MM/dd HH:mm:ss):
changeMetadata.creator=Creador:
@@ -306,13 +306,13 @@ changeMetadata.producer=Productor:
changeMetadata.subject=Asunto:
changeMetadata.title=TÃtulo:
changeMetadata.trapped=Trapped:
-changeMetadata.SeleccionaText.4=Otros Metadatos:
-changeMetadata.SeleccionaText.5=Agregar entrada de metadatos personalizados
+changeMetadata.selectText.4=Otros Metadatos:
+changeMetadata.selectText.5=Agregar entrada de metadatos personalizados
changeMetadata.submit=Cambia
xlsToPdf.title=Excel a PDF
xlsToPdf.header=Excel a PDF
-xlsToPdf.SeleccionaText.1=Selecciona hoja de cálculo de Excel XLS o XLSX para convertir
+xlsToPdf.selectText.1=Selecciona hoja de cálculo de Excel XLS o XLSX para convertir
xlsToPdf.convert=convertir
@@ -328,29 +328,29 @@ pdfToPDFA.submit=Convertir
PDFToWord.title=PDF a Word
PDFToWord.header=PDF a Word
PDFToWord.selectText.1=Formato de archivo de salida
-PDFToWord.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
+PDFToWord.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
PDFToWord.submit=Convertir
-PDFToPresentation.title=PDF a presentación
-PDFToPresentation.header=PDF a presentación
+PDFToPresentation.title=PDF a presentación
+PDFToPresentation.header=PDF a presentación
PDFToPresentation.selectText.1=Formato de archivo de salida
-PDFToPresentation.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
+PDFToPresentation.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
PDFToPresentation.submit=Convertir
PDFToText.title=PDF a texto/RTF
PDFToText.header=PDF a texto/RTF
PDFToText.selectText.1=Formato de archivo de salida
-PDFToText.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
+PDFToText.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
PDFToText.submit=Convertir
PDFToHTML.title=PDF a HTML
PDFToHTML.header=PDF a HTML
-PDFToHTML.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
+PDFToHTML.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
PDFToHTML.submit=Convertir
PDFToXML.title=PDF a XML
PDFToXML.header=PDF a XML
-PDFToXML.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
+PDFToXML.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
PDFToXML.submit=Convertir
diff --git a/src/main/resources/static/css/general.css b/src/main/resources/static/css/general.css
index 47465094..f6e4809e 100644
--- a/src/main/resources/static/css/general.css
+++ b/src/main/resources/static/css/general.css
@@ -21,3 +21,17 @@ html[lang-direction=rtl] * {
direction: rtl;
text-align: right;
}
+
+.align-top {
+ position: absolute;
+ top: 0;
+}
+.align-center-right {
+ position: absolute;
+ right: 0;
+ top: 50%;
+}
+.align-bottom {
+ position: absolute;
+ bottom: 0;
+}
diff --git a/src/main/resources/static/pdf-lib.min.js b/src/main/resources/static/js/pdf-lib.min.js
similarity index 100%
rename from src/main/resources/static/pdf-lib.min.js
rename to src/main/resources/static/js/pdf-lib.min.js
diff --git a/src/main/resources/templates/fragments/common.html b/src/main/resources/templates/fragments/common.html
index 53ae9662..52a35367 100644
--- a/src/main/resources/templates/fragments/common.html
+++ b/src/main/resources/templates/fragments/common.html
@@ -23,7 +23,7 @@
-
+
diff --git a/src/main/resources/templates/page-manager.html b/src/main/resources/templates/page-manager.html
new file mode 100644
index 00000000..5a249ceb
--- /dev/null
+++ b/src/main/resources/templates/page-manager.html
@@ -0,0 +1,450 @@
+
+
+
+