diff --git a/.github/workflows/push-docker.yml b/.github/workflows/push-docker.yml index 8bcf7803..ecdb0867 100644 --- a/.github/workflows/push-docker.yml +++ b/.github/workflows/push-docker.yml @@ -110,3 +110,31 @@ jobs: labels: ${{ steps.meta2.outputs.labels }} build-args: VERSION_TAG=${{ steps.versionNumber.outputs.versionNumber }} platforms: linux/amd64,linux/arm64/v8 + + + - name: Generate tags fat + id: meta3 + uses: docker/metadata-action@v5 + if: github.ref != 'refs/heads/main' + with: + images: | + ${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf + ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf + tags: | + type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-fat,enable=${{ github.ref == 'refs/heads/master' }} + type=raw,value=latest-fat,enable=${{ github.ref == 'refs/heads/master' }} + + - name: Build and push main Dockerfile fat + uses: docker/build-push-action@v5 + if: github.ref != 'refs/heads/main' + with: + builder: ${{ steps.buildx.outputs.name }} + context: . + file: ./Dockerfile-fat + push: true + cache-from: type=gha + cache-to: type=gha,mode=max + tags: ${{ steps.meta3.outputs.tags }} + labels: ${{ steps.meta3.outputs.labels }} + build-args: VERSION_TAG=${{ steps.versionNumber.outputs.versionNumber }} + platforms: linux/amd64,linux/arm64/v8 diff --git a/Dockerfile-fat b/Dockerfile-fat new file mode 100644 index 00000000..ae1a8b9e --- /dev/null +++ b/Dockerfile-fat @@ -0,0 +1,84 @@ +# Build the application +FROM gradle:7.6-jdk17 AS build + +# Set the working directory +WORKDIR /app + +# Copy the entire project to the working directory +COPY . . + +# Build the application with DOCKER_ENABLE_SECURITY=false +RUN DOCKER_ENABLE_SECURITY=true \ +./gradlew clean build + +# Main stage +FROM alpine:3.20.0 + +# Copy necessary files +COPY scripts /scripts +COPY pipeline /pipeline +COPY src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/ +COPY --from=build /app/build/libs/*.jar app.jar + +ARG VERSION_TAG + +# Set Environment Variables +ENV DOCKER_ENABLE_SECURITY=false \ + VERSION_TAG=$VERSION_TAG \ + JAVA_TOOL_OPTIONS="$JAVA_TOOL_OPTIONS -XX:MaxRAMPercentage=75" \ + HOME=/home/stirlingpdfuser \ + PUID=1000 \ + PGID=1000 \ + UMASK=022 \ + FAT_DOCKER=true \ + INSTALL_BOOK_AND_ADVANCED_HTML_OPS=true + + +# JDK for app +RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories && \ + echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/community" | 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 add --no-cache \ + ca-certificates \ + tzdata \ + tini \ + bash \ + curl \ + calibre@testing \ + shadow \ + su-exec \ + openssl \ + openssl-dev \ + openjdk21-jre \ +# Doc conversion + libreoffice \ +# pdftohtml + poppler-utils \ +# OCR MY PDF (unpaper for descew and other advanced featues) + ocrmypdf \ + tesseract-ocr-data-eng \ + font-terminus font-dejavu font-noto font-noto-cjk font-awesome font-noto-extra \ +# CV + py3-opencv \ +# python3/pip + python3 && \ + wget https://bootstrap.pypa.io/get-pip.py -qO - | python3 - --break-system-packages --no-cache-dir --upgrade && \ +# uno unoconv and HTML + pip install --break-system-packages --no-cache-dir --upgrade unoconv WeasyPrint && \ + mv /usr/share/tessdata /usr/share/tessdata-original && \ + mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \ + fc-cache -f -v && \ + chmod +x /scripts/* && \ + chmod +x /scripts/init.sh && \ +# User permissions + addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \ + chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \ + chown stirlingpdfuser:stirlingpdfgroup /app.jar && \ + tesseract --list-langs + +EXPOSE 8080/tcp + +# Set user and run command +ENTRYPOINT ["tini", "--", "/scripts/init.sh"] +CMD ["java", "-Dfile.encoding=UTF-8", "-jar", "/app.jar"] diff --git a/Endpoint-groups.md b/Endpoint-groups.md index d88ce058..9f906586 100644 --- a/Endpoint-groups.md +++ b/Endpoint-groups.md @@ -1,46 +1,47 @@ -| Operation | PageOps | Convert | Security | Other | CLI | Python | OpenCV | LibreOffice | OCRmyPDF | Java | Javascript | -|---------------------|---------|---------|----------|-------|------|--------|--------|-------------|----------|----------|------------| -| adjust-contrast | ✔️ | | | | | | | | | | ✔️ | -| auto-split-pdf | ✔️ | | | | | | | | | ✔️ | | -| crop | ✔️ | | | | | | | | | ✔️ | | -| extract-page | ✔️ | | | | | | | | | ✔️ | | -| merge-pdfs | ✔️ | | | | | | | | | ✔️ | | -| multi-page-layout | ✔️ | | | | | | | | | ✔️ | | -| pdf-organizer | ✔️ | | | | | | | | | ✔️ | ✔️ | -| pdf-to-single-page | ✔️ | | | | | | | | | ✔️ | | -| remove-pages | ✔️ | | | | | | | | | ✔️ | | -| rotate-pdf | ✔️ | | | | | | | | | ✔️ | | -| scale-pages | ✔️ | | | | | | | | | ✔️ | | -| split-pdfs | ✔️ | | | | | | | | | ✔️ | | -| file-to-pdf | | ✔️ | | | ✔️ | | | ✔️ | | | | -| img-to-pdf | | ✔️ | | | | | | | | ✔️ | | -| pdf-to-html | | ✔️ | | | ✔️ | | | ✔️ | | | | -| pdf-to-img | | ✔️ | | | | | | | | ✔️ | | -| pdf-to-pdfa | | ✔️ | | | ✔️ | | | | ✔️ | | | -| pdf-to-markdown | | ✔️ | | | | | | | | ✔️ | | -| pdf-to-presentation | | ✔️ | | | ✔️ | | | ✔️ | | | | -| pdf-to-text | | ✔️ | | | ✔️ | | | ✔️ | | | | -| pdf-to-word | | ✔️ | | | ✔️ | | | ✔️ | | | | -| pdf-to-xml | | ✔️ | | | ✔️ | | | ✔️ | | | | -| xlsx-to-pdf | | ✔️ | | | ✔️ | | | ✔️ | | | | -| add-password | | | ✔️ | | | | | | | ✔️ | | -| add-watermark | | | ✔️ | | | | | | | ✔️ | | -| cert-sign | | | ✔️ | | | | | | | ✔️ | | -| change-permissions | | | ✔️ | | | | | | | ✔️ | | -| remove-password | | | ✔️ | | | | | | | ✔️ | | -| sanitize-pdf | | | ✔️ | | | | | | | ✔️ | | -| add-image | | | | ✔️ | | | | | | ✔️ | | -| add-page-numbers | | | | ✔️ | | | | | | ✔️ | | -| auto-rename | | | | ✔️ | | | | | | ✔️ | | -| change-metadata | | | | ✔️ | | | | | | ✔️ | | -| compare | | | | ✔️ | | | | | | | ✔️ | -| compress-pdf | | | | ✔️ | ✔️ | | | | ✔️ | | | -| extract-image-scans | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | | -| extract-images | | | | ✔️ | | | | | | ✔️ | | -| flatten | | | | ✔️ | | | | | | | ✔️ | -| get-info-on-pdf | | | | ✔️ | | | | | | ✔️ | | -| ocr-pdf | | | | ✔️ | ✔️ | | | | ✔️ | | | -| remove-blanks | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | | -| repair | | | | ✔️ | ✔️ | | | ✔️ | | | | -| show-javascript | | | | ✔️ | | | | | | | ✔️ | -| sign | | | | ✔️ | | | | | | | ✔️ | \ No newline at end of file +| Operation | PageOps | Convert | Security | Other | CLI | Python | OpenCV | LibreOffice | OCRmyPDF | Java | Javascript | +| ------------------- | ------- | ------- | -------- | ----- | --- | ------ | ------ | ----------- | -------- | ---- | ---------- | +| adjust-contrast | ✔️ | | | | | | | | | | ✔️ | +| auto-split-pdf | ✔️ | | | | | | | | | ✔️ | | +| crop | ✔️ | | | | | | | | | ✔️ | | +| extract-page | ✔️ | | | | | | | | | ✔️ | | +| merge-pdfs | ✔️ | | | | | | | | | ✔️ | | +| multi-page-layout | ✔️ | | | | | | | | | ✔️ | | +| pdf-organizer | ✔️ | | | | | | | | | ✔️ | ✔️ | +| pdf-to-single-page | ✔️ | | | | | | | | | ✔️ | | +| remove-pages | ✔️ | | | | | | | | | ✔️ | | +| rotate-pdf | ✔️ | | | | | | | | | ✔️ | | +| scale-pages | ✔️ | | | | | | | | | ✔️ | | +| split-pdfs | ✔️ | | | | | | | | | ✔️ | | +| file-to-pdf | | ✔️ | | | ✔️ | | | ✔️ | | | | +| img-to-pdf | | ✔️ | | | | | | | | ✔️ | | +| pdf-to-html | | ✔️ | | | ✔️ | | | ✔️ | | | | +| pdf-to-img | | ✔️ | | | | | | | | ✔️ | | +| pdf-to-pdfa | | ✔️ | | | ✔️ | | | | ✔️ | | | +| pdf-to-markdown | | ✔️ | | | | | | | | ✔️ | | +| pdf-to-presentation | | ✔️ | | | ✔️ | | | ✔️ | | | | +| pdf-to-text | | ✔️ | | | ✔️ | | | ✔️ | | | | +| pdf-to-word | | ✔️ | | | ✔️ | | | ✔️ | | | | +| pdf-to-xml | | ✔️ | | | ✔️ | | | ✔️ | | | | +| xlsx-to-pdf | | ✔️ | | | ✔️ | | | ✔️ | | | | +| add-password | | | ✔️ | | | | | | | ✔️ | | +| add-watermark | | | ✔️ | | | | | | | ✔️ | | +| cert-sign | | | ✔️ | | | | | | | ✔️ | | +| remove-cert-sign | | | ✔️ | | | | | | | ✔️ | | +| change-permissions | | | ✔️ | | | | | | | ✔️ | | +| remove-password | | | ✔️ | | | | | | | ✔️ | | +| sanitize-pdf | | | ✔️ | | | | | | | ✔️ | | +| add-image | | | | ✔️ | | | | | | ✔️ | | +| add-page-numbers | | | | ✔️ | | | | | | ✔️ | | +| auto-rename | | | | ✔️ | | | | | | ✔️ | | +| change-metadata | | | | ✔️ | | | | | | ✔️ | | +| compare | | | | ✔️ | | | | | | | ✔️ | +| compress-pdf | | | | ✔️ | ✔️ | | | | ✔️ | | | +| extract-image-scans | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | | +| extract-images | | | | ✔️ | | | | | | ✔️ | | +| flatten | | | | ✔️ | | | | | | | ✔️ | +| get-info-on-pdf | | | | ✔️ | | | | | | ✔️ | | +| ocr-pdf | | | | ✔️ | ✔️ | | | | ✔️ | | | +| remove-blanks | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | | +| repair | | | | ✔️ | ✔️ | | | ✔️ | | | | +| show-javascript | | | | ✔️ | | | | | | | ✔️ | +| sign | | | | ✔️ | | | | | | | ✔️ | \ No newline at end of file diff --git a/README.md b/README.md index 4b6afec3..a2002414 100644 --- a/README.md +++ b/README.md @@ -159,39 +159,41 @@ Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR ## Supported Languages -Stirling PDF currently supports 28! +Stirling PDF currently supports 32! | Language | Progress | | ------------------------------------------- | -------------------------------------- | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | -| Arabic (العربية) (ar_AR) | ![41%](https://geps.dev/progress/41) | -| German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) | -| French (Français) (fr_FR) | ![95%](https://geps.dev/progress/95) | -| Spanish (Español) (es_ES) | ![96%](https://geps.dev/progress/96) | -| Simplified Chinese (简体中文) (zh_CN) | ![96%](https://geps.dev/progress/96) | -| Traditional Chinese (繁體中文) (zh_TW) | ![95%](https://geps.dev/progress/95) | +| Arabic (العربية) (ar_AR) | ![40%](https://geps.dev/progress/40) | +| German (Deutsch) (de_DE) | ![99%](https://geps.dev/progress/99) | +| French (Français) (fr_FR) | ![93%](https://geps.dev/progress/93) | +| Spanish (Español) (es_ES) | ![95%](https://geps.dev/progress/95) | +| Simplified Chinese (简体中文) (zh_CN) | ![95%](https://geps.dev/progress/95) | +| Traditional Chinese (繁體中文) (zh_TW) | ![94%](https://geps.dev/progress/94) | | Catalan (Català) (ca_CA) | ![49%](https://geps.dev/progress/49) | -| Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | -| Swedish (Svenska) (sv_SE) | ![41%](https://geps.dev/progress/41) | -| Polish (Polski) (pl_PL) | ![43%](https://geps.dev/progress/43) | -| Romanian (Română) (ro_RO) | ![40%](https://geps.dev/progress/40) | -| Korean (한국어) (ko_KR) | ![88%](https://geps.dev/progress/88) | -| Portuguese Brazilian (Português) (pt_BR) | ![62%](https://geps.dev/progress/62) | -| Russian (Русский) (ru_RU) | ![88%](https://geps.dev/progress/88) | -| Basque (Euskara) (eu_ES) | ![64%](https://geps.dev/progress/64) | -| Japanese (日本語) (ja_JP) | ![88%](https://geps.dev/progress/88) | -| Dutch (Nederlands) (nl_NL) | ![86%](https://geps.dev/progress/86) | -| Greek (Ελληνικά) (el_GR) | ![86%](https://geps.dev/progress/86) | -| Turkish (Türkçe) (tr_TR) | ![99%](https://geps.dev/progress/99) | -| Indonesia (Bahasa Indonesia) (id_ID) | ![79%](https://geps.dev/progress/79) | -| Hindi (हिंदी) (hi_IN) | ![80%](https://geps.dev/progress/80) | -| Hungarian (Magyar) (hu_HU) | ![79%](https://geps.dev/progress/79) | -| Bulgarian (Български) (bg_BG) | ![96%](https://geps.dev/progress/96) | -| Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![81%](https://geps.dev/progress/81) | -| Ukrainian (Українська) (uk_UA) | ![87%](https://geps.dev/progress/87) | -| Slovakian (Slovensky) (sk_SK) | ![96%](https://geps.dev/progress/96) | +| Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | +| Swedish (Svenska) (sv_SE) | ![40%](https://geps.dev/progress/40) | +| Polish (Polski) (pl_PL) | ![42%](https://geps.dev/progress/42) | +| Romanian (Română) (ro_RO) | ![39%](https://geps.dev/progress/39) | +| Korean (한국어) (ko_KR) | ![87%](https://geps.dev/progress/87) | +| Portuguese Brazilian (Português) (pt_BR) | ![61%](https://geps.dev/progress/61) | +| Russian (Русский) (ru_RU) | ![87%](https://geps.dev/progress/87) | +| Basque (Euskara) (eu_ES) | ![63%](https://geps.dev/progress/63) | +| Japanese (日本語) (ja_JP) | ![87%](https://geps.dev/progress/87) | +| Dutch (Nederlands) (nl_NL) | ![85%](https://geps.dev/progress/85) | +| Greek (Ελληνικά) (el_GR) | ![85%](https://geps.dev/progress/85) | +| Turkish (Türkçe) (tr_TR) | ![97%](https://geps.dev/progress/97) | +| Indonesia (Bahasa Indonesia) (id_ID) | ![78%](https://geps.dev/progress/78) | +| Hindi (हिंदी) (hi_IN) | ![79%](https://geps.dev/progress/79) | +| Hungarian (Magyar) (hu_HU) | ![78%](https://geps.dev/progress/78) | +| Bulgarian (Български) (bg_BG) | ![98%](https://geps.dev/progress/98) | +| Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![80%](https://geps.dev/progress/80) | +| Ukrainian (Українська) (uk_UA) | ![86%](https://geps.dev/progress/86) | +| Slovakian (Slovensky) (sk_SK) | ![95%](https://geps.dev/progress/95) | | Czech (Česky) (cs_CZ) | ![94%](https://geps.dev/progress/94) | +| Croatian (Hrvatski) (hr_HR) | ![98%](https://geps.dev/progress/98) | +| Norwegian (Norsk) (no_NB) | ![98%](https://geps.dev/progress/98) | ## Contributing (creating issues, translations, fixing bugs, etc.) @@ -213,10 +215,10 @@ For example in the settings.yml you have ```yaml system: - defaultLocale: 'en-US' + enableLogin: 'true' ``` -To have this via an environment variable you would have ``SYSTEM_DEFAULTLOCALE`` +To have this via an environment variable you would have ``SYSTEM_ENABLELOGIN`` The Current list of settings is diff --git a/Version-groups.md b/Version-groups.md index 8c37e22d..2495ae4d 100644 --- a/Version-groups.md +++ b/Version-groups.md @@ -1,52 +1,53 @@ -| Technology | Ultra-Lite | Full | -|----------------|:----------:|:----:| -| Java | ✔️ | ✔️ | -| JavaScript | ✔️ | ✔️ | -| Libre | | ✔️ | -| Python | | ✔️ | -| OpenCV | | ✔️ | -| OCRmyPDF | | ✔️ | +| Technology | Ultra-Lite | Full | +| ---------- | :--------: | :---: | +| Java | ✔️ | ✔️ | +| JavaScript | ✔️ | ✔️ | +| Libre | | ✔️ | +| Python | | ✔️ | +| OpenCV | | ✔️ | +| OCRmyPDF | | ✔️ | -Operation | Ultra-Lite | Full --------------------------|------------|----- -add-page-numbers | ✔️ | ✔️ -add-password | ✔️ | ✔️ -add-image | ✔️ | ✔️ -add-watermark | ✔️ | ✔️ -adjust-contrast | ✔️ | ✔️ -auto-split-pdf | ✔️ | ✔️ -auto-redact | ✔️ | ✔️ -auto-rename | ✔️ | ✔️ -cert-sign | ✔️ | ✔️ -crop | ✔️ | ✔️ -change-metadata | ✔️ | ✔️ -change-permissions | ✔️ | ✔️ -compare | ✔️ | ✔️ -extract-page | ✔️ | ✔️ -extract-images | ✔️ | ✔️ -flatten | ✔️ | ✔️ -get-info-on-pdf | ✔️ | ✔️ -img-to-pdf | ✔️ | ✔️ -markdown-to-pdf | ✔️ | ✔️ -merge-pdfs | ✔️ | ✔️ -multi-page-layout | ✔️ | ✔️ -overlay-pdf | ✔️ | ✔️ -pdf-organizer | ✔️ | ✔️ -pdf-to-csv | ✔️ | ✔️ -pdf-to-img | ✔️ | ✔️ -pdf-to-single-page | ✔️ | ✔️ -remove-pages | ✔️ | ✔️ -remove-password | ✔️ | ✔️ -rotate-pdf | ✔️ | ✔️ -sanitize-pdf | ✔️ | ✔️ -scale-pages | ✔️ | ✔️ -sign | ✔️ | ✔️ -show-javascript | ✔️ | ✔️ -split-by-size-or-count | ✔️ | ✔️ -split-pdf-by-sections | ✔️ | ✔️ -split-pdfs | ✔️ | ✔️ -compress-pdf | | ✔️ -extract-image-scans | | ✔️ -ocr-pdf | | ✔️ -pdf-to-pdfa | | ✔️ -remove-blanks | | ✔️ +| Operation | Ultra-Lite | Full | +| ---------------------- | ---------- | ---- | +| add-page-numbers | ✔️ | ✔️ | +| add-password | ✔️ | ✔️ | +| add-image | ✔️ | ✔️ | +| add-watermark | ✔️ | ✔️ | +| adjust-contrast | ✔️ | ✔️ | +| auto-split-pdf | ✔️ | ✔️ | +| auto-redact | ✔️ | ✔️ | +| auto-rename | ✔️ | ✔️ | +| cert-sign | ✔️ | ✔️ | +| remove-cert-sign | ✔️ | ✔️ | +| crop | ✔️ | ✔️ | +| change-metadata | ✔️ | ✔️ | +| change-permissions | ✔️ | ✔️ | +| compare | ✔️ | ✔️ | +| extract-page | ✔️ | ✔️ | +| extract-images | ✔️ | ✔️ | +| flatten | ✔️ | ✔️ | +| get-info-on-pdf | ✔️ | ✔️ | +| img-to-pdf | ✔️ | ✔️ | +| markdown-to-pdf | ✔️ | ✔️ | +| merge-pdfs | ✔️ | ✔️ | +| multi-page-layout | ✔️ | ✔️ | +| overlay-pdf | ✔️ | ✔️ | +| pdf-organizer | ✔️ | ✔️ | +| pdf-to-csv | ✔️ | ✔️ | +| pdf-to-img | ✔️ | ✔️ | +| pdf-to-single-page | ✔️ | ✔️ | +| remove-pages | ✔️ | ✔️ | +| remove-password | ✔️ | ✔️ | +| rotate-pdf | ✔️ | ✔️ | +| sanitize-pdf | ✔️ | ✔️ | +| scale-pages | ✔️ | ✔️ | +| sign | ✔️ | ✔️ | +| show-javascript | ✔️ | ✔️ | +| split-by-size-or-count | ✔️ | ✔️ | +| split-pdf-by-sections | ✔️ | ✔️ | +| split-pdfs | ✔️ | ✔️ | +| compress-pdf | | ✔️ | +| extract-image-scans | | ✔️ | +| ocr-pdf | | ✔️ | +| pdf-to-pdfa | | ✔️ | +| remove-blanks | | ✔️ | diff --git a/build.gradle b/build.gradle index 0b3c26da..28f0cf58 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ plugins { import com.github.jk1.license.render.* group = 'stirling.software' -version = '0.24.6' +version = '0.25.2' //17 is lowest but we support and recommend 21 sourceCompatibility = '17' @@ -21,7 +21,6 @@ repositories { mavenCentral() } - licenseReport { renderers = [new JsonReportRenderer()] } @@ -172,14 +171,14 @@ dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.32' } -tasks.withType(JavaCompile) { +tasks.withType(JavaCompile).configureEach { dependsOn 'spotlessApply' } compileJava { options.compilerArgs << '-parameters' } -task writeVersion { +task writeVersion { def propsFile = file('src/main/resources/version.properties') def props = new Properties() props.setProperty('version', version) @@ -196,8 +195,6 @@ swaggerhubUpload { oas '3.0.0' // The version of the OpenAPI Specification you're using } - - jar { enabled = false manifest { @@ -211,6 +208,6 @@ tasks.named('test') { useJUnitPlatform() } -task printVersion { - println project.version +task printVersion { + println project.version } diff --git a/chart/stirling-pdf/Chart.yaml b/chart/stirling-pdf/Chart.yaml index aa960f02..ae25f637 100644 --- a/chart/stirling-pdf/Chart.yaml +++ b/chart/stirling-pdf/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 0.24.6 +appVersion: 0.25.2 description: locally hosted web application that allows you to perform various operations on PDF files home: https://github.com/Stirling-Tools/Stirling-PDF diff --git a/exampleYmlFiles/docker-compose-latest-fat-security.yml b/exampleYmlFiles/docker-compose-latest-fat-security.yml new file mode 100644 index 00000000..a581fa9b --- /dev/null +++ b/exampleYmlFiles/docker-compose-latest-fat-security.yml @@ -0,0 +1,34 @@ +version: '3.3' +services: + stirling-pdf: + container_name: Stirling-PDF-Security-Fat + image: frooodle/s-pdf:latest-fat + deploy: + resources: + limits: + memory: 4G + healthcheck: + test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP' && curl -fL http://localhost:8080/ | grep -q 'Please sign in'"] + interval: 5s + timeout: 10s + retries: 16 + ports: + - 8080:8080 + volumes: + - /stirling/latest/data:/usr/share/tessdata:rw + - /stirling/latest/config:/configs:rw + - /stirling/latest/logs:/logs:rw + environment: + DOCKER_ENABLE_SECURITY: "true" + SECURITY_ENABLELOGIN: "true" + PUID: 1002 + PGID: 1002 + UMASK: "022" + SYSTEM_DEFAULTLOCALE: en-US + UI_APPNAME: Stirling-PDF + UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest-fat with Security + UI_APPNAMENAVBAR: Stirling-PDF Latest-fat + SYSTEM_MAXFILESIZE: "100" + METRICS_ENABLED: "true" + SYSTEM_GOOGLEVISIBILITY: "true" + restart: on-failure:5 diff --git a/exampleYmlFiles/docker-compose-latest-security-with-sso.yml b/exampleYmlFiles/docker-compose-latest-security-with-sso.yml index 592daeff..1970a079 100644 --- a/exampleYmlFiles/docker-compose-latest-security-with-sso.yml +++ b/exampleYmlFiles/docker-compose-latest-security-with-sso.yml @@ -13,7 +13,7 @@ services: timeout: 10s retries: 16 ports: - - 8080:8080 + - "8080:8080" volumes: - /stirling/latest/data:/usr/share/tessdata:rw - /stirling/latest/config:/configs:rw @@ -27,6 +27,8 @@ services: SECURITY_OAUTH2_CLIENTID: ".apps.googleusercontent.com" # Client ID from your provider SECURITY_OAUTH2_CLIENTSECRET: "" # Client Secret from your provider SECURITY_OAUTH2_SCOPES: "openid,profile,email" # Expected OAuth2 Scope + SECURITY_OAUTH2_USEASUSERNAME: "email" # Default is 'email'; custom fields can be used as the username + SECURITY_OAUTH2_PROVIDER: "google" # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak' PUID: 1002 PGID: 1002 UMASK: "022" diff --git a/exampleYmlFiles/docker-compose-latest-security.yml b/exampleYmlFiles/docker-compose-latest-security.yml index 82014b8e..b0ec6ea1 100644 --- a/exampleYmlFiles/docker-compose-latest-security.yml +++ b/exampleYmlFiles/docker-compose-latest-security.yml @@ -13,7 +13,7 @@ services: timeout: 10s retries: 16 ports: - - 8080:8080 + - "8080:8080" volumes: - /stirling/latest/data:/usr/share/tessdata:rw - /stirling/latest/config:/configs:rw diff --git a/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml b/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml index c0dd09ce..2faac865 100644 --- a/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml +++ b/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml @@ -13,7 +13,7 @@ services: timeout: 10s retries: 16 ports: - - 8080:8080 + - "8080:8080" volumes: - /stirling/latest/data:/usr/share/tessdata:rw - /stirling/latest/config:/configs:rw diff --git a/exampleYmlFiles/docker-compose-latest-ultra-lite.yml b/exampleYmlFiles/docker-compose-latest-ultra-lite.yml index 710c0072..da868ff2 100644 --- a/exampleYmlFiles/docker-compose-latest-ultra-lite.yml +++ b/exampleYmlFiles/docker-compose-latest-ultra-lite.yml @@ -13,7 +13,7 @@ services: timeout: 10s retries: 16 ports: - - 8080:8080 + - "8080:8080" volumes: - /stirling/latest/config:/configs:rw - /stirling/latest/logs:/logs:rw diff --git a/exampleYmlFiles/docker-compose-latest.yml b/exampleYmlFiles/docker-compose-latest.yml index c2593332..794eb1be 100644 --- a/exampleYmlFiles/docker-compose-latest.yml +++ b/exampleYmlFiles/docker-compose-latest.yml @@ -13,7 +13,7 @@ services: timeout: 10s retries: 16 ports: - - 8080:8080 + - "8080:8080" volumes: - /stirling/latest/data:/usr/share/tessdata:rw - /stirling/latest/config:/configs:rw diff --git a/scripts/init-without-ocr.sh b/scripts/init-without-ocr.sh index 761dd08d..99054031 100644 --- a/scripts/init-without-ocr.sh +++ b/scripts/init-without-ocr.sh @@ -11,14 +11,16 @@ if [ ! -z "$PGID" ] && [ "$PGID" != "$(getent group stirlingpdfgroup | cut -d: - fi umask "$UMASK" || true -if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" ]]; then +if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" && "$FAT_DOCKER" != "true" ]]; then apk add --no-cache calibre@testing fi -/scripts/download-security-jar.sh +if [[ "$FAT_DOCKER" != "true" ]]; then + /scripts/download-security-jar.sh +fi if [[ -n "$LANGS" ]]; then - /scripts/installFonts.sh $LANGS + /scripts/installFonts.sh $LANGS fi echo "Setting permissions and ownership for necessary directories..." diff --git a/scripts/translation_status.toml b/scripts/translation_status.toml index 633847c9..4a57aaf4 100644 --- a/scripts/translation_status.toml +++ b/scripts/translation_status.toml @@ -15,7 +15,10 @@ ignore = [ [cs_CZ] ignore = [ + 'info', 'language.direction', + 'pipeline.header', + 'text', ] [de_DE] @@ -65,6 +68,16 @@ ignore = [ 'language.direction', ] +[hr_HR] +ignore = [ + 'font', + 'home.pipeline.title', + 'info', + 'language.direction', + 'pdfOrganiser.tags', + 'showJS.tags', +] + [hu_HU] ignore = [ 'language.direction', @@ -103,6 +116,11 @@ ignore = [ 'language.direction', ] +[no_NB] +ignore = [ + 'language.direction', +] + [pl_PL] ignore = [ 'language.direction', diff --git a/src/main/java/stirling/software/SPDF/LibreOfficeListener.java b/src/main/java/stirling/software/SPDF/LibreOfficeListener.java index 96c4d270..06e19512 100644 --- a/src/main/java/stirling/software/SPDF/LibreOfficeListener.java +++ b/src/main/java/stirling/software/SPDF/LibreOfficeListener.java @@ -6,11 +6,15 @@ import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import io.github.pixee.security.SystemCommand; public class LibreOfficeListener { - private static final long ACTIVITY_TIMEOUT = 20 * 60 * 1000; // 20 minutes + private static final Logger logger = LoggerFactory.getLogger(LibreOfficeListener.class); + private static final long ACTIVITY_TIMEOUT = 20L * 60 * 1000; // 20 minutes private static final LibreOfficeListener INSTANCE = new LibreOfficeListener(); private static final int LISTENER_PORT = 2002; @@ -27,14 +31,12 @@ public class LibreOfficeListener { private LibreOfficeListener() {} private boolean isListenerRunning() { - try { - System.out.println("waiting for listener to start"); - Socket socket = new Socket(); + System.out.println("waiting for listener to start"); + try (Socket socket = new Socket()) { socket.connect( new InetSocketAddress("localhost", 2002), 1000); // Timeout after 1 second - socket.close(); return true; - } catch (IOException e) { + } catch (Exception e) { return false; } } @@ -63,6 +65,7 @@ public class LibreOfficeListener { try { Thread.sleep(5000); // Check for inactivity every 5 seconds } catch (InterruptedException e) { + Thread.currentThread().interrupt(); break; } } @@ -80,8 +83,8 @@ public class LibreOfficeListener { try { Thread.sleep(1000); } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + Thread.currentThread().interrupt(); + logger.error("exception", e); } // Check every 1 second } } diff --git a/src/main/java/stirling/software/SPDF/config/AppConfig.java b/src/main/java/stirling/software/SPDF/config/AppConfig.java index 16618e1e..bad35880 100644 --- a/src/main/java/stirling/software/SPDF/config/AppConfig.java +++ b/src/main/java/stirling/software/SPDF/config/AppConfig.java @@ -2,9 +2,13 @@ package stirling.software.SPDF.config; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.Properties; +import java.util.function.Predicate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -22,6 +26,8 @@ import stirling.software.SPDF.model.ApplicationProperties; @Lazy public class AppConfig { + private static final Logger logger = LoggerFactory.getLogger(AppConfig.class); + @Autowired ApplicationProperties applicationProperties; @Bean @@ -54,7 +60,7 @@ public class AppConfig { props.load(resource.getInputStream()); return props.getProperty("version"); } catch (IOException e) { - e.printStackTrace(); + logger.error("exception", e); } return "0.0.0"; } @@ -108,4 +114,26 @@ public class AppConfig { public boolean missingActivSecurity() { return false; } + + @Bean(name = "watchedFoldersDir") + public String watchedFoldersDir() { + return "./pipeline/watchedFolders/"; + } + + @Bean(name = "finishedFoldersDir") + public String finishedFoldersDir() { + return "./pipeline/finishedFolders/"; + } + + @Bean(name = "directoryFilter") + public Predicate processPDFOnlyFilter() { + return path -> { + if (Files.isDirectory(path)) { + return !path.toString().contains("processing"); + } else { + String fileName = path.getFileName().toString(); + return fileName.endsWith(".pdf"); + } + }; + } } diff --git a/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java b/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java index d258ea51..f0d52e32 100644 --- a/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java +++ b/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java @@ -7,7 +7,6 @@ import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; import java.util.List; import org.springframework.context.ApplicationContextInitializer; @@ -45,46 +44,47 @@ public class ConfigInitializer } } } else { - Path templatePath = - Paths.get( - getClass() - .getClassLoader() - .getResource("settings.yml.template") - .toURI()); - Path userPath = Paths.get("configs", "settings.yml"); - - List templateLines = Files.readAllLines(templatePath); - List userLines = - Files.exists(userPath) ? Files.readAllLines(userPath) : new ArrayList<>(); - - List resultLines = new ArrayList<>(); - int position = 0; - for (String templateLine : templateLines) { - // Check if the line is a comment - if (templateLine.trim().startsWith("#")) { - String entry = templateLine.trim().substring(1).trim(); - if (!entry.isEmpty()) { - // Check if this comment has been uncommented in userLines - String key = entry.split(":")[0].trim(); - addLine(resultLines, userLines, templateLine, key, position); - } else { - resultLines.add(templateLine); - } - } - // Check if the line is a key-value pair - else if (templateLine.contains(":")) { - String key = templateLine.split(":")[0].trim(); - addLine(resultLines, userLines, templateLine, key, position); - } - // Handle empty lines - else if (templateLine.trim().length() == 0) { - resultLines.add(""); - } - position++; - } - - // Write the result to the user settings file - Files.write(userPath, resultLines); + // Path templatePath = + // Paths.get( + // getClass() + // .getClassLoader() + // .getResource("settings.yml.template") + // .toURI()); + // Path userPath = Paths.get("configs", "settings.yml"); + // + // List templateLines = Files.readAllLines(templatePath); + // List userLines = + // Files.exists(userPath) ? Files.readAllLines(userPath) : new + // ArrayList<>(); + // + // List resultLines = new ArrayList<>(); + // int position = 0; + // for (String templateLine : templateLines) { + // // Check if the line is a comment + // if (templateLine.trim().startsWith("#")) { + // String entry = templateLine.trim().substring(1).trim(); + // if (!entry.isEmpty()) { + // // Check if this comment has been uncommented in userLines + // String key = entry.split(":")[0].trim(); + // addLine(resultLines, userLines, templateLine, key, position); + // } else { + // resultLines.add(templateLine); + // } + // } + // // Check if the line is a key-value pair + // else if (templateLine.contains(":")) { + // String key = templateLine.split(":")[0].trim(); + // addLine(resultLines, userLines, templateLine, key, position); + // } + // // Handle empty lines + // else if (templateLine.trim().length() == 0) { + // resultLines.add(""); + // } + // position++; + // } + // + // // Write the result to the user settings file + // Files.write(userPath, resultLines); } Path customSettingsPath = Paths.get("configs", "custom_settings.yml"); diff --git a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java index b145b478..43180753 100644 --- a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java @@ -116,6 +116,7 @@ public class EndpointConfiguration { addEndpointToGroup("Security", "change-permissions"); addEndpointToGroup("Security", "add-watermark"); addEndpointToGroup("Security", "cert-sign"); + addEndpointToGroup("Security", "remove-cert-sign"); addEndpointToGroup("Security", "sanitize-pdf"); addEndpointToGroup("Security", "auto-redact"); @@ -200,6 +201,7 @@ public class EndpointConfiguration { addEndpointToGroup("Java", "extract-images"); addEndpointToGroup("Java", "change-metadata"); addEndpointToGroup("Java", "cert-sign"); + addEndpointToGroup("Java", "remove-cert-sign"); addEndpointToGroup("Java", "multi-page-layout"); addEndpointToGroup("Java", "scale-pages"); addEndpointToGroup("Java", "add-page-numbers"); diff --git a/src/main/java/stirling/software/SPDF/config/FileFallbackTemplateResolver.java b/src/main/java/stirling/software/SPDF/config/FileFallbackTemplateResolver.java index be6e28a7..8b31cc95 100644 --- a/src/main/java/stirling/software/SPDF/config/FileFallbackTemplateResolver.java +++ b/src/main/java/stirling/software/SPDF/config/FileFallbackTemplateResolver.java @@ -1,16 +1,18 @@ package stirling.software.SPDF.config; import java.io.IOException; +import java.io.InputStream; import java.util.Map; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.thymeleaf.IEngineConfiguration; import org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver; -import org.thymeleaf.templateresource.ClassLoaderTemplateResource; import org.thymeleaf.templateresource.FileTemplateResource; import org.thymeleaf.templateresource.ITemplateResource; +import stirling.software.SPDF.model.InputStreamTemplateResource; + public class FileFallbackTemplateResolver extends AbstractConfigurableTemplateResolver { private final ResourceLoader resourceLoader; @@ -40,9 +42,13 @@ public class FileFallbackTemplateResolver extends AbstractConfigurableTemplateRe } - return new ClassLoaderTemplateResource( - Thread.currentThread().getContextClassLoader(), - "classpath:/templates/" + resourceName, - characterEncoding); + InputStream inputStream = + Thread.currentThread() + .getContextClassLoader() + .getResourceAsStream("templates/" + resourceName); + if (inputStream != null) { + return new InputStreamTemplateResource(inputStream, "UTF-8"); + } + return null; } } diff --git a/src/main/java/stirling/software/SPDF/config/MetricsFilter.java b/src/main/java/stirling/software/SPDF/config/MetricsFilter.java index 6f2751a9..876613f4 100644 --- a/src/main/java/stirling/software/SPDF/config/MetricsFilter.java +++ b/src/main/java/stirling/software/SPDF/config/MetricsFilter.java @@ -36,7 +36,6 @@ public class MetricsFilter extends OncePerRequestFilter { || uri.startsWith("/v1/api-docs") || uri.endsWith("robots.txt") || uri.startsWith("/images") - || uri.startsWith("/images") || uri.endsWith(".png") || uri.endsWith(".ico") || uri.endsWith(".css") diff --git a/src/main/java/stirling/software/SPDF/config/security/AppUpdateAuthService.java b/src/main/java/stirling/software/SPDF/config/security/AppUpdateAuthService.java index 0da07c61..c4b53ad5 100644 --- a/src/main/java/stirling/software/SPDF/config/security/AppUpdateAuthService.java +++ b/src/main/java/stirling/software/SPDF/config/security/AppUpdateAuthService.java @@ -18,6 +18,7 @@ class AppUpdateAuthService implements ShowAdminInterface { @Autowired private UserRepository userRepository; @Autowired private ApplicationProperties applicationProperties; + @Override public boolean getShowUpdateOnlyAdmins() { boolean showUpdate = applicationProperties.getSystem().getShowUpdate(); if (!showUpdate) { diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java index 85447376..02911622 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java @@ -49,10 +49,12 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF } String username = request.getParameter("username"); - if (username != null && !isDemoUser(username)) { + Optional optUser = userService.findByUsernameIgnoreCase(username); + + if (username != null && optUser.isPresent() && !isDemoUser(optUser)) { logger.info( "Remaining attempts for user {}: {}", - username, + optUser.get().getUsername(), loginAttemptService.getRemainingAttempts(username)); loginAttemptService.loginFailed(username); if (loginAttemptService.isBlocked(username) @@ -70,8 +72,7 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF super.onAuthenticationFailure(request, response, exception); } - private boolean isDemoUser(String username) { - Optional user = userService.findByUsernameIgnoreCase(username); + private boolean isDemoUser(Optional user) { return user.isPresent() && user.get().getAuthorities().stream() .anyMatch(authority -> "ROLE_DEMO_USER".equals(authority.getAuthority())); diff --git a/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java b/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java index f398f13c..da3e216e 100644 --- a/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java +++ b/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java @@ -33,7 +33,6 @@ public class LoginAttemptService { } public void loginSucceeded(String key) { - logger.info(key + " " + attemptsCache.mappingCount()); if (key == null || key.trim().isEmpty()) { return; } diff --git a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java index ce6ce799..fad0f285 100644 --- a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java @@ -238,7 +238,7 @@ public class SecurityConfiguration { GoogleProvider google = client.getGoogle(); return google != null && google.isSettingsValid() ? Optional.of( - ClientRegistration.withRegistrationId("google") + ClientRegistration.withRegistrationId(google.getName()) .clientId(google.getClientId()) .clientSecret(google.getClientSecret()) .scope(google.getScopes()) @@ -246,8 +246,8 @@ public class SecurityConfiguration { .tokenUri(google.getTokenuri()) .userInfoUri(google.getUserinfouri()) .userNameAttributeName(google.getUseAsUsername()) - .clientName("Google") - .redirectUri("{baseUrl}/login/oauth2/code/google") + .clientName(google.getClientName()) + .redirectUri("{baseUrl}/login/oauth2/code/" + google.getName()) .authorizationGrantType( org.springframework.security.oauth2.core .AuthorizationGrantType.AUTHORIZATION_CODE) @@ -269,12 +269,12 @@ public class SecurityConfiguration { return keycloak != null && keycloak.isSettingsValid() ? Optional.of( ClientRegistrations.fromIssuerLocation(keycloak.getIssuer()) - .registrationId("keycloak") + .registrationId(keycloak.getName()) .clientId(keycloak.getClientId()) .clientSecret(keycloak.getClientSecret()) .scope(keycloak.getScopes()) .userNameAttributeName(keycloak.getUseAsUsername()) - .clientName("Keycloak") + .clientName(keycloak.getClientName()) .build()) : Optional.empty(); } @@ -291,7 +291,7 @@ public class SecurityConfiguration { GithubProvider github = client.getGithub(); return github != null && github.isSettingsValid() ? Optional.of( - ClientRegistration.withRegistrationId("github") + ClientRegistration.withRegistrationId(github.getName()) .clientId(github.getClientId()) .clientSecret(github.getClientSecret()) .scope(github.getScopes()) @@ -299,8 +299,8 @@ public class SecurityConfiguration { .tokenUri(github.getTokenuri()) .userInfoUri(github.getUserinfouri()) .userNameAttributeName(github.getUseAsUsername()) - .clientName("GitHub") - .redirectUri("{baseUrl}/login/oauth2/code/github") + .clientName(github.getClientName()) + .redirectUri("{baseUrl}/login/oauth2/code/" + github.getName()) .authorizationGrantType( org.springframework.security.oauth2.core .AuthorizationGrantType.AUTHORIZATION_CODE) diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2LogoutSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2LogoutSuccessHandler.java index f8b76ab9..9b12b279 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2LogoutSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2LogoutSuccessHandler.java @@ -52,7 +52,7 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand issuer = provider.getIssuer(); clientId = provider.getClientId(); } catch (Exception e) { - e.printStackTrace(); + logger.error("exception", e); } } else { @@ -60,13 +60,13 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand issuer = oauth.getIssuer(); clientId = oauth.getClientId(); } - + String errorMessage = ""; if (request.getParameter("oauth2AuthenticationErrorWeb") != null) { param = "erroroauth=oauth2AuthenticationErrorWeb"; - } else if (request.getParameter("error") != null) { - param = "error=" + request.getParameter("error"); - } else if (request.getParameter("erroroauth") != null) { - param = "erroroauth=" + request.getParameter("erroroauth"); + } else if ((errorMessage = request.getParameter("error")) != null) { + param = "error=" + sanitizeInput(errorMessage); + } else if ((errorMessage = request.getParameter("erroroauth")) != null) { + param = "erroroauth=" + sanitizeInput(errorMessage); } else if (request.getParameter("oauth2AutoCreateDisabled") != null) { param = "error=oauth2AutoCreateDisabled"; } @@ -81,7 +81,7 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand logger.info("Session invalidated: " + sessionId); } - switch (registrationId) { + switch (registrationId.toLowerCase()) { case "keycloak": // Add Keycloak specific logout URL if needed String logoutUrl = @@ -115,4 +115,8 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand break; } } + + private String sanitizeInput(String input) { + return input.replaceAll("[^a-zA-Z0-9 ]", ""); + } } diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2UserService.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2UserService.java index a5d65ff0..b9766480 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2UserService.java @@ -16,6 +16,8 @@ import org.springframework.security.oauth2.core.oidc.user.OidcUser; import stirling.software.SPDF.config.security.LoginAttemptService; import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.ApplicationProperties; +import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2; +import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2.Client; import stirling.software.SPDF.model.User; public class CustomOAuth2UserService implements OAuth2UserService { @@ -41,11 +43,27 @@ public class CustomOAuth2UserService implements OAuth2UserService duser = userService.findByUsernameIgnoreCase(username); if (duser.isPresent()) { if (loginAttemptService.isBlocked(username)) { @@ -56,13 +74,14 @@ public class CustomOAuth2UserService implements OAuth2UserService userOpt = userService.findByUsername(principal.getName()); if (userOpt == null || userOpt.isEmpty()) { - return new RedirectView("/account?messageType=userNotFound"); + return new RedirectView("/account?messageType=userNotFound", true); } User user = userOpt.get(); if (user.getUsername().equals(newUsername)) { - return new RedirectView("/account?messageType=usernameExists"); + return new RedirectView("/account?messageType=usernameExists", true); } if (!userService.isPasswordCorrect(user, currentPassword)) { - return new RedirectView("/account?messageType=incorrectPassword"); + return new RedirectView("/account?messageType=incorrectPassword", true); } if (!user.getUsername().equals(newUsername) && userService.usernameExists(newUsername)) { - return new RedirectView("/account?messageType=usernameExists"); + return new RedirectView("/account?messageType=usernameExists", true); } if (newUsername != null && newUsername.length() > 0) { try { userService.changeUsername(user, newUsername); } catch (IllegalArgumentException e) { - return new RedirectView("/account?messageType=invalidUsername"); + return new RedirectView("/account?messageType=invalidUsername", true); } } // Logout using Spring's utility new SecurityContextLogoutHandler().logout(request, response, null); - return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED); + return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED, true); } @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @@ -118,19 +118,19 @@ public class UserController { HttpServletResponse response, RedirectAttributes redirectAttributes) { if (principal == null) { - return new RedirectView("/change-creds?messageType=notAuthenticated"); + return new RedirectView("/change-creds?messageType=notAuthenticated", true); } Optional userOpt = userService.findByUsernameIgnoreCase(principal.getName()); if (userOpt == null || userOpt.isEmpty()) { - return new RedirectView("/change-creds?messageType=userNotFound"); + return new RedirectView("/change-creds?messageType=userNotFound", true); } User user = userOpt.get(); if (!userService.isPasswordCorrect(user, currentPassword)) { - return new RedirectView("/change-creds?messageType=incorrectPassword"); + return new RedirectView("/change-creds?messageType=incorrectPassword", true); } userService.changePassword(user, newPassword); @@ -138,7 +138,7 @@ public class UserController { // Logout using Spring's utility new SecurityContextLogoutHandler().logout(request, response, null); - return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED); + return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED, true); } @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @@ -151,19 +151,19 @@ public class UserController { HttpServletResponse response, RedirectAttributes redirectAttributes) { if (principal == null) { - return new RedirectView("/account?messageType=notAuthenticated"); + return new RedirectView("/account?messageType=notAuthenticated", true); } Optional userOpt = userService.findByUsernameIgnoreCase(principal.getName()); if (userOpt == null || userOpt.isEmpty()) { - return new RedirectView("/account?messageType=userNotFound"); + return new RedirectView("/account?messageType=userNotFound", true); } User user = userOpt.get(); if (!userService.isPasswordCorrect(user, currentPassword)) { - return new RedirectView("/account?messageType=incorrectPassword"); + return new RedirectView("/account?messageType=incorrectPassword", true); } userService.changePassword(user, newPassword); @@ -171,7 +171,7 @@ public class UserController { // Logout using Spring's utility new SecurityContextLogoutHandler().logout(request, response, null); - return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED); + return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED, true); } @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @@ -204,7 +204,7 @@ public class UserController { boolean forceChange) { if (!userService.isUsernameValid(username)) { - return new RedirectView("/addUsers?messageType=invalidUsername"); + return new RedirectView("/addUsers?messageType=invalidUsername", true); } Optional userOpt = userService.findByUsernameIgnoreCase(username); @@ -212,26 +212,27 @@ public class UserController { if (userOpt.isPresent()) { User user = userOpt.get(); if (user != null && user.getUsername().equalsIgnoreCase(username)) { - return new RedirectView("/addUsers?messageType=usernameExists"); + return new RedirectView("/addUsers?messageType=usernameExists", true); } } if (userService.usernameExistsIgnoreCase(username)) { - return new RedirectView("/addUsers?messageType=usernameExists"); + return new RedirectView("/addUsers?messageType=usernameExists", true); } try { // Validate the role Role roleEnum = Role.fromString(role); if (roleEnum == Role.INTERNAL_API_USER) { // If the role is INTERNAL_API_USER, reject the request - return new RedirectView("/addUsers?messageType=invalidRole"); + return new RedirectView("/addUsers?messageType=invalidRole", true); } } catch (IllegalArgumentException e) { // If the role ID is not valid, redirect with an error message - return new RedirectView("/addUsers?messageType=invalidRole"); + return new RedirectView("/addUsers?messageType=invalidRole", true); } userService.saveUser(username, password, role, forceChange); - return new RedirectView("/addUsers"); // Redirect to account page after adding the user + return new RedirectView( + "/addUsers", true); // Redirect to account page after adding the user } @PreAuthorize("hasRole('ROLE_ADMIN')") @@ -244,33 +245,34 @@ public class UserController { Optional userOpt = userService.findByUsernameIgnoreCase(username); if (!userOpt.isPresent()) { - return new RedirectView("/addUsers?messageType=userNotFound"); + return new RedirectView("/addUsers?messageType=userNotFound", true); } if (!userService.usernameExistsIgnoreCase(username)) { - return new RedirectView("/addUsers?messageType=userNotFound"); + return new RedirectView("/addUsers?messageType=userNotFound", true); } // Get the currently authenticated username String currentUsername = authentication.getName(); // Check if the provided username matches the current session's username if (currentUsername.equalsIgnoreCase(username)) { - return new RedirectView("/addUsers?messageType=downgradeCurrentUser"); + return new RedirectView("/addUsers?messageType=downgradeCurrentUser", true); } try { // Validate the role Role roleEnum = Role.fromString(role); if (roleEnum == Role.INTERNAL_API_USER) { // If the role is INTERNAL_API_USER, reject the request - return new RedirectView("/addUsers?messageType=invalidRole"); + return new RedirectView("/addUsers?messageType=invalidRole", true); } } catch (IllegalArgumentException e) { // If the role ID is not valid, redirect with an error message - return new RedirectView("/addUsers?messageType=invalidRole"); + return new RedirectView("/addUsers?messageType=invalidRole", true); } User user = userOpt.get(); userService.changeRole(user, role); - return new RedirectView("/addUsers"); // Redirect to account page after adding the user + return new RedirectView( + "/addUsers", true); // Redirect to account page after adding the user } @PreAuthorize("hasRole('ROLE_ADMIN')") @@ -279,7 +281,7 @@ public class UserController { @PathVariable(name = "username") String username, Authentication authentication) { if (!userService.usernameExistsIgnoreCase(username)) { - return new RedirectView("/addUsers?messageType=deleteUsernameExists"); + return new RedirectView("/addUsers?messageType=deleteUsernameExists", true); } // Get the currently authenticated username @@ -287,11 +289,11 @@ public class UserController { // Check if the provided username matches the current session's username if (currentUsername.equalsIgnoreCase(username)) { - return new RedirectView("/addUsers?messageType=deleteCurrentUser"); + return new RedirectView("/addUsers?messageType=deleteCurrentUser", true); } invalidateUserSessions(username); userService.deleteUser(username); - return new RedirectView("/addUsers"); + return new RedirectView("/addUsers", true); } @Autowired private SessionRegistry sessionRegistry; diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java index e3578826..cd748d53 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java @@ -1,10 +1,22 @@ package stirling.software.SPDF.controller.api.converters; +import java.io.ByteArrayOutputStream; +import java.io.FileOutputStream; +import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDDocumentCatalog; +import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; +import org.apache.pdfbox.pdmodel.interactive.form.PDField; +import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -26,6 +38,8 @@ import stirling.software.SPDF.utils.WebResponseUtils; @Tag(name = "Convert", description = "Convert APIs") public class ConvertPDFToPDFA { + private static final Logger logger = LoggerFactory.getLogger(ConvertPDFToPDFA.class); + @PostMapping(consumes = "multipart/form-data", value = "/pdf/pdfa") @Operation( summary = "Convert a PDF to a PDF/A", @@ -36,9 +50,39 @@ public class ConvertPDFToPDFA { MultipartFile inputFile = request.getFileInput(); String outputFormat = request.getOutputFormat(); - // Save the uploaded file to a temporary location + // Convert MultipartFile to byte[] + byte[] pdfBytes = inputFile.getBytes(); + + // Load the PDF document + PDDocument document = Loader.loadPDF(pdfBytes); + + // Get the document catalog + PDDocumentCatalog catalog = document.getDocumentCatalog(); + + // Get the AcroForm + PDAcroForm acroForm = catalog.getAcroForm(); + if (acroForm != null) { + // Remove signature fields safely + List fieldsToRemove = + acroForm.getFields().stream() + .filter(field -> field instanceof PDSignatureField) + .collect(Collectors.toList()); + + if (!fieldsToRemove.isEmpty()) { + acroForm.flatten(fieldsToRemove, false); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + document.save(baos); + pdfBytes = baos.toByteArray(); + } + } + document.close(); + + // Save the uploaded (and possibly modified) file to a temporary location Path tempInputFile = Files.createTempFile("input_", ".pdf"); - inputFile.transferTo(tempInputFile.toFile()); + try (OutputStream outputStream = new FileOutputStream(tempInputFile.toFile())) { + outputStream.write(pdfBytes); + } // Prepare the output file path Path tempOutputFile = Files.createTempFile("output_", ".pdf"); @@ -58,7 +102,7 @@ public class ConvertPDFToPDFA { .runCommandWithOutputHandling(command); // Read the optimized PDF file - byte[] pdfBytes = Files.readAllBytes(tempOutputFile); + byte[] optimizedPdfBytes = Files.readAllBytes(tempOutputFile); // Clean up the temporary files Files.deleteIfExists(tempInputFile); @@ -69,6 +113,6 @@ public class ConvertPDFToPDFA { Filenames.toSimpleFileName(inputFile.getOriginalFilename()) .replaceFirst("[.][^.]+$", "") + "_PDFA.pdf"; - return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); + return WebResponseUtils.bytesToWebResponse(optimizedPdfBytes, outputFilename); } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java index 23c08f26..d57a8bda 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java @@ -15,6 +15,8 @@ import java.util.zip.ZipOutputStream; import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -43,6 +45,7 @@ import stirling.software.SPDF.utils.WebResponseUtils; @Tag(name = "Misc", description = "Miscellaneous APIs") public class AutoSplitPdfController { + private static final Logger logger = LoggerFactory.getLogger(AutoSplitPdfController.class); private static final String QR_CONTENT = "https://github.com/Stirling-Tools/Stirling-PDF"; private static final String QR_CONTENT_OLD = "https://github.com/Frooodle/Stirling-PDF"; @@ -115,7 +118,7 @@ public class AutoSplitPdfController { zipOut.closeEntry(); } } catch (Exception e) { - e.printStackTrace(); + logger.error("exception", e); } finally { data = Files.readAllBytes(zipFile); Files.deleteIfExists(zipFile); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java index 73dab071..59fc0be7 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java @@ -106,7 +106,7 @@ public class BlankPageController { .replaceFirst("[.][^.]+$", "") + "_blanksRemoved.pdf"); } catch (IOException e) { - e.printStackTrace(); + logger.error("exception", e); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } finally { if (document != null) document.close(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java b/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java index 2400c0d3..d4c4ce05 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java @@ -110,8 +110,8 @@ public class FakeScanControllerWIP { private BufferedImage rotate(BufferedImage image, double rotation) { double rotationRequired = Math.toRadians(rotation); - double locationX = image.getWidth() / 2; - double locationY = image.getHeight() / 2; + double locationX = (double) image.getWidth() / 2; + double locationY = (double) image.getHeight() / 2; AffineTransform tx = AffineTransform.getRotateInstance(rotationRequired, locationX, locationY); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BICUBIC); @@ -127,8 +127,8 @@ public class FakeScanControllerWIP { for (int i = -radius; i <= radius; i++) { for (int j = -radius; j <= radius; j++) { - double xDistance = i * i; - double yDistance = j * j; + double xDistance = (double) i * i; + double yDistance = (double) j * j; double g = Math.exp(-(xDistance + yDistance) / (2 * sigma * sigma)); data[(i + radius) * size + j + radius] = (float) g; sum += g; @@ -137,7 +137,7 @@ public class FakeScanControllerWIP { // Normalize the kernel for (int i = 0; i < data.length; i++) { - data[i] /= sum; + if (sum != 0) data[i] /= sum; } Kernel kernel = new Kernel(size, size, data); @@ -166,7 +166,7 @@ public class FakeScanControllerWIP { 0, new Color(0, 0, 0, 1f), 0, - featherRadius * 2, + featherRadius * 2f, new Color(0, 0, 0, 0f))); g2.fillRect(0, 0, width, featherRadius); @@ -174,7 +174,7 @@ public class FakeScanControllerWIP { g2.setPaint( new GradientPaint( 0, - height - featherRadius * 2, + height - featherRadius * 2f, new Color(0, 0, 0, 0f), 0, height, @@ -187,7 +187,7 @@ public class FakeScanControllerWIP { 0, 0, new Color(0, 0, 0, 1f), - featherRadius * 2, + featherRadius * 2f, 0, new Color(0, 0, 0, 0f))); g2.fillRect(0, 0, featherRadius, height); @@ -195,7 +195,7 @@ public class FakeScanControllerWIP { // Right edge g2.setPaint( new GradientPaint( - width - featherRadius * 2, + width - featherRadius * 2f, 0, new Color(0, 0, 0, 0f), width, @@ -244,7 +244,7 @@ public class FakeScanControllerWIP { int y2 = y1 + random.nextInt(20) - 10; Path2D.Double hair = new Path2D.Double(); hair.moveTo(x1, y1); - hair.curveTo(x1, y1, (x1 + x2) / 2, (y1 + y2) / 2, x2, y2); + hair.curveTo(x1, y1, (double) (x1 + x2) / 2, (double) (y1 + y2) / 2, x2, y2); g2d.draw(hair); } diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java index bdc0a478..888d7670 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java @@ -12,6 +12,8 @@ import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -33,6 +35,8 @@ import stirling.software.SPDF.utils.WebResponseUtils; @Tag(name = "Misc", description = "Miscellaneous APIs") public class FlattenController { + private static final Logger logger = LoggerFactory.getLogger(FlattenController.class); + @PostMapping(consumes = "multipart/form-data", value = "/flatten") @Operation( summary = "Flatten PDF form fields or full page", @@ -73,7 +77,7 @@ public class FlattenController { contentStream.drawImage(pdImage, 0, 0, pageWidth, pageHeight); } } catch (IOException e) { - e.printStackTrace(); + logger.error("exception", e); } } PdfUtils.setMetadataToPdf(newDocument, metadata); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java index fec07380..4d51e0f8 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java @@ -11,6 +11,8 @@ import org.apache.pdfbox.Loader; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocumentInformation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -30,6 +32,8 @@ import stirling.software.SPDF.utils.WebResponseUtils; @Tag(name = "Misc", description = "Miscellaneous APIs") public class MetadataController { + private static final Logger logger = LoggerFactory.getLogger(MetadataController.class); + private String checkUndefined(String entry) { // Check if the string is "undefined" if ("undefined".equals(entry)) { @@ -136,7 +140,7 @@ public class MetadataController { creationDateCal.setTime( new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse(creationDate)); } catch (ParseException e) { - e.printStackTrace(); + logger.error("exception", e); } info.setCreationDate(creationDateCal); } else { @@ -148,7 +152,7 @@ public class MetadataController { modificationDateCal.setTime( new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse(modificationDate)); } catch (ParseException e) { - e.printStackTrace(); + logger.error("exception", e); } info.setModificationDate(modificationDateCal); } else { diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java index c61b29e9..25531880 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java @@ -19,6 +19,7 @@ import java.util.stream.Stream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.Resource; import org.springframework.scheduling.annotation.Scheduled; @@ -28,6 +29,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineOperation; +import stirling.software.SPDF.utils.FileMonitor; @Service public class PipelineDirectoryProcessor { @@ -35,11 +37,18 @@ public class PipelineDirectoryProcessor { private static final Logger logger = LoggerFactory.getLogger(PipelineDirectoryProcessor.class); @Autowired private ObjectMapper objectMapper; @Autowired private ApiDocService apiDocService; - - final String watchedFoldersDir = "./pipeline/watchedFolders/"; - final String finishedFoldersDir = "./pipeline/finishedFolders/"; - @Autowired PipelineProcessor processor; + @Autowired FileMonitor fileMonitor; + + final String watchedFoldersDir; + final String finishedFoldersDir; + + public PipelineDirectoryProcessor( + @Qualifier("watchedFoldersDir") String watchedFoldersDir, + @Qualifier("finishedFoldersDir") String finishedFoldersDir) { + this.watchedFoldersDir = watchedFoldersDir; + this.finishedFoldersDir = finishedFoldersDir; + } @Scheduled(fixedRate = 60000) public void scanFolders() { @@ -130,7 +139,11 @@ public class PipelineDirectoryProcessor { throws IOException { try (Stream paths = Files.list(dir)) { if ("automated".equals(operation.getParameters().get("fileInput"))) { - return paths.filter(path -> !Files.isDirectory(path) && !path.equals(jsonFile)) + return paths.filter( + path -> + !Files.isDirectory(path) + && !path.equals(jsonFile) + && fileMonitor.isFileReadyForProcessing(path)) .map(Path::toFile) .toArray(File[]::new); } else { diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java index d066bd9a..6ff75ebd 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java @@ -148,7 +148,7 @@ public class CertSignController { doc.addSignature(signature, instance); doc.saveIncremental(output); } catch (Exception e) { - e.printStackTrace(); + logger.error("exception", e); } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java b/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java index 9926da55..77f02524 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java @@ -56,6 +56,8 @@ import org.apache.xmpbox.XMPMetadata; import org.apache.xmpbox.xml.DomXmpParser; import org.apache.xmpbox.xml.XmpParsingException; import org.apache.xmpbox.xml.XmpSerializer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -79,6 +81,8 @@ import stirling.software.SPDF.utils.WebResponseUtils; @Tag(name = "Security", description = "Security APIs") public class GetInfoOnPDF { + private static final Logger logger = LoggerFactory.getLogger(GetInfoOnPDF.class); + static ObjectMapper objectMapper = new ObjectMapper(); @PostMapping(consumes = "multipart/form-data", value = "/get-info-on-pdf") @@ -220,7 +224,7 @@ public class GetInfoOnPDF { javascriptArray.add(jsNode); } } catch (IOException e) { - e.printStackTrace(); + logger.error("exception", e); } } } @@ -253,7 +257,7 @@ public class GetInfoOnPDF { } } catch (Exception e) { // TODO Auto-generated catch block - e.printStackTrace(); + logger.error("exception", e); } boolean isPdfACompliant = checkForStandard(pdfBoxDoc, "PDF/A"); @@ -305,7 +309,7 @@ public class GetInfoOnPDF { new XmpSerializer().serialize(xmpMeta, os, true); xmpString = new String(os.toByteArray(), StandardCharsets.UTF_8); } catch (XmpParsingException | IOException e) { - e.printStackTrace(); + logger.error("exception", e); } } @@ -593,7 +597,7 @@ public class GetInfoOnPDF { MediaType.APPLICATION_JSON); } catch (Exception e) { - e.printStackTrace(); + logger.error("exception", e); } return null; } @@ -691,7 +695,7 @@ public class GetInfoOnPDF { Exception e) { // Catching general exception for brevity, ideally you'd catch specific // exceptions. - e.printStackTrace(); + logger.error("exception", e); } return false; diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/RemoveCertSignController.java b/src/main/java/stirling/software/SPDF/controller/api/security/RemoveCertSignController.java new file mode 100644 index 00000000..6a131a98 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/security/RemoveCertSignController.java @@ -0,0 +1,81 @@ +package stirling.software.SPDF.controller.api.security; + +import java.io.ByteArrayOutputStream; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDDocumentCatalog; +import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; +import org.apache.pdfbox.pdmodel.interactive.form.PDField; +import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import io.github.pixee.security.Filenames; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; + +import stirling.software.SPDF.model.api.PDFFile; +import stirling.software.SPDF.utils.WebResponseUtils; + +@RestController +@RequestMapping("/api/v1/security") +@Tag(name = "Security", description = "Security APIs") +public class RemoveCertSignController { + + private static final Logger logger = LoggerFactory.getLogger(RemoveCertSignController.class); + + @PostMapping(consumes = "multipart/form-data", value = "/remove-cert-sign") + @Operation( + summary = "Remove digital signature from PDF", + description = + "This endpoint accepts a PDF file and returns the PDF file without the digital signature. Input: PDF, Output: PDF") + public ResponseEntity removeCertSignPDF(@ModelAttribute PDFFile request) + throws Exception { + MultipartFile pdf = request.getFileInput(); + + // Convert MultipartFile to byte[] + byte[] pdfBytes = pdf.getBytes(); + + // Create a ByteArrayOutputStream to hold the resulting PDF + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + // Load the PDF document + PDDocument document = Loader.loadPDF(pdfBytes); + + // Get the document catalog + PDDocumentCatalog catalog = document.getDocumentCatalog(); + + // Get the AcroForm + PDAcroForm acroForm = catalog.getAcroForm(); + if (acroForm != null) { + // Remove signature fields safely + List fieldsToRemove = + acroForm.getFields().stream() + .filter(field -> field instanceof PDSignatureField) + .collect(Collectors.toList()); + + if (!fieldsToRemove.isEmpty()) { + acroForm.flatten(fieldsToRemove, false); + } + } + + // Save the modified document to the ByteArrayOutputStream + document.save(baos); + document.close(); + + // Return the modified PDF as a response + return WebResponseUtils.boasToWebResponse( + baos, + Filenames.toSimpleFileName(pdf.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + + "_unsigned.pdf"); + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/strippers/PDFTableStripper.java b/src/main/java/stirling/software/SPDF/controller/api/strippers/PDFTableStripper.java index e2ed3ca0..0ea3e131 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/strippers/PDFTableStripper.java +++ b/src/main/java/stirling/software/SPDF/controller/api/strippers/PDFTableStripper.java @@ -117,7 +117,6 @@ public class PDFTableStripper extends PDFTextStripper { /** * Instantiate a new PDFTableStripper object. * - * @param document * @throws IOException If there is an error loading the properties. */ public PDFTableStripper() throws IOException { diff --git a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java index b0490fb5..9d67e395 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java @@ -52,23 +52,23 @@ public class AccountWebController { OAUTH2 oauth = applicationProperties.getSecurity().getOAUTH2(); if (oauth != null) { if (oauth.isSettingsValid()) { - providerList.put("oidc", "OpenID Connect"); + providerList.put("oidc", oauth.getProvider()); } Client client = oauth.getClient(); if (client != null) { GoogleProvider google = client.getGoogle(); if (google.isSettingsValid()) { - providerList.put("google", "Google"); + providerList.put(google.getName(), google.getClientName()); } GithubProvider github = client.getGithub(); if (github.isSettingsValid()) { - providerList.put("github", "Github"); + providerList.put(github.getName(), github.getClientName()); } KeycloakProvider keycloak = client.getKeycloak(); if (keycloak.isSettingsValid()) { - providerList.put("keycloak", "Keycloak"); + providerList.put(keycloak.getName(), keycloak.getClientName()); } } } @@ -129,6 +129,8 @@ public class AccountWebController { case "invalid_request": erroroauth = "login.oauth2invalidRequest"; break; + case "invalid_id_token": + erroroauth = "login.oauth2InvalidIdToken"; default: break; } @@ -260,8 +262,7 @@ public class AccountWebController { userRepository.findByUsernameIgnoreCase( username); // Assuming findByUsername method exists if (!user.isPresent()) { - // Handle error appropriately - return "redirect:/error"; // Example redirection in case of error + return "redirect:/error"; } // Convert settings map to JSON string @@ -271,8 +272,8 @@ public class AccountWebController { settingsJson = objectMapper.writeValueAsString(user.get().getSettings()); } catch (JsonProcessingException e) { // Handle JSON conversion error - e.printStackTrace(); - return "redirect:/error"; // Example redirection in case of error + logger.error("exception", e); + return "redirect:/error"; } String messageType = request.getParameter("messageType"); diff --git a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java index 5615a3a6..bb730dc9 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java @@ -15,6 +15,8 @@ import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; @@ -33,6 +35,8 @@ import io.swagger.v3.oas.annotations.tags.Tag; @Tag(name = "General", description = "General APIs") public class GeneralWebController { + private static final Logger logger = LoggerFactory.getLogger(GeneralWebController.class); + @GetMapping("/pipeline") @Hidden public String pipelineForm(Model model) { @@ -74,7 +78,7 @@ public class GeneralWebController { } } catch (IOException e) { - e.printStackTrace(); + logger.error("exception", e); } } if (pipelineConfigsWithNames.size() == 0) { diff --git a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java b/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java index 94e83342..5ade5668 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java @@ -6,6 +6,8 @@ import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; @@ -26,6 +28,8 @@ import stirling.software.SPDF.model.Dependency; @Controller public class HomeWebController { + private static final Logger logger = LoggerFactory.getLogger(HomeWebController.class); + @GetMapping("/about") @Hidden public String gameForm(Model model) { @@ -46,7 +50,7 @@ public class HomeWebController { mapper.readValue(json, new TypeReference>>() {}); model.addAttribute("dependencies", data.get("dependencies")); } catch (IOException e) { - e.printStackTrace(); + logger.error("exception", e); } return "licenses"; } diff --git a/src/main/java/stirling/software/SPDF/controller/web/SecurityWebController.java b/src/main/java/stirling/software/SPDF/controller/web/SecurityWebController.java index 68b16d89..927e9bb8 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/SecurityWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/SecurityWebController.java @@ -53,6 +53,13 @@ public class SecurityWebController { return "security/cert-sign"; } + @GetMapping("/remove-cert-sign") + @Hidden + public String certUnSignForm(Model model) { + model.addAttribute("currentPage", "remove-cert-sign"); + return "security/remove-cert-sign"; + } + @GetMapping("/sanitize-pdf") @Hidden public String sanitizeForm(Model model) { diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java index c2253b21..13c33d63 100644 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java @@ -356,8 +356,8 @@ public class ApplicationProperties { private KeycloakProvider keycloak = new KeycloakProvider(); public Provider get(String registrationId) throws Exception { - switch (registrationId) { - case "gogole": + switch (registrationId.toLowerCase()) { + case "google": return getGoogle(); case "github": return getGithub(); @@ -455,6 +455,7 @@ public class ApplicationProperties { @Override public Collection getScopes() { if (scopes == null || scopes.isEmpty()) { + scopes = new ArrayList<>(); scopes.add("https://www.googleapis.com/auth/userinfo.email"); scopes.add("https://www.googleapis.com/auth/userinfo.profile"); } @@ -495,6 +496,11 @@ public class ApplicationProperties { return "google"; } + @Override + public String getClientName() { + return "Google"; + } + public boolean isSettingsValid() { return super.isValid(this.getClientId(), "clientId") && super.isValid(this.getClientSecret(), "clientSecret") @@ -553,8 +559,10 @@ public class ApplicationProperties { this.clientSecret = clientSecret; } + @Override public Collection getScopes() { if (scopes == null || scopes.isEmpty()) { + scopes = new ArrayList<>(); scopes.add("read:user"); } return scopes; @@ -594,6 +602,11 @@ public class ApplicationProperties { return "github"; } + @Override + public String getClientName() { + return "GitHub"; + } + public boolean isSettingsValid() { return super.isValid(this.getClientId(), "clientId") && super.isValid(this.getClientSecret(), "clientSecret") @@ -642,13 +655,14 @@ public class ApplicationProperties { @Override public Collection getScopes() { if (scopes == null || scopes.isEmpty()) { - scopes.add("openid"); + scopes = new ArrayList<>(); scopes.add("profile"); scopes.add("email"); } return scopes; } + @Override public void setScopes(String scopes) { this.scopes = Arrays.stream(scopes.split(",")).map(String::trim).collect(Collectors.toList()); @@ -684,6 +698,11 @@ public class ApplicationProperties { return "keycloak"; } + @Override + public String getClientName() { + return "Keycloak"; + } + public boolean isSettingsValid() { return isValid(this.getIssuer(), "issuer") && isValid(this.getClientId(), "clientId") diff --git a/src/main/java/stirling/software/SPDF/model/InputStreamTemplateResource.java b/src/main/java/stirling/software/SPDF/model/InputStreamTemplateResource.java new file mode 100644 index 00000000..b4271df0 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/InputStreamTemplateResource.java @@ -0,0 +1,45 @@ +package stirling.software.SPDF.model; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; + +import org.thymeleaf.templateresource.ITemplateResource; + +public class InputStreamTemplateResource implements ITemplateResource { + private InputStream inputStream; + private String characterEncoding; + + public InputStreamTemplateResource(InputStream inputStream, String characterEncoding) { + this.inputStream = inputStream; + this.characterEncoding = characterEncoding; + } + + @Override + public Reader reader() throws IOException { + return new InputStreamReader(inputStream, characterEncoding); + } + + @Override + public ITemplateResource relative(String relativeLocation) { + // Implement logic for relative resources, if needed + throw new UnsupportedOperationException("Relative resources not supported"); + } + + @Override + public String getDescription() { + return "InputStream resource [Stream]"; + } + + @Override + public String getBaseName() { + return "streamResource"; + } + + @Override + public boolean exists() { + // TODO Auto-generated method stub + return false; + } +} diff --git a/src/main/java/stirling/software/SPDF/model/Provider.java b/src/main/java/stirling/software/SPDF/model/Provider.java index a8dce446..c378975d 100644 --- a/src/main/java/stirling/software/SPDF/model/Provider.java +++ b/src/main/java/stirling/software/SPDF/model/Provider.java @@ -4,11 +4,16 @@ import java.util.Collection; public class Provider implements ProviderInterface { private String name; + private String clientName; public String getName() { return name; } + public String getClientName() { + return clientName; + } + protected boolean isValid(String value, String name) { if (value != null && !value.trim().isEmpty()) { return true; diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java index 7f94791e..173bde0b 100644 --- a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java +++ b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java @@ -5,6 +5,8 @@ import java.util.List; import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.media.Schema; @@ -19,6 +21,8 @@ import stirling.software.SPDF.utils.GeneralUtils; @EqualsAndHashCode(callSuper = true) public class PDFWithPageNums extends PDFFile { + private static final Logger logger = LoggerFactory.getLogger(PDFWithPageNums.class); + @Schema( description = "The pages to select, Supports ranges (e.g., '1,3,5-9'), or 'all' or functions in the format 'an+b' where 'a' is the multiplier of the page number 'n', and 'b' is a constant (e.g., '2n+1', '3n', '6n-5')\"") @@ -31,7 +35,7 @@ public class PDFWithPageNums extends PDFFile { pageCount = Loader.loadPDF(getFileInput().getBytes()).getNumberOfPages(); } catch (IOException e) { // TODO Auto-generated catch block - e.printStackTrace(); + logger.error("exception", e); } return GeneralUtils.parsePageList(pageNumbers, pageCount, zeroCount); } diff --git a/src/main/java/stirling/software/SPDF/utils/FileMonitor.java b/src/main/java/stirling/software/SPDF/utils/FileMonitor.java new file mode 100644 index 00000000..6d96958c --- /dev/null +++ b/src/main/java/stirling/software/SPDF/utils/FileMonitor.java @@ -0,0 +1,168 @@ +package stirling.software.SPDF.utils; + +import static java.nio.file.StandardWatchEventKinds.*; + +import java.io.IOException; +import java.nio.file.*; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +public class FileMonitor { + private static final Logger logger = LoggerFactory.getLogger(FileMonitor.class); + private final Map path2KeyMapping; + private final Set newlyDiscoveredFiles; + private final ConcurrentHashMap.KeySetView readyForProcessingFiles; + private final WatchService watchService; + private final Predicate pathFilter; + private final Path rootDir; + private Set stagingFiles; + + /** + * @param rootDirectory the root directory to monitor + * @param pathFilter the filter to apply to the paths, return true if the path should be + * monitored, false otherwise + */ + @Autowired + public FileMonitor( + @Qualifier("watchedFoldersDir") String rootDirectory, + @Qualifier("directoryFilter") Predicate pathFilter) + throws IOException { + this.newlyDiscoveredFiles = new HashSet<>(); + this.path2KeyMapping = new HashMap<>(); + this.stagingFiles = new HashSet<>(); + this.pathFilter = pathFilter; + this.readyForProcessingFiles = ConcurrentHashMap.newKeySet(); + this.watchService = FileSystems.getDefault().newWatchService(); + this.rootDir = Path.of(rootDirectory); + } + + private boolean shouldNotProcess(Path path) { + return !pathFilter.test(path); + } + + private void recursivelyRegisterEntry(Path dir) throws IOException { + WatchKey key = dir.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); + path2KeyMapping.put(dir, key); + logger.info("Registered directory: {}", dir); + + try (Stream directoryVisitor = Files.walk(dir, 1)) { + final Iterator iterator = directoryVisitor.iterator(); + while (iterator.hasNext()) { + Path path = iterator.next(); + if (path.equals(dir) || shouldNotProcess(path)) continue; + + if (Files.isDirectory(path)) { + recursivelyRegisterEntry(path); + } else if (Files.isRegularFile(path)) { + handleFileCreation(path); + } + } + } + } + + @Scheduled(fixedRate = 5000) + public void trackFiles() { + /* + All files observed changes in the last iteration will be considered as staging files. + If those files are not modified in current iteration, they will be considered as ready for processing. + */ + stagingFiles = new HashSet<>(newlyDiscoveredFiles); + readyForProcessingFiles.clear(); + + if (path2KeyMapping.isEmpty()) { + logger.warn( + "not monitoring any directory, even the root directory itself: {}", rootDir); + if (Files.exists( + rootDir)) { // if the root directory exists, re-register the root directory + try { + recursivelyRegisterEntry(rootDir); + } catch (IOException e) { + logger.error("unable to register monitoring", e); + } + } + } + + WatchKey key; + while ((key = watchService.poll()) != null) { + final Path watchingDir = (Path) key.watchable(); + key.pollEvents() + .forEach( + (evt) -> { + final Path path = (Path) evt.context(); + final WatchEvent.Kind kind = evt.kind(); + if (shouldNotProcess(path)) return; + + try { + if (Files.isDirectory(path)) { + if (kind == ENTRY_CREATE) { + handleDirectoryCreation(path); + } + /* + we don't need to handle directory deletion or modification + - directory deletion will be handled by key.reset() + - directory modification indicates a new file creation or deletion, which is handled by below + */ + } + Path relativePathFromRoot = watchingDir.resolve(path); + if (kind == ENTRY_CREATE) { + handleFileCreation(relativePathFromRoot); + } else if (kind == ENTRY_DELETE) { + handleFileRemoval(relativePathFromRoot); + } else if (kind == ENTRY_MODIFY) { + handleFileModification(relativePathFromRoot); + } + } catch (Exception e) { + logger.error("Error while processing file: {}", path, e); + } + }); + + boolean isKeyValid = key.reset(); + if (!isKeyValid) { // key is invalid when the directory itself is no longer exists + path2KeyMapping.remove((Path) key.watchable()); + } + } + readyForProcessingFiles.addAll(stagingFiles); + } + + private void handleDirectoryCreation(Path dir) throws IOException { + WatchKey key = dir.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); + path2KeyMapping.put(dir, key); + } + + private void handleFileRemoval(Path path) { + newlyDiscoveredFiles.remove(path); + stagingFiles.remove(path); + } + + private void handleFileCreation(Path path) { + newlyDiscoveredFiles.add(path); + stagingFiles.remove(path); + } + + private void handleFileModification(Path path) { + // the logic is the same + handleFileCreation(path); + } + + /** + * Check if the file is ready for processing. + * + *

A file is ready for processing if it is not being modified for 5000ms. + * + * @param path the path of the file + * @return true if the file is ready for processing, false otherwise + */ + public boolean isFileReadyForProcessing(Path path) { + return readyForProcessingFiles.contains(path); + } +} diff --git a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java index 2a891c08..c7123424 100644 --- a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java +++ b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java @@ -42,6 +42,7 @@ public class FileToPdf { List command = new ArrayList<>(); if (!htmlFormatsInstalled) { command.add("weasyprint"); + command.add("-e utf-8"); command.add(tempInputFile.toString()); command.add(tempOutputFile.toString()); @@ -52,7 +53,7 @@ public class FileToPdf { command.add("--paper-size"); command.add("a4"); - if (request.getZoom() != 1.0) { + if (request != null && request.getZoom() != 1.0) { // Create a temporary CSS file File tempCssFile = Files.createTempFile("customStyle", ".css").toFile(); try (FileWriter writer = new FileWriter(tempCssFile)) { diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index 03ae55ce..ae86d8c1 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -14,6 +14,8 @@ import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; import com.fathzer.soft.javaluator.DoubleEvaluator; @@ -23,6 +25,8 @@ import io.github.pixee.security.Urls; public class GeneralUtils { + private static final Logger logger = LoggerFactory.getLogger(GeneralUtils.class); + public static File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException { File tempFile = Files.createTempFile("temp", null).toFile(); try (FileOutputStream os = new FileOutputStream(tempFile)) { @@ -234,7 +238,7 @@ public class GeneralUtils { try { Files.createDirectories(folder); } catch (IOException e) { - e.printStackTrace(); + logger.error("exception", e); return false; } } diff --git a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java index f5297a10..7c419220 100644 --- a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java +++ b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java @@ -14,6 +14,8 @@ import java.util.zip.ZipOutputStream; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -24,6 +26,7 @@ import io.github.pixee.security.Filenames; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; public class PDFToFile { + private static final Logger logger = LoggerFactory.getLogger(PDFToFile.class); public ResponseEntity processPdfToHtml(MultipartFile inputFile) throws IOException, InterruptedException { @@ -67,18 +70,20 @@ public class PDFToFile { // Return output files in a ZIP archive fileName = pdfBaseName + "ToHtml.zip"; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream); - - for (File outputFile : outputFiles) { - ZipEntry entry = new ZipEntry(outputFile.getName()); - zipOutputStream.putNextEntry(entry); - FileInputStream fis = new FileInputStream(outputFile); - IOUtils.copy(fis, zipOutputStream); - fis.close(); - zipOutputStream.closeEntry(); + try (ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream)) { + for (File outputFile : outputFiles) { + ZipEntry entry = new ZipEntry(outputFile.getName()); + zipOutputStream.putNextEntry(entry); + try (FileInputStream fis = new FileInputStream(outputFile)) { + IOUtils.copy(fis, zipOutputStream); + } catch (IOException e) { + logger.error("Exception writing zip entry", e); + } + zipOutputStream.closeEntry(); + } + } catch (IOException e) { + logger.error("Exception writing zip", e); } - - zipOutputStream.close(); fileBytes = byteArrayOutputStream.toByteArray(); } finally { @@ -160,18 +165,22 @@ public class PDFToFile { // Return output files in a ZIP archive fileName = pdfBaseName + "To" + outputFormat + ".zip"; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream); + try (ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream)) { + for (File outputFile : outputFiles) { + ZipEntry entry = new ZipEntry(outputFile.getName()); + zipOutputStream.putNextEntry(entry); + try (FileInputStream fis = new FileInputStream(outputFile)) { + IOUtils.copy(fis, zipOutputStream); + } catch (IOException e) { + logger.error("Exception writing zip entry", e); + } - for (File outputFile : outputFiles) { - ZipEntry entry = new ZipEntry(outputFile.getName()); - zipOutputStream.putNextEntry(entry); - FileInputStream fis = new FileInputStream(outputFile); - IOUtils.copy(fis, zipOutputStream); - fis.close(); - zipOutputStream.closeEntry(); + zipOutputStream.closeEntry(); + } + } catch (IOException e) { + logger.error("Exception writing zip", e); } - zipOutputStream.close(); fileBytes = byteArrayOutputStream.toByteArray(); } diff --git a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java index 93fdbd54..5055c14c 100644 --- a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java +++ b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java @@ -125,7 +125,7 @@ public class ProcessExecutor { logger.warn( "Error reader thread was interrupted due to timeout."); } catch (IOException e) { - e.printStackTrace(); + logger.error("exception", e); } }); @@ -149,7 +149,7 @@ public class ProcessExecutor { logger.warn( "Error reader thread was interrupted due to timeout."); } catch (IOException e) { - e.printStackTrace(); + logger.error("exception", e); } }); diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 18b8e74c..8cb04c01 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -332,6 +332,10 @@ home.certSign.title=Sign with Certificate home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Multi-Page Layout home.pageLayout.desc=Merge multiple pages of a PDF document into a single page pageLayout.tags=merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=الاسم certSign.submit=تسجيل PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=إزالة الفراغات removeBlanks.header=إزالة الصفحات الفارغة @@ -964,6 +976,7 @@ pdfToPDFA.credit=تستخدم هذه الخدمة OCRmyPDF لتحويل PDF / A. pdfToPDFA.submit=تحويل pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 7f164568..913c1981 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -59,8 +59,8 @@ deleteCurrentUserMessage=Не може да се изтрие вписания deleteUsernameExistsMessage=Потребителското име не съществува и не може да бъде изтрито. downgradeCurrentUserMessage=Не може да се понижи ролята на текущия потребител downgradeCurrentUserLongMessage=Не може да се понижи ролята на текущия потребител. Следователно текущият потребител няма да бъде показан. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. +userAlreadyExistsOAuthMessage=Потребителят вече съществува като OAuth2 потребител. +userAlreadyExistsWebMessage=Потребителят вече съществува като уеб-потребител. error=Грешка oops=Опаа! help=Помощ @@ -105,18 +105,18 @@ pipelineOptions.validateButton=Валидирай ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=Любими navbar.darkmode=Тъмна тема -navbar.language=Languages +navbar.language=Езици navbar.settings=Настройки -navbar.allTools=Tools -navbar.multiTool=Multi Tools -navbar.sections.organize=Organize -navbar.sections.convertTo=Convert to PDF -navbar.sections.convertFrom=Convert from PDF -navbar.sections.security=Sign & Security -navbar.sections.advance=Advanced -navbar.sections.edit=View & Edit +navbar.allTools=Инструменти +navbar.multiTool=Мулти инструменти +navbar.sections.organize=Организирайте +navbar.sections.convertTo=Преобразуване в PDF +navbar.sections.convertFrom=Преобразуване от PDF +navbar.sections.security=Подписване и сигурност +navbar.sections.advance=Разширено +navbar.sections.edit=Преглед и редактиране ############# # SETTINGS # @@ -185,7 +185,7 @@ adminUserSettings.internalApiUser=Вътрешен API потребител adminUserSettings.forceChange=Принудете потребителя да промени потребителското име/парола при влизане adminUserSettings.submit=Съхранете потребителя adminUserSettings.changeUserRole=Промяна на ролята на потребителя -adminUserSettings.authenticated=Authenticated +adminUserSettings.authenticated=Удостоверен ############# # HOME-PAGE # @@ -267,7 +267,7 @@ home.fileToPDF.desc=Преобразуване почти всеки файл к fileToPDF.tags=трансформация,формат,документ,изображение,слайд,текст,преобразуване,офис,документи,word,excel,powerpoint home.ocr.title=OCR / Почистващи сканирания -home.ocr.desc=Почистване, сканира и открива текст от изображения към PDF и го добавя отново като текст. +home.ocr.desc=Почиства, сканира и открива текст от изображения в PDF и го добавя отново като текст. ocr.tags=разпознаване,текст,изображение,сканиране,четене,идентифициране,откриване,редактиране @@ -313,7 +313,7 @@ home.flatten.desc=Премахнете всички интерактивни е flatten.tags=статичен,деактивиран,неинтерактивен,рационализиран home.repair.title=Поправи -home.repair.desc=Опитва се да поправи повреден/счупен PDF +home.repair.desc=Опитва се да поправи повреден PDF repair.tags=поправка,възстановяване,корекция,възстановяване home.removeBlanks.title=Премахване на празни страници @@ -332,6 +332,10 @@ home.certSign.title=Подпишете със сертификат home.certSign.desc=Подписва PDF със сертификат/ключ (PEM/P12) certSign.tags=удостоверяване,PEM,P12,официален,шифроване +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Оформление с няколко страници home.pageLayout.desc=Слейте няколко страници от PDF документ в една страница pageLayout.tags=сливане,комбиниран,единичен изглед,организиране @@ -364,7 +368,7 @@ home.autoSplitPDF.title=Автоматично разделяне на стра home.autoSplitPDF.desc=Автоматично разделяне на сканиран PDF файл с QR код за разделяне на физически сканирани страници autoSplitPDF.tags=QR-базиран,отделен,сканиране-сегмент,организиране -home.sanitizePdf.title=Дезинфенкцирам +home.sanitizePdf.title=Обеззаразяване home.sanitizePdf.desc=Премахване на скриптове и други елементи от PDF файлове sanitizePdf.tags=чисти,сигурни,безопасни,премахване-заплахи @@ -382,8 +386,8 @@ home.MarkdownToPDF.desc=Преобразува всеки Markdown файл къ MarkdownToPDF.tags=маркиране,уеб-съдържание,трансформация,преобразуване -home.getPdfInfo.title=Вземете ЦЯЛАТА информация към PDF -home.getPdfInfo.desc=Взема всяка възможна информация от PDF файлове +home.getPdfInfo.title=Вземете ЦЯЛАТА информация от PDF +home.getPdfInfo.desc=Взима всяка възможна информация от PDF файлове getPdfInfo.tags=информация,данни,статистики,статистика @@ -405,7 +409,7 @@ home.autoRedact.title=Автоматично редактиране home.autoRedact.desc=Автоматично редактира (зачернява) текст в PDF въз основа на въведен текст autoRedact.tags=Редактиране,Скриване,затъмняване,черен,маркер,скрит -home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.title=PDF в CSV home.tableExtraxt.desc=Извлича таблици от PDF, като ги конвертира в CSV tableExtraxt.tags=CSV,извличане на таблица,извличане,конвертиране @@ -452,11 +456,12 @@ login.locked=Вашият акаунт е заключен. login.signinTitle=Моля впишете се login.ssoSignIn=Влизане чрез еднократно влизане login.oauth2AutoCreateDisabled=OAUTH2 Автоматично създаване на потребител е деактивирано -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2RequestNotFound=Заявката за оторизация не е намерена +login.oauth2InvalidUserInfoResponse=Невалидна информация за потребителя +login.oauth2invalidRequest=Невалидна заявка +login.oauth2AccessDenied=Отказан достъп +login.oauth2InvalidTokenResponse=Невалиден отговор на токена +login.oauth2InvalidIdToken=Невалиден токен за идентификатор #auto-redact @@ -637,7 +642,7 @@ scalePages.submit=Подайте #certSign -certSign.title=Подписване на сертификат +certSign.title=Подписване със сертификат certSign.header=Подпишете PDF с вашия сертификат (В процес на работа) certSign.selectPDF=Изберете PDF файл за подписване: certSign.jksNote=Забележка: Ако вашият тип сертификат не е в списъка по-долу, моля, конвертирайте го във файл на Java Keystore (.jks) с помощта на инструмента за команден ред keytool. След това изберете опцията за .jks файл по-долу. @@ -654,6 +659,13 @@ certSign.name=Име certSign.submit=Подпишете PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Премахване на празни места removeBlanks.header=Премахване на празни страници @@ -757,7 +769,7 @@ extractImages.submit=Извличане fileToPDF.title=Файл към PDF fileToPDF.header=Конвертирайте всеки файл към PDF fileToPDF.credit=Тази услуга използва LibreOffice и Unoconv за преобразуване на файлове. -fileToPDF.supportedFileTypesInfo=Supported File types +fileToPDF.supportedFileTypesInfo=Поддържание файлови типове fileToPDF.supportedFileTypes=Поддържаните типове файлове трябва да включват по-долу, но за пълен актуализиран списък на поддържаните формати, моля, вижте документацията на LibreOffice fileToPDF.submit=Преобразуване към PDF @@ -766,10 +778,10 @@ fileToPDF.submit=Преобразуване към PDF compress.title=Компресиране compress.header=Компресиране на PDF compress.credit=Тази услуга използва Ghostscript за PDF компресиране/оптимизиране. -compress.selectText.1=Ръчен режим - От 1 до 4 +compress.selectText.1=Ръчен режим - от 1 до 4 compress.selectText.2=Ниво на оптимизация: compress.selectText.3=4 (Ужасно за текстови изображения) -compress.selectText.4=Автоматичен режим - Автоматично настройва качеството, за да получи PDF точен размер +compress.selectText.4=Автоматичен режим - Автоматично настройва качеството, за да получи PDF с точен размер compress.selectText.5=Очакван PDF размер (напр. 25МБ, 10.8МБ, 25КБ) compress.submit=Компресиране @@ -810,7 +822,7 @@ pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1) #multiTool multiTool.title=PDF Мулти инструмент multiTool.header=PDF Мулти инструмент -multiTool.uploadPrompts=File Name +multiTool.uploadPrompts=Име на файл #view pdf viewPdf.title=Преглед на PDF @@ -909,8 +921,8 @@ watermark.selectText.7=Непрозрачност (0% - 100%): watermark.selectText.8=Тип воден знак: watermark.selectText.9=Изображение за воден знак: watermark.submit=Добавяне на воден знак -watermark.type.1=Text -watermark.type.2=Image +watermark.type.1=Текст +watermark.type.2=Изображение #Change permissions @@ -964,6 +976,7 @@ pdfToPDFA.credit=Тази услуга използва OCRmyPDF за PDF/A пр pdfToPDFA.submit=Преобразуване pdfToPDFA.tip=В момента не работи за няколко входа наведнъж pdfToPDFA.outputFormat=Изходен формат +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 814e8bbf..9880563f 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -332,6 +332,10 @@ home.certSign.title=Signa amb Certificat home.certSign.desc=Sign PDF amb Certificate/Clau (PEM/P12) certSign.tags=authentica,PEM,P12,official,encripta +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Multi-Page Layout home.pageLayout.desc=Merge multiple pages of a PDF document into a single page pageLayout.tags=merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Nom certSign.submit=Firma PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Elimina els espais en blanc removeBlanks.header=Elimina les pàgines en blanc @@ -964,6 +976,7 @@ pdfToPDFA.credit=Utilitza OCRmyPDF per la conversió a PDF/A pdfToPDFA.submit=Converteix pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 3e25e4a7..42539603 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -26,7 +26,7 @@ bored=Nudíte se při čekání? alphabet=Abeceda downloadPdf=Stáhnout PDF text=Text -font=Font +font=Písmo selectFillter=-- Vyberte -- pageNum=Číslo stránky sizes.small=Malé @@ -332,6 +332,10 @@ home.certSign.title=Podpis s certifikátem home.certSign.desc=Podpis PDF s certifikátem/klíčem (PEM/P12) certSign.tags=autentizace,PEM,P12,oficiální,šifrování +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Vícestránkové rozložení home.pageLayout.desc=Sloučení více stránek dokumentu PDF do jedné stránky pageLayout.tags=sloučit,kompozitní,jedno zobrazení,organizovat @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Název certSign.submit=Podepsat PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Odebrat prázdné stránky removeBlanks.header=Odebrat prázdné stránky @@ -964,6 +976,7 @@ pdfToPDFA.credit=Tato služba používá OCRmyPDF pro konverzi do formátu PDF/A pdfToPDFA.submit=Převést pdfToPDFA.tip=V současné době nepracuje pro více vstupů najednou pdfToPDFA.outputFormat=Výstupní formát +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index 6a5cc4ce..bd306345 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -71,7 +71,7 @@ visitGithub=GitHub-Repository besuchen donate=Spenden color=Farbe sponsor=Sponsor -info=Die Info +info=Informationen @@ -332,6 +332,10 @@ home.certSign.title=Mit Zertifikat signieren home.certSign.desc=Ein PDF mit einem Zertifikat/Schlüssel (PEM/P12) signieren certSign.tags=authentifizieren,pem,p12,offiziell,verschlüsseln +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Mehrseitiges Layout home.pageLayout.desc=Mehrere Seiten eines PDF zu einer Seite zusammenführen pageLayout.tags=zusammenführen,zusammensetzen,einzelansicht,organisieren @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Ungültige Benutzerinformationsantwort login.oauth2invalidRequest=ungültige Anfrage login.oauth2AccessDenied=Zugriff abgelehnt login.oauth2InvalidTokenResponse=Ungültige Token-Antwort +login.oauth2InvalidIdToken=Ungültiges ID-Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Name certSign.submit=PDF signieren +#removeCertSign +removeCertSign.title=Zertifikatsignatur entfernen +removeCertSign.header=Digitales Zertifikat aus dem PDF entfernen +removeCertSign.selectPDF=PDF-Datei auswählen: +removeCertSign.submit=Signatur entfernen + + #removeBlanks removeBlanks.title=Leere Seiten entfernen removeBlanks.header=Leere Seiten entfernen @@ -964,6 +976,7 @@ pdfToPDFA.credit=Dieser Dienst verwendet OCRmyPDF für die PDF/A-Konvertierung pdfToPDFA.submit=Konvertieren pdfToPDFA.tip=Dieser Dienst kann nur einzelne Eingangsdateien verarbeiten. pdfToPDFA.outputFormat=Ausgabeformat +pdfToPDFA.pdfWithDigitalSignature=Das PDF enthält eine digitale Signatur. Sie wird im nächsten Schritt entfernt. #PDFToWord diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index 335a1339..cd9552c4 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -332,6 +332,10 @@ home.certSign.title=Υπογραφή με Πιστοποιητικό home.certSign.desc=Υπογραφή ενός PDF αρχείου με ένα Πιστοποιητικό/Κλειδί (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Διάταξη πολλών σελίδων home.pageLayout.desc=Συγχώνευση πολλαπλών σελίδων ενός εγγράφου PDF σε μία μόνο σελίδα pageLayout.tags=merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Όνομα certSign.submit=Υπογραφή PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Αφαίρεση Κενών removeBlanks.header=Αφαίρεση Κενών Σελίδων @@ -964,6 +976,7 @@ pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί OCRmyPDF pdfToPDFA.submit=Μετατροπή pdfToPDFA.tip=Προς το παρόν δεν λειτουργεί για πολλαπλές εισόδους ταυτόχρονα pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index cf4b6cf3..0b41cce5 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -332,6 +332,10 @@ home.certSign.title=Sign with Certificate home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Multi-Page Layout home.pageLayout.desc=Merge multiple pages of a PDF document into a single page pageLayout.tags=merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Name certSign.submit=Sign PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Remove Blanks removeBlanks.header=Remove Blank Pages @@ -964,6 +976,7 @@ pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion pdfToPDFA.submit=Convert pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 5a2258b4..d1c235f3 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -332,6 +332,10 @@ home.certSign.title=Sign with Certificate home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Multi-Page Layout home.pageLayout.desc=Merge multiple pages of a PDF document into a single page pageLayout.tags=merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Name certSign.submit=Sign PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Remove Blanks removeBlanks.header=Remove Blank Pages @@ -964,6 +976,7 @@ pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion pdfToPDFA.submit=Convert pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 4f186c40..03126849 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -332,6 +332,10 @@ home.certSign.title=Firmar con certificado home.certSign.desc=Firmar un PDF con un Certificado/Clave (PEM/P12) certSign.tags=autentificar,PEM,P12,oficial,encriptar +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Diseño de varias páginas home.pageLayout.desc=Unir varias páginas de un documento PDF en una sola página pageLayout.tags=unir,compuesto,vista única,organizar @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Nombre certSign.submit=Firmar PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Eliminar espacios en blanco removeBlanks.header=Eliminar páginas en blanco @@ -964,6 +976,7 @@ pdfToPDFA.credit=Este servicio usa OCRmyPDF para la conversión a PDF/A pdfToPDFA.submit=Convertir pdfToPDFA.tip=Actualmente no funciona para múltiples entrada a la vez pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 4784293c..b4da403b 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -332,6 +332,10 @@ home.certSign.title=Sinatu ziurtagiriarekin home.certSign.desc=Sinatu PDF bat Ziurtagiri/Gako batekin (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Zenbait orrialderen diseinua home.pageLayout.desc=Elkartu orri bakar batean PDF dokumentu baten zenbait orrialde pageLayout.tags=merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Izena certSign.submit=Sinatu PDFa +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Ezabatu zuriuneak removeBlanks.header=Ezabatu orrialde zuriak @@ -964,6 +976,7 @@ pdfToPDFA.credit=Zerbitzu honek OCRmyPDF erabiltzen du PDFak PDF/A bihurtzeko pdfToPDFA.submit=Bihurtu pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index bd87d628..e8dd429b 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -332,6 +332,10 @@ home.certSign.title=Signer avec un certificat home.certSign.desc=Signez un PDF avec un certificat ou une clé (PEM/P12). certSign.tags=signer,chiffrer,certificat,authenticate,PEM,P12,official,encrypt +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Fusionner des pages home.pageLayout.desc=Fusionnez plusieurs pages d’un PDF en une seule. pageLayout.tags=fusionner,merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Nom certSign.submit=Signer +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Supprimer les pages vierges removeBlanks.header=Supprimer les pages vierges @@ -964,6 +976,7 @@ pdfToPDFA.credit=Ce service utilise OCRmyPDF pour la conversion en PDF/A. pdfToPDFA.submit=Convertir pdfToPDFA.tip=Ne fonctionne actuellement pas pour plusieurs entrées à la fois pdfToPDFA.outputFormat=Format de sortie +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 9cb61c44..ea85f397 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -332,6 +332,10 @@ home.certSign.title=प्रमाणपत्र के साथ हस्त home.certSign.desc=पीडीएफ़ को प्रमाणपत्र/कुंजी (PEM/P12) के साथ हस्ताक्षरित करता है। certSign.tags=प्रमाणीकरण, PEM, P12, आधिकारिक, एन्क्रिप्ट +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=मल्टी-पेज लेआउट home.pageLayout.desc=पीडीएफ़ दस्तावेज़ के कई पेजों को एक ही पेज में मर्ज करता है। pageLayout.tags=मर्ज, संयोजित, एकल दृश्य, संगठित @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=नाम certSign.submit=पीडीएफ़ पर हस्ताक्षर करें +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=खाली पेज हटाएं removeBlanks.header=खाली पेज हटाएं @@ -964,6 +976,7 @@ pdfToPDFA.credit=इस सेवा में PDF/A परिवर्तन pdfToPDFA.submit=परिवर्तित करें pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties new file mode 100644 index 00000000..e5e4d92f --- /dev/null +++ b/src/main/resources/messages_hr_HR.properties @@ -0,0 +1,1093 @@ +########### +# Generic # +########### +# the direction that the language is written (ltr = left to right, rtl = right to left) +language.direction=ltr + +pdfPrompt=Odaberi PDF(ove) +multiPdfPrompt=Odaberi PDF-ove (2+) +multiPdfDropPrompt=Odaberi (ili povuci i ispusti) sve potrebne PDF-ove +imgPrompt=Odaberi sliku (slike) +genericSubmit=Pošalji +processTimeWarning=Upozorenje: Ovaj proces može trajati i do minutu, u zavisnosti od veličine dokumenta +pageOrderPrompt=Prilagođeni redoslijed stranica (unesi listu brojeva stranica ili funkcija, kao što su 2n+1, razdvojene zarezima) : +pageSelectionPrompt=Prilagođeni odabir stranica (unesi listu brojeva stranica ili funkcija, kao što su 2n+1, razdvojene zarezima) : +goToPage=Idi na stranicu +true=Točno +false=Netočno +unknown=Nepoznato +save=Spremi +saveToBrowser=spremi u Preglednik +close=Zatvori +filesSelected=odabrane datoteke +noFavourites=Nema dodanih favorita +downloadComplete=Preuzimanje završeno +bored=Dosađujete se čekajući? +alphabet=Abeceda +downloadPdf=Preuzmi PDF +text=Tekst +font=Font +selectFillter=-- Odaberi -- +pageNum=Broj stranice +sizes.small=Malo +sizes.medium=Srednje +sizes.large=Veliko +sizes.x-large=Jako veliko +error.pdfPassword=PDF dokument je šifriran i zaporka nije dana ili je netočna +delete=Izbriši +username=Korisničko ime +password=Zaporka +welcome=Dobrodošli +property=Svojstvo +black=Crno +white=Bijelo +red=Crveno +green=Zeleno +blue=Plavo +custom=Prilagođeno... +WorkInProgess=Radovi u tijeku, u slučaju grešaka molimo prijavite probleme! +poweredBy=Pokreće +yes=Da +no=Ne +changedCredsMessage=Podaci za prijavu uspješno promijenjeni! +notAuthenticatedMessage=Korisnik nije autentificiran. +userNotFoundMessage=Korisnik nije pronađen. +incorrectPasswordMessage=Kriva zaporka. +usernameExistsMessage=Korisničko ime već postoji +invalidUsernameMessage=Nevažeće korisničko ime, korisničko ime može sadržavati samo slova, brojke i sljedeće posebne znakove @._+- ili mora biti važeća adresa e-pošte. +deleteCurrentUserMessage=Nije moguće izbrisati trenutno prijavljenog korisnika. +deleteUsernameExistsMessage=Korisničko ime ne postoji i ne može se izbrisati. +downgradeCurrentUserMessage=Nije moguće vratiti unazad ulogu trenutnog korisnika +downgradeCurrentUserLongMessage=Nije moguće vratiti unazad ulogu trenutnog korisnika. Dakle, trenutni korisnik neće biti prikazan. +userAlreadyExistsOAuthMessage=Korisnik već postoji kao OAuth2 korisnik. +userAlreadyExistsWebMessage=Korisnik već postoji kao web korisnik. +error=Greška +oops=Ups! +help=Pomoć +goHomepage=Idi na početnu stranicu +joinDiscord=Pridruži se našem Discord serveru +seeDockerHub=Vidi Docker Hub +visitGithub=Posjeti Github Repository +donate=Doniraj +color=Boja +sponsor=Sponzor +info=Info + + + +############### +# Pipeline # +############### +pipeline.header=Pipeline Meni (Beta) +pipeline.uploadButton=Prenesi prilagođeno +pipeline.configureButton=Konfigurirati +pipeline.defaultOption=Prilagođeno +pipeline.submitButton=Pošalji +pipeline.help=Pipeline Pomoć +pipeline.scanHelp=Pomoć za skeniranje mapa + +###################### +# Pipeline Options # +###################### +pipelineOptions.header=Pipeline Konfiguracija +pipelineOptions.pipelineNameLabel=Pipeline Ime +pipelineOptions.saveSettings=Spremi Postavke +pipelineOptions.pipelineNamePrompt=Unesite naziv pipeline-a ovdje +pipelineOptions.selectOperation=Odaberite Operaciju +pipelineOptions.addOperationButton=Dodajte operaciju +pipelineOptions.pipelineHeader=Pipeline: +pipelineOptions.saveButton=Preuzmi datoteku +pipelineOptions.validateButton=Potvrdi + + + + +############# +# NAVBAR # +############# +navbar.favorite=Favoriti +navbar.darkmode=Tamni Način Rada +navbar.language=Jezici +navbar.settings=Postavke +navbar.allTools=Alati +navbar.multiTool=Multi Tools (Alati) +navbar.sections.organize=Organizirati +navbar.sections.convertTo=Pretvori u PDF +navbar.sections.convertFrom=Pretvori iz PDF +navbar.sections.security=Potpis & sigurnost +navbar.sections.advance=Napredno +navbar.sections.edit=Pregled & Uređivanje + +############# +# SETTINGS # +############# +settings.title=Postavke +settings.update=Dostupno ažuriranje +settings.updateAvailable={0} je trenutno instalirana verzija. Dostupna je nova verzija ({1}). +settings.appVersion=Verzija aplikacije: +settings.downloadOption.title=Odaberite opciju preuzimanja (Za preuzimanje pojedinačnih datoteka bez zip formata): +settings.downloadOption.1=Otvori u istom prozoru +settings.downloadOption.2=Otvori u novom prozoru +settings.downloadOption.3=Preuzmi datoteku +settings.zipThreshold=Spremi .zip datoteku kada broj preuzetih datoteka pređe +settings.signOut=Odjava +settings.accountSettings=Postavke računa +settings.bored.help=Omogućuje "easter egg" igru +settings.cacheInputs.name=Spremi unose obrazaca +settings.cacheInputs.help=omogućiti pohranjivanje prethodno korištenih ulaza za buduća izvođenja + +changeCreds.title=Promijeni pristupne podatke +changeCreds.header=Ažurirajte korisničke podatke +changeCreds.changePassword=Koristite zadanu lozinku za prijavu. Unesite novu lozinku +changeCreds.newUsername=Novo korisničko ime +changeCreds.oldPassword=Trenutna zaporka +changeCreds.newPassword=Nova zaporka +changeCreds.confirmNewPassword=Potvrdite novu lozinku +changeCreds.submit=Potvrdi + + + +account.title=Postavke računa +account.accountSettings=Postavke računa +account.adminSettings=Admin Postavka - Pregled i dodavanje korisnika +account.userControlSettings=Postavke kontrole korisnika +account.changeUsername=Promijeni korisničko ime +account.newUsername=Novo korisničko ime +account.password=Potvrda lozinke +account.oldPassword=Stara zaporka +account.newPassword=Nova zaporka +account.changePassword=Promijeni lozinku +account.confirmNewPassword=Potvrdi novu lozinku +account.signOut=Odjava +account.yourApiKey=Tvoj API ključ +account.syncTitle=Sinkronizirajte postavke preglednika s računom +account.settingsCompare=Usporedba postavki: +account.property=Svojstvo +account.webBrowserSettings=Postavka web-preglednika +account.syncToBrowser=Sinkronizacija Račun -> Preglednik +account.syncToAccount=Sinkronizacija Račun <- Preglednik + + +adminUserSettings.title=Postavka kontrole korisnika +adminUserSettings.header=Postavka kontrole korisnika za administratora +adminUserSettings.admin=Administrator +adminUserSettings.user=Korisnik +adminUserSettings.addUser=Dodaj novog korisnika +adminUserSettings.usernameInfo=Korisničko ime može sadržavati samo slova, brojke i sljedeće posebne znakove @._+- ili mora biti važeća adresa e-pošte. +adminUserSettings.roles=Uloge +adminUserSettings.role=Uloga +adminUserSettings.actions=Akcije +adminUserSettings.apiUser=Korisnik s ograničenim API pristupom +adminUserSettings.extraApiUser=Dodatni korisnik s ograničenim API pristupom +adminUserSettings.webOnlyUser=Web Korisnik +adminUserSettings.demoUser=Demo korisnik (Bez prilagođenih Postavki) +adminUserSettings.internalApiUser=Interni API Korisnik +adminUserSettings.forceChange=Prisiliti korisnika da promijeni lozinku prilikom prijave +adminUserSettings.submit=Spremi korisnika +adminUserSettings.changeUserRole=Promijenite korisničku ulogu +adminUserSettings.authenticated=Autentificirano + +############# +# HOME-PAGE # +############# +home.desc=Sve na jednom mjestu za sve vaše PDF potrebe. +home.searchBar=Pretraži funkcije... + + +home.viewPdf.title=Pregledaj PDF +home.viewPdf.desc=Pregledaj, komentiraj, dodaj tekst ili slike +viewPdf.tags=pregled,čitanje,komentiranje,tekst,slika + +home.multiTool.title=PDF Višestruki alat +home.multiTool.desc=Spajanje, rotiranje, preuređivanje i uklanjanje stranica +multiTool.tags=Višestruki alat, više operacija, korisničko sučelje, povlačenje klikom, prednji kraj, strana klijenta, interaktivno, nepopravljivo, pomicanje + +home.merge.title=Spajanje +home.merge.desc=Jednostavno spojite više PDF-ova u jedan. +merge.tags=spajanje,Operacije sa stranicama,Backend,poslužiteljska strana + +home.split.title=Razdvajanje +home.split.desc=Razdvojite PDF-ove u više dokumenata +split.tags=Operacije stranice, dijeljenje, više stranica, rezanje,poslužiteljska strana + +home.rotate.title=Rotacija +home.rotate.desc=Jednostavno rotirajte vaše PDF-ove. +rotate.tags=poslužiteljska strana + + +home.imageToPdf.title=Slika u PDF +home.imageToPdf.desc=Pretvorite sliku (PNG, JPEG, GIF) u PDF. +imageToPdf.tags=konverzija,pretvaranje,img,jpg,slika,foto + +home.pdfToImage.title=PDF u Sliku +home.pdfToImage.desc=Pretvorite PDF u sliku. (PNG, JPEG, GIF) +pdfToImage.tags=konverzija,img,jpg,slika,foto + +home.pdfOrganiser.title=Organiziranje +home.pdfOrganiser.desc=Uklonite/preuredite stranice bilo kojim redoslijedom +pdfOrganiser.tags=duplex,even,odd,sort,move + + +home.addImage.title=Dodaj sliku +home.addImage.desc=Dodaje sliku na zadano mjesto u PDF-u +addImage.tags=img,jpg,slika,foto + +home.watermark.title=Dodaj vodeni žig +home.watermark.desc=DDodajte prilagođeni vodeni žig svom PDF dokumentu. +watermark.tags=Tekst,ponavljanje,etiketa,vlastiti,autorsko pravo,zaštita, img,jpg,slika,foto + +home.permissions.title=Promjena dopuštenja +home.permissions.desc=Promijenite dopuštenja svog PDF dokumenta +permissions.tags=čitanje,pisanje,izmjena,print + + +home.removePages.title=Ukloniti +home.removePages.desc=Izbrišite neželjene stranice iz svog PDF dokumenta. +removePages.tags=Ukloni stranice,izbriši stranice + +home.addPassword.title=Dodaj lozinku +home.addPassword.desc=Šifrirajte svoj PDF dokument lozinkom.. +addPassword.tags=sigurno, sigurnost + +home.removePassword.title=Ukloni lozinku +home.removePassword.desc=Uklonite zaštitu lozinkom sa svog PDF dokumenta.. +removePassword.tags=sigurno, dešifriranje, sigurnost, poništi lozinku, izbriši lozinku + +home.compressPdfs.title=Komprimiraj +home.compressPdfs.desc=Komprimirajte PDF-ove kako biste smanjili njihovu veličinu. +compressPdfs.tags=squish, mali, maleni + + +home.changeMetadata.title=Promjena metapodataka +home.changeMetadata.desc=Promjeni/Ukloni/Dodaj metapodatke iz PDF dokumenta +changeMetadata.tags=Naslov,autor,datum,kreacije,vrijeme,izdavač,proizvođač,statistike + +home.fileToPDF.title=Pretvori datoteku u PDF +home.fileToPDF.desc=Pretvorite gotovo sve datoteke u PDF (DOCX, PNG, XLS, PPT, TXT i više) +fileToPDF.tags=transformacija,format,dokument,slika,slajd,tekst,konverzija,office,docs,word,excel,powerpoint + +home.ocr.title=OCR / Čišćenje skeniranih dokumenata +home.ocr.desc=Čišćenje skenira i otkriva tekst sa slika unutar PDF-a i ponovno ga dodaje kao tekst. +ocr.tags=prepoznavanje,tekst,slika,sken,čitanje,identifikacija,detektiranje,uređivanje + + +home.extractImages.title=Ekstrakt slika +home.extractImages.desc=Izdvaja sve slike iz PDF-a i sprema ih u zip format +extractImages.tags=slika, fotografija, spremanje, arhiva, zip, snimanje, zgrabi + +home.pdfToPDFA.title=PDF u PDF/A +home.pdfToPDFA.desc=Pretvorite PDF u PDF/A za dugoročnu pohranu +pdfToPDFA.tags=arhiva,dugoročno,standardno,konverzija,čuvanje,čuvanje + +home.PDFToWord.title=PDF u Word +home.PDFToWord.desc=Pretvorite PDF u Word formate (DOC, DOCX i ODT) +PDFToWord.tags=doc,docx,odt,word,transformacija,format,konverzija,office,microsoft,docfile + +home.PDFToPresentation.title=PDF u Prezentaciju +home.PDFToPresentation.desc=Pretvorite PDF u formate za prezentaciju (PPT, PPTX i ODP) +PDFToPresentation.tags=slajdovi,prikaz,office,microsoft + +home.PDFToText.title=PDF u RTF (Tekst) +home.PDFToText.desc=Pretvorite PDF u tekst ili RTF format +PDFToText.tags=richformat,richtextformat,rich text format + +home.PDFToHTML.title=PDF u HTML +home.PDFToHTML.desc=Pretvorite PDF u HTML format +PDFToHTML.tags=web sadržaj,prijateljski za pretraživače + + +home.PDFToXML.title=PDF u XML +home.PDFToXML.desc=Pretvorite PDF u XML format +PDFToXML.tags=izdvajanje-podataka,strukturirani-sadržaj,interop,transformacija,konvertiranje + +home.ScannerImageSplit.title=Otkrij/razdvoji skenirane fotografije +home.ScannerImageSplit.desc=Razdvaja više fotografija iz fotografije/PDF-a +ScannerImageSplit.tags=razdvoji,auto-detekcija,skeniranja,višestruke fotografije,organizacija + +home.sign.title=Potpisati +home.sign.desc=Dodaje potpis u PDF crtežom, tekstom ili slikom +sign.tags=autorizacija,inicijali,crtani-potpis,tekstualni-potpis,slikovni-potpis + +home.flatten.title=Ravnanje (Flatten) +home.flatten.desc=Uklonite sve interaktivne elemente i obrasce iz PDF-a +flatten.tags=statično,deaktivirati,neinteraktivno,usmjeriti + +home.repair.title=Popravi +home.repair.desc=Pokušava popraviti oštećeni/pokvareni PDF +repair.tags=popravi,vrati,korekcija,obnovi + +home.removeBlanks.title=Ukloni prazne stranice +home.removeBlanks.desc=Otkriva i uklanja prazne stranice iz dokumenta +removeBlanks.tags=čišćenje,usmjeriti,ne-sadržaj,organizacija + +home.removeAnnotations.title=Ukloni komentare +home.removeAnnotations.desc=Uklanja sve komentare/anotacije iz PDF-a +removeAnnotations.tags=komentari,isticanje,bilješke,oznake,ukloni + +home.compare.title=Uporedi +home.compare.desc=Uspoređuje i pokazuje razlike između 2 PDF dokumenta +compare.tags=razlikovati,kontrast,izmjene,analiza + +home.certSign.title=Potpišite s certifikatom +home.certSign.desc=Potpisuje PDF s certifikatom/ključem (PEM/P12) +certSign.tags=autentifikacija,PEM,P12,zvanično,šifriranje + +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + +home.pageLayout.title=Izgled s više stranica +home.pageLayout.desc=Spojite više stranica PDF dokumenta u jednu stranicu +pageLayout.tags=spajanje,kompozitni,pojedinačan-prikaz,organizacija + +home.scalePages.title=Prilagodite veličinu/razmjer stranice +home.scalePages.desc=Promijenite veličinu/razmjer stranice i/ili njezin sadržaj. +scalePages.tags=izmjena,modifikacija,dimenzija,adaptacija + +home.pipeline.title=Pipeline (Advanced) +home.pipeline.desc=Izvršite više radnji na PDF-ovima definiranjem skripti u pipeline-u +pipeline.tags=automatizacija,sekvenciranje,skriptirano,batch-process + +home.add-page-numbers.title=Dodaj brojeve stranica +home.add-page-numbers.desc=Dodajte brojeve stranica kroz dokument na određeno mjesto +add-page-numbers.tags=paginirati, označiti, organizirati, indeksirati + +home.auto-rename.title=Automatsko preimenovanje PDF datoteka +home.auto-rename.desc=Automatski preimenuje PDF datoteku na temelju otkrivenog zaglavlja +auto-rename.tags=auto-detekcija,zaglavlje-bazirano,organizacija,preimenovanje + +home.adjust-contrast.title=Podesi boje/kontrast +home.adjust-contrast.desc=Podesite kontrast, zasićenost i svjetlinu PDF-a +adjust-contrast.tags=korekcija boje, ugađanje, modificiranje, poboljšanje + +home.crop.title=Izrežite PDF +home.crop.desc=Izrežite PDF kako biste smanjili njegovu veličinu (zadržava tekst!) +crop.tags=obrezivanje, smanjivanje, uređivanje, oblikovanje + +home.autoSplitPDF.title=Automatsko dijeljenje stranica +home.autoSplitPDF.desc=Automatsko dijeljenje skeniranog PDF-a s fizičkim QR kodom za dijeljenje stranica +autoSplitPDF.tags=QR-bazirano,razdvoji,segment-skeniranja,organizacija + +home.sanitizePdf.title=Dezinficirati (Sanitize) +home.sanitizePdf.desc=Uklonite skripte i druge elemente iz PDF datoteka +sanitizePdf.tags=čisto, sigurno, sigurno, uklanjanje prijetnji + +home.URLToPDF.title=URL/Webstranica u PDF +home.URLToPDF.desc=Pretvara bilo koji http(s)URL u PDF +URLToPDF.tags=uhvati-web,sačuvaj-stranicu,web-u-doc,arhiva + +home.HTMLToPDF.title=HTML u PDF +home.HTMLToPDF.desc=Pretvara bilo koji HTML datoteku ili zip u PDF +HTMLToPDF.tags=oznake,web-sadržaj,transformacija,konvertiranje + + +home.MarkdownToPDF.title=Markdown u PDF +home.MarkdownToPDF.desc=Pretvara bilo koju Markdown datoteku u PDF +MarkdownToPDF.tags=oznake,web-sadržaj,transformacija,konvertiranje + + +home.getPdfInfo.title=Dohvati SVE informacije o PDF-u +home.getPdfInfo.desc=Dohvaća sve moguće informacije o PDF-ovima +getPdfInfo.tags=informacije,podaci,statistike + + +home.extractPage.title=Izdvoji stranicu(e) +home.extractPage.desc=Izdvaja odabrane stranice iz PDF-a +extractPage.tags=izdvajanje + + +home.PdfToSinglePage.title=PDF u Jednu Veliku Stranicu +home.PdfToSinglePage.desc=Spaja sve PDF stranice u jednu veliku stranicu +PdfToSinglePage.tags=jedna-stranica + + +home.showJS.title=Prikaži JavaScript +home.showJS.desc=Pretražuje i prikazuje bilo koji JavaScript umetnut u PDF +showJS.tags=JS + +home.autoRedact.title=Automatsko uređivanje +home.autoRedact.desc=Automatski redigira (zacrni) tekst u PDF-u na temelju unosa teksta +autoRedact.tags=Cenzura,Sakrij,prekrivanje,crna,marker,skriveno + +home.tableExtraxt.title=PDF u CSV +home.tableExtraxt.desc=Izdvaja tablice iz PDF-a pretvarajući ga u CSV +tableExtraxt.tags=CSV,Izdvajanje tabela,izdvajanje,pretvaranje + + +home.autoSizeSplitPDF.title=Automatska podjela po veličini/broju +home.autoSizeSplitPDF.desc=Podijelite jedan PDF na više dokumenata na temelju veličine, broja stranica ili broja dokumenata +autoSizeSplitPDF.tags=pdf,podjela,dokumenti,organizacija + + +home.overlay-pdfs.title=Preklapanje PDF-ova +home.overlay-pdfs.desc=Preklapa PDF-ove na drugi PDF +overlay-pdfs.tags=Preklapanje + +home.split-by-sections.title=Podijeli PDF po odjeljcima +home.split-by-sections.desc=Svaku stranicu PDF-a podijelite na manje vodoravne i okomite dijelove +split-by-sections.tags=Dijeljenje odjeljaka,Dijeljenje,Postavke + +home.AddStampRequest.title=Dodaj pečat u PDF +home.AddStampRequest.desc=Dodajte tekst ili dodajte slikovne oznake na postavljenim mjestima +AddStampRequest.tags=Pečat, dodavanje slike, središnja slika, vodeni žig, PDF, ugradnja, prilagodba + + +home.PDFToBook.title=PDF u Book +home.PDFToBook.desc=Pretvara PDF u format knjige/stripa pomoću calibre +PDFToBook.tags=Knjiga,Strip,Calibre,Pretvori,manga,amazon,kindle + +home.BookToPDF.title=Book u PDF +home.BookToPDF.desc=Pretvara format knjige/stripa u PDF format pomoću calibre +BookToPDF.tags=Knjiga,Strip,Calibre,Pretvori,manga,amazon,kindle + + +########################### +# # +# WEB PAGES # +# # +########################### +#login +login.title=Prijavite se +login.header=Prijavite se +login.signin=Prijavite se +login.rememberme=Zapamti me +login.invalid=Neispravno korisničko ime ili zaporka. +login.locked=Vaš račun je zaključan. +login.signinTitle=Molimo vas da se prijavite +login.ssoSignIn=Prijavite se putem jedinstvene prijave +login.oauth2AutoCreateDisabled=OAUTH2 automatsko kreiranje korisnika je onemogućeno +login.oauth2RequestNotFound=Zahtjev za autorizaciju nije pronađen +login.oauth2InvalidUserInfoResponse=Nevažeće informacije o korisniku +login.oauth2invalidRequest=Neispravan zahtjev +login.oauth2AccessDenied=Pristup odbijen +login.oauth2InvalidTokenResponse=Nevažeći odgovor tokena +login.oauth2InvalidIdToken=Nevažeći ID token + + +#auto-redact +autoRedact.title=Automatsko uređivanje +autoRedact.header=Automatsko uređivanje +autoRedact.colorLabel=Boja +autoRedact.textsToRedactLabel=Tekst za uređivanje (razdvojen linijama) +autoRedact.textsToRedactPlaceholder=npr. \nPovjerljivo \nStrogo čuvana tajna +autoRedact.useRegexLabel=Koristi Regex +autoRedact.wholeWordSearchLabel=Pretraživanje cijelih riječi +autoRedact.customPaddingLabel=Dodatni prazan prostor +autoRedact.convertPDFToImageLabel=Pretvorite PDF u PDF-sliku (koristi se za uklanjanje teksta iza okvira) +autoRedact.submitButton=Potvrdi + + +#showJS +showJS.title=Prikaži Javascript +showJS.header=Prikaži Javascript +showJS.downloadJS=Preuzmite Javascript +showJS.submit=Prikaži + + +#pdfToSinglePage +pdfToSinglePage.title=PDF u Jednu Stranicu +pdfToSinglePage.header=PDF u Jednu Stranicu +pdfToSinglePage.submit=Pretvori u Jednu Stranicu + + +#pageExtracter +pageExtracter.title=Izdvojiti stranice +pageExtracter.header=Izdvojiti stranice +pageExtracter.submit=Izdvoji +pageExtracter.placeholder=(t.j. 1,2,8 ili 4,7,12-16 ili 2n-1) + + +#getPdfInfo +getPdfInfo.title=Informacije o PDF-u +getPdfInfo.header=Informacije o PDF-u +getPdfInfo.submit=Informacije +getPdfInfo.downloadJson=Preuzmite JSON + + +#markdown-to-pdf +MarkdownToPDF.title=Markdown u PDF +MarkdownToPDF.header=Markdown u PDF +MarkdownToPDF.submit=Pretvori +MarkdownToPDF.help=Rad u toku +MarkdownToPDF.credit=Koristi WeasyPrint + + + +#url-to-pdf +URLToPDF.title=URL u PDF +URLToPDF.header=URL u PDF +URLToPDF.submit=Pretvori +URLToPDF.credit=Koristi WeasyPrint + + +#html-to-pdf +HTMLToPDF.title=HTML u PDF +HTMLToPDF.header=HTML u PDF +HTMLToPDF.help=Prihvaća HTML datoteke i ZIP-ove koji sadrže html/css/slike itd. potrebno +HTMLToPDF.submit=Pretvori +HTMLToPDF.credit=Koristi WeasyPrint +HTMLToPDF.zoom=Razina zumiranja za prikaz web stranice. +HTMLToPDF.pageWidth=Širina stranice u centimetrima. (Prazno u Zadano) +HTMLToPDF.pageHeight=Visina stranice u centimetrima. (Prazno u Zadano) +HTMLToPDF.marginTop=Gornja margina stranice u milimetrima. (Prazno u Zadano) +HTMLToPDF.marginBottom=Donja margina stranice u milimetrima. (Prazno u Zadano) +HTMLToPDF.marginLeft=Lijeva margina stranice u milimetrima. (Prazno u Zadano) +HTMLToPDF.marginRight=Desna margina stranice u milimetrima. (Prazno u Zadano) +HTMLToPDF.printBackground=Prikaz pozadine web stranica. +HTMLToPDF.defaultHeader=Omogući zadano zaglavlje (Ime i broj stranice) +HTMLToPDF.cssMediaType=Promijenite vrstu CSS medija stranice. +HTMLToPDF.none=Nijedan +HTMLToPDF.print=Ispis +HTMLToPDF.screen=Zaslon + + +#AddStampRequest +AddStampRequest.header=Pečat PDF +AddStampRequest.title=Pečat PDF +AddStampRequest.stampType=Pečat Tip +AddStampRequest.stampText=Pečat Tekst +AddStampRequest.stampImage=Pečat Slika +AddStampRequest.alphabet=Abeceda +AddStampRequest.fontSize=Veličina fonta/slike +AddStampRequest.rotation=Rotacija +AddStampRequest.opacity=Neprozirnost +AddStampRequest.position=Položaj +AddStampRequest.overrideX=Poništi X koordinatu +AddStampRequest.overrideY=Poništi Y koordinatu +AddStampRequest.customMargin=Prilagođena margina +AddStampRequest.customColor=Prilagođena boja teksta +AddStampRequest.submit=Pošalji + + +#sanitizePDF +sanitizePDF.title=Sanirajte PDF +sanitizePDF.header=Sanirajte PDF datoteku +sanitizePDF.selectText.1=Ukloni JavaScript akcije +sanitizePDF.selectText.2=Ukloni ugrađene datoteke +sanitizePDF.selectText.3=Ukloni metapodatke +sanitizePDF.selectText.4=Ukloni poveznice +sanitizePDF.selectText.5=Uklonite fontove +sanitizePDF.submit=Sanirajte PDF + + +#addPageNumbers +addPageNumbers.title=Dodavanje brojeva stranica +addPageNumbers.header=Dodavanje brojeva stranica +addPageNumbers.selectText.1=Odaberi PDF datoteku: +addPageNumbers.selectText.2=Veličina margine +addPageNumbers.selectText.3=Položaj +addPageNumbers.selectText.4=Početni broj +addPageNumbers.selectText.5=Brojanje stranica +addPageNumbers.selectText.6=Prilagođeni tekst +addPageNumbers.customTextDesc=Prilagođeni tekst +addPageNumbers.numberPagesDesc=Koje stranice numerirati, zadano je 'sve', također prihvaća 1-5 ili 2,5,9 itd. +addPageNumbers.customNumberDesc=Zadano je {n}, također prihvaća 'Stranica {n} od {total}', 'Tekst-{n}', '{ime datoteke}-{n}' +addPageNumbers.submit=Dodaj brojeve stranica + + +#auto-rename +auto-rename.title=Automatski preimenuj +auto-rename.header=Automatski preimenuj PDF +auto-rename.submit=Automatski preimenuj + + +#adjustContrast +adjustContrast.title=Podesite kontrast +adjustContrast.header=Podesite kontrast +adjustContrast.contrast=Kontrast: +adjustContrast.brightness=Osvjetljenje: +adjustContrast.saturation=Zasićenje: +adjustContrast.download=Preuzmi + + +#crop +crop.title=Izreži +crop.header=Izreži sliku +crop.submit=Potvrdi + + +#autoSplitPDF +autoSplitPDF.title=Automatsko dijeljenje PDF-a +autoSplitPDF.header=Automatsko dijeljenje PDF-a +autoSplitPDF.description=Ispišite, umetnite, skenirajte, učitajte i dopustite nam da automatski odvojimo vaše dokumente. Nije potrebno ručno sortiranje. +autoSplitPDF.selectText.1=Ispišite nekoliko razdjelnih listova odozdo (crno-bijelo je u redu). +autoSplitPDF.selectText.2=Skenirajte sve dokumente odjednom umetanjem razdjelnog lista između njih. +autoSplitPDF.selectText.3=Prenesite jednu veliku skeniranu PDF datoteku i pustite našem PDF-u da se pobrine za ostalo. +autoSplitPDF.selectText.4=Razdjelne stranice automatski se otkrivaju i uklanjaju, jamčeći uredan konačni dokument. +autoSplitPDF.formPrompt=Pošaljite PDF koji sadrži naše razdjelnike stranica: +autoSplitPDF.duplexMode=Obostrani način rada (skeniranje s prednje i stražnje strane) +autoSplitPDF.dividerDownload1=Preuzmite 'Auto Splitter Divider (minimalan).pdf' +autoSplitPDF.dividerDownload2=Preuzmite 'Auto Splitter Divider (s uputama).pdf' +autoSplitPDF.submit=Potvrdi + + +#pipeline +pipeline.title=Tok rada + + +#pageLayout +pageLayout.title=Izgled s više stranica +pageLayout.header=Izgled s više stranica +pageLayout.pagesPerSheet=Broj stranica po listu: +pageLayout.addBorder=Dodajte granice dokumenta +pageLayout.submit=Potvrdi + + +#scalePages +scalePages.title=Podesite veličinu stranice +scalePages.header=Podesite veličinu stranice +scalePages.pageSize=Veličina stranice dokumenta. +scalePages.scaleFactor=Razina zumiranja (obrezivanje) stranice. +scalePages.submit=Potvrdi + + +#certSign +certSign.title=Potpisivanje Certifikatom +certSign.header=Potpišite PDF svojim certifikatom (Rad u tijeku) +certSign.selectPDF=Odaberite PDF datoteku za potpisivanje: +certSign.jksNote=Napomena: Ako vrsta vašeg certifikata nije navedena u nastavku, pretvorite ga u datoteku Java Keystore (.jks) pomoću alata naredbenog retka keytool. Zatim odaberite opciju .jks datoteke u nastavku. +certSign.selectKey=Odaberite svoju datoteku privatnog ključa (format PKCS#8, može biti .pem ili .der): +certSign.selectCert=Odaberite svoju datoteku certifikata (format X.509, može biti .pem ili .der): +certSign.selectP12=Odaberite svoju PKCS#12 datoteku pohrane ključeva (.p12 ili .pfx) (neobavezno, ako je dostupna, trebala bi sadržavati vaš privatni ključ i certifikat): +certSign.selectJKS=Odaberite datoteku Java Keystore (.jks ili .keystore): +certSign.certType=Tip certifikata +certSign.password=Unesite svoju lozinku za skladište ključeva ili privatni ključ (ako postoji): +certSign.showSig=Prikaži potpis +certSign.reason=Razlog +certSign.location=Mjesto +certSign.name=Ime +certSign.submit=Potpiši PDF + + +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + +#removeBlanks +removeBlanks.title=Uklonite prazne stranice +removeBlanks.header=Uklonite prazne stranice +removeBlanks.threshold=Prag bjeline piksela: +removeBlanks.thresholdDesc=Prag za određivanje koliko bijeli piksel mora biti bijel da bi bio klasificiran kao 'bijeli'. 0 = crno, 255 čisto bijelo. +removeBlanks.whitePercent=Postotak bijele boje (%): +removeBlanks.whitePercentDesc=Postotak stranice koji mora biti "bijeli" piksel da bi se uklonio +removeBlanks.submit=Uklonite prazne stranice + + +#removeAnnotations +removeAnnotations.title=Ukloni komentare +removeAnnotations.header=Ukloni komentare +removeAnnotations.submit=Ukloni + + +#compare +compare.title=Uporedite +compare.header=Usporedite PDF-ove +compare.document.1=Dokument 1 +compare.document.2=Dokument 2 +compare.submit=Uporedi + +#BookToPDF +BookToPDF.title=Knjige i stripovi u PDF +BookToPDF.header=Knjiga u PDF +BookToPDF.credit=Koristi Calibre +BookToPDF.submit=Pretvori + +#PDFToBook +PDFToBook.title=PDF u Knjigu +PDFToBook.header=PDF u Knjigu +PDFToBook.selectText.1=Format +PDFToBook.credit=Koristi Calibre +PDFToBook.submit=Pretvori + +#sign +sign.title=Potpišite +sign.header=Potpišite PDF-ove +sign.upload=Učitaj sliku +sign.draw=Nacrtaj potpis +sign.text=Tekstualni unos +sign.clear=Obriši +sign.add=Dodaj + + +#repair +repair.title=Popravi +repair.header=Popravi PDF datoteku +repair.submit=Popravi + + +#flatten +flatten.title=Izravnati +flatten.header=Izravnati pdf +flatten.flattenOnlyForms=Izravnati samo obrasce +flatten.submit=Izravnati + + +#ScannerImageSplit +ScannerImageSplit.selectText.1=Kutni prag: +ScannerImageSplit.selectText.2=Postavlja minimalni apsolutni kut potreban za rotiranje slike (zadano: 10). +ScannerImageSplit.selectText.3=Tolerancija: +ScannerImageSplit.selectText.4=Određuje raspon varijacije boje oko procijenjene boje pozadine (zadano: 30). +ScannerImageSplit.selectText.5=Minimalna površina: +ScannerImageSplit.selectText.6=Postavlja minimalni prag površine za fotografiju (zadano: 10000). +ScannerImageSplit.selectText.7=Minimalna konturna površina: +ScannerImageSplit.selectText.8=Postavlja minimalni prag površine konture za fotografiju +ScannerImageSplit.selectText.9=Veličina obruba: +ScannerImageSplit.selectText.10=Postavlja veličinu obruba koji se dodaje i uklanja kako bi se spriječili bijeli obrubi u ispisu (zadano: 1). + + +#OCR +ocr.title=OCR / čišćenje skeniranja +ocr.header=Čišćenje skeniranja / OCR (optičko prepoznavanje znakova) +ocr.selectText.1=Odaberite jezike koji će se otkriti unutar PDF-a (navedeni su oni koji su trenutno otkriveni): +ocr.selectText.2=Izradite tekstualnu datoteku koja sadrži OCR tekst uz OCR-ovani PDF +ocr.selectText.3=Ispravne stranice su skenirane pod nagnutim kutom rotiranjem na mjesto +ocr.selectText.4=Očistite stranicu tako da je manja vjerojatnost da će OCR pronaći tekst u pozadinskoj buci. (Bez promjene izlaza) +ocr.selectText.5=Očisti stranicu tako da je manja vjerojatnost da će OCR pronaći tekst u pozadinskoj buci, održava čišćenje u izlazu. +ocr.selectText.6=Ignorira stranice koje na sebi imaju interaktivni tekst, samo OCR stranice koje su slike +ocr.selectText.7=Prinudni OCR, OCR će za svaku stranicu ukloniti sve izvorne elemente teksta +ocr.selectText.8=Normalno (Bit će pogreška ako PDF sadrži tekst) +ocr.selectText.9=Dodatne postavke +ocr.selectText.10=OCR način +ocr.selectText.11=Ukloni slike nakon OCR-a (Uklanja SVE slike, korisno samo ako je dio koraka konverzije) +ocr.selectText.12=Vrsta iscrtavanja (napredno) +ocr.help=Pročitajte ovu dokumentaciju o tome kako ovo koristiti za druge jezike i/ili koristiti ne u dockeru +ocr.credit=Ova usluga koristi OCRmyPDF i Tesseract za OCR. +ocr.submit=Obradi PDF sa OCR-om + + +#extractImages +extractImages.title=Ekstrakt slika +extractImages.header=Ekstrakt slika +extractImages.selectText=Odaberite format slike za pretvaranje izdvojenih slika +extractImages.submit=Izdvajanje + + +#File to PDF +fileToPDF.title=datoteku u PDF +fileToPDF.header=Pretvori bilo koji datoteku u PDF +fileToPDF.credit=Ova usluga koristi LibreOffice i Unoconv za pretvaranje datoteka. +fileToPDF.supportedFileTypesInfo=Podržane vrste datoteka +fileToPDF.supportedFileTypes=Podržane vrste datoteka trebale bi uključivati dolje, no za potpuni ažurirani popis podržanih formata pogledajte dokumentaciju LibreOfficea +fileToPDF.submit=Pretvori u PDF + + +#compress +compress.title=Komprimirajte +compress.header=Komprimirajte PDF +compress.credit=Ova usluga koristi Ghostscript za komprimiranje / optimizaciju PDF-a. +compress.selectText.1=Ručni režim - Od 1 do 4 +compress.selectText.2=Nivo optimizacije: +compress.selectText.3=4 (Užasno za tekstualne slike) +compress.selectText.4=Automatski način - Automatski prilagođava kvalitetu kako bi PDF dobio točnu veličinu +compress.selectText.5=Očekivana veličina PDF-a (npr. 25 MB, 10,8 MB, 25 KB) +compress.submit=Kompresiraj + + +#Add image +addImage.title=Dodaj sliku +addImage.header=Dodaj sliku u PDF +addImage.everyPage=Na svakoj stranici? +addImage.upload=Dodaj sliku +addImage.submit=Dodaj sliku + + +#merge +merge.title=Spajanje +merge.header=Spajanje više PDF-ova (2+) +merge.sortByName=Poredaj po imenu +merge.sortByDate=Poredaj po datumu +merge.submit=Spajanje + + +#pdfOrganiser +pdfOrganiser.title=Organizator stranica +pdfOrganiser.header=Organizator stranica u PDF-u +pdfOrganiser.submit=preuredite stranice +pdfOrganiser.mode=Način rada +pdfOrganiser.mode.1=Prilagođeni redoslijed stranica +pdfOrganiser.mode.2=Obrnuti redoslijed +pdfOrganiser.mode.3=Duplex sortiranje +pdfOrganiser.mode.4=Booklet sortiranje +pdfOrganiser.mode.5=Knjižica s bočnim ubodom +pdfOrganiser.mode.6=Par-Nepar Podjela +pdfOrganiser.mode.7=Ukloni Prvu +pdfOrganiser.mode.8=Ukloni Zadnju +pdfOrganiser.mode.9=Ukloni Prvu i Zadnju +pdfOrganiser.placeholder=(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1) + + +#multiTool +multiTool.title=PDF Višenamjenski alat +multiTool.header=PDF Višenamjenski alat +multiTool.uploadPrompts=Naziv datoteke + +#view pdf +viewPdf.title=Pogledaj +viewPdf.header=Pogledaj PDF + +#pageRemover +pageRemover.title=Uklanjanje stranica +pageRemover.header=Uklanjanje stranica iz PDF-a +pageRemover.pagesToDelete=Stranice za brisanje (Unesite listu brojeva stranica odvojenih zarezima) : +pageRemover.submit=Obriši stranice +pageRemover.placeholder=(npr. 1,2,6 ili 1-10,15-30) + + +#rotate +rotate.title=Zakreni PDF +rotate.header=Zakreni PDF +rotate.selectAngle=Odaberite kut rotacije (u umnošcima od 90 stupnjeva): +rotate.submit=Zakreni + + +#split-pdfs +split.title=Razdvajanje PDF-a +split.header=Razdvajanje PDF-a +split.desc.1=Brojevi koje odaberete su brojevi stranica na kojima želite napraviti podjelu +split.desc.2=s takvim odabirom 1,3,7-9 bi se dokument od 10 stranica podijelio u 6 zasebnih PDF-ova sa: +split.desc.3=Dokument #1: Stranica 1 +split.desc.4=Dokument #2: Stranice 2 i 3 +split.desc.5=Dokument #3: Stranice 4, 5, 6 i 7 +split.desc.6=Dokument #4: Stranica 8 +split.desc.7=Dokument #5: Stranica 9 +split.desc.8=Dokument #6: Stranice 10 +split.splitPages=Unesite stranice za razdvajanje: +split.submit=Razdvoji + + +#merge +imageToPDF.title=Slika u PDF +imageToPDF.header=Slika u PDF +imageToPDF.submit=Pretvori +imageToPDF.selectLabel=Opcije prilagodbe slike +imageToPDF.fillPage=Ispuni stranicu +imageToPDF.fitDocumentToImage=Prilagodi stranicu slici +imageToPDF.maintainAspectRatio=Sačuvaj omjere slike +imageToPDF.selectText.2=Automatsko zaktretanje PDF-a +imageToPDF.selectText.3=Logika više datoteka (omogućeno samo ako radite s više slika) +imageToPDF.selectText.4=Spojite u jedan PDF +imageToPDF.selectText.5=Pretvori u zasebne PDF-ove + + +#pdfToImage +pdfToImage.title=PDF u sliku +pdfToImage.header=PDF u sliku +pdfToImage.selectText=Format slike +pdfToImage.singleOrMultiple=Vrsta rezultata Stranica u sliku +pdfToImage.single=Jedna velika slika koja sadrži sve stranice +pdfToImage.multi=Više slika, jedna slika po stranici +pdfToImage.colorType=Tip boje +pdfToImage.color=Boja +pdfToImage.grey=Sivi tonovi +pdfToImage.blackwhite=Crno-bijelo (mogu se izgubiti podaci!) +pdfToImage.submit=Pretvori + + +#addPassword +addPassword.title=Dodajte zaporku +addPassword.header=Dodajte zaporku (kriptiraj) +addPassword.selectText.1=Odaberite PDF za šifriranje +addPassword.selectText.2=Korisnička Zaporka +addPassword.selectText.3=Dužina ključa šifriranja +addPassword.selectText.4=Više vrijednosti su jače, ali niže vrijednosti imaju bolju kompatibilnost. +addPassword.selectText.5=Dopuštenja za postavljanje (preporučuje se korištenje uz vlasničku lozinku) +addPassword.selectText.6=Spriječiti sastavljanje dokumenta +addPassword.selectText.7=Spriječite izdvajanje sadržaja +addPassword.selectText.8=Spriječite izvlačenje radi pristupačnosti +addPassword.selectText.9=Spriječiti ispunjavanje obrasca +addPassword.selectText.10=Spriječiti izmjene +addPassword.selectText.11=Spriječi modificiranje napomena +addPassword.selectText.12=Spriječiti ispis +addPassword.selectText.13=Spriječite ispis različitih formata +addPassword.selectText.14=Zaporka vlasnika +addPassword.selectText.15=Ograničava što se može učiniti s dokumentom nakon što se otvori (ne podržavaju svi čitači) +addPassword.selectText.16=Ograničava otvaranje samog dokumenta +addPassword.submit=Šifriraj + + +#watermark +watermark.title=Dodaj vodeni žig +watermark.header=Dodaj vodeni žig +watermark.selectText.1=Izaberite PDF za dodavanje vodenog žiga: +watermark.selectText.2=Tekst vodenog žiga: +watermark.selectText.3=Veličina fonta: +watermark.selectText.4=Rotacija (0-360): +watermark.selectText.5=Širina razmaka (Razmak između svakog vodenog žiga vodoravno): +watermark.selectText.6=Visina razmaka (Razmak između svakog vodenog žiga okomito): +watermark.selectText.7=Neprozirnost (0% - 100%): +watermark.selectText.8=Vrsta vodenog žiga: +watermark.selectText.9=Slika vodenog žiga: +watermark.submit=Dodaj vodeni žig +watermark.type.1=Tekst +watermark.type.2=Slika + + +#Change permissions +permissions.title=Promjena dopuštenja +permissions.header=Promjena dopuštenja +permissions.warning=Upozorenje: da ove dozvole budu nepromjenjive, preporuča se da ih postavite lozinkom putem stranice za dodavanje lozinke +permissions.selectText.1=Odaberite PDF za promjenu dopuštenja +permissions.selectText.2=Dopuštenja za postavljanje +permissions.selectText.3=Spriječiti sastavljanje dokumenta +permissions.selectText.4=Spriječiti izdvajanje sadržaja +permissions.selectText.5=Spriječite izvlačenje radi pristupačnosti +permissions.selectText.6=Spriječiti ispunjavanje obrasca +permissions.selectText.7=Spriječiti izmjene +permissions.selectText.8=Spriječi modificiranje napomena +permissions.selectText.9=Spriječiti ispis +permissions.selectText.10=Spriječite ispis različitih formata +permissions.submit=Promijeniti + + +#remove password +removePassword.title=Ukloni zaporku +removePassword.header=Ukloni zaporku (dekriptiraj) +removePassword.selectText.1=Odaberite PDF za dekriptiranje +removePassword.selectText.2=Zaporka +removePassword.submit=Ukloniti + + +#changeMetadata +changeMetadata.title=Promjena metapodataka +changeMetadata.header=Promjena metapodataka +changeMetadata.selectText.1=Uredite varijable koje želite promijeniti +changeMetadata.selectText.2=Izbriši sve metapodatke +changeMetadata.selectText.3=Prikaži prilagođene metapodatke: +changeMetadata.author=Autor: +changeMetadata.creationDate=Datum stvaranja (gggg/MM/dd HH:mm:ss): +changeMetadata.creator=Kreator: +changeMetadata.keywords=Ključne riječi: +changeMetadata.modDate=Datum izmjene (gggg/MM/dd HH:mm:ss): +changeMetadata.producer=Proizvođač: +changeMetadata.subject=Predmet: +changeMetadata.trapped=Zarobljen: +changeMetadata.selectText.4=Ostali metapodaci: +changeMetadata.selectText.5=Dodaj prilagođeni unos metapodataka +changeMetadata.submit=Promijeniti + + +#pdfToPDFA +pdfToPDFA.title=PDF u PDF/A +pdfToPDFA.header=PDF u PDF/A +pdfToPDFA.credit=Ova usluga koristi OCRmyPDF za PDF/A pretvorbu +pdfToPDFA.submit=Pretvoriti +pdfToPDFA.tip=Trenutno ne radi za više unosa odjednom +pdfToPDFA.outputFormat=Izlazni format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. + + +#PDFToWord +PDFToWord.title=PDF u Word +PDFToWord.header=PDF u Word +PDFToWord.selectText.1=Format izlazne datoteke +PDFToWord.credit=Ova usluga koristi LibreOffice za konverziju datoteka. +PDFToWord.submit=Pretvoriti + + +#PDFToPresentation +PDFToPresentation.title=PDF u Prezentaciju +PDFToPresentation.header=PDF u Prezentaciju +PDFToPresentation.selectText.1=Format izlazne datoteke +PDFToPresentation.credit=Ova usluga koristi LibreOffice za konverziju datoteka. +PDFToPresentation.submit=Pretvoriti + + +#PDFToText +PDFToText.title=PDF u RTF (Tekst) +PDFToText.header=PDF u RTF (Tekst) +PDFToText.selectText.1=Format izlazne datoteke +PDFToText.credit=Ova usluga koristi LibreOffice za konverziju datoteka. +PDFToText.submit=Pretvoriti + + +#PDFToHTML +PDFToHTML.title=PDF u HTML +PDFToHTML.header=PDF u HTML +PDFToHTML.credit=Ova usluga koristi pdftohtml za konverziju datoteka. +PDFToHTML.submit=Pretvoriti + + +#PDFToXML +PDFToXML.title=PDF u XML +PDFToXML.header=PDF u XML +PDFToXML.credit=Ova usluga koristi LibreOffice za konverziju datoteka. +PDFToXML.submit=Pretvoriti + +#PDFToCSV +PDFToCSV.title=PDF u CSV +PDFToCSV.header=PDF u CSV +PDFToCSV.prompt=Odaberite stranicu za izdvajanje tablice +PDFToCSV.submit=Izvuci + +#split-by-size-or-count +split-by-size-or-count.title=Podijeli PDF prema veličini ili broju +split-by-size-or-count.header=Podijeli PDF prema veličini ili broju +split-by-size-or-count.type.label=Odaberite vrstu dijeljenja +split-by-size-or-count.type.size=Po veličini +split-by-size-or-count.type.pageCount=Po broju stranica +split-by-size-or-count.type.docCount=Po broju dokumenata +split-by-size-or-count.value.label=Unesite vrijednost +split-by-size-or-count.value.placeholder=Unesite veličinu (npr. 2MB ili 3KB) ili broj (npr. 5) +split-by-size-or-count.submit=Potvrdite + + +#overlay-pdfs +overlay-pdfs.header=Prekrivanje PDF datoteka +overlay-pdfs.baseFile.label=Odaberite Osnovnu PDF datoteka +overlay-pdfs.overlayFiles.label=Izaberite PDF datoteke za prekrivanje +overlay-pdfs.mode.label=Odaberite način preklapanja +overlay-pdfs.mode.sequential=Sekvencijalno preklapanje +overlay-pdfs.mode.interleaved=Isprepleteni sloj +overlay-pdfs.mode.fixedRepeat=Popravljeni sloj ponavljanja +overlay-pdfs.counts.label=Brojevi preklapanja (za način fiksnog ponavljanja) +overlay-pdfs.counts.placeholder=Unesite brojeve odvojene zarezima (npr. 2,3,1) +overlay-pdfs.position.label=Odaberite položaj preklapanja +overlay-pdfs.position.foreground=Prednji plan +overlay-pdfs.position.background=Pozadina +overlay-pdfs.submit=Potvrditi + + +#split-by-sections +split-by-sections.title=Podijeli PDF po odjeljcima +split-by-sections.header=Podijeli PDF u odjeljke +split-by-sections.horizontal.label=Vodoravne podjele +split-by-sections.vertical.label=Okomite podjele +split-by-sections.horizontal.placeholder=Unesite broj vodoravnih podjela +split-by-sections.vertical.placeholder=Unesite broj okomitih podjela +split-by-sections.submit=Razdvojiti PDF +split-by-sections.merge=Spoji u jedan PDF + + +#printFile +printFile.title=Ispis datoteke +printFile.header=Ispis datoteke na pisač +printFile.selectText.1=Odaberite Datoteku za ispis +printFile.selectText.2=Unesite naziv pisača +printFile.submit=Ispis + + +#licenses +licenses.nav=Licence +licenses.title=Licence treće strane +licenses.header=Licence treće strane +licenses.module=Modul +licenses.version=Verzija +licenses.license=Licenca + + +#error +error.sorry=Oprostite zbog problema! +error.needHelp=Trebate pomoć / Pronašli ste problem? +error.contactTip=Ako i dalje imate problema, ne ustručavajte se obratiti nam se za pomoć. Tiket možete poslati na našoj GitHub stranici ili nas kontaktirati putem Discorda: +error.404.head=404 - Stranica nije pronađena | Ups, spotaknuli smo se u kodu! +error.404.1=Čini se da ne možemo pronaći stranicu koju tražite. +error.404.2=Nešto je pošlo po zlu +error.github=Pošaljite ticket na GitHub +error.showStack=Prikaži Stack Trace +error.copyStack=Kopiraj Stack Trace +error.githubSubmit=GitHub - Pošaljite ticket +error.discordSubmit=Discord - Pošalji objavu podrške + diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 49366bed..872db7fc 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -332,6 +332,10 @@ home.certSign.title=Aláírás Tanúsítvánnyal home.certSign.desc=PDF aláírása tanúsítvánnyal/kulccsal (PEM/P12) certSign.tags=hitelesítés,PEM,P12,hivatalos,segitít,álca +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Több oldal elrendezése home.pageLayout.desc=Több oldal egyesítése egy PDF dokumentumban egyetlen oldallá pageLayout.tags=egyesítés,kompozit,egy oldal,megszervez @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Név certSign.submit=PDF aláírása +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Üres oldalak eltávolítása removeBlanks.header=Üres oldalak eltávolítása @@ -964,6 +976,7 @@ pdfToPDFA.credit=Ez a szolgáltatás az OCRmyPDF-t használja a PDF/A konverzió pdfToPDFA.submit=Konvertálás pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index f1678612..051d6cae 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -332,6 +332,10 @@ home.certSign.title=Tanda tangani dengan Sertifikat home.certSign.desc=Menandatangani PDF dengan Certificate/Key (PEM/P12) certSign.tags=mengotentikasi, PEM, P12, resmi, mengenkripsi +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Tata Letak Multi-Halaman home.pageLayout.desc=Menggabungkan beberapa halaman dokumen PDF menjadi satu halaman pageLayout.tags=menggabungkan, komposit, tampilan tunggal, mengatur @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Nama certSign.submit=Tanda tangani PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Hapus Halaman Kosong removeBlanks.header=Remove Blank Pages @@ -964,6 +976,7 @@ pdfToPDFA.credit=Layanan ini menggunakan OCRmyPDF untuk konversi PDF/A. pdfToPDFA.submit=Konversi pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index bd1fd5d3..f1f654cf 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -332,6 +332,10 @@ home.certSign.title=Firma con certificato home.certSign.desc=Firma un PDF con un certificato/chiave (PEM/P12) certSign.tags=autenticare,PEM,P12,ufficiale,crittografare +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Layout multipagina home.pageLayout.desc=Unisci più pagine di un documento PDF in un'unica pagina pageLayout.tags=unire,comporre,visualizzazione singola,organizzare @@ -417,7 +421,7 @@ autoSizeSplitPDF.tags=pdf,diviso,documento,organizzazione home.overlay-pdfs.title=Sovrapposizione di PDF home.overlay-pdfs.desc=Sovrappone i PDF sopra un altro PDF -overlay-pdfs.tags=Svrapponi +overlay-pdfs.tags=Sovrapponi home.split-by-sections.title=Dividi PDF per sezioni home.split-by-sections.desc=Dividi ciascuna pagina di un PDF in sezioni orizzontali e verticali più piccole @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Risposta relativa alle informazioni utente n login.oauth2invalidRequest=Richiesta non valida login.oauth2AccessDenied=Accesso negato login.oauth2InvalidTokenResponse=Risposta token non valida +login.oauth2InvalidIdToken=Id Token non valido #auto-redact @@ -654,6 +659,13 @@ certSign.name=Nome certSign.submit=Firma PDF +#removeCertSign +removeCertSign.title=Rimuovi certificato della firma +removeCertSign.header=Rimuovere il certificato digitale dal PDF +removeCertSign.selectPDF=Seleziona un file PDF: +removeCertSign.submit=Rimuovi firma + + #removeBlanks removeBlanks.title=Rimuovi spazi vuoti removeBlanks.header=Rimuovi pagine vuote @@ -964,6 +976,7 @@ pdfToPDFA.credit=Questo servizio utilizza OCRmyPDF per la conversione in PDF/A. pdfToPDFA.submit=Converti pdfToPDFA.tip=Attualmente non funziona per più input contemporaneamente pdfToPDFA.outputFormat=Formato di output +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 30bdb928..3a8a86eb 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -332,6 +332,10 @@ home.certSign.title=証明書による署名 home.certSign.desc=証明書/キーを使用してPDFに署名します。 (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=マルチページレイアウト home.pageLayout.desc=PDFの複数のページを1ページに結合します。 pageLayout.tags=merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=名前 certSign.submit=PDFに署名 +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=空白の削除 removeBlanks.header=空白ページの削除 @@ -964,6 +976,7 @@ pdfToPDFA.credit=本サービスはPDF/Aの変換にOCRmyPDFを使用してい pdfToPDFA.submit=変換 pdfToPDFA.tip=現在、一度に複数の入力に対して機能しません pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 8af64f62..2bab77ad 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -332,6 +332,10 @@ home.certSign.title=인증서로 서명 home.certSign.desc=PDF 문서에 인증서 또는 키로 서명합니다. (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=다중 페이지 레이아웃 home.pageLayout.desc=PDF 문서의 여러 페이지를 한 페이지로 합칩니다. pageLayout.tags=merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=이름 certSign.submit=PDF 서명 +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=빈 페이지 제거 removeBlanks.header=빈 페이지 제거 @@ -964,6 +976,7 @@ pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 OCRmyPDF 문서를 사 pdfToPDFA.submit=변환 pdfToPDFA.tip=현재 한 번에 여러 입력에 대해 작동하지 않습니다. pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index bdc0f8a7..750b46b2 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -332,6 +332,10 @@ home.certSign.title=Ondertekenen met certificaat home.certSign.desc=Ondertekent een PDF met een certificaat/sleutel (PEM/P12) certSign.tags=authenticeren,PEM,P12,officieel,versleutelen +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Multi-pagina indeling home.pageLayout.desc=Voeg meerdere pagina's van een PDF-document samen op één pagina pageLayout.tags=samenvoegen,composiet,enkel-zicht,organiseren @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Naam certSign.submit=PDF ondertekenen +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Verwijder blanco's removeBlanks.header=Verwijder lege pagina's @@ -964,6 +976,7 @@ pdfToPDFA.credit=Deze service gebruikt OCRmyPDF voor PDF/A-conversie pdfToPDFA.submit=Converteren pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties new file mode 100644 index 00000000..cee5c3f9 --- /dev/null +++ b/src/main/resources/messages_no_NB.properties @@ -0,0 +1,1093 @@ +########### +# Generic # +########### +# the direction that the language is written (ltr = left to right, rtl = right to left) +language.direction=ltr + +pdfPrompt=Velg PDF(er) +multiPdfPrompt=Velg PDF-filer (2+) +multiPdfDropPrompt=Velg (eller dra og slipp) alle PDF-ene du trenger +imgPrompt=Velg Bilde(r) +genericSubmit=Send inn +processTimeWarning=Denne prosessen kan ta opptil ett minutt avhengig av filstørrelse +pageOrderPrompt=Tilpasset side rekkefølge (Skriv inn en kommaseparert liste over sidetall eller funksjoner som 2n+1): +pageSelectionPrompt=Tilpasset Sidevalg (Skriv inn en kommaseparert liste over sidetall 1,5,6 eller Funksjoner som 2n+1): +goToPage=Gå +true=Sann +false=Usann +unknown=Ukjent +save=Lagre +saveToBrowser=Lagre til Nettleser +close=Lukk +filesSelected=filer valgt +noFavourites=Ingen favoritter lagt til +downloadComplete=Nedlasting Fullført +bored=Lei av å vente? +alphabet=Alfabet +downloadPdf=Last ned PDF +text=Tekst +font=Skrifttype +selectFillter=-- Velg -- +pageNum=Sidnummer +sizes.small=Liten +sizes.medium=Middels +sizes.large=Stor +sizes.x-large=Ekstra Stor +error.pdfPassword=PDF-dokumentet er passordbeskyttet og enten ble passordet ikke oppgitt eller var feil +delete=Slett +username=Brukernavn +password=Passord +welcome=Velkommen +property=Egenskap +black=Svart +white=Hvit +red=Rød +green=Grønn +blue=Blå +custom=Tilpasset... +WorkInProgess=Arbeid pågår, Kan være feil eller buggy, Vennligst rapporter eventuelle problemer! +poweredBy=Drevet av +yes=Ja +no=Nei +changedCredsMessage=Legitimasjon endret! +notAuthenticatedMessage=Bruker ikke autentisert. +userNotFoundMessage=Bruker ikke funnet. +incorrectPasswordMessage=Nåværende passord er feil. +usernameExistsMessage=Det nye brukernavnet eksisterer allerede. +invalidUsernameMessage=Ugyldig brukernavn, brukernavnet kan bare inneholde bokstaver, tall og følgende spesialtegn @._+- eller må være en gyldig e-postadresse. +deleteCurrentUserMessage=Kan ikke slette den innloggede brukeren. +deleteUsernameExistsMessage=Brukernavnet eksisterer ikke og kan ikke slettes. +downgradeCurrentUserMessage=Kan ikke nedgradere den innloggede brukerens rolle. +downgradeCurrentUserLongMessage=Kan ikke nedgradere den innloggede brukerens rolle. Derfor vil ikke den innloggede brukeren bli vist. +userAlreadyExistsOAuthMessage=Brukeren eksisterer allerede som en OAuth2-bruker. +userAlreadyExistsWebMessage=Brukeren eksisterer allerede som en web-bruker. +error=Feil +oops=Oops! +help=Hjelp +goHomepage=Gå til Hjemmeside +joinDiscord=Bli med på vår Discord-server +seeDockerHub=Se Docker Hub +visitGithub=Besøk Github Repository +donate=Doner +color=Farge +sponsor=Sponsor +info=Info + + + +############### +# Pipeline # +############### +pipeline.header=Pipeline-meny (Beta) +pipeline.uploadButton=Last opp tilpasset +pipeline.configureButton=Konfigurer +pipeline.defaultOption=Tilpasset +pipeline.submitButton=Send inn +pipeline.help=Pipeline hjelp +pipeline.scanHelp=Mappe skanning hjelp + +###################### +# Pipeline Options # +###################### +pipelineOptions.header=Pipeline konfigurasjon +pipelineOptions.pipelineNameLabel=Pipeline navn +pipelineOptions.saveSettings=Lagre operasjonsinnstillinger +pipelineOptions.pipelineNamePrompt=Skriv inn pipeline-navn her +pipelineOptions.selectOperation=Velg operasjon +pipelineOptions.addOperationButton=Legg til operasjon +pipelineOptions.pipelineHeader=Pipeline: +pipelineOptions.saveButton=Last ned +pipelineOptions.validateButton=Valider + + + + +############# +# NAVBAR # +############# +navbar.favorite=Favoritter +navbar.darkmode=Mørk Modus +navbar.language=Språk +navbar.settings=Innstillinger +navbar.allTools=Verktøy +navbar.multiTool=Multi Verktøy +navbar.sections.organize=Organisere +navbar.sections.convertTo=Konverter til PDF +navbar.sections.convertFrom=Konverter fra PDF +navbar.sections.security=Signer & Sikkerhet +navbar.sections.advance=Avansert +navbar.sections.edit=Vis & Rediger + +############# +# SETTINGS # +############# +settings.title=Innstillinger +settings.update=Oppdatering tilgjengelig +settings.updateAvailable={0} er den nåværende installerte versjonen. En ny versjon ({1}) er tilgjengelig. +settings.appVersion=App Versjon: +settings.downloadOption.title=Velg nedlastingsalternativ (For enkeltfil ikke-zip nedlastinger): +settings.downloadOption.1=Åpne i samme vindu +settings.downloadOption.2=Åpne i nytt vindu +settings.downloadOption.3=Last ned fil +settings.zipThreshold=Zip filer når antall nedlastede filer overstiger +settings.signOut=Logg ut +settings.accountSettings=Kontoinnstillinger +settings.bored.help=Aktiverer påskeegg-spill +settings.cacheInputs.name=Lagre skjemainput +settings.cacheInputs.help=Aktiver for å lagre tidligere brukte input for fremtidige kjøringer + +changeCreds.title=Endre Legitimasjon +changeCreds.header=Oppdater Konto Detaljer +changeCreds.changePassword=Du bruker standard påloggingsdetaljer. Vennligst skriv inn et nytt passord +changeCreds.newUsername=Nytt Brukernavn +changeCreds.oldPassword=Nåværende Passord +changeCreds.newPassword=Nytt Passord +changeCreds.confirmNewPassword=Bekreft Nytt Passord +changeCreds.submit=Send Endringer + + + +account.title=Kontoinnstillinger +account.accountSettings=Kontoinnstillinger +account.adminSettings=Admin Innstillinger - Vis og Legg til Brukere +account.userControlSettings=Brukerkontroll Innstillinger +account.changeUsername=Endre Brukernavn +account.newUsername=Nytt Brukernavn +account.password=Bekreftelsespassord +account.oldPassword=Gammelt Passord +account.newPassword=Nytt Passord +account.changePassword=Endre Passord +account.confirmNewPassword=Bekreft Nytt Passord +account.signOut=Logg ut +account.yourApiKey=Din API-nøkkel +account.syncTitle=Synkroniser nettleserinnstillinger med Konto +account.settingsCompare=Innstillingsammenligning: +account.property=Egenskap +account.webBrowserSettings=Nettleserinnstilling +account.syncToBrowser=Synk Konto -> Nettleser +account.syncToAccount=Synk Konto <- Nettleser + + +adminUserSettings.title=Brukerkontroll Innstillinger +adminUserSettings.header=Admin Brukerkontroll Innstillinger +adminUserSettings.admin=Admin +adminUserSettings.user=Bruker +adminUserSettings.addUser=Legg til Ny Bruker +adminUserSettings.usernameInfo=Brukernavn kan bare inneholde bokstaver, tall og følgende spesialtegn @._+- eller må være en gyldig e-postadresse. +adminUserSettings.roles=Roller +adminUserSettings.role=Rolle +adminUserSettings.actions=Handlinger +adminUserSettings.apiUser=Begrenset API Bruker +adminUserSettings.extraApiUser=Ekstra Begrenset API Bruker +adminUserSettings.webOnlyUser=Kun Web Bruker +adminUserSettings.demoUser=Demo Bruker (Ingen tilpassede innstillinger) +adminUserSettings.internalApiUser=Intern API Bruker +adminUserSettings.forceChange=Tving bruker til å endre passord ved innlogging +adminUserSettings.submit=Lagre Bruker +adminUserSettings.changeUserRole=Endre Brukerens Rolle +adminUserSettings.authenticated=Autentisert + +############# +# HOME-PAGE # +############# +home.desc=Din lokale one-stop-shop for alle dine PDF-behov. +home.searchBar=Søk etter funksjoner... + + +home.viewPdf.title=Vis PDF +home.viewPdf.desc=Vis, annoter, legg til tekst eller bilder +viewPdf.tags=vis,les,annoter,tekst,bilde + +home.multiTool.title=PDF Multi Verktøy +home.multiTool.desc=Slå sammen, roter, omorganiser og fjern sider +multiTool.tags=Multi Verktøy,Multi operasjon,UI,klikk dra,frontend,klientside,interaktiv,bevegelig + +home.merge.title=Slå sammen +home.merge.desc=Slå enkelt sammen flere PDF-er til én. +merge.tags=sammenslåing,sideoperasjoner,backend,serverside + +home.split.title=Del opp +home.split.desc=Del PDF-er i flere dokumenter +split.tags=sideoperasjoner,del,flersidig,kutt,serverside + +home.rotate.title=Roter +home.rotate.desc=Roter enkelt dine PDF-er. +rotate.tags=serverside + + +home.imageToPdf.title=Bilde til PDF +home.imageToPdf.desc=Konverter et bilde (PNG, JPEG, GIF) til PDF. +imageToPdf.tags=konvertering,bilde,jpg,foto + +home.pdfToImage.title=PDF til Bilde +home.pdfToImage.desc=Konverter en PDF til et bilde. (PNG, JPEG, GIF) +pdfToImage.tags=konvertering,bilde,jpg,foto + +home.pdfOrganiser.title=Organiser +home.pdfOrganiser.desc=Fjern/omorganiser sider i hvilken som helst rekkefølge +pdfOrganiser.tags=dupleks,par,single,sorter,flytt + + +home.addImage.title=Legg til bilde +home.addImage.desc=Legger til et bilde på en angitt plassering i PDF-en +addImage.tags=bilde,jpg,foto + +home.watermark.title=Legg til Vannmerke +home.watermark.desc=Legg til et tilpasset vannmerke i din PDF-dokument. +watermark.tags=tekst,gjentakende,etikett,egen,opphavsrett,varemerke,bilde,jpg,foto + +home.permissions.title=Endre Tillatelser +home.permissions.desc=Endre tillatelsene til din PDF-dokument +permissions.tags=les,skriv,rediger,skriv ut + + +home.removePages.title=Fjern +home.removePages.desc=Slett uønskede sider fra din PDF-dokument. +removePages.tags=fjern sider,slett sider + +home.addPassword.title=Legg til Passord +home.addPassword.desc=Krypter din PDF-dokument med et passord. +addPassword.tags=sikker,trygghet + +home.removePassword.title=Fjern Passord +home.removePassword.desc=Fjern passordbeskyttelse fra din PDF-dokument. +removePassword.tags=sikker,dekrypter,trygghet,upassord,slett passord + +home.compressPdfs.title=Komprimer +home.compressPdfs.desc=Komprimer PDF-er for å redusere filstørrelsen. +compressPdfs.tags=komprimer,liten,tiny + + +home.changeMetadata.title=Endre Metadata +home.changeMetadata.desc=Endre/fjern/legg til metadata fra en PDF-dokument +changeMetadata.tags=title,forfatter,dato,opprettelse,tidsstempel,utgiver,produsent,statistikk + +home.fileToPDF.title=Konverter fil til PDF +home.fileToPDF.desc=Konverter nesten hvilken som helst fil til PDF (DOCX, PNG, XLS, PPT, TXT og mer) +fileToPDF.tags=transformasjon,format,dokument,bilde,slide,tekst,konvertering,office,dokumenter,word,excel,powerpoint + +home.ocr.title=OCR / Rydd opp skanninger +home.ocr.desc=Rydd opp skanninger og oppdag tekst fra bilder i en PDF og legg den til som tekst. +ocr.tags=gjenkjenning,tekst,bilde,skann,les,identifisere,deteksjon,redigerbar + + +home.extractImages.title=Ekstraher Bilder +home.extractImages.desc=Ekstraherer alle bilder fra en PDF og lagrer dem som zip +extractImages.tags=bilde,foto,lagre,arkiv,zip,fangst,hent + +home.pdfToPDFA.title=PDF til PDF/A +home.pdfToPDFA.desc=Konverter PDF til PDF/A for langtidslagring +pdfToPDFA.tags=arkiv,langtidslagring,standard,konvertering,lagring,bevaring + +home.PDFToWord.title=PDF til Word +home.PDFToWord.desc=Konverter PDF til Word formater (DOC, DOCX og ODT) +PDFToWord.tags=doc,docx,odt,word,transformasjon,format,konvertering,office,microsoft,dokumentfil + +home.PDFToPresentation.title=PDF til Presentasjon +home.PDFToPresentation.desc=Konverter PDF til presentasjonsformater (PPT, PPTX og ODP) +PDFToPresentation.tags=slides,visning,office,microsoft + +home.PDFToText.title=PDF til RTF (Tekst) +home.PDFToText.desc=Konverter PDF til tekst eller RTF-format +PDFToText.tags=rikformat,riktekstformat,rik tekst format + +home.PDFToHTML.title=PDF til HTML +home.PDFToHTML.desc=Konverter PDF til HTML-format +PDFToHTML.tags=web-innhold,nettleservennlig + + +home.PDFToXML.title=PDF til XML +home.PDFToXML.desc=Konverter PDF til XML-format +PDFToXML.tags=datauttrekk,strukturert innhold,interop,transformasjon,konverter + +home.ScannerImageSplit.title=Oppdag/Del Skannede bilder +home.ScannerImageSplit.desc=Deler flere bilder fra et bilde/PDF +ScannerImageSplit.tags=separere,auto-oppdag,skanninger,flere bilder,organisere + +home.sign.title=Signer +home.sign.desc=Legger til signatur i PDF ved tegning, tekst eller bilde +sign.tags=autorisere,initialer,tegnet signatur,tekst signatur,bildesignatur + +home.flatten.title=Gjøre flat +home.flatten.desc=Fjern alle interaktive elementer og skjemaer fra en PDF +flatten.tags=statisk,deaktiver,ikke-interaktiv,strømlinjeformet + +home.repair.title=Reparer +home.repair.desc=Forsøker å reparere en korrupt/ødelagt PDF +repair.tags=fiks,gjenopprett,korreksjon,gjenoppretting + +home.removeBlanks.title=Fjern Tomme sider +home.removeBlanks.desc=Oppdager og fjerner tomme sider fra et dokument +removeBlanks.tags=rydde opp,strømlinjeformet,ingen-innhold,organisere + +home.removeAnnotations.title=Fjern Anmerkninger +home.removeAnnotations.desc=Fjerner alle kommentarer/anmerkninger fra en PDF +removeAnnotations.tags=kommentarer,utheving,notater,markering,fjern + +home.compare.title=Sammenlign +home.compare.desc=Sammenligner og viser forskjellene mellom to PDF-dokumenter +compare.tags=differensiere,kontrast,endringer,analyse + +home.certSign.title=Signer med Sertifikat +home.certSign.desc=Signer en PDF med et sertifikat/nøkkel (PEM/P12) +certSign.tags=autentisere,PEM,P12,offisiell,krypter + +home.removeCertSign.title=Fjern Sertifikatsignering +home.removeCertSign.desc=Fjern sertifikatsignatur fra PDF +removeCertSign.tags=autentisere,PEM,P12,offisiell,dechiffrere + +home.pageLayout.title=Flersidig Layout +home.pageLayout.desc=Slå sammen flere sider av en PDF-dokument til en enkelt side +pageLayout.tags=slå sammen,kompositt,enkel-visning,organisere + +home.scalePages.title=Juster sidestørrelse/skala +home.scalePages.desc=Endre størrelsen/skalaen til en side og/eller dens innhold. +scalePages.tags=endre størrelse,modifisere,dimensjon,tilpasse + +home.pipeline.title=Pipeline (Avansert) +home.pipeline.desc=Utfør flere handlinger på PDF-er ved å definere pipelineskripter +pipeline.tags=automatisere,sekvens,skriptet,batch-prosess + +home.add-page-numbers.title=Legg til Sidetall +home.add-page-numbers.desc=Legg til sidetall gjennom et dokument på en angitt plassering +add-page-numbers.tags=paginere,etikett,organisere,indeks + +home.auto-rename.title=Auto Omdøp PDF Fil +home.auto-rename.desc=Omdøper automatisk en PDF-fil basert på dens oppdagede overskrift +auto-rename.tags=auto-oppdag,overskrift-basert,organisere,omdøp + +home.adjust-contrast.title=Juster Farger/Kontrast +home.adjust-contrast.desc=Juster kontrast, metning og lysstyrke i en PDF +adjust-contrast.tags=fargekorrigering,tilpasse,modifisere,forbedre + +home.crop.title=Beskjære PDF +home.crop.desc=Beskjære en PDF for å redusere størrelsen (beholder tekst!) +crop.tags=trim,redusere,redigere,form + +home.autoSplitPDF.title=Auto Del Sider +home.autoSplitPDF.desc=Auto Del Skannet PDF med fysisk skannet sidesplitter QR-kode +autoSplitPDF.tags=QR-basert,separere,skann-segment,organisere + +home.sanitizePdf.title=Sanitiser +home.sanitizePdf.desc=Fjern skript og andre elementer fra PDF-filer +sanitizePdf.tags=rydde opp,sikker,trygg,fjern trusler + +home.URLToPDF.title=URL/Nettsted Til PDF +home.URLToPDF.desc=Konverter hvilken som helst http(s)URL til PDF +URLToPDF.tags=web-fangst,lagre side,web-til-dokument,arkiv + +home.HTMLToPDF.title=HTML til PDF +home.HTMLToPDF.desc=Konverter hvilken som helst HTML-fil eller zip til PDF +HTMLToPDF.tags=markup,web-innhold,transformasjon,konverter + + +home.MarkdownToPDF.title=Markdown til PDF +home.MarkdownToPDF.desc=Konverter hvilken som helst Markdown-fil til PDF +MarkdownToPDF.tags=markup,web-innhold,transformasjon,konverter + + +home.getPdfInfo.title=Få ALL informasjon om PDF +home.getPdfInfo.desc=Fanger opp all tilgjengelig informasjon om PDF-er +getPdfInfo.tags=informasjon,data,statistikk + + +home.extractPage.title=Ekstraher side(r) +home.extractPage.desc=Ekstraher valgte sider fra PDF +extractPage.tags=ekstrahere + + +home.PdfToSinglePage.title=PDF til Enkelt Stor Side +home.PdfToSinglePage.desc=Slår sammen alle PDF-sider til en stor enkeltside +PdfToSinglePage.tags=enkelside + + +home.showJS.title=Vis Javascript +home.showJS.desc=Søker og viser eventuelle JS injisert i en PDF +showJS.tags=JS + +home.autoRedact.title=Automatisk Sensurering +home.autoRedact.desc=Automatisk sensurering (sverter ut) tekst i en PDF basert på inntastet tekst +autoRedact.tags=Sensurere,Skjule,sverte ut,svart,markør,skjult + +home.tableExtraxt.title=PDF til CSV +home.tableExtraxt.desc=Ekstraherer tabeller fra en PDF og konverterer dem til CSV +tableExtraxt.tags=CSV,tabelluttrekk,ekstrahere,konvertere + + +home.autoSizeSplitPDF.title=Auto Del etter Størrelse/Antall +home.autoSizeSplitPDF.desc=Del en enkelt PDF i flere dokumenter basert på størrelse, antall sider eller dokumenter +autoSizeSplitPDF.tags=pdf,del,dokument,organisering + + +home.overlay-pdfs.title=Overlay PDF-er +home.overlay-pdfs.desc=Legger PDF-er over hverandre +overlay-pdfs.tags=overlay + +home.split-by-sections.title=Del PDF etter Seksjoner +home.split-by-sections.desc=Del hver side av en PDF i mindre horisontale og vertikale seksjoner +split-by-sections.tags=seksjonsdeling,del,tilpass + +home.AddStampRequest.title=Legg til Stempel i PDF +home.AddStampRequest.desc=Legg til tekst eller bilde stempler på angitte steder +AddStampRequest.tags=stempel,legg til bilde,senter bilde,vannmerke,PDF,embed,tilpass + + +home.PDFToBook.title=PDF til Bok +home.PDFToBook.desc=Konverter PDF til Bok/Comic-formater ved hjelp av calibre +PDFToBook.tags=bok,comic,calibre,konvertere,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf + +home.BookToPDF.title=Bok til PDF +home.BookToPDF.desc=Konverter bøker/tegneserier til PDF ved hjelp av calibre +BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf + + +########################### +# # +# WEB PAGES # +# # +########################### +#login +login.title=Logg inn +login.header=Logg inn +login.signin=Logg inn +login.rememberme=Husk meg +login.invalid=Ugyldig brukernavn eller passord. +login.locked=Kontoen din har blitt låst. +login.signinTitle=Vennligst logg inn +login.ssoSignIn=Logg inn via Enkel Pålogging +login.oauth2AutoCreateDisabled=OAUTH2 Auto-Opretting av bruker deaktivert +login.oauth2RequestNotFound=Autentiseringsforespørsel ikke funnet +login.oauth2InvalidUserInfoResponse=Ugyldig brukerinforespons +login.oauth2invalidRequest=Ugyldig forespørsel +login.oauth2AccessDenied=Tilgang nektet +login.oauth2InvalidTokenResponse=Ugyldig tokenrespons +login.oauth2InvalidIdToken=Ugyldig Id Token + + +#auto-redact +autoRedact.title=Automatisk Sensurering +autoRedact.header=Automatisk Sensurering +autoRedact.colorLabel=Farge +autoRedact.textsToRedactLabel=Tekst som skal sensureres (linje-separert) +autoRedact.textsToRedactPlaceholder=f.eks. \nKonfidensiell \nTopp-hemmelig +autoRedact.useRegexLabel=Bruk Regex +autoRedact.wholeWordSearchLabel=Hele ordsøk +autoRedact.customPaddingLabel=Tilpasset ekstra polstring +autoRedact.convertPDFToImageLabel=Konverter PDF til PDF-bilde (Brukes for å fjerne tekst bak boksen) +autoRedact.submitButton=Send inn + + +#showJS +showJS.title=Vis Javascript +showJS.header=Vis Javascript +showJS.downloadJS=Last ned Javascript +showJS.submit=Vis + + +#pdfToSinglePage +pdfToSinglePage.title=PDF Til Enkelt Side +pdfToSinglePage.header=PDF Til Enkelt Side +pdfToSinglePage.submit=Konverter til Enkelt Side + + +#pageExtracter +pageExtracter.title=Trekk ut Sider +pageExtracter.header=Trekk ut Sider +pageExtracter.submit=Trekk ut +pageExtracter.placeholder=(f.eks. 1,2,8 eller 4,7,12-16 eller 2n-1) + + +#getPdfInfo +getPdfInfo.title=Få Info om PDF +getPdfInfo.header=Få Info om PDF +getPdfInfo.submit=Få Info +getPdfInfo.downloadJson=Last ned JSON + + +#markdown-to-pdf +MarkdownToPDF.title=Markdown Til PDF +MarkdownToPDF.header=Markdown Til PDF +MarkdownToPDF.submit=Konverter +MarkdownToPDF.help=Arbeid pågår +MarkdownToPDF.credit=Bruker WeasyPrint + + + +#url-to-pdf +URLToPDF.title=URL Til PDF +URLToPDF.header=URL Til PDF +URLToPDF.submit=Konverter +URLToPDF.credit=Bruker WeasyPrint + + +#html-to-pdf +HTMLToPDF.title=HTML Til PDF +HTMLToPDF.header=HTML Til PDF +HTMLToPDF.help=Godtar HTML-filer og ZIP-filer som inneholder html/css/bilder etc. som er nødvendige +HTMLToPDF.submit=Konverter +HTMLToPDF.credit=Bruker WeasyPrint +HTMLToPDF.zoom=Zoomnivå for visning av nettsiden. +HTMLToPDF.pageWidth=Bredde på siden i centimeter. (Blank for standard) +HTMLToPDF.pageHeight=Høyde på siden i centimeter. (Blank for standard) +HTMLToPDF.marginTop=Øvre margin på siden i millimeter. (Blank for standard) +HTMLToPDF.marginBottom=Nedre margin på siden i millimeter. (Blank for standard) +HTMLToPDF.marginLeft=Venstre margin på siden i millimeter. (Blank for standard) +HTMLToPDF.marginRight=Høyre margin på siden i millimeter. (Blank for standard) +HTMLToPDF.printBackground=Vis bakgrunnen til nettsider. +HTMLToPDF.defaultHeader=Aktiver standardtopp (Navn og sidenummer) +HTMLToPDF.cssMediaType=Endre CSS-mediatypen til siden. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Skjerm + + +#AddStampRequest +AddStampRequest.header=Stemple PDF +AddStampRequest.title=Stemple PDF +AddStampRequest.stampType=Stempeltype +AddStampRequest.stampText=Stempele tekst +AddStampRequest.stampImage=Stemplebilde +AddStampRequest.alphabet=Alfabet +AddStampRequest.fontSize=Font/Bilde Størrelse +AddStampRequest.rotation=Rotasjon +AddStampRequest.opacity=Gjennomsiktighet +AddStampRequest.position=Posisjon +AddStampRequest.overrideX=Overskriv X-koordinat +AddStampRequest.overrideY=Overskriv Y-koordinat +AddStampRequest.customMargin=Tilpasset Margin +AddStampRequest.customColor=Tilpasset Tekstfarge +AddStampRequest.submit=Send inn + + +#sanitizePDF +sanitizePDF.title=Rensker PDF +sanitizePDF.header=Rensker en PDF fil +sanitizePDF.selectText.1=Fjern JavaScript-handlinger +sanitizePDF.selectText.2=Fjern innebygde filer +sanitizePDF.selectText.3=Fjern metadata +sanitizePDF.selectText.4=Fjern lenker +sanitizePDF.selectText.5=Fjern skrifter +sanitizePDF.submit=Rensk PDF + + +#addPageNumbers +addPageNumbers.title=Legg til Sidetall +addPageNumbers.header=Legg til Sidetall +addPageNumbers.selectText.1=Velg PDF-fil: +addPageNumbers.selectText.2=Marginstørrelse +addPageNumbers.selectText.3=Posisjon +addPageNumbers.selectText.4=Startnummer +addPageNumbers.selectText.5=Sider å nummerere +addPageNumbers.selectText.6=Tilpasset Tekst +addPageNumbers.customTextDesc=Tilpasset Tekst +addPageNumbers.numberPagesDesc=Hvilke sider som skal nummereres, standard 'alle', aksepterer også 1-5 eller 2,5,9 osv. +addPageNumbers.customNumberDesc=Standard til {n}, aksepterer også 'Side {n} av {total}', 'Tekst-{n}', '{filnavn}-{n} +addPageNumbers.submit=Legg til Sidetall + + +#auto-rename +auto-rename.title=Auto Navngi +auto-rename.header=Auto Navngi PDF +auto-rename.submit=Auto Navngi + + +#adjustContrast +adjustContrast.title=Juster Kontrast +adjustContrast.header=Juster Kontrast +adjustContrast.contrast=Kontrast: +adjustContrast.brightness=Lysstyrke: +adjustContrast.saturation=Metning: +adjustContrast.download=Last ned + + +#crop +crop.title=Beskjær +crop.header=Beskjær PDF +crop.submit=Send inn + + +#autoSplitPDF +autoSplitPDF.title=Automatisk Del PDF +autoSplitPDF.header=Automatisk Del PDF +autoSplitPDF.description=Skriv ut, Sett inn, Skann, last opp, og la oss automatisk separere dokumentene dine. Ingen manuell sortering nødvendig. +autoSplitPDF.selectText.1=Skriv ut noen delingssider fra alternativene nedenfor (Svart-hvitt er greit). +autoSplitPDF.selectText.2=Skann alle dokumentene samtidig ved å sette inn delingssiden mellom dem. +autoSplitPDF.selectText.3=Last opp den enkelte store skannede PDF-filen og la Stirling PDF håndtere resten. +autoSplitPDF.selectText.4=Delingssidene blir automatisk oppdaget og fjernet, og garanterer et pent endelig dokument. +autoSplitPDF.formPrompt=Send inn PDF som inneholder Stirling-PDF-sideskillere: +autoSplitPDF.duplexMode=Dupleksmodus (Front- og bakskanning) +autoSplitPDF.dividerDownload1=Last ned 'Auto Splitter Divider (minimal).pdf' +autoSplitPDF.dividerDownload2=Last ned 'Auto Splitter Divider (med instruksjoner).pdf' +autoSplitPDF.submit=Send inn + + +#pipeline +pipeline.title=Pipeline + + +#pageLayout +pageLayout.title=Flersideoppsett +pageLayout.header=Flersideoppsett +pageLayout.pagesPerSheet=Sider per ark: +pageLayout.addBorder=Legg til rammer +pageLayout.submit=Send inn + + +#scalePages +scalePages.title=Juster side-skala +scalePages.header=Juster side-skala +scalePages.pageSize=Størrelse på et ark i dokumentet. +scalePages.scaleFactor=Zoom-nivå (beskjær) for en side. +scalePages.submit=Send inn + + +#certSign +certSign.title=Sertifikatsignering +certSign.header=Signer en PDF med sertifikatet ditt (Arbeid pågår) +certSign.selectPDF=Velg en PDF-fil for signering: +certSign.jksNote=Merk: Hvis sertifikattypen din ikke er oppført nedenfor, vennligst konverter den til en Java-keystore (.jks) fil ved å bruke kommandolinjeverktøyet keytool. Deretter velger du .jks-fil-alternativet nedenfor. +certSign.selectKey=Velg din private nøkkelfil (PKCS#8-format, kan være .pem eller .der): +certSign.selectCert=Velg din sertifikatfil (X.509-format, kan være .pem eller .der): +certSign.selectP12=Velg din PKCS#12-keystore-fil (.p12 eller .pfx) (Valgfritt, hvis angitt, bør den inneholde din private nøkkel og sertifikat): +certSign.selectJKS=Velg din Java-keystore-fil (.jks eller .keystore): +certSign.certType=Sertifikattype +certSign.password=Skriv inn passordet for keystore eller privat nøkkel (hvis noen): +certSign.showSig=Vis signatur +certSign.reason=Årsak +certSign.location=Sted +certSign.name=Navn +certSign.submit=Signer PDF + + +#removeCertSign +removeCertSign.title=Fjern Sertifikatsignatur +removeCertSign.header=Fjern det digitale sertifikatet fra PDF-en +removeCertSign.selectPDF=Velg en PDF-fil: +removeCertSign.submit=Fjern Signatur + + +#removeBlanks +removeBlanks.title=Fjern Blank Sider +removeBlanks.header=Fjern Blank Sider +removeBlanks.threshold=Pixel Hvithetsgrense: +removeBlanks.thresholdDesc=Grense for å bestemme hvor hvit en hvit piksel må være for å klassifiseres som 'Hvit'. 0 = Svart, 255 = Ren hvit. +removeBlanks.whitePercent=Hvit Prosent (%): +removeBlanks.whitePercentDesc=Prosent av siden som må være 'hvite' piksler for å fjernes +removeBlanks.submit=Fjern Blank Sider + + +#removeAnnotations +removeAnnotations.title=Fjern Anmerkninger +removeAnnotations.header=Fjern Anmerkninger +removeAnnotations.submit=Fjern + + +#compare +compare.title=Sammenlign +compare.header=Sammenlign PDF-er +compare.document.1=Dokument 1 +compare.document.2=Dokument 2 +compare.submit=Sammenlign + +#BookToPDF +BookToPDF.title=Bøker og Tegneserier til PDF +BookToPDF.header=Bok til PDF +BookToPDF.credit=Bruker Calibre +BookToPDF.submit=Konverter + +#PDFToBook +PDFToBook.title=PDF til Bok +PDFToBook.header=PDF til Bok +PDFToBook.selectText.1=Format +PDFToBook.credit=Bruker Calibre +PDFToBook.submit=Konverter + +#sign +sign.title=Signer +sign.header=Signer PDF-er +sign.upload=Last opp bilde +sign.draw=Tegn signatur +sign.text=Tekstinput +sign.clear=Slett +sign.add=Legg til + + +#repair +repair.title=Reparer +repair.header=Reparer PDF-er +repair.submit=Reparer + + +#flatten +flatten.title=Utjevning +flatten.header=Utjevning av PDf +flatten.flattenOnlyForms=Utjevning av kun skjemaer +flatten.submit=Utjevn + + +#ScannerImageSplit +ScannerImageSplit.selectText.1=Vinkelgrense: +ScannerImageSplit.selectText.2=Angir den minimale absolutte vinkelen som kreves for at bildet skal roteres (standard: 10). +ScannerImageSplit.selectText.3=Toleranse: +ScannerImageSplit.selectText.4=Bestemmer området for fargevariasjon rundt estimert bakgrunnsfarge (standard: 30). +ScannerImageSplit.selectText.5=Minimumsområde: +ScannerImageSplit.selectText.6=Angir minimumsområde terskel for et bilde (standard: 10000). +ScannerImageSplit.selectText.7=Minimumskonturområde: +ScannerImageSplit.selectText.8=Angir minimumskonturområde terskel for et bilde +ScannerImageSplit.selectText.9=Kantstørrelse: +ScannerImageSplit.selectText.10=Angir størrelsen på kanten som legges til og fjernes for å forhindre hvite kanter i utdataen (standard: 1). + + +#OCR +ocr.title=OCR / Rens av skanning +ocr.header=Rens av skanning / OCR (Optisk tegngjenkjenning) +ocr.selectText.1=Velg språk som skal oppdages innenfor PDF-en (De oppførte er de som for øyeblikket er oppdaget): +ocr.selectText.2=Produser tekstfil som inneholder OCR-tekst sammen med OCR-ert PDF +ocr.selectText.3=Korriger sider som ble skannet med skjev vinkel ved å rotere dem tilbake på plass +ocr.selectText.4=Rens siden slik at det er mindre sannsynlig at OCR vil finne tekst i bakgrunnsstøy. (Ingen utdataendring) +ocr.selectText.5=Rens siden slik at det er mindre sannsynlig at OCR vil finne tekst i bakgrunnsstøy, opprettholder rensing i utdataen. +ocr.selectText.6=Ignorer sider som har interaktiv tekst på dem, OCR kun sider som er bilder +ocr.selectText.7=Tving OCR, vil OCR hver side og fjerne alle originale tekstelementer +ocr.selectText.8=Normal (Vil gi feil hvis PDF inneholder tekst) +ocr.selectText.9=Tilleggsinnstillinger +ocr.selectText.10=OCR-modus +ocr.selectText.11=Fjern bilder etter OCR (Fjerner ALLE bilder, kun nyttig hvis det er en del av konverteringsprosessen) +ocr.selectText.12=Renderingstype (Avansert) +ocr.help=Vennligst les denne dokumentasjonen for hvordan du bruker dette for andre språk og/eller bruk utenfor Docker. +ocr.credit=Denne tjenesten bruker OCRmyPDF og Tesseract for OCR. +ocr.submit=Behandle PDF med OCR + + +#extractImages +extractImages.title=Hent ut bilder +extractImages.header=Hent ut bilder +extractImages.selectText=Velg bildeformat for å konvertere de hentede bildene til +extractImages.submit=Hent ut + + +#File to PDF +fileToPDF.title=Fil til PDF +fileToPDF.header=Konverter hvilken som helst fil til PDF +fileToPDF.credit=Denne tjenesten bruker LibreOffice og Unoconv for filkonvertering. +fileToPDF.supportedFileTypesInfo=Støttede filtyper +fileToPDF.supportedFileTypes=Støttede filtyper bør inkludere følgende, men for en fullstendig oppdatert liste over støttede formater, vennligst se LibreOffice-dokumentasjonen +fileToPDF.submit=Konverter til PDF + + +#compress +compress.title=Komprimer +compress.header=Komprimer PDF +compress.credit=Denne tjenesten bruker Ghostscript for PDF-komprimering/optimisering. +compress.selectText.1=Manuell modus - Fra 1 til 4 +compress.selectText.2=Optimeringsnivå: +compress.selectText.3=4 (Dårlig for tekstbilder) +compress.selectText.4=Automatisk modus - Justerer automatisk kvaliteten for å få PDF til nøyaktig størrelse +compress.selectText.5=Forventet PDF-størrelse (f.eks. 25MB, 10.8MB, 25KB) +compress.submit=Komprimer + + +#Add image +addImage.title=Legg til bilde +addImage.header=Legg til bilde i PDF +addImage.everyPage=På hver side? +addImage.upload=Legg til bilde +addImage.submit=Legg til bilde + + +#merge +merge.title=Slå sammen +merge.header=Slå sammen flere PDF-er (2+) +merge.sortByName=Sorter etter navn +merge.sortByDate=Sorter etter dato +merge.submit=Slå sammen + + +#pdfOrganiser +pdfOrganiser.title=Sideorganisering +pdfOrganiser.header=PDF-sideorganisering +pdfOrganiser.submit=Omorganiser sider +pdfOrganiser.mode=Modus +pdfOrganiser.mode.1=Egendefinert sideorden +pdfOrganiser.mode.2=Omvendt rekkefølge +pdfOrganiser.mode.3=Dupleks sortering +pdfOrganiser.mode.4=Brosjyresortering +pdfOrganiser.mode.5=Sidesøm brosjyresortering +pdfOrganiser.mode.6=Oddetall-jevntall splitt +pdfOrganiser.mode.7=Fjern først +pdfOrganiser.mode.8=Fjern sist +pdfOrganiser.mode.9=Fjern først og sist +pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1) + + +#multiTool +multiTool.title=PDF-multiverktøy +multiTool.header=PDF-multiverktøy +multiTool.uploadPrompts=Filnavn + +#view pdf +viewPdf.title=Vis PDF +viewPdf.header=Vis PDF + +#pageRemover +pageRemover.title=Sletting av sider +pageRemover.header=PDF-sidefjerner +pageRemover.pagesToDelete=Sider som skal slettes (Skriv inn en kommaseparert liste over sidenumre): +pageRemover.submit=Slett sider +pageRemover.placeholder=(f.eks. 1,2,6 eller 1-10,15-30) + + +#rotate +rotate.title=Roter PDF +rotate.header=Roter PDF +rotate.selectAngle=Velg rotasjonsvinkel (i multipler av 90 grader): +rotate.submit=Roter + + +#split-pdfs +split.title=Del PDF +split.header=Del PDF +split.desc.1=De tallene du velger er sidenummeret du ønsker å dele på +split.desc.2=Således vil valg av 1,3,7-9 dele et 10-siders dokument inn i 6 separate PDF-er med: +split.desc.3=Dokument #1: Side 1 +split.desc.4=Dokument #2: Side 2 og 3 +split.desc.5=Dokument #3: Side 4, 5, 6 og 7 +split.desc.6=Dokument #4: Side 8 +split.desc.7=Dokument #5: Side 9 +split.desc.8=Dokument #6: Side 10 +split.splitPages=Skriv inn sidene som skal deles på: +split.submit=Del + + +#merge +imageToPDF.title=Bilde til PDF +imageToPDF.header=Bilde til PDF +imageToPDF.submit=Konverter +imageToPDF.selectLabel=Bildejusteringsalternativer +imageToPDF.fillPage=Fyll side +imageToPDF.fitDocumentToImage=Pass side til bilde +imageToPDF.maintainAspectRatio=Behold sideforhold +imageToPDF.selectText.2=Automatisk rotasjon av PDF +imageToPDF.selectText.3=Flere fillogikk (Bare aktivert ved arbeid med flere bilder) +imageToPDF.selectText.4=Slå sammen til en enkelt PDF +imageToPDF.selectText.5=Konverter til separate PDF-filer + + +#pdfToImage +pdfToImage.title=PDF til bilde +pdfToImage.header=PDF til bilde +pdfToImage.selectText=Bildeformat +pdfToImage.singleOrMultiple=Resultattype for side til bilde +pdfToImage.single=Enkelt stort bilde som kombinerer alle sider +pdfToImage.multi=Flere bilder, ett bilde per side +pdfToImage.colorType=Farge type +pdfToImage.color=Farge +pdfToImage.grey=Gråtone +pdfToImage.blackwhite=Svart-hvitt (kan miste data!) +pdfToImage.submit=Konverter + + +#addPassword +addPassword.title=Legg til passord +addPassword.header=Legg til passord (Krypter) +addPassword.selectText.1=Velg PDF-fil for kryptering +addPassword.selectText.2=Brukerpassord +addPassword.selectText.3=Krypteringsnøkkellengde +addPassword.selectText.4=Høyere verdier er sterkere, men lavere verdier har bedre kompatibilitet. +addPassword.selectText.5=Tillatelser å sette (Anbefales å brukes sammen med eierpassord) +addPassword.selectText.6=Forhindre sammenstilling av dokumentet +addPassword.selectText.7=Forhindre innholdsekstraksjon +addPassword.selectText.8=Forhindre ekstraksjon for tilgjengelighet +addPassword.selectText.9=Forhindre utfylling av skjema +addPassword.selectText.10=Forhindre modifisering +addPassword.selectText.11=Forhindre annotasjonsmodifisering +addPassword.selectText.12=Forhindre utskrift +addPassword.selectText.13=Forhindre utskrift i ulike formater +addPassword.selectText.14=Eierpassord +addPassword.selectText.15=Begrenser hva som kan gjøres med dokumentet når det er åpnet (Støttes ikke av alle leserprogrammer) +addPassword.selectText.16=Begrenser åpningen av dokumentet selv +addPassword.submit=Krypter + + +#watermark +watermark.title=Legg til vannmerke +watermark.header=Legg til vannmerke +watermark.selectText.1=Velg PDF-fil å legge til vannmerke på: +watermark.selectText.2=Vannmerketekst: +watermark.selectText.3=Skriftstørrelse: +watermark.selectText.4=Rotasjon (0-360): +watermark.selectText.5=Breddeavstand (Avstand mellom hvert vannmerke horisontalt): +watermark.selectText.6=Høydeavstand (Avstand mellom hvert vannmerke vertikalt): +watermark.selectText.7=Opasitet (0% - 100%): +watermark.selectText.8=Vannmerketype: +watermark.selectText.9=Vannmerkebilde: +watermark.submit=Legg til vannmerke +watermark.type.1=Tekst +watermark.type.2=Bilde + + +#Change permissions +permissions.title=Endre tillatelser +permissions.header=Endre tillatelser +permissions.warning=Advarsel: For at disse tillatelsene skal være ugjenkallelige, anbefales det å angi dem med et passord via siden for å legge til passord +permissions.selectText.1=Velg PDF for å endre tillatelser +permissions.selectText.2=Tillatelser å sette +permissions.selectText.3=Forhindre sammenstilling av dokumentet +permissions.selectText.4=Forhindre innholdsekstraksjon +permissions.selectText.5=Forhindre ekstraksjon for tilgjengelighet +permissions.selectText.6=Forhindre utfylling av skjema +permissions.selectText.7=Forhindre modifisering +permissions.selectText.8=Forhindre annotasjonsmodifisering +permissions.selectText.9=Forhindre utskrift +permissions.selectText.10=Forhindre utskrift i ulike formater +permissions.submit=Endre + + +#remove password +removePassword.title=Fjern passord +removePassword.header=Fjern passord (Dekrypter) +removePassword.selectText.1=Velg PDF for å dekryptere +removePassword.selectText.2=Passord +removePassword.submit=Fjern + + +#changeMetadata +changeMetadata.title=Endre metadata +changeMetadata.header=Endre metadata +changeMetadata.selectText.1=Vennligst rediger variablene du ønsker å endre +changeMetadata.selectText.2=Slett all metadata +changeMetadata.selectText.3=Vis tilpasset metadata: +changeMetadata.author=Forfatter: +changeMetadata.creationDate=Opprettelsesdato (åååå/MM/dd HH:mm:ss): +changeMetadata.creator=Oppretter: +changeMetadata.keywords=Nøkkelord: +changeMetadata.modDate=Endringsdato (åååå/MM/dd HH:mm:ss): +changeMetadata.producer=Produsent: +changeMetadata.subject=Emne: +changeMetadata.trapped=Fanget: +changeMetadata.selectText.4=Annen metadata: +changeMetadata.selectText.5=Legg til tilpasset metadataoppføring +changeMetadata.submit=Endre + + +#pdfToPDFA +pdfToPDFA.title=PDF til PDF/A +pdfToPDFA.header=PDF til PDF/A +pdfToPDFA.credit=Denne tjenesten bruker OCRmyPDF for PDF/A-konvertering +pdfToPDFA.submit=Konverter +pdfToPDFA.tip=Fungere for øyeblikket ikke for flere innganger samtidig +pdfToPDFA.outputFormat=Utdataformat +pdfToPDFA.pdfWithDigitalSignature=PDFen inneholder en digital signatur. Denne vil bli fjernet i neste steg. + + +#PDFToWord +PDFToWord.title=PDF til Word +PDFToWord.header=PDF til Word +PDFToWord.selectText.1=Utdatafilformat +PDFToWord.credit=Denne tjenesten bruker LibreOffice for filkonvertering. +PDFToWord.submit=Konverter + + +#PDFToPresentation +PDFToPresentation.title=PDF til Presentasjon +PDFToPresentation.header=PDF til Presentasjon +PDFToPresentation.selectText.1=Utdatafilformat +PDFToPresentation.credit=Denne tjenesten bruker LibreOffice for filkonvertering. +PDFToPresentation.submit=Konverter + + +#PDFToText +PDFToText.title=PDF til RTF (Tekst) +PDFToText.header=PDF til RTF (Tekst) +PDFToText.selectText.1=Utdatafilformat +PDFToText.credit=Denne tjenesten bruker LibreOffice for filkonvertering. +PDFToText.submit=Konverter + + +#PDFToHTML +PDFToHTML.title=PDF til HTML +PDFToHTML.header=PDF til HTML +PDFToHTML.credit=Denne tjenesten bruker pdftohtml for filkonvertering. +PDFToHTML.submit=Konverter + + +#PDFToXML +PDFToXML.title=PDF til XML +PDFToXML.header=PDF til XML +PDFToXML.credit=Denne tjenesten bruker LibreOffice for filkonvertering. +PDFToXML.submit=Konverter + +#PDFToCSV +PDFToCSV.title=PDF til CSV +PDFToCSV.header=PDF til CSV +PDFToCSV.prompt=Velg side for å trekke ut tabell +PDFToCSV.submit=Trekke ut + +#split-by-size-or-count +split-by-size-or-count.title=Del PDF etter størrelse eller antall +split-by-size-or-count.header=Del PDF etter størrelse eller antall +split-by-size-or-count.type.label=Velg delingstype +split-by-size-or-count.type.size=Etter størrelse +split-by-size-or-count.type.pageCount=Etter sidetall +split-by-size-or-count.type.docCount=Etter antall dokumenter +split-by-size-or-count.value.label=Skriv inn verdi +split-by-size-or-count.value.placeholder=Skriv inn størrelse (f.eks. 2 MB eller 3 KB) eller antall (f.eks. 5) +split-by-size-or-count.submit=Send inn + + +#overlay-pdfs +overlay-pdfs.header=Overlegg PDF-filer +overlay-pdfs.baseFile.label=Velg grunnleggende PDF-fil +overlay-pdfs.overlayFiles.label=Velg overlegg PDF-filer +overlay-pdfs.mode.label=Velg overleggmodus +overlay-pdfs.mode.sequential=Sekvensiell overlegg +overlay-pdfs.mode.interleaved=Interleaved overlegg +overlay-pdfs.mode.fixedRepeat=Fast gjentakende overlegg +overlay-pdfs.counts.label=Antall overlegg (for fast gjentakende modus) +overlay-pdfs.counts.placeholder=Skriv inn komma-separerte tellinger (f.eks. 2,3,1) +overlay-pdfs.position.label=Velg overleggposisjon +overlay-pdfs.position.foreground=Forgrunn +overlay-pdfs.position.background=Bakgrunn +overlay-pdfs.submit=Send inn + + +#split-by-sections +split-by-sections.title=Del PDF etter seksjoner +split-by-sections.header=Del PDF inn i seksjoner +split-by-sections.horizontal.label=Horisontale delinger +split-by-sections.vertical.label=Vertikale delinger +split-by-sections.horizontal.placeholder=Skriv inn antall horisontale delinger +split-by-sections.vertical.placeholder=Skriv inn antall vertikale delinger +split-by-sections.submit=Del PDF +split-by-sections.merge=Slå sammen til én PDF + + +#printFile +printFile.title=Skriv ut fil +printFile.header=Skriv ut fil til skriver +printFile.selectText.1=Velg fil som skal skrives ut +printFile.selectText.2=Skriv inn skrivernavn +printFile.submit=Skriv ut + + +#licenses +licenses.nav=Lisenser +licenses.title=Tredjeparts lisenser +licenses.header=Tredjeparts lisenser +licenses.module=Modul +licenses.version=Versjon +licenses.license=Lisens + + +#error +error.sorry=Beklager for problemet! +error.needHelp=Trenger du hjelp / Har du funnet et problem? +error.contactTip=Hvis du fortsatt har problemer, ikke nøl med å kontakte oss for hjelp. Du kan sende inn en billett på vår GitHub-side eller kontakte oss via Discord: +error.404.head=404 - Side ikke funnet | Oops, vi falt i koden! +error.404.1=Vi kan ikke finne siden du leter etter. +error.404.2=Noe gikk galt +error.github=Send inn en billett på GitHub +error.showStack=Vis stakksporing +error.copyStack=Kopier stakksporing +error.githubSubmit=GitHub - Send inn en billett +error.discordSubmit=Discord - Send inn støtteinnlegg + diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 5f61a111..11735023 100644 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -332,6 +332,10 @@ home.certSign.title=Podpisz certyfikatem home.certSign.desc=Podpisz dokument PDF za pomocą certyfikatu/klucza prywatnego (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Układ wielu stron home.pageLayout.desc=Scal wiele stron dokumentu PDF w jedną stronę pageLayout.tags=merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Nazwa certSign.submit=Podpisz PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Usuń puste removeBlanks.header=Usuń puste strony @@ -964,6 +976,7 @@ pdfToPDFA.credit=Ta usługa używa OCRmyPDF do konwersji PDF/A pdfToPDFA.submit=Konwertuj pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index b1fe46ca..76f19b0f 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -332,6 +332,10 @@ home.certSign.title=Assinar com Certificado home.certSign.desc=Assinar um PDF com um Certificado/Chave (PEM/P12) certSign.tags=autenticar,PEM,P12,oficial,criptografar +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Layout de Múltiplas Páginas home.pageLayout.desc=Mesclar várias páginas de um documento PDF em uma única página pageLayout.tags=mesclar,composto,vista-única,organizar @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Nome certSign.submit=Assinar PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Remover Páginas em Branco removeBlanks.header=Remover Páginas em Branco @@ -964,6 +976,7 @@ pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A pdfToPDFA.submit=Converter pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 439e8d36..c7875e95 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -332,6 +332,10 @@ home.certSign.title=Assinar com Certificado home.certSign.desc=Assinar um PDF com um Certificado/Chave (PEM/P12) certSign.tags=autenticar,PEM,P12,oficial,criptografar +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Layout de Múltiplas Páginas home.pageLayout.desc=Juntar várias páginas de um documento PDF em uma única página pageLayout.tags=juntar,composto,vista-única,organizar @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Nome certSign.submit=Assinar PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Remover Páginas em Branco removeBlanks.header=Remover Páginas em Branco @@ -964,6 +976,7 @@ pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A pdfToPDFA.submit=Converter pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 439c75fb..cbe31268 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -332,6 +332,10 @@ home.certSign.title=Semnare cu certificat home.certSign.desc=Semnează un PDF cu un certificat/cheie (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Multi-Page Layout home.pageLayout.desc=Merge multiple pages of a PDF document into a single page pageLayout.tags=merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Numele certSign.submit=Semnează PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Elimină pagini goale removeBlanks.header=Elimină pagini goale @@ -964,6 +976,7 @@ pdfToPDFA.credit=Acest serviciu utilizează OCRmyPDF pentru conversia în PDF/A pdfToPDFA.submit=Convert pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 27b9fd8a..9f9e461a 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -332,6 +332,10 @@ home.certSign.title=Подписать сертификатом home.certSign.desc=Подписать PDF сертификатом/ключом (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Объединить страницы home.pageLayout.desc=Объединение нескольких страниц документа PDF в одну страницу pageLayout.tags=merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Имя certSign.submit=Подписать PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Удалить Пустые removeBlanks.header=Удалить Пустые Страницы @@ -964,6 +976,7 @@ pdfToPDFA.credit=Этот сервис использует OCRmyPDF для пр pdfToPDFA.submit=Конвертировать pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index 9d5f5ed9..73b86a9f 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -332,6 +332,10 @@ home.certSign.title=Podpísať s certifikátom home.certSign.desc=Podpísať PDF s certifikátom/kľúčom (PEM/P12) certSign.tags=autentifikovať,PEM,P12,oficiálne,šifrovať +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Viacstranové usporiadanie home.pageLayout.desc=Zlúčte viacero stránok PDF dokumentu do jednej stránky pageLayout.tags=zlúčiť,zjednotiť,jednostranový pohľad,organizovať @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Meno certSign.submit=Podpísať PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Odstrániť prázdne stránky removeBlanks.header=Odstrániť prázdne stránky @@ -964,6 +976,7 @@ pdfToPDFA.credit=Táto služba používa OCRmyPDF na konverziu PDF/A pdfToPDFA.submit=Konvertovať pdfToPDFA.tip=Momentálne nefunguje pre viacero vstupov naraz pdfToPDFA.outputFormat=Výstupný formát +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index 8adf67bf..a4a01c78 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -332,6 +332,10 @@ home.certSign.title=Potpis sa sertifikatom home.certSign.desc=Potpisuje PDF sa sertifikatom/ključem (PEM/P12) certSign.tags=autentifikacija,PEM,P12,zvanično,šifrovanje +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Višestruki prikaz stranica home.pageLayout.desc=Spaja više stranica PDF dokumenta u jednu stranicu pageLayout.tags=spajanje,kompozit,pojedinačan-prikaz,organizacija @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Ime certSign.submit=Potpiši PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Ukloni prazne stranice removeBlanks.header=Ukloni prazne stranice @@ -964,6 +976,7 @@ pdfToPDFA.credit=Ova usluga koristi OCRmyPDF za konverziju u PDF/A format pdfToPDFA.submit=Konvertuj pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index 621bdbe1..040c8ca6 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -332,6 +332,10 @@ home.certSign.title=Sign with Certificate home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Multi-Page Layout home.pageLayout.desc=Merge multiple pages of a PDF document into a single page pageLayout.tags=merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Namn certSign.submit=Skriv under PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Ta bort tomrum removeBlanks.header=Ta bort tomma sidor @@ -964,6 +976,7 @@ pdfToPDFA.credit=Denna tjänst använder OCRmyPDF för PDF/A-konvertering pdfToPDFA.submit=Konvertera pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 560501b2..94830130 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -332,6 +332,10 @@ home.certSign.title=Sertifika ile İmzala home.certSign.desc=Bir PDF'i Sertifika/Anahtar (PEM/P12) ile imzalar certSign.tags=doğrula,PEM,P12,resmi,şifrele +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Çoklu-Sayfa Düzeni home.pageLayout.desc=Bir PDF belgesinin çoklu sayfalarını tek bir sayfada birleştirir pageLayout.tags=birleştir,kompozit,tek-görünüm,düzenle @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=İsim certSign.submit=PDF'i İmzala +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Boşları Kaldır removeBlanks.header=Boş Sayfaları Kaldır @@ -964,6 +976,7 @@ pdfToPDFA.credit=Bu hizmet PDF/A dönüşümü için OCRmyPDF kullanır pdfToPDFA.submit=Dönüştür pdfToPDFA.tip=Şu anda aynı anda birden fazla giriş için çalışmıyor pdfToPDFA.outputFormat=Çıkış formatı +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index bef38428..a9e6b967 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -332,6 +332,10 @@ home.certSign.title=Підписати сертифікатом home.certSign.desc=Підписати PDF сертифікатом/ключем (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=Об'єднати сторінки home.pageLayout.desc=Об'єднання кількох сторінок документа PDF в одну сторінку pageLayout.tags=merge,composite,single-view,organize @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=Ім'я certSign.submit=Підписати PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=Видалити порожні removeBlanks.header=Видалити порожні сторінки @@ -964,6 +976,7 @@ pdfToPDFA.credit=Цей сервіс використовує OCRmyPDF для п pdfToPDFA.submit=Конвертувати pdfToPDFA.tip=Наразі не працює для кількох вхідних файлів одночасно pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 2d7cd4b5..0e6f6793 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -332,6 +332,10 @@ home.certSign.title=使用证书签署 home.certSign.desc=使用证书/密钥(PEM/P12)对PDF进行签署 certSign.tags=身份验证、PEM、P12、官方、加密 +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=多页布局 home.pageLayout.desc=将PDF文档的多个页面合并成一页 pageLayout.tags=合并、组合、单视图、整理 @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=名称 certSign.submit=签署 PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=删除空白 removeBlanks.header=删除空白页 @@ -964,6 +976,7 @@ pdfToPDFA.credit=此服务使用OCRmyPDF进行PDF/A转换 pdfToPDFA.submit=转换 pdfToPDFA.tip=目前不支持上传多个 pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index 2afd7e61..92de26ef 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -332,6 +332,10 @@ home.certSign.title=使用憑證簽章 home.certSign.desc=使用憑證/金鑰(PEM/P12)簽章 PDF certSign.tags=驗證,PEM,P12,官方,加密 +home.removeCertSign.title=Remove Certificate Sign +home.removeCertSign.desc=Remove certificate signature from PDF +removeCertSign.tags=authenticate,PEM,P12,official,decrypt + home.pageLayout.title=多頁面版面配置 home.pageLayout.desc=將 PDF 檔案的多個頁面合併到單一頁面 pageLayout.tags=合併,複合,單一檢視,組織 @@ -457,6 +461,7 @@ login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response +login.oauth2InvalidIdToken=Invalid Id Token #auto-redact @@ -654,6 +659,13 @@ certSign.name=名稱 certSign.submit=簽章 PDF +#removeCertSign +removeCertSign.title=Remove Certificate Signature +removeCertSign.header=Remove the digital certificate from the PDF +removeCertSign.selectPDF=Select a PDF file: +removeCertSign.submit=Remove Signature + + #removeBlanks removeBlanks.title=移除空白頁面 removeBlanks.header=移除空白頁面 @@ -964,6 +976,7 @@ pdfToPDFA.credit=此服務使用 OCRmyPDF 進行 PDF/A 轉換 pdfToPDFA.submit=轉換 pdfToPDFA.tip=目前不支援上傳多個 pdfToPDFA.outputFormat=Output format +pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. #PDFToWord diff --git a/src/main/resources/static/css/home.css b/src/main/resources/static/css/home.css index a6f89ed0..07a1350f 100644 --- a/src/main/resources/static/css/home.css +++ b/src/main/resources/static/css/home.css @@ -5,7 +5,7 @@ font-size: 16px; margin-bottom: 2rem; padding: 0.75rem 3.5rem; - border: 0.1rem solid var(--md-sys-color-outline-variant); + border: 1px solid var(--md-sys-color-outline-variant); border-radius: 3rem; outline-color: var(--md-sys-color-outline-variant); } @@ -19,12 +19,12 @@ .features-container { display: grid; grid-template-columns: repeat(auto-fill, minmax(15rem, 3fr)); - gap: 25px 30px; + gap: 30px 30px; } .feature-card { - border: 2px solid var(--md-sys-color-surface-5); - border-radius: 2rem; + border: 1px solid var(--md-sys-color-surface-5); + border-radius: 1.75rem; padding: 1.25rem; display: flex; flex-direction: column; @@ -47,13 +47,13 @@ } .feature-card .card-text { - flex: 1; + font-size: .875rem; } .feature-card:hover { cursor: pointer; - transform: scale(1.1); - box-shadow: var(--md-sys-elevation-3); + transform: scale(1.08); + box-shadow: var(--md-sys-elevation-2); } .card-title.text-primary { @@ -79,11 +79,12 @@ } #tool-text { - margin: 0.5rem 0.5rem 0rem; + margin: 0.0rem 0 0 1.25rem; } .card-title { margin-bottom: 1rem; + font-size: 1.1rem; } /* Only show the favorite icons when the parent card is being hovered over */ diff --git a/src/main/resources/static/css/navbar.css b/src/main/resources/static/css/navbar.css index ddeab5aa..a8845f29 100644 --- a/src/main/resources/static/css/navbar.css +++ b/src/main/resources/static/css/navbar.css @@ -75,7 +75,7 @@ } .icon-text { - margin-left: 4px; + margin-left: 8px; margin-right: 4px; display: inline-flex; flex-direction: column; diff --git a/src/main/resources/static/css/theme/componentes.css b/src/main/resources/static/css/theme/componentes.css index d767d59d..7e3f744e 100644 --- a/src/main/resources/static/css/theme/componentes.css +++ b/src/main/resources/static/css/theme/componentes.css @@ -187,8 +187,8 @@ td { .feature-card .nav-icon { vertical-align: middle; font-size: 2rem !important; - padding: 0.5rem; - border-radius: 1.25rem; + padding: 0.75rem; + border-radius: 0.9rem; color: var(--md-sys-color-surface); } @@ -798,6 +798,8 @@ textarea.form-control { } .nav-link { + display: flex; + align-items: center; transition: none !important; padding: 0.5rem 1rem !important; border: 1px transparent; diff --git a/src/main/resources/static/css/theme/font.css b/src/main/resources/static/css/theme/font.css index dfb1c1b8..f245dd32 100644 --- a/src/main/resources/static/css/theme/font.css +++ b/src/main/resources/static/css/theme/font.css @@ -7,7 +7,7 @@ .material-symbols-rounded { font-family: 'Material Symbols Rounded'; - font-weight: normal; + font-weight: 300; font-style: normal; font-size: 24px; line-height: 1; diff --git a/src/main/resources/static/css/theme/theme.css b/src/main/resources/static/css/theme/theme.css index 3c9565d1..4f7be33e 100644 --- a/src/main/resources/static/css/theme/theme.css +++ b/src/main/resources/static/css/theme/theme.css @@ -30,5 +30,5 @@ } .no-fill { - font-variation-settings: var(--md-sys-icon-fill-0); + /* font-variation-settings: var(--md-sys-icon-fill-0); */ } \ No newline at end of file diff --git a/src/main/resources/static/images/flags/hr.svg b/src/main/resources/static/images/flags/hr.svg new file mode 100644 index 00000000..44fed27d --- /dev/null +++ b/src/main/resources/static/images/flags/hr.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/static/images/flags/no.svg b/src/main/resources/static/images/flags/no.svg new file mode 100644 index 00000000..a5f2a152 --- /dev/null +++ b/src/main/resources/static/images/flags/no.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/main/resources/templates/addUsers.html b/src/main/resources/templates/addUsers.html index 0cb5c512..d291a4a9 100644 --- a/src/main/resources/templates/addUsers.html +++ b/src/main/resources/templates/addUsers.html @@ -34,7 +34,7 @@

- +
@@ -47,7 +47,7 @@ Default message if not found -
+
@@ -78,7 +78,7 @@
Default message if not found
- +
+ +
-
+
+

diff --git a/src/main/resources/templates/crop.html b/src/main/resources/templates/crop.html index 1f3d9734..984a0b4c 100644 --- a/src/main/resources/templates/crop.html +++ b/src/main/resources/templates/crop.html @@ -1,7 +1,7 @@ - + @@ -16,7 +16,7 @@ crop -
+
@@ -75,6 +75,16 @@ } }); + cropForm.addEventListener('submit', function(e) { + if (xInput.value == "" && yInput.value == "" && widthInput.value == "" && heightInput.value == "") { + // Ορίστε συντεταγμένες για ολόκληρη την επιφάνεια του PDF + xInput.value = 0; + yInput.value = 0; + widthInput.value = pdfCanvas.width; + heightInput.value = pdfCanvas.height; + } + }); + overlayCanvas.addEventListener('mousedown', function(e) { // Clear previously drawn rectangle on the main canvas context.clearRect(0, 0, pdfCanvas.width, pdfCanvas.height); @@ -138,4 +148,4 @@ - \ No newline at end of file + diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html index e24d114b..f9e2088a 100644 --- a/src/main/resources/templates/error.html +++ b/src/main/resources/templates/error.html @@ -21,7 +21,7 @@ - + diff --git a/src/main/resources/templates/fragments/languages.html b/src/main/resources/templates/fragments/languages.html index b004faf1..b3cd932e 100644 --- a/src/main/resources/templates/fragments/languages.html +++ b/src/main/resources/templates/fragments/languages.html @@ -29,4 +29,6 @@ icon Srpski icon Українська icon Česky + icon Hrvatski + icon Norsk diff --git a/src/main/resources/templates/fragments/navbar.html b/src/main/resources/templates/fragments/navbar.html index c296ab7d..0ddc0362 100644 --- a/src/main/resources/templates/fragments/navbar.html +++ b/src/main/resources/templates/fragments/navbar.html @@ -8,7 +8,7 @@