Compare commits

..

7 Commits

Author SHA1 Message Date
Anthony Stirling
ac1b1916d2 use /opt/venv only if docker/ else use path 2025-02-22 15:56:24 +00:00
Anthony Stirling
a36c0415b7 Merge remote-tracking branch 'origin/main' into fixPipeline 2025-02-22 01:38:52 +00:00
Anthony Stirling
dc986b5213 Allow dynamic path renaming 2025-02-22 01:37:44 +00:00
Anthony Stirling
efb3b1f234 Merge remote-tracking branch 'origin/main' into fixPipeline 2025-02-21 14:33:26 +00:00
Anthony Stirling
590a3b6cbb init 2025-02-21 14:32:29 +00:00
Anthony Stirling
5deb27cc12 view/edit PDF other langs 2025-02-18 17:46:38 +00:00
Anthony Stirling
f51c3c870a name change 2025-02-18 15:54:56 +00:00
442 changed files with 130583 additions and 433 deletions

View File

@@ -121,7 +121,7 @@ jobs:
password: ${{ secrets.DOCKER_HUB_API }} password: ${{ secrets.DOCKER_HUB_API }}
- name: Build and push PR-specific image - name: Build and push PR-specific image
uses: docker/build-push-action@0adf9959216b96bec444f325f1e493d4aa344497 # v6.14.0 uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6.13.0
with: with:
context: . context: .
file: ./Dockerfile file: ./Dockerfile

View File

@@ -49,7 +49,7 @@ jobs:
- name: Upload Test Reports - name: Upload Test Reports
if: always() if: always()
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
with: with:
name: test-reports-jdk-${{ matrix.jdk-version }} name: test-reports-jdk-${{ matrix.jdk-version }}
path: | path: |
@@ -80,7 +80,7 @@ jobs:
- name: FAILED - check the licenses for compatibility - name: FAILED - check the licenses for compatibility
if: failure() if: failure()
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
with: with:
name: dependencies-without-allowed-license.json name: dependencies-without-allowed-license.json
path: | path: |

View File

@@ -24,7 +24,7 @@ jobs:
- name: Generate GitHub App Token - name: Generate GitHub App Token
id: generate-token id: generate-token
uses: actions/create-github-app-token@0d564482f06ca65fa9e77e2510873638c82206f2 # v1.11.5 uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3
with: with:
app-id: ${{ secrets.GH_APP_ID }} app-id: ${{ secrets.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
@@ -45,7 +45,7 @@ jobs:
- name: FAILED - check the licenses for compatibility - name: FAILED - check the licenses for compatibility
if: failure() if: failure()
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
with: with:
name: dependencies-without-allowed-license.json name: dependencies-without-allowed-license.json
path: | path: |

View File

@@ -80,7 +80,7 @@ jobs:
mv ./build/libs/Stirling-PDF-${{ needs.read_versions.outputs.version }}.jar ./binaries/Stirling-PDF${{ matrix.file_suffix }}.jar mv ./build/libs/Stirling-PDF-${{ needs.read_versions.outputs.version }}.jar ./binaries/Stirling-PDF${{ matrix.file_suffix }}.jar
- name: Upload build artifacts - name: Upload build artifacts
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
with: with:
retention-days: 1 retention-days: 1
if-no-files-found: error if-no-files-found: error
@@ -114,7 +114,7 @@ jobs:
run: ls -R run: ls -R
- name: Upload signed artifacts - name: Upload signed artifacts
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
with: with:
retention-days: 1 retention-days: 1
if-no-files-found: error if-no-files-found: error
@@ -188,7 +188,7 @@ jobs:
run: ls -R ./binaries run: ls -R ./binaries
- name: Upload build artifacts - name: Upload build artifacts
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
with: with:
retention-days: 1 retention-days: 1
if-no-files-found: error if-no-files-found: error
@@ -224,7 +224,7 @@ jobs:
- name: Install Cosign - name: Install Cosign
if: matrix.os == 'windows-latest' if: matrix.os == 'windows-latest'
uses: sigstore/cosign-installer@d7d6bc7722e3daa8354c50bcb52f4837da5e9b6a # v3.8.1 uses: sigstore/cosign-installer@c56c2d3e59e4281cc41dea2217323ba5694b171e # v3.8.0
- name: Generate key pair - name: Generate key pair
if: matrix.os == 'windows-latest' if: matrix.os == 'windows-latest'
@@ -255,7 +255,7 @@ jobs:
run: ls -R run: ls -R
- name: Upload signed artifacts - name: Upload signed artifacts
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
with: with:
retention-days: 1 retention-days: 1
if-no-files-found: error if-no-files-found: error

View File

@@ -22,7 +22,7 @@ jobs:
- name: Generate GitHub App Token - name: Generate GitHub App Token
id: generate-token id: generate-token
uses: actions/create-github-app-token@0d564482f06ca65fa9e77e2510873638c82206f2 # v1.11.5 uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3
with: with:
app-id: ${{ secrets.GH_APP_ID }} app-id: ${{ secrets.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}

View File

@@ -42,7 +42,7 @@ jobs:
- name: Install cosign - name: Install cosign
if: github.ref == 'refs/heads/master' if: github.ref == 'refs/heads/master'
uses: sigstore/cosign-installer@d7d6bc7722e3daa8354c50bcb52f4837da5e9b6a # v3.8.1 uses: sigstore/cosign-installer@c56c2d3e59e4281cc41dea2217323ba5694b171e # v3.8.0
with: with:
cosign-release: "v2.4.1" cosign-release: "v2.4.1"
@@ -90,7 +90,7 @@ jobs:
- name: Build and push main Dockerfile - name: Build and push main Dockerfile
id: build-push-regular id: build-push-regular
uses: docker/build-push-action@0adf9959216b96bec444f325f1e493d4aa344497 # v6.14.0 uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6.13.0
with: with:
builder: ${{ steps.buildx.outputs.name }} builder: ${{ steps.buildx.outputs.name }}
context: . context: .
@@ -135,7 +135,7 @@ jobs:
- name: Build and push Dockerfile-ultra-lite - name: Build and push Dockerfile-ultra-lite
id: build-push-lite id: build-push-lite
uses: docker/build-push-action@0adf9959216b96bec444f325f1e493d4aa344497 # v6.14.0 uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6.13.0
if: github.ref != 'refs/heads/main' if: github.ref != 'refs/heads/main'
with: with:
context: . context: .
@@ -166,7 +166,7 @@ jobs:
- name: Build and push main Dockerfile fat - name: Build and push main Dockerfile fat
id: build-push-fat id: build-push-fat
uses: docker/build-push-action@0adf9959216b96bec444f325f1e493d4aa344497 # v6.14.0 uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6.13.0
if: github.ref != 'refs/heads/main' if: github.ref != 'refs/heads/main'
with: with:
builder: ${{ steps.buildx.outputs.name }} builder: ${{ steps.buildx.outputs.name }}

View File

@@ -63,7 +63,7 @@ jobs:
ls -R ./build/launch4j ls -R ./build/launch4j
- name: Upload build artifacts - name: Upload build artifacts
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
with: with:
name: binaries${{ matrix.file_suffix }} name: binaries${{ matrix.file_suffix }}
path: | path: |
@@ -95,7 +95,7 @@ jobs:
run: ls -R run: ls -R
- name: Install Cosign - name: Install Cosign
uses: sigstore/cosign-installer@d7d6bc7722e3daa8354c50bcb52f4837da5e9b6a # v3.8.1 uses: sigstore/cosign-installer@c56c2d3e59e4281cc41dea2217323ba5694b171e # v3.8.0
- name: Generate key pair - name: Generate key pair
run: cosign generate-key-pair run: cosign generate-key-pair
@@ -139,7 +139,7 @@ jobs:
./launch4j/Stirling-PDF-Server${{ matrix.file_suffix }}.exe ./launch4j/Stirling-PDF-Server${{ matrix.file_suffix }}.exe
- name: Upload signed artifacts - name: Upload signed artifacts
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
with: with:
name: signed${{ matrix.file_suffix }} name: signed${{ matrix.file_suffix }}
path: | path: |

View File

@@ -44,7 +44,7 @@ jobs:
persist-credentials: false persist-credentials: false
- name: "Run analysis" - name: "Run analysis"
uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0
with: with:
results_file: results.sarif results_file: results.sarif
results_format: sarif results_format: sarif
@@ -66,7 +66,7 @@ jobs:
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab. # format to the repository Actions tab.
- name: "Upload artifact" - name: "Upload artifact"
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
with: with:
name: SARIF file name: SARIF file
path: results.sarif path: results.sarif
@@ -74,6 +74,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard. # Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning" - name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 uses: github/codeql-action/upload-sarif@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9
with: with:
sarif_file: results.sarif sarif_file: results.sarif

View File

@@ -46,7 +46,7 @@ jobs:
- name: Upload Problems Report on Failure - name: Upload Problems Report on Failure
if: failure() if: failure()
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
with: with:
name: gradle-problems-report name: gradle-problems-report
path: build/reports/problems/problems-report.html path: build/reports/problems/problems-report.html
@@ -54,7 +54,7 @@ jobs:
- name: Upload Sonar Logs on Failure - name: Upload Sonar Logs on Failure
if: failure() if: failure()
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
with: with:
name: sonar-logs name: sonar-logs
path: | path: |

View File

@@ -30,7 +30,7 @@ jobs:
- name: Generate GitHub App Token - name: Generate GitHub App Token
id: generate-token id: generate-token
uses: actions/create-github-app-token@0d564482f06ca65fa9e77e2510873638c82206f2 # v1.11.5 uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3
with: with:
app-id: ${{ secrets.GH_APP_ID }} app-id: ${{ secrets.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
@@ -63,7 +63,7 @@ jobs:
- name: Generate GitHub App Token - name: Generate GitHub App Token
id: generate-token id: generate-token
uses: actions/create-github-app-token@0d564482f06ca65fa9e77e2510873638c82206f2 # v1.11.5 uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3
with: with:
app-id: ${{ vars.GH_APP_ID }} app-id: ${{ vars.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}

View File

@@ -46,7 +46,7 @@ jobs:
password: ${{ secrets.DOCKER_HUB_API }} password: ${{ secrets.DOCKER_HUB_API }}
- name: Build and push test image - name: Build and push test image
uses: docker/build-push-action@0adf9959216b96bec444f325f1e493d4aa344497 # v6.14.0 uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6.13.0
with: with:
context: . context: .
file: ./Dockerfile file: ./Dockerfile

View File

@@ -9,8 +9,8 @@ COPY . .
# Build the application with DOCKER_ENABLE_SECURITY=false # Build the application with DOCKER_ENABLE_SECURITY=false
RUN DOCKER_ENABLE_SECURITY=true \ RUN DOCKER_ENABLE_SECURITY=true \
STIRLING_PDF_DESKTOP_UI=false \ STIRLING_PDF_DESKTOP_UI=false \
./gradlew clean build ./gradlew clean build
# Main stage # Main stage
FROM alpine:3.21.3@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c FROM alpine:3.21.3@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c
@@ -50,29 +50,29 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a
echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \ echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \
apk upgrade --no-cache -a && \ apk upgrade --no-cache -a && \
apk add --no-cache \ apk add --no-cache \
ca-certificates \ ca-certificates \
tzdata \ tzdata \
tini \ tini \
bash \ bash \
curl \ curl \
shadow \ shadow \
su-exec \ su-exec \
openssl \ openssl \
openssl-dev \ openssl-dev \
openjdk21-jre \ openjdk21-jre \
# Doc conversion # Doc conversion
gcompat \ gcompat \
libc6-compat \ libc6-compat \
libreoffice \ libreoffice \
# pdftohtml # pdftohtml
poppler-utils \ poppler-utils \
# OCR MY PDF (unpaper for descew and other advanced featues) # OCR MY PDF (unpaper for descew and other advanced featues)
qpdf \ qpdf \
tesseract-ocr-data-eng \ tesseract-ocr-data-eng \
font-terminus font-dejavu font-noto font-noto-cjk font-awesome font-noto-extra font-liberation font-linux-libertine \ font-terminus font-dejavu font-noto font-noto-cjk font-awesome font-noto-extra \
# CV # CV
py3-opencv \ py3-opencv \
python3 \ python3 \
py3-pip \ py3-pip \
py3-pillow@testing \ py3-pillow@testing \
@@ -89,7 +89,7 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a
fc-cache -f -v && \ fc-cache -f -v && \
chmod +x /scripts/* && \ chmod +x /scripts/* && \
chmod +x /scripts/init.sh && \ chmod +x /scripts/init.sh && \
# User permissions # User permissions
addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \ addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \
chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \ chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \
chown stirlingpdfuser:stirlingpdfgroup /app.jar chown stirlingpdfuser:stirlingpdfgroup /app.jar
@@ -97,4 +97,4 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a
EXPOSE 8080/tcp EXPOSE 8080/tcp
# Set user and run command # Set user and run command
ENTRYPOINT ["tini", "--", "/scripts/init.sh"] ENTRYPOINT ["tini", "--", "/scripts/init.sh"]
CMD ["sh", "-c", "java -Dfile.encoding=UTF-8 -jar /app.jar & /opt/venv/bin/unoserver --port 2003 --interface 0.0.0.0"] CMD ["sh", "-c", "java -Dfile.encoding=UTF-8 -jar /app.jar & /opt/venv/bin/unoserver --port 2003 --interface 0.0.0.0"]

View File

@@ -148,11 +148,11 @@ Stirling-PDF currently supports 39 languages!
| Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) | | Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) |
| Slovakian (Slovensky) (sk_SK) | ![74%](https://geps.dev/progress/74) | | Slovakian (Slovensky) (sk_SK) | ![74%](https://geps.dev/progress/74) |
| Slovenian (Slovenščina) (sl_SI) | ![96%](https://geps.dev/progress/96) | | Slovenian (Slovenščina) (sl_SI) | ![96%](https://geps.dev/progress/96) |
| Spanish (Español) (es_ES) | ![98%](https://geps.dev/progress/98) | | Spanish (Español) (es_ES) | ![86%](https://geps.dev/progress/86) |
| Swedish (Svenska) (sv_SE) | ![92%](https://geps.dev/progress/92) | | Swedish (Svenska) (sv_SE) | ![92%](https://geps.dev/progress/92) |
| Thai (ไทย) (th_TH) | ![85%](https://geps.dev/progress/85) | | Thai (ไทย) (th_TH) | ![85%](https://geps.dev/progress/85) |
| Tibetan (བོད་ཡིག་) (zh_BO) | ![94%](https://geps.dev/progress/94) | | Tibetan (བོད་ཡིག་) (zh_BO) | ![94%](https://geps.dev/progress/94) |
| Traditional Chinese (繁體中文) (zh_TW) | ![99%](https://geps.dev/progress/99) | | Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) |
| Turkish (Türkçe) (tr_TR) | ![82%](https://geps.dev/progress/82) | | Turkish (Türkçe) (tr_TR) | ![82%](https://geps.dev/progress/82) |
| Ukrainian (Українська) (uk_UA) | ![72%](https://geps.dev/progress/72) | | Ukrainian (Українська) (uk_UA) | ![72%](https://geps.dev/progress/72) |
| Vietnamese (Tiếng Việt) (vi_VN) | ![79%](https://geps.dev/progress/79) | | Vietnamese (Tiếng Việt) (vi_VN) | ![79%](https://geps.dev/progress/79) |

View File

@@ -1,6 +1,6 @@
plugins { plugins {
id "java" id "java"
id "org.springframework.boot" version "3.4.3" id "org.springframework.boot" version "3.4.1"
id "io.spring.dependency-management" version "1.1.7" id "io.spring.dependency-management" version "1.1.7"
id "org.springdoc.openapi-gradle-plugin" version "1.8.0" id "org.springdoc.openapi-gradle-plugin" version "1.8.0"
id "io.swagger.swaggerhub" version "1.3.2" id "io.swagger.swaggerhub" version "1.3.2"
@@ -15,12 +15,12 @@ plugins {
import com.github.jk1.license.render.* import com.github.jk1.license.render.*
ext { ext {
springBootVersion = "3.4.3" springBootVersion = "3.4.2"
pdfboxVersion = "3.0.4" pdfboxVersion = "3.0.4"
imageioVersion = "3.12.0" imageioVersion = "3.12.0"
lombokVersion = "1.18.36" lombokVersion = "1.18.36"
bouncycastleVersion = "1.80" bouncycastleVersion = "1.80"
springSecuritySamlVersion = "6.4.3" springSecuritySamlVersion = "6.4.2"
openSamlVersion = "4.3.2" openSamlVersion = "4.3.2"
} }
@@ -294,8 +294,8 @@ configurations.all {
dependencies { dependencies {
//tmp for security bumps //tmp for security bumps
implementation 'ch.qos.logback:logback-core:1.5.16' implementation 'ch.qos.logback:logback-core:1.5.15'
implementation 'ch.qos.logback:logback-classic:1.5.16' implementation 'ch.qos.logback:logback-classic:1.5.15'
// Exclude vulnerable BouncyCastle version used in tableau // Exclude vulnerable BouncyCastle version used in tableau
@@ -306,7 +306,8 @@ dependencies {
} }
if (System.getenv("STIRLING_PDF_DESKTOP_UI") != "false") { if (System.getenv("STIRLING_PDF_DESKTOP_UI") != "false") {
implementation "me.friwi:jcefmaven:132.3.1" implementation 'org.apache.commons:commons-compress:1.26.0'
implementation "me.friwi:jcefmaven:127.3.1"
implementation "org.openjfx:javafx-controls:21" implementation "org.openjfx:javafx-controls:21"
implementation "org.openjfx:javafx-swing:21" implementation "org.openjfx:javafx-swing:21"
} }
@@ -331,7 +332,7 @@ dependencies {
implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion"
implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion"
implementation "org.springframework.session:spring-session-core:3.4.2" implementation "org.springframework.session:spring-session-core:3.4.1"
implementation "org.springframework:spring-jdbc:6.2.3" implementation "org.springframework:spring-jdbc:6.2.3"
implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5' implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5'

View File

@@ -1,6 +1,7 @@
package stirling.software.SPDF; package stirling.software.SPDF;
import java.io.IOException; import java.io.IOException;
import java.net.ServerSocket;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
@@ -28,7 +29,6 @@ import stirling.software.SPDF.UI.WebBrowser;
import stirling.software.SPDF.config.ConfigInitializer; import stirling.software.SPDF.config.ConfigInitializer;
import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.config.InstallationPathConfig;
import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.ApplicationProperties;
import stirling.software.SPDF.utils.UrlUtils;
@Slf4j @Slf4j
@EnableScheduling @EnableScheduling
@@ -64,12 +64,6 @@ public class SPDFApplication {
app.setHeadless(false); app.setHeadless(false);
props.put("java.awt.headless", "false"); props.put("java.awt.headless", "false");
props.put("spring.main.web-application-type", "servlet"); props.put("spring.main.web-application-type", "servlet");
int desiredPort = 8080;
String port = UrlUtils.findAvailablePort(desiredPort);
props.put("server.port", port);
System.setProperty("server.port", port);
log.info("Desktop UI mode: Using port {}", port);
} }
app.setAdditionalProfiles(getActiveProfile(args)); app.setAdditionalProfiles(getActiveProfile(args));
@@ -166,17 +160,7 @@ public class SPDFApplication {
} }
@Value("${server.port:8080}") @Value("${server.port:8080}")
public void setServerPort(String port) { public void setServerPortStatic(String port) {
if ("auto".equalsIgnoreCase(port)) {
// Use Spring Boot's automatic port assignment (server.port=0)
SPDFApplication.serverPortStatic =
"0"; // This will let Spring Boot assign an available port
} else {
SPDFApplication.serverPortStatic = port;
}
}
public static void setServerPortStatic(String port) {
if ("auto".equalsIgnoreCase(port)) { if ("auto".equalsIgnoreCase(port)) {
// Use Spring Boot's automatic port assignment (server.port=0) // Use Spring Boot's automatic port assignment (server.port=0)
SPDFApplication.serverPortStatic = SPDFApplication.serverPortStatic =
@@ -213,11 +197,36 @@ public class SPDFApplication {
return new String[] {"default"}; return new String[] {"default"};
} }
private static boolean isPortAvailable(int port) {
try (ServerSocket socket = new ServerSocket(port)) {
return true;
} catch (IOException e) {
return false;
}
}
// Optionally keep this method if you want to provide a manual port-incrementation fallback.
private static String findAvailablePort(int startPort) {
int port = startPort;
while (!isPortAvailable(port)) {
port++;
}
return String.valueOf(port);
}
public static String getStaticBaseUrl() { public static String getStaticBaseUrl() {
return baseUrlStatic; return baseUrlStatic;
} }
public String getNonStaticBaseUrl() {
return baseUrlStatic;
}
public static String getStaticPort() { public static String getStaticPort() {
return serverPortStatic; return serverPortStatic;
} }
public String getNonStaticPort() {
return serverPortStatic;
}
} }

View File

@@ -2,13 +2,13 @@ package stirling.software.SPDF.config;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import stirling.software.SPDF.config.interfaces.ShowAdminInterface; import stirling.software.SPDF.config.interfaces.ShowAdminInterface;
import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.ApplicationProperties;
@Configuration @Service
class AppUpdateService { class AppUpdateService {
private final ApplicationProperties applicationProperties; private final ApplicationProperties applicationProperties;

View File

@@ -57,11 +57,12 @@ public class RuntimePathConfig {
this.pipelineDefaultWebUiConfigs = webUiConfigsPath; this.pipelineDefaultWebUiConfigs = webUiConfigsPath;
boolean isDocker = isRunningInDocker(); boolean isDocker = isRunningInDocker();
// Initialize Operation paths // Initialize Operation paths
String weasyPrintPath = isDocker ? "/opt/venv/bin/weasyprint" : "weasyprint"; String weasyPrintPath = isDocker ? "/opt/venv/bin/weasyprint" : "weasyprint";
String unoConvertPath = isDocker ? "/opt/venv/bin/unoconvert" : "unoconvert"; String unoConvertPath = isDocker ? "/opt/venv/bin/unoconvert" : "unoconvert";
// Check for custom operation paths // Check for custom operation paths
Operations operations = properties.getSystem().getCustomPaths().getOperations(); Operations operations = properties.getSystem().getCustomPaths().getOperations();
if (operations != null) { if (operations != null) {
@@ -77,8 +78,9 @@ public class RuntimePathConfig {
this.weasyPrintPath = weasyPrintPath; this.weasyPrintPath = weasyPrintPath;
this.unoConvertPath = unoConvertPath; this.unoConvertPath = unoConvertPath;
} }
private boolean isRunningInDocker() { private boolean isRunningInDocker() {
return Files.exists(Paths.get("/.dockerenv")); return Files.exists(Paths.get("/.dockerenv"));
} }
} }

View File

@@ -52,8 +52,7 @@ public class CompressController {
this.pdfDocumentFactory = pdfDocumentFactory; this.pdfDocumentFactory = pdfDocumentFactory;
} }
private void compressImagesInPDF(Path pdfFile, double initialScaleFactor, boolean grayScale) private void compressImagesInPDF(Path pdfFile, double initialScaleFactor) throws Exception {
throws Exception {
byte[] fileBytes = Files.readAllBytes(pdfFile); byte[] fileBytes = Files.readAllBytes(pdfFile);
try (PDDocument doc = Loader.loadPDF(fileBytes)) { try (PDDocument doc = Loader.loadPDF(fileBytes)) {
double scaleFactor = initialScaleFactor; double scaleFactor = initialScaleFactor;
@@ -78,23 +77,11 @@ public class CompressController {
bufferedImage.getScaledInstance( bufferedImage.getScaledInstance(
newWidth, newHeight, Image.SCALE_SMOOTH); newWidth, newHeight, Image.SCALE_SMOOTH);
BufferedImage scaledBufferedImage; BufferedImage scaledBufferedImage =
if (grayScale new BufferedImage(
|| bufferedImage.getType() == BufferedImage.TYPE_BYTE_GRAY) { newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
scaledBufferedImage = scaledBufferedImage.getGraphics().drawImage(scaledImage, 0, 0, null);
new BufferedImage(
newWidth, newHeight, BufferedImage.TYPE_BYTE_GRAY);
scaledBufferedImage
.getGraphics()
.drawImage(scaledImage, 0, 0, null);
} else {
scaledBufferedImage =
new BufferedImage(
newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
scaledBufferedImage
.getGraphics()
.drawImage(scaledImage, 0, 0, null);
}
ByteArrayOutputStream compressedImageStream = ByteArrayOutputStream compressedImageStream =
new ByteArrayOutputStream(); new ByteArrayOutputStream();
ImageIO.write(scaledBufferedImage, "jpeg", compressedImageStream); ImageIO.write(scaledBufferedImage, "jpeg", compressedImageStream);
@@ -153,7 +140,6 @@ public class CompressController {
} }
boolean sizeMet = false; boolean sizeMet = false;
boolean grayscaleEnabled = Boolean.TRUE.equals(request.getGrayscale());
while (!sizeMet && optimizeLevel <= 9) { while (!sizeMet && optimizeLevel <= 9) {
// Apply additional image compression for levels 6-9 // Apply additional image compression for levels 6-9
@@ -167,7 +153,7 @@ public class CompressController {
case 9 -> 0.5; // 60% of original size case 9 -> 0.5; // 60% of original size
default -> 1.0; default -> 1.0;
}; };
compressImagesInPDF(tempInputFile, scaleFactor, grayscaleEnabled); compressImagesInPDF(tempInputFile, scaleFactor);
} }
// Run QPDF optimization // Run QPDF optimization
@@ -184,7 +170,6 @@ public class CompressController {
command.add("--compression-level=" + optimizeLevel); command.add("--compression-level=" + optimizeLevel);
command.add("--compress-streams=y"); command.add("--compress-streams=y");
command.add("--object-streams=generate"); command.add("--object-streams=generate");
command.add("--no-warn");
command.add(tempInputFile.toString()); command.add(tempInputFile.toString());
command.add(tempOutputFile.toString()); command.add(tempOutputFile.toString());

View File

@@ -30,13 +30,4 @@ public class OptimizePdfRequest extends PDFFile {
"Whether to normalize the PDF content for better compatibility. Default is false.", "Whether to normalize the PDF content for better compatibility. Default is false.",
defaultValue = "false") defaultValue = "false")
private Boolean normalize = false; private Boolean normalize = false;
@Schema(
description = "Whether to convert the PDF to grayscale. Default is false.",
defaultValue = "false")
private Boolean grayscale = false;
public Boolean getGrayscale() {
return grayscale;
}
} }

View File

@@ -207,7 +207,8 @@ public class PostHogService {
private void addIfNotEmpty(Map<String, Object> map, String key, Object value) { private void addIfNotEmpty(Map<String, Object> map, String key, Object value) {
if (value != null) { if (value != null) {
if (value instanceof String strValue) { if (value instanceof String) {
String strValue = (String) value;
if (!StringUtils.isBlank(strValue)) { if (!StringUtils.isBlank(strValue)) {
map.put(key, strValue.trim()); map.put(key, strValue.trim());
} }

View File

@@ -1,8 +1,5 @@
package stirling.software.SPDF.utils; package stirling.software.SPDF.utils;
import java.io.IOException;
import java.net.ServerSocket;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
public class UrlUtils { public class UrlUtils {
@@ -17,20 +14,4 @@ public class UrlUtils {
return scheme + "://" + serverName + ":" + serverPort + contextPath; return scheme + "://" + serverName + ":" + serverPort + contextPath;
} }
public static boolean isPortAvailable(int port) {
try (ServerSocket socket = new ServerSocket(port)) {
return true;
} catch (IOException e) {
return false;
}
}
public static String findAvailablePort(int startPort) {
int port = startPort;
while (!isPortAvailable(port)) {
port++;
}
return String.valueOf(port);
}
} }

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=تطبيق التدرج الرمادي للضغط

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Sıxma üçün Boz Rəng Tətbiq Edin

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Версия
validateSignature.cert.keyUsage=Предназначение на ключа за използване validateSignature.cert.keyUsage=Предназначение на ключа за използване
validateSignature.cert.selfSigned=Самостоятелно подписан validateSignature.cert.selfSigned=Самостоятелно подписан
validateSignature.cert.bits=битове validateSignature.cert.bits=битове
compress.grayscale.label=Приложи сива скала за компресиране

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Aplicar escala de grisos per a la compressió

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Verze
validateSignature.cert.keyUsage=Použití klíče validateSignature.cert.keyUsage=Použití klíče
validateSignature.cert.selfSigned=Podepsaný sám sebou validateSignature.cert.selfSigned=Podepsaný sám sebou
validateSignature.cert.bits=bitů validateSignature.cert.bits=bitů
compress.grayscale.label=Použít stupnici šedi pro kompresi

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Anvend gråskala til komprimering

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Schlüsselverwendung validateSignature.cert.keyUsage=Schlüsselverwendung
validateSignature.cert.selfSigned=Selbstsigniert validateSignature.cert.selfSigned=Selbstsigniert
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Graustufen für Komprimierung anwenden

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Έκδοση
validateSignature.cert.keyUsage=Χρήση κλειδιού validateSignature.cert.keyUsage=Χρήση κλειδιού
validateSignature.cert.selfSigned=Αυτο-υπογεγραμμένο validateSignature.cert.selfSigned=Αυτο-υπογεγραμμένο
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Εφαρμογή κλίμακας του γκρι για συμπίεση

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Apply Grayscale for Compression

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Apply Grayscale for Compression

View File

@@ -138,13 +138,13 @@ analytics.settings=Puede cambiar la configuración de analíticas en el archivo
# NAVBAR # # NAVBAR #
############# #############
navbar.favorite=Favoritos navbar.favorite=Favoritos
navbar.recent=Nuevo y recientemente actualizado navbar.recent=New and recently updated
navbar.darkmode=Modo oscuro navbar.darkmode=Modo oscuro
navbar.language=Idiomas navbar.language=Idiomas
navbar.settings=Configuración navbar.settings=Configuración
navbar.allTools=Herramientas navbar.allTools=Herramientas
navbar.multiTool=Multi herramientas navbar.multiTool=Multi herramientas
navbar.search=Buscar navbar.search=Search
navbar.sections.organize=Organizar navbar.sections.organize=Organizar
navbar.sections.convertTo=Convertir a PDF navbar.sections.convertTo=Convertir a PDF
navbar.sections.convertFrom=Convertir desde PDF navbar.sections.convertFrom=Convertir desde PDF
@@ -246,14 +246,14 @@ database.info_1=Al importar datos, es fundamental garantizar la estructura corre
database.info_2=El nombre del archivo no importa al cargarlo. Posteriormente se le cambiará el nombre para que siga el formato backup_user_yyyyMMddHHmm.sql, lo que garantiza una convención de nomenclatura coherente. database.info_2=El nombre del archivo no importa al cargarlo. Posteriormente se le cambiará el nombre para que siga el formato backup_user_yyyyMMddHHmm.sql, lo que garantiza una convención de nomenclatura coherente.
database.submit=Importar Copia de Seguridad database.submit=Importar Copia de Seguridad
database.importIntoDatabaseSuccessed=Importación a la base de datos ha sido exitosa database.importIntoDatabaseSuccessed=Importación a la base de datos ha sido exitosa
database.backupCreated=Respaldo de la Base de Datos exitoso database.backupCreated=Database backup successful
database.fileNotFound=Archivo no encontrado database.fileNotFound=Archivo no encontrado
database.fileNullOrEmpty=El archivo no debe ser nulo o vacío. database.fileNullOrEmpty=El archivo no debe ser nulo o vacío.
database.failedImportFile=Archivo de importación fallido database.failedImportFile=Archivo de importación fallido
database.notSupported=Esta función no esta disponible para su conexión de Base de Datos database.notSupported=This function is not available for your database connection.
session.expired=Tu sesión ha caducado. Actualice la página e inténtelo de nuevo. session.expired=Tu sesión ha caducado. Actualice la página e inténtelo de nuevo.
session.refreshPage=Refrescar Página session.refreshPage=Refresh Page
############# #############
# HOME-PAGE # # HOME-PAGE #
@@ -262,18 +262,18 @@ home.desc=Su ventanilla única autohospedada para todas sus necesidades PDF
home.searchBar=Buscar características... home.searchBar=Buscar características...
home.viewPdf.title=Ver/Editar PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Ver, anotar, añadir texto o imágenes home.viewPdf.desc=Ver, anotar, añadir texto o imágenes
viewPdf.tags=ver,leer,anotar,texto,imagen viewPdf.tags=ver,leer,anotar,texto,imagen
home.setFavorites=Agregar Favoritos home.setFavorites=Set Favourites
home.hideFavorites=Ocultar Favoritos home.hideFavorites=Hide Favourites
home.showFavorites=Mostrar Favoritos home.showFavorites=Show Favourites
home.legacyHomepage=Página de inicio anterior home.legacyHomepage=Old homepage
home.newHomePage=¡Prueba nuestra nueva página de inicio! home.newHomePage=Try our new homepage!
home.alphabetical=Alfabetico home.alphabetical=Alphabetical
home.globalPopularity=Popularidad Global home.globalPopularity=Global Popularity
home.sortBy=Ordenado por: home.sortBy=Sort by:
home.multiTool.title=Multi-herramienta PDF home.multiTool.title=Multi-herramienta PDF
home.multiTool.desc=Combinar, rotar, reorganizar y eliminar páginas home.multiTool.desc=Combinar, rotar, reorganizar y eliminar páginas
@@ -462,9 +462,9 @@ home.MarkdownToPDF.title=Markdown a PDF
home.MarkdownToPDF.desc=Convierte cualquier archivo Markdown a PDF home.MarkdownToPDF.desc=Convierte cualquier archivo Markdown a PDF
MarkdownToPDF.tags=margen,contenido web,transformación,convertir MarkdownToPDF.tags=margen,contenido web,transformación,convertir
home.PDFToMarkdown.title=PDF a Markdown home.PDFToMarkdown.title=PDF to Markdown
home.PDFToMarkdown.desc=Convierte cualquier PDF a Markdown home.PDFToMarkdown.desc=Converts any PDF to Markdown
PDFToMarkdown.tags=markup,contenido web,transformación,convertir,md PDFToMarkdown.tags=markup,web-content,transformation,convert,md
home.getPdfInfo.title=Obtener toda la información en PDF home.getPdfInfo.title=Obtener toda la información en PDF
home.getPdfInfo.desc=Obtiene toda la información posible de archivos PDF home.getPdfInfo.desc=Obtiene toda la información posible de archivos PDF
@@ -489,9 +489,9 @@ home.autoRedact.title=Auto Redactar
home.autoRedact.desc=Redactar automáticamente (ocultar) texto en un PDF según el texto introducido home.autoRedact.desc=Redactar automáticamente (ocultar) texto en un PDF según el texto introducido
autoRedact.tags=Redactar,Ocultar,ocultar,negro,subrayador,oculto autoRedact.tags=Redactar,Ocultar,ocultar,negro,subrayador,oculto
home.redact.title=Redacción Manual home.redact.title=Manual Redaction
home.redact.desc=Redacta un PDF basado en el texto seleccionado, dibuja formas y/o página(s) selecionada(s) home.redact.desc=Redacts a PDF based on selected text, drawn shapes and/or selected page(s)
redact.tags=Redactar,Ocultar,oscurece,negro,marcador,oculto,manual redact.tags=Redact,Hide,black out,black,marker,hidden,manual
home.tableExtraxt.title=PDF a CSV home.tableExtraxt.title=PDF a CSV
home.tableExtraxt.desc=Extraer Tablas de un PDF convirtiéndolas a CSV home.tableExtraxt.desc=Extraer Tablas de un PDF convirtiéndolas a CSV
@@ -533,9 +533,9 @@ home.splitPdfByChapters.title=Dividir PDF por capítulos
home.splitPdfByChapters.desc=Divida un PDF en varios archivos según su estructura de capítulos. home.splitPdfByChapters.desc=Divida un PDF en varios archivos según su estructura de capítulos.
splitPdfByChapters.tags=dividir,capítulos,marcadores,organizar splitPdfByChapters.tags=dividir,capítulos,marcadores,organizar
home.validateSignature.title=Validar firma del PDF home.validateSignature.title=Validate PDF Signature
home.validateSignature.desc=Verifica firmas digitales y certificados en los documentos PDF home.validateSignature.desc=Verify digital signatures and certificates in PDF documents
validateSignature.tags=firma,verificar,validar,pdf,certificado,firma digital,validar firma,validar certificado validateSignature.tags=signature,verify,validate,pdf,certificate,digital signature,Validate Signature,Validate certificate
#replace-invert-color #replace-invert-color
replace-color.title=Reemplazar-Invertir-Color replace-color.title=Reemplazar-Invertir-Color
@@ -580,50 +580,50 @@ login.oauth2invalidRequest=Solicitud no válida
login.oauth2AccessDenied=Acceso denegado login.oauth2AccessDenied=Acceso denegado
login.oauth2InvalidTokenResponse=Respuesta de token no válida login.oauth2InvalidTokenResponse=Respuesta de token no válida
login.oauth2InvalidIdToken=Token de identificación no válido login.oauth2InvalidIdToken=Token de identificación no válido
login.relyingPartyRegistrationNotFound=No hay registro de terceros confiables login.relyingPartyRegistrationNotFound=No relying party registration found
login.userIsDisabled=El usuario está desactivado, actualmente el acceso está bloqueado para ese nombre de usuario. Por favor, póngase en contacto con el administrador. login.userIsDisabled=El usuario está desactivado, actualmente el acceso está bloqueado para ese nombre de usuario. Por favor, póngase en contacto con el administrador.
login.alreadyLoggedIn=Ya has iniciado sesión en login.alreadyLoggedIn=Ya has iniciado sesión en
login.alreadyLoggedIn2=dispositivos. Cierra sesión en los dispositivos y vuelve a intentarlo. login.alreadyLoggedIn2=dispositivos. Cierra sesión en los dispositivos y vuelve a intentarlo.
login.toManySessions=Tienes demasiadas sesiones activas login.toManySessions=Tienes demasiadas sesiones activas
#auto-redact #auto-redact
autoRedact.title=Auto Censurar Texto autoRedact.title=Auto Redactar
autoRedact.header=Auto Censurar Texto autoRedact.header=Auto Redactar
autoRedact.colorLabel=Color autoRedact.colorLabel=Color
autoRedact.textsToRedactLabel=Texto para Censurar (separado por líneas) autoRedact.textsToRedactLabel=Texto para Redactar (separado por líneas)
autoRedact.textsToRedactPlaceholder=por ej. \nConfidencial \nAlto-Secreto autoRedact.textsToRedactPlaceholder=por ej. \nConfidencial \nAlto-Secreto
autoRedact.useRegexLabel=Usar Regex autoRedact.useRegexLabel=Usar Regex
autoRedact.wholeWordSearchLabel=Búsqueda por palabra completa autoRedact.wholeWordSearchLabel=Búsqueda por palabra completa
autoRedact.customPaddingLabel=Extra Padding personalizado autoRedact.customPaddingLabel=Extra Padding personalizado
autoRedact.convertPDFToImageLabel=Convertir PDF a imagen PDF (Utilizado para eliminar el texto detrás del cajetín de censura) autoRedact.convertPDFToImageLabel=Convertir PDF a imagen PDF (Utilizado para quitar el texto detrás del cajetín)
autoRedact.submitButton=Enviar autoRedact.submitButton=Enviar
#redact #redact
redact.title=Censurar texto Manualmente redact.title=Manual Redaction
redact.header=Censurar texto Manualmente redact.header=Manual Redaction
redact.submit=Enviar redact.submit=Redact
redact.textBasedRedaction=Censura basada en texto redact.textBasedRedaction=Text based Redaction
redact.pageBasedRedaction=Censura basada en la página redact.pageBasedRedaction=Page-based Redaction
redact.convertPDFToImageLabel=Convertir PDF a PDF-Image (Utilizado para eliminar el texto detrás del cajetín de censura) redact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box)
redact.pageRedactionNumbers.title=Páginas redact.pageRedactionNumbers.title=Pages
redact.pageRedactionNumbers.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) redact.pageRedactionNumbers.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
redact.redactionColor.title=Color del cajetín redact.redactionColor.title=Redaction Color
redact.export=Exportar redact.export=Export
redact.upload=Cargar redact.upload=Upload
redact.boxRedaction=Dibujar cajetín de censura redact.boxRedaction=Box draw redaction
redact.zoom=Zoom redact.zoom=Zoom
redact.zoomIn=Zoom in redact.zoomIn=Zoom in
redact.zoomOut=Zoom out redact.zoomOut=Zoom out
redact.nextPage=Siguiente página redact.nextPage=Next Page
redact.previousPage=Pagina Anterior redact.previousPage=Previous Page
redact.toggleSidebar=Activar/desactivar barra lateral redact.toggleSidebar=Toggle Sidebar
redact.showThumbnails=Mostrar Miniaturas redact.showThumbnails=Show Thumbnails
redact.showDocumentOutline=Mostra Esquema del documento (doble-click para expandir/colapsar elementos) redact.showDocumentOutline=Show Document Outline (double-click to expand/collapse all items)
redact.showAttatchments=Mostrar Adjuntos redact.showAttatchments=Show Attachments
redact.showLayers=Mostrar Capas (doble-click para reiniciar las capas a su estado inicial) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Seleccionador de Color redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Buscar elemento actual de esquema redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Aplicar Cambios redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Mostrar Javascript showJS.title=Mostrar Javascript
@@ -661,9 +661,9 @@ MarkdownToPDF.credit=Usa WeasyPrint
#pdf-to-markdown #pdf-to-markdown
PDFToMarkdown.title=PDF a Markdown PDFToMarkdown.title=PDF To Markdown
PDFToMarkdown.header=PDF a Markdown PDFToMarkdown.header=PDF To Markdown
PDFToMarkdown.submit=Convertir PDFToMarkdown.submit=Convert
#url-to-pdf #url-to-pdf
@@ -713,14 +713,14 @@ AddStampRequest.submit=Enviar
#sanitizePDF #sanitizePDF
sanitizePDF.title=Limpiar archivo PDF sanitizePDF.title=Desinfectar archivo PDF
sanitizePDF.header=Limpiar un archivo PDF sanitizePDF.header=Desinfectar un archivo PDF
sanitizePDF.selectText.1=Eliminar código JavaScript sanitizePDF.selectText.1=Eliminar acciones JavaScript
sanitizePDF.selectText.2=Eliminar archivos incrustados sanitizePDF.selectText.2=Eliminar archivos incrustados
sanitizePDF.selectText.3=Eliminar metadatos sanitizePDF.selectText.3=Eliminar metadatos
sanitizePDF.selectText.4=Eliminar enlaces sanitizePDF.selectText.4=Eliminar enlaces
sanitizePDF.selectText.5=Eliminar fuentes sanitizePDF.selectText.5=Eliminar fuentes
sanitizePDF.submit=Limpiar PDF sanitizePDF.submit=Desinfectar PDF
#addPageNumbers #addPageNumbers
@@ -874,13 +874,13 @@ sign.save=Guardar Firma
sign.personalSigs=Firmas Personales sign.personalSigs=Firmas Personales
sign.sharedSigs=Firmas compartidas sign.sharedSigs=Firmas compartidas
sign.noSavedSigs=No se encontraron firmas guardadas sign.noSavedSigs=No se encontraron firmas guardadas
sign.addToAll=Agregar a todas las páginas sign.addToAll=Add to all pages
sign.delete=Eliminar sign.delete=Delete
sign.first=Primera página sign.first=First page
sign.last=Última página sign.last=Last page
sign.next=Siguiente página sign.next=Next page
sign.previous=Página anterior sign.previous=Previous page
sign.maintainRatio=Activar/desactivar la relación de aspecto sign.maintainRatio=Toggle maintain aspect ratio
#repair #repair
@@ -952,7 +952,7 @@ compress.title=Comprimir
compress.header=Comprimir PDF compress.header=Comprimir PDF
compress.credit=Este servicio utiliza qpdf para compresión/optimización de PDF compress.credit=Este servicio utiliza qpdf para compresión/optimización de PDF
compress.selectText.1=Modo manual - De 1 a 5 compress.selectText.1=Modo manual - De 1 a 5
compress.selectText.1.1=En los niveles de optimización 6 a 9, además de la compresión general de PDF, se reduce la resolución de la imagen para reducir aún más el tamaño del archivo. Los niveles más altos dan como resultado una mayor compresión de la imagen (hasta el 50 % del tamaño original), lo que permite lograr una mayor reducción del tamaño, pero con una posible pérdida de calidad en las imágenes. compress.selectText.1.1=In optimization levels 6 to 9, in addition to general PDF compression, image resolution is scaled down to further reduce file size. Higher levels result in stronger image compression (up to 50% of the original size), achieving greater size reduction but with potential quality loss in images.
compress.selectText.2=Nivel de optimización: compress.selectText.2=Nivel de optimización:
compress.selectText.3=4 (Terrible para imágenes de texto) compress.selectText.3=4 (Terrible para imágenes de texto)
compress.selectText.4=Modo automático: ajusta automáticamente la calidad para que el PDF tenga el tamaño exacto compress.selectText.4=Modo automático: ajusta automáticamente la calidad para que el PDF tenga el tamaño exacto
@@ -1000,42 +1000,42 @@ pdfOrganiser.placeholder=(por ej., 1,3,2 o 4-8,2,10-12 o 2n-1)
multiTool.title=Multi-herramienta PDF multiTool.title=Multi-herramienta PDF
multiTool.header=Multi-herramienta PDF multiTool.header=Multi-herramienta PDF
multiTool.uploadPrompts=Nombre del archivo multiTool.uploadPrompts=Nombre del archivo
multiTool.selectAll=Seleccionar Todo multiTool.selectAll=Select All
multiTool.deselectAll=Deseleccionar Todo multiTool.deselectAll=Deselect All
multiTool.selectPages=Seleccionar página(s) multiTool.selectPages=Page Select
multiTool.selectedPages=Página(s) Selecccionada(s) multiTool.selectedPages=Selected Pages
multiTool.page=Página multiTool.page=Page
multiTool.deleteSelected=Borrar selecionado(s) multiTool.deleteSelected=Delete Selected
multiTool.downloadAll=Exportar multiTool.downloadAll=Export
multiTool.downloadSelected=Exportar selecionado(s) multiTool.downloadSelected=Export Selected
multiTool.insertPageBreak=Insertar salto página multiTool.insertPageBreak=Insert Page Break
multiTool.addFile=Agregar Archivo multiTool.addFile=Add File
multiTool.rotateLeft=Rotar a la izquierda multiTool.rotateLeft=Rotate Left
multiTool.rotateRight=Rotar a la derecha multiTool.rotateRight=Rotate Right
multiTool.split=Dividir multiTool.split=Split
multiTool.moveLeft=Mover a la izquierda multiTool.moveLeft=Move Left
multiTool.moveRight=Mover a la derecha multiTool.moveRight=Move Right
multiTool.delete=Borrar multiTool.delete=Delete
multiTool.dragDropMessage=Página(s) Selecccionada(s) multiTool.dragDropMessage=Page(s) Selected
multiTool.undo=Deshacer multiTool.undo=Undo
multiTool.redo=Rehacer multiTool.redo=Redo
#decrypt #decrypt
decrypt.passwordPrompt=Este archivo está protegido con contraseña. Introdúzca la contraseña: decrypt.passwordPrompt=This file is password-protected. Please enter the password:
decrypt.cancelled=Operación cancelada para el PDF: {0} decrypt.cancelled=Operation cancelled for PDF: {0}
decrypt.noPassword=No se proporcionó contraseña para PDF cifrado: {0} decrypt.noPassword=No password provided for encrypted PDF: {0}
decrypt.invalidPassword=Por favor, inténtelo de nuevo con la contraseña correcta. decrypt.invalidPassword=Please try again with the correct password.
decrypt.invalidPasswordHeader=Contraseña incorrecta o cifrado no compatible para PDF: {0} decrypt.invalidPasswordHeader=Incorrect password or unsupported encryption for PDF: {0}
decrypt.unexpectedError=Se produjo un error al procesar el archivo. Inténtalo nuevamente. decrypt.unexpectedError=There was an error processing the file. Please try again.
decrypt.serverError=Error del servidor al descifrar: {0} decrypt.serverError=Server error while decrypting: {0}
decrypt.success=Archivo descifrado exitosamente. decrypt.success=File decrypted successfully.
#multiTool-advert #multiTool-advert
multiTool-advert.message=Esta función también está disponible en nuestra <a href="{0}">página de herramientas múltiples</a>. ¡Échale un vistazo para ver una interfaz de usuario página por página mejorada y funciones adicionales! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Ver/Editar PDF viewPdf.title=View/Edit PDF
viewPdf.header=Ver PDF viewPdf.header=Ver PDF
#pageRemover #pageRemover
@@ -1337,51 +1337,50 @@ splitByChapters.submit=Dividir PDF
#File Chooser #File Chooser
fileChooser.click=Click fileChooser.click=Click
fileChooser.or=o fileChooser.or=or
fileChooser.dragAndDrop=Arrastrar & Soltar fileChooser.dragAndDrop=Drag & Drop
fileChooser.dragAndDropPDF=Arrastrar & Soltar archivo PDF fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Arrastrar & Soltar archivo de Imagen fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Arrastrar & Soltar archivos(s) aquí fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
#release notes #release notes
releases.footer=Versiones releases.footer=Releases
releases.title=Notas de la versión releases.title=Release Notes
releases.header=Notas de la versión releases.header=Release Notes
releases.current.version=versión Actual releases.current.version=Current Release
releases.note=Las notas de la versión solo están disponibles en Inglés releases.note=Release notes are only available in English
#Validate Signature #Validate Signature
validateSignature.title=Validar firmas del PDF validateSignature.title=Validate PDF Signatures
validateSignature.header=Validar firmas del PDF validateSignature.header=Validate Digital Signatures
validateSignature.selectPDF=Seleccione el archivo PDF firmado validateSignature.selectPDF=Select signed PDF file
validateSignature.submit=Validar firmas validateSignature.submit=Validate Signatures
validateSignature.results=Resultados de la Validación validateSignature.results=Validation Results
validateSignature.status=Estador validateSignature.status=Status
validateSignature.signer=Firmante validateSignature.signer=Signer
validateSignature.date=Fecha validateSignature.date=Date
validateSignature.reason=Razón validateSignature.reason=Reason
validateSignature.location=Ubicación validateSignature.location=Location
validateSignature.noSignatures=No se encontrario firmas digiales en este documento validateSignature.noSignatures=No digital signatures found in this document
validateSignature.status.valid=Válido validateSignature.status.valid=Valid
validateSignature.status.invalid=Inválido validateSignature.status.invalid=Invalid
validateSignature.chain.invalid=Error en la validación de la cadena de certificados: no se puede verificar la identidad del firmante validateSignature.chain.invalid=Certificate chain validation failed - cannot verify signer's identity
validateSignature.trust.invalid=El certificado no se encuentra en los almacenes de confianza: no se puede verificar la fuente validateSignature.trust.invalid=Certificate not in trust store - source cannot be verified
validateSignature.cert.expired=Certificado expiredo validateSignature.cert.expired=Certificate has expired
validateSignature.cert.revoked=Certificado fue revocado validateSignature.cert.revoked=Certificate has been revoked
validateSignature.signature.info=Información de la firma validateSignature.signature.info=Signature Information
validateSignature.signature=Firma validateSignature.signature=Signature
validateSignature.signature.mathValid=La firma es matemáticamente válida aunque: validateSignature.signature.mathValid=Signature is mathematically valid BUT:
validateSignature.selectCustomCert=Archivo de certificado personalizado X.509 (opcional) validateSignature.selectCustomCert=Custom Certificate File X.509 (Optional)
validateSignature.cert.info=Detalles Certificado validateSignature.cert.info=Certificate Details
validateSignature.cert.issuer=Emisor validateSignature.cert.issuer=Issuer
validateSignature.cert.subject=Subject validateSignature.cert.subject=Subject
validateSignature.cert.serialNumber=Número Serie validateSignature.cert.serialNumber=Serial Number
validateSignature.cert.validFrom=Válido desde validateSignature.cert.validFrom=Valid From
validateSignature.cert.validUntil=Válido hasta validateSignature.cert.validUntil=Valid Until
validateSignature.cert.algorithm=Algoritmo validateSignature.cert.algorithm=Algorithm
validateSignature.cert.keySize=Tamaño llave validateSignature.cert.keySize=Key Size
validateSignature.cert.version=Versión validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Uso de la llave validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Autofirmado validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Aplicar escala de grises para compresión

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Aplikatu grisezko eskala konpresiorako

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=نسخه
validateSignature.cert.keyUsage=کاربرد کلید validateSignature.cert.keyUsage=کاربرد کلید
validateSignature.cert.selfSigned=با امضای خود validateSignature.cert.selfSigned=با امضای خود
validateSignature.cert.bits=بیت‌ها validateSignature.cert.bits=بیت‌ها
compress.grayscale.label=اعمال مقیاس خاکستری برای فشرده‌سازی

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Usage de la clé validateSignature.cert.keyUsage=Usage de la clé
validateSignature.cert.selfSigned=Auto-signé validateSignature.cert.selfSigned=Auto-signé
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Appliquer l'échelle de gris pour la compression

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Leagan
validateSignature.cert.keyUsage=Úsáid Eochrach validateSignature.cert.keyUsage=Úsáid Eochrach
validateSignature.cert.selfSigned=Féin-Sínithe validateSignature.cert.selfSigned=Féin-Sínithe
validateSignature.cert.bits=giotáin validateSignature.cert.bits=giotáin
compress.grayscale.label=Cuir Scála Liath i bhFeidhm le Comhbhrú

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=संस्करण
validateSignature.cert.keyUsage=कुंजी उपयोग validateSignature.cert.keyUsage=कुंजी उपयोग
validateSignature.cert.selfSigned=स्व-हस्ताक्षरित validateSignature.cert.selfSigned=स्व-हस्ताक्षरित
validateSignature.cert.bits=बिट्स validateSignature.cert.bits=बिट्स
compress.grayscale.label=संपीड़न के लिए ग्रेस्केल लागू करें

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Primijeni sivinu za kompresiju

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Verzió
validateSignature.cert.keyUsage=Kulcshasználat validateSignature.cert.keyUsage=Kulcshasználat
validateSignature.cert.selfSigned=Önaláírt validateSignature.cert.selfSigned=Önaláírt
validateSignature.cert.bits=bit validateSignature.cert.bits=bit
compress.grayscale.label=Szürkeárnyalatok alkalmazása tömörítéshez

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Terapkan Skala Abu-Abu untuk Kompresi

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Versione
validateSignature.cert.keyUsage=Utilizzo della chiave validateSignature.cert.keyUsage=Utilizzo della chiave
validateSignature.cert.selfSigned=Autofirmato validateSignature.cert.selfSigned=Autofirmato
validateSignature.cert.bits=bit validateSignature.cert.bits=bit
compress.grayscale.label=Applica scala di grigio per la compressione

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=バージョン
validateSignature.cert.keyUsage=キーの使用法 validateSignature.cert.keyUsage=キーの使用法
validateSignature.cert.selfSigned=自己署名 validateSignature.cert.selfSigned=自己署名
validateSignature.cert.bits=ビット validateSignature.cert.bits=ビット
compress.grayscale.label=圧縮にグレースケールを適用する

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=버전
validateSignature.cert.keyUsage=키 용도 validateSignature.cert.keyUsage=키 용도
validateSignature.cert.selfSigned=자체 서명 validateSignature.cert.selfSigned=자체 서명
validateSignature.cert.bits=비트 validateSignature.cert.bits=비트
compress.grayscale.label=압축을 위해 그레이스케일 적용

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Grijsschaal toepassen voor compressie

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Bruk gråskala for komprimering

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Zastosuj skalę szarości do kompresji

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Versão
validateSignature.cert.keyUsage=Uso da chave validateSignature.cert.keyUsage=Uso da chave
validateSignature.cert.selfSigned=Autoassinados validateSignature.cert.selfSigned=Autoassinados
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Aplicar escala de cinza para compressão

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Versão
validateSignature.cert.keyUsage=Utilização da Chave validateSignature.cert.keyUsage=Utilização da Chave
validateSignature.cert.selfSigned=Auto-Assinado validateSignature.cert.selfSigned=Auto-Assinado
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Aplicar escala de cinzentos para compressão

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Aplicare scală de gri pentru compresie

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Версия
validateSignature.cert.keyUsage=Использование ключа validateSignature.cert.keyUsage=Использование ключа
validateSignature.cert.selfSigned=Самоподписанный validateSignature.cert.selfSigned=Самоподписанный
validateSignature.cert.bits=бит validateSignature.cert.bits=бит
compress.grayscale.label=Применить шкалу серого для сжатия

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Použiť odtiene šedej na kompresiu

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Različica
validateSignature.cert.keyUsage=Uporaba ključa validateSignature.cert.keyUsage=Uporaba ključa
validateSignature.cert.selfSigned=Samopodpisano validateSignature.cert.selfSigned=Samopodpisano
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Uporabi sivinsko lestvico za stiskanje

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Primeni sivinu za kompresiju

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Tillämpa gråskala för komprimering

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=ใช้ระดับสีเทาสำหรับการบีบอัด

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Sıkıştırma için Gri Ton Uygula

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Застосувати відтінки сірого для стиснення

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=bits validateSignature.cert.bits=bits
compress.grayscale.label=Áp dụng thang độ xám để nén

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=པར་གཞི།
validateSignature.cert.keyUsage=ལྡེ་མིག་བེད་སྤྱོད། validateSignature.cert.keyUsage=ལྡེ་མིག་བེད་སྤྱོད།
validateSignature.cert.selfSigned=རང་མིང་རྟགས། validateSignature.cert.selfSigned=རང་མིང་རྟགས།
validateSignature.cert.bits=གནས། validateSignature.cert.bits=གནས།
compress.grayscale.label=应用灰度进行压缩

View File

@@ -1384,4 +1384,3 @@ validateSignature.cert.version=版本
validateSignature.cert.keyUsage=密钥用途 validateSignature.cert.keyUsage=密钥用途
validateSignature.cert.selfSigned=自签名 validateSignature.cert.selfSigned=自签名
validateSignature.cert.bits=比特 validateSignature.cert.bits=比特
compress.grayscale.label=应用灰度进行压缩

View File

@@ -138,7 +138,7 @@ analytics.settings=您可以在 config/settings.yml 檔案中變更分析功能
# NAVBAR # # NAVBAR #
############# #############
navbar.favorite=我的最愛 navbar.favorite=我的最愛
navbar.recent=最新與近期更新 navbar.recent=New and recently updated
navbar.darkmode=深色模式 navbar.darkmode=深色模式
navbar.language=語言 navbar.language=語言
navbar.settings=設定 navbar.settings=設定
@@ -262,18 +262,18 @@ home.desc=您的本機一站式 PDF 解決方案。
home.searchBar=搜尋功能... home.searchBar=搜尋功能...
home.viewPdf.title=檢視/編輯 PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=檢視、註釋、新增文字或圖片 home.viewPdf.desc=檢視、註釋、新增文字或圖片
viewPdf.tags=檢視,閱讀,註釋,文字,圖片 viewPdf.tags=檢視,閱讀,註釋,文字,圖片
home.setFavorites=設定我的最愛 home.setFavorites=Set Favourites
home.hideFavorites=隱藏我的最愛 home.hideFavorites=Hide Favourites
home.showFavorites=顯示我的最愛 home.showFavorites=Show Favourites
home.legacyHomepage=舊版首頁 home.legacyHomepage=Old homepage
home.newHomePage=嘗試使用全新首頁! home.newHomePage=Try our new homepage!
home.alphabetical=按照字母排序 home.alphabetical=Alphabetical
home.globalPopularity=熱門程度 home.globalPopularity=Global Popularity
home.sortBy=排序方式: home.sortBy=Sort by:
home.multiTool.title=PDF 複合工具 home.multiTool.title=PDF 複合工具
home.multiTool.desc=合併、旋轉、重新排列和移除頁面 home.multiTool.desc=合併、旋轉、重新排列和移除頁面
@@ -623,7 +623,7 @@ redact.showAttatchments=顯示附件
redact.showLayers=顯示圖層(按兩下可將所有圖層重設為預設狀態) redact.showLayers=顯示圖層(按兩下可將所有圖層重設為預設狀態)
redact.colourPicker=顏色選擇器 redact.colourPicker=顏色選擇器
redact.findCurrentOutlineItem=尋找目前的大綱項目 redact.findCurrentOutlineItem=尋找目前的大綱項目
redact.applyChanges=套用變更 redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=顯示 JavaScript showJS.title=顯示 JavaScript
@@ -992,7 +992,7 @@ pdfOrganiser.mode.7=刪除第一頁
pdfOrganiser.mode.8=刪除最後一頁 pdfOrganiser.mode.8=刪除最後一頁
pdfOrganiser.mode.9=刪除第一頁和最後一頁 pdfOrganiser.mode.9=刪除第一頁和最後一頁
pdfOrganiser.mode.10=奇偶合併 pdfOrganiser.mode.10=奇偶合併
pdfOrganiser.mode.11=複製所有頁面 pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(例如 1,3,2 或 4-8,2,10-12 或 2n-1 pdfOrganiser.placeholder=(例如 1,3,2 或 4-8,2,10-12 或 2n-1
@@ -1035,7 +1035,7 @@ decrypt.success=檔案已成功解密。
multiTool-advert.message=此功能也可以在我們的<a href="{0}">複合工具頁面</a>中使用。前往查看並體驗更強大的逐頁操作介面及其他進階功能! multiTool-advert.message=此功能也可以在我們的<a href="{0}">複合工具頁面</a>中使用。前往查看並體驗更強大的逐頁操作介面及其他進階功能!
#view pdf #view pdf
viewPdf.title=檢視/編輯 PDF viewPdf.title=View/Edit PDF
viewPdf.header=檢視 PDF viewPdf.header=檢視 PDF
#pageRemover #pageRemover
@@ -1384,4 +1384,3 @@ validateSignature.cert.version=版本
validateSignature.cert.keyUsage=金鑰用途 validateSignature.cert.keyUsage=金鑰用途
validateSignature.cert.selfSigned=自我簽署 validateSignature.cert.selfSigned=自我簽署
validateSignature.cert.bits=位元 validateSignature.cert.bits=位元
compress.grayscale.label=應用灰階進行壓縮

View File

@@ -85,7 +85,7 @@ system:
showUpdateOnlyAdmin: false # only admins can see when a new update is available, depending on showUpdate it must be set to 'true' showUpdateOnlyAdmin: false # only admins can see when a new update is available, depending on showUpdate it must be set to 'true'
customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template HTML files customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template HTML files
tessdataDir: /usr/share/tessdata # path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored. tessdataDir: /usr/share/tessdata # path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored.
enableAnalytics: 'undefined' # set to 'true' to enable analytics, set to 'false' to disable analytics; for enterprise users, this is set to true enableAnalytics: 'true' # set to 'true' to enable analytics, set to 'false' to disable analytics; for enterprise users, this is set to true
disableSanitize: false # set to true to disable Sanitize HTML; (can lead to injections in HTML) disableSanitize: false # set to true to disable Sanitize HTML; (can lead to injections in HTML)
datasource: datasource:
enableCustomDatabase: false # Enterprise users ONLY, set this property to 'true' if you would like to use your own custom database configuration enableCustomDatabase: false # Enterprise users ONLY, set this property to 'true' if you would like to use your own custom database configuration

View File

@@ -3,14 +3,14 @@
{ {
"moduleName": "ch.qos.logback:logback-classic", "moduleName": "ch.qos.logback:logback-classic",
"moduleUrl": "http://www.qos.ch", "moduleUrl": "http://www.qos.ch",
"moduleVersion": "1.5.16", "moduleVersion": "1.5.15",
"moduleLicense": "GNU Lesser General Public License", "moduleLicense": "GNU Lesser General Public License",
"moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" "moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html"
}, },
{ {
"moduleName": "ch.qos.logback:logback-core", "moduleName": "ch.qos.logback:logback-core",
"moduleUrl": "http://www.qos.ch", "moduleUrl": "http://www.qos.ch",
"moduleVersion": "1.5.16", "moduleVersion": "1.5.15",
"moduleLicense": "GNU Lesser General Public License", "moduleLicense": "GNU Lesser General Public License",
"moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" "moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html"
}, },
@@ -168,21 +168,21 @@
{ {
"moduleName": "com.google.errorprone:error_prone_annotations", "moduleName": "com.google.errorprone:error_prone_annotations",
"moduleUrl": "https://errorprone.info/error_prone_annotations", "moduleUrl": "https://errorprone.info/error_prone_annotations",
"moduleVersion": "2.27.0", "moduleVersion": "2.28.0",
"moduleLicense": "Apache 2.0", "moduleLicense": "Apache 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
{ {
"moduleName": "com.google.guava:failureaccess", "moduleName": "com.google.guava:failureaccess",
"moduleUrl": "https://github.com/google/guava/", "moduleUrl": "https://github.com/google/guava/",
"moduleVersion": "1.0.1", "moduleVersion": "1.0.2",
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
{ {
"moduleName": "com.google.guava:guava", "moduleName": "com.google.guava:guava",
"moduleUrl": "https://github.com/google/guava/", "moduleUrl": "https://github.com/google/guava/",
"moduleVersion": "31.1-jre", "moduleVersion": "33.3.1-jre",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
@@ -195,8 +195,8 @@
{ {
"moduleName": "com.google.j2objc:j2objc-annotations", "moduleName": "com.google.j2objc:j2objc-annotations",
"moduleUrl": "https://github.com/google/j2objc/", "moduleUrl": "https://github.com/google/j2objc/",
"moduleVersion": "1.3", "moduleVersion": "3.0.0",
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
{ {
@@ -263,7 +263,7 @@
{ {
"moduleName": "com.nimbusds:oauth2-oidc-sdk", "moduleName": "com.nimbusds:oauth2-oidc-sdk",
"moduleUrl": "https://bitbucket.org/connect2id/oauth-2.0-sdk-with-openid-connect-extensions", "moduleUrl": "https://bitbucket.org/connect2id/oauth-2.0-sdk-with-openid-connect-extensions",
"moduleVersion": "9.43.6", "moduleVersion": "9.43.4",
"moduleLicense": "Apache License, version 2.0", "moduleLicense": "Apache License, version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.html" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.html"
}, },
@@ -512,7 +512,7 @@
{ {
"moduleName": "commons-codec:commons-codec", "moduleName": "commons-codec:commons-codec",
"moduleUrl": "https://commons.apache.org/proper/commons-codec/", "moduleUrl": "https://commons.apache.org/proper/commons-codec/",
"moduleVersion": "1.17.2", "moduleVersion": "1.17.1",
"moduleLicense": "Apache-2.0", "moduleLicense": "Apache-2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
@@ -553,7 +553,7 @@
{ {
"moduleName": "io.micrometer:micrometer-commons", "moduleName": "io.micrometer:micrometer-commons",
"moduleUrl": "https://github.com/micrometer-metrics/micrometer", "moduleUrl": "https://github.com/micrometer-metrics/micrometer",
"moduleVersion": "1.14.4", "moduleVersion": "1.14.2",
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
@@ -567,14 +567,14 @@
{ {
"moduleName": "io.micrometer:micrometer-jakarta9", "moduleName": "io.micrometer:micrometer-jakarta9",
"moduleUrl": "https://github.com/micrometer-metrics/micrometer", "moduleUrl": "https://github.com/micrometer-metrics/micrometer",
"moduleVersion": "1.14.4", "moduleVersion": "1.14.2",
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
{ {
"moduleName": "io.micrometer:micrometer-observation", "moduleName": "io.micrometer:micrometer-observation",
"moduleUrl": "https://github.com/micrometer-metrics/micrometer", "moduleUrl": "https://github.com/micrometer-metrics/micrometer",
"moduleVersion": "1.14.4", "moduleVersion": "1.14.2",
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
@@ -720,14 +720,14 @@
{ {
"moduleName": "me.friwi:jcef-api", "moduleName": "me.friwi:jcef-api",
"moduleUrl": "https://bitbucket.org/chromiumembedded/java-cef/", "moduleUrl": "https://bitbucket.org/chromiumembedded/java-cef/",
"moduleVersion": "jcef-1770317+cef-132.3.1+g144febe+chromium-132.0.6834.83", "moduleVersion": "jcef-99c2f7a+cef-127.3.1+g6cbb30e+chromium-127.0.6533.100",
"moduleLicense": "BSD License", "moduleLicense": "BSD License",
"moduleLicenseUrl": "https://bitbucket.org/chromiumembedded/java-cef/src/master/LICENSE.txt" "moduleLicenseUrl": "https://bitbucket.org/chromiumembedded/java-cef/src/master/LICENSE.txt"
}, },
{ {
"moduleName": "me.friwi:jcefmaven", "moduleName": "me.friwi:jcefmaven",
"moduleUrl": "https://github.com/jcefmaven/jcefmaven/", "moduleUrl": "https://github.com/jcefmaven/jcefmaven/",
"moduleVersion": "132.3.1", "moduleVersion": "127.3.1",
"moduleLicense": "Apache-2.0 License", "moduleLicense": "Apache-2.0 License",
"moduleLicenseUrl": "https://github.com/jcefmaven/jcefmaven/blob/master/LICENSE" "moduleLicenseUrl": "https://github.com/jcefmaven/jcefmaven/blob/master/LICENSE"
}, },
@@ -747,14 +747,14 @@
{ {
"moduleName": "net.minidev:accessors-smart", "moduleName": "net.minidev:accessors-smart",
"moduleUrl": "https://urielch.github.io/", "moduleUrl": "https://urielch.github.io/",
"moduleVersion": "2.5.2", "moduleVersion": "2.5.1",
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
{ {
"moduleName": "net.minidev:json-smart", "moduleName": "net.minidev:json-smart",
"moduleUrl": "https://urielch.github.io/", "moduleUrl": "https://urielch.github.io/",
"moduleVersion": "2.5.2", "moduleVersion": "2.5.1",
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
@@ -781,7 +781,7 @@
{ {
"moduleName": "org.apache.commons:commons-compress", "moduleName": "org.apache.commons:commons-compress",
"moduleUrl": "https://commons.apache.org/proper/commons-compress/", "moduleUrl": "https://commons.apache.org/proper/commons-compress/",
"moduleVersion": "1.27.1", "moduleVersion": "1.26.0",
"moduleLicense": "Apache-2.0", "moduleLicense": "Apache-2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
@@ -883,7 +883,7 @@
{ {
"moduleName": "org.apache.tomcat.embed:tomcat-embed-el", "moduleName": "org.apache.tomcat.embed:tomcat-embed-el",
"moduleUrl": "https://tomcat.apache.org/", "moduleUrl": "https://tomcat.apache.org/",
"moduleVersion": "10.1.36", "moduleVersion": "10.1.34",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
@@ -1195,7 +1195,7 @@
{ {
"moduleName": "org.hibernate.orm:hibernate-core", "moduleName": "org.hibernate.orm:hibernate-core",
"moduleUrl": "https://www.hibernate.org/orm/6.6", "moduleUrl": "https://www.hibernate.org/orm/6.6",
"moduleVersion": "6.6.8.Final", "moduleVersion": "6.6.4.Final",
"moduleLicense": "GNU Library General Public License v2.1 or later", "moduleLicense": "GNU Library General Public License v2.1 or later",
"moduleLicenseUrl": "https://www.opensource.org/licenses/LGPL-2.1" "moduleLicenseUrl": "https://www.opensource.org/licenses/LGPL-2.1"
}, },
@@ -1392,238 +1392,238 @@
{ {
"moduleName": "org.springframework.boot:spring-boot", "moduleName": "org.springframework.boot:spring-boot",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-actuator", "moduleName": "org.springframework.boot:spring-boot-actuator",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-actuator-autoconfigure", "moduleName": "org.springframework.boot:spring-boot-actuator-autoconfigure",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-autoconfigure", "moduleName": "org.springframework.boot:spring-boot-autoconfigure",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-devtools", "moduleName": "org.springframework.boot:spring-boot-devtools",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter", "moduleName": "org.springframework.boot:spring-boot-starter",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-actuator", "moduleName": "org.springframework.boot:spring-boot-starter-actuator",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-data-jpa", "moduleName": "org.springframework.boot:spring-boot-starter-data-jpa",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-jdbc", "moduleName": "org.springframework.boot:spring-boot-starter-jdbc",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-jetty", "moduleName": "org.springframework.boot:spring-boot-starter-jetty",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-json", "moduleName": "org.springframework.boot:spring-boot-starter-json",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-logging", "moduleName": "org.springframework.boot:spring-boot-starter-logging",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-oauth2-client", "moduleName": "org.springframework.boot:spring-boot-starter-oauth2-client",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-security", "moduleName": "org.springframework.boot:spring-boot-starter-security",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf", "moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-web", "moduleName": "org.springframework.boot:spring-boot-starter-web",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.data:spring-data-commons", "moduleName": "org.springframework.data:spring-data-commons",
"moduleUrl": "https://spring.io/projects/spring-data", "moduleUrl": "https://spring.io/projects/spring-data",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.data:spring-data-jpa", "moduleName": "org.springframework.data:spring-data-jpa",
"moduleUrl": "https://projects.spring.io/spring-data-jpa", "moduleUrl": "https://projects.spring.io/spring-data-jpa",
"moduleVersion": "3.4.3", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.security:spring-security-config", "moduleName": "org.springframework.security:spring-security-config",
"moduleUrl": "https://spring.io/projects/spring-security", "moduleUrl": "https://spring.io/projects/spring-security",
"moduleVersion": "6.4.3", "moduleVersion": "6.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.security:spring-security-core", "moduleName": "org.springframework.security:spring-security-core",
"moduleUrl": "https://spring.io/projects/spring-security", "moduleUrl": "https://spring.io/projects/spring-security",
"moduleVersion": "6.4.3", "moduleVersion": "6.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.security:spring-security-crypto", "moduleName": "org.springframework.security:spring-security-crypto",
"moduleUrl": "https://spring.io/projects/spring-security", "moduleUrl": "https://spring.io/projects/spring-security",
"moduleVersion": "6.4.3", "moduleVersion": "6.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.security:spring-security-oauth2-client", "moduleName": "org.springframework.security:spring-security-oauth2-client",
"moduleUrl": "https://spring.io/projects/spring-security", "moduleUrl": "https://spring.io/projects/spring-security",
"moduleVersion": "6.4.3", "moduleVersion": "6.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.security:spring-security-oauth2-core", "moduleName": "org.springframework.security:spring-security-oauth2-core",
"moduleUrl": "https://spring.io/projects/spring-security", "moduleUrl": "https://spring.io/projects/spring-security",
"moduleVersion": "6.4.3", "moduleVersion": "6.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.security:spring-security-oauth2-jose", "moduleName": "org.springframework.security:spring-security-oauth2-jose",
"moduleUrl": "https://spring.io/projects/spring-security", "moduleUrl": "https://spring.io/projects/spring-security",
"moduleVersion": "6.4.3", "moduleVersion": "6.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.security:spring-security-saml2-service-provider", "moduleName": "org.springframework.security:spring-security-saml2-service-provider",
"moduleUrl": "https://spring.io/projects/spring-security", "moduleUrl": "https://spring.io/projects/spring-security",
"moduleVersion": "6.4.3", "moduleVersion": "6.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.security:spring-security-web", "moduleName": "org.springframework.security:spring-security-web",
"moduleUrl": "https://spring.io/projects/spring-security", "moduleUrl": "https://spring.io/projects/spring-security",
"moduleVersion": "6.4.3", "moduleVersion": "6.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.session:spring-session-core", "moduleName": "org.springframework.session:spring-session-core",
"moduleUrl": "https://spring.io/projects/spring-session", "moduleUrl": "https://spring.io/projects/spring-session",
"moduleVersion": "3.4.2", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework:spring-aop", "moduleName": "org.springframework:spring-aop",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.3", "moduleVersion": "6.2.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework:spring-aspects", "moduleName": "org.springframework:spring-aspects",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.3", "moduleVersion": "6.2.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework:spring-beans", "moduleName": "org.springframework:spring-beans",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.3", "moduleVersion": "6.2.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework:spring-context", "moduleName": "org.springframework:spring-context",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.3", "moduleVersion": "6.2.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework:spring-core", "moduleName": "org.springframework:spring-core",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.3", "moduleVersion": "6.2.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework:spring-expression", "moduleName": "org.springframework:spring-expression",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.3", "moduleVersion": "6.2.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework:spring-jcl", "moduleName": "org.springframework:spring-jcl",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.3", "moduleVersion": "6.2.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
@@ -1637,21 +1637,21 @@
{ {
"moduleName": "org.springframework:spring-orm", "moduleName": "org.springframework:spring-orm",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.3", "moduleVersion": "6.2.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework:spring-tx", "moduleName": "org.springframework:spring-tx",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.3", "moduleVersion": "6.2.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework:spring-web", "moduleName": "org.springframework:spring-web",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.3", "moduleVersion": "6.2.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },

View File

@@ -57,17 +57,13 @@ async function checkForUpdate() {
// Initialize the update button as hidden // Initialize the update button as hidden
var updateBtn = document.getElementById("update-btn") || null; var updateBtn = document.getElementById("update-btn") || null;
var updateLink = document.getElementById("update-link") || null; var updateLink = document.getElementById("update-link") || null;
var updateLinkLegacy = document.getElementById("update-link-legacy") || null;
if (updateBtn !== null) { if (updateBtn !== null) {
updateBtn.style.display = "none"; updateBtn.style.display = "none";
} }
if (updateLink !== null) { if (updateLink !== null) {
updateLink.style.display = "none";
}
if (updateLinkLegacy !== null) {
console.log("hidden!"); console.log("hidden!");
if (!updateLinkLegacy.classList.contains("visually-hidden")) { if (!updateLink.classList.contains("visually-hidden")) {
updateLinkLegacy.classList.add("visually-hidden"); updateLink.classList.add("visually-hidden");
} }
} }
@@ -80,19 +76,16 @@ async function checkForUpdate() {
document.getElementById("update-btn").style.display = "block"; document.getElementById("update-btn").style.display = "block";
} }
if (updateLink !== null) { if (updateLink !== null) {
document.getElementById("update-link").style.display = "flex";
}
if (updateLinkLegacy !== null) {
document.getElementById("app-update").innerHTML = updateAvailable.replace("{0}", '<b>' + currentVersion + '</b>').replace("{1}", '<b>' + latestVersion + '</b>'); document.getElementById("app-update").innerHTML = updateAvailable.replace("{0}", '<b>' + currentVersion + '</b>').replace("{1}", '<b>' + latestVersion + '</b>');
if (updateLinkLegacy.classList.contains("visually-hidden")) { if (updateLink.classList.contains("visually-hidden")) {
updateLinkLegacy.classList.remove("visually-hidden"); updateLink.classList.remove("visually-hidden");
} }
} }
console.log("visible"); console.log("visible");
} else { } else {
if (updateLinkLegacy !== null) { if (updateLink !== null) {
if (!updateLinkLegacy.classList.contains("visually-hidden")) { if (!updateLink.classList.contains("visually-hidden")) {
updateLinkLegacy.classList.add("visually-hidden"); updateLink.classList.add("visually-hidden");
} }
} }
console.log("hidden"); console.log("hidden");

View File

@@ -73,6 +73,12 @@ function reorderCards(container) {
cards.sort(function (a, b) { cards.sort(function (a, b) {
var aIsFavorite = localStorage.getItem(a.id) === 'favorite'; var aIsFavorite = localStorage.getItem(a.id) === 'favorite';
var bIsFavorite = localStorage.getItem(b.id) === 'favorite'; var bIsFavorite = localStorage.getItem(b.id) === 'favorite';
if (a.id === 'update-link') {
return -1;
}
if (b.id === 'update-link') {
return 1;
}
if (aIsFavorite && !bIsFavorite) { if (aIsFavorite && !bIsFavorite) {
return -1; return -1;

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More