diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 349c991d..b5141f57 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -10,5 +10,6 @@ Closes #(issue_number) - [ ] I have performed a self-review of my own code - [ ] I have attached images of the change if it is UI based - [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] If my code has heavily changed functionality I have updated relevant docs on [Stirling-PDFs doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) - [ ] My changes generate no new warnings - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) diff --git a/.github/scripts/gradle_to_chart.py b/.github/scripts/gradle_to_chart.py deleted file mode 100644 index c8944f6d..00000000 --- a/.github/scripts/gradle_to_chart.py +++ /dev/null @@ -1,100 +0,0 @@ -import re -import yaml - -# Paths to the files -chart_yaml_path = "chart/stirling-pdf/Chart.yaml" -gradle_path = "build.gradle" - - -def get_chart_version(path): - """ - Reads the version and the appVersion from Chart.yaml. - - Args: - path (str): The file path to the Chart.yaml. - - Returns: - dict: The version under "chart" key and the appVersion under "app" key. - """ - with open(path, encoding="utf-8") as file: - chart_yaml = yaml.safe_load(file) - return { - "chart": chart_yaml["version"], - "app": chart_yaml["appVersion"] - } - - -def get_gradle_version(path): - """ - Extracts the version from build.gradle. - - Args: - path (str): The file path to the build.gradle. - - Returns: - str: The version if found, otherwise an empty string. - """ - with open(path, encoding="utf-8") as file: - for line in file: - if "version =" in line: - # Extracts the value after 'version =' - return re.search(r'version\s*=\s*[\'"](.+?)[\'"]', line).group(1) - return "" - - -def get_new_chart_version(chart_version, old_app_version, new_app_version): - """ - Get the new chart version from - - Args: - str: The current chart version. - str: The current app version. - str: The new app version. - - Returns: - str: The new chart version to update to. - """ - chart_major, chart_minor, chart_patch = chart_version.split(".") - - old_major, old_minor, old_patch = old_app_version.split(".") - new_major, new_minor, new_patch = new_app_version.split(".") - - if old_major != new_major: - new_chart_version = f"{int(chart_major)+1}.0.0" - elif old_minor != new_minor: - new_chart_version = f"{chart_major}.{int(chart_minor)+1}.0" - elif old_patch != new_patch: - new_chart_version = f"{chart_major}.{chart_minor}.{int(chart_patch)+1}" - - return new_chart_version - - -def update_chart_version(path, new_chart_version, new_app_version): - """ - Updates the version and the appVersion in Chart.yaml with a new version. - - Args: - path (str): The file path to the Chart.yaml. - new_chart_version (str): The new chart version to update to. - new_app_version (str): The new app version to update to. - """ - with open(path, encoding="utf-8") as file: - chart_yaml = yaml.safe_load(file) - chart_yaml["version"] = new_chart_version - chart_yaml["appVersion"] = new_app_version - with open(path, "w", encoding="utf-8") as file: - yaml.safe_dump(chart_yaml, file) - - -# Main logic -chart_version = get_chart_version(chart_yaml_path) -gradle_version = get_gradle_version(gradle_path) - -if chart_version["app"] != gradle_version: - new_chart_version = get_new_chart_version(chart_version["chart"], chart_version["app"], gradle_version, ) - print( - f"Versions do not match. Updating Chart.yaml from {chart_version['chart']} to {new_chart_version}." - ) - update_chart_version(chart_yaml_path, new_chart_version, gradle_version) -else: - print("Versions match. No update required.") diff --git a/.github/workflows/lint-helm-charts.yml b/.github/workflows/lint-helm-charts.yml deleted file mode 100644 index 3b012091..00000000 --- a/.github/workflows/lint-helm-charts.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Lint and Test Helm Charts - -on: - push: - branches: ["main"] - pull_request: - branches: ["main"] - -jobs: - lint-test: - runs-on: ubuntu-latest - - permissions: - contents: read - - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Set up Helm - uses: azure/setup-helm@v4 - - - name: Set up python - uses: actions/setup-python@v5 - with: - python-version: '3.10' - - - name: Run pre-commit - uses: pre-commit/action@v3.0.1 - with: - extra_args: helm-docs-built - - - name: Set up chart-testing - uses: helm/chart-testing-action@v2 - - - name: Run chart-testing (list-changed) - id: list-changed - run: | - changed=$(ct list-changed --target-branch ${{ github.event.repository.default_branch }}) - if [[ -n "$changed" ]]; then - echo "changed=true" >> "$GITHUB_OUTPUT" - fi - - - name: Run chart-testing - if: steps.list-changed.outputs.changed == 'true' - run: ct lint --target-branch ${{ github.event.repository.default_branch }} --validate-maintainers=false diff --git a/.github/workflows/push-docker.yml b/.github/workflows/push-docker.yml index df7af98a..334ca078 100644 --- a/.github/workflows/push-docker.yml +++ b/.github/workflows/push-docker.yml @@ -10,6 +10,7 @@ on: permissions: contents: read packages: write + jobs: push: runs-on: ubuntu-latest @@ -66,6 +67,7 @@ jobs: images: | ${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf + ${{ secrets.DOCKER_HUB_ORG_USERNAME }}/stirling-pdf tags: | type=raw,value=${{ steps.versionNumber.outputs.versionNumber }},enable=${{ github.ref == 'refs/heads/master' }} type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }} @@ -93,6 +95,7 @@ jobs: images: | ${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf + ${{ secrets.DOCKER_HUB_ORG_USERNAME }}/stirling-pdf tags: | type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }} type=raw,value=latest-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }} @@ -119,6 +122,7 @@ jobs: images: | ${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf + ${{ secrets.DOCKER_HUB_ORG_USERNAME }}/stirling-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' }} diff --git a/.github/workflows/release-helm-charts.yml b/.github/workflows/release-helm-charts.yml deleted file mode 100644 index 0dca6fb5..00000000 --- a/.github/workflows/release-helm-charts.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Release Helm charts - -on: - push: - branches: - - main - -permissions: - contents: write - -jobs: - release: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Set up git config - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "github-actions[bot]@users.noreply.github.com" - - - name: Run chart-releaser - uses: helm/chart-releaser-action@v1.6.0 - with: - config: "./cr.yaml" - charts_dir: "chart" - env: - CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/sync_files.yml b/.github/workflows/sync_files.yml index 486cad5f..d220f92d 100644 --- a/.github/workflows/sync_files.yml +++ b/.github/workflows/sync_files.yml @@ -14,48 +14,6 @@ permissions: pull-requests: write jobs: - sync-versions: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.x" - - name: Install dependencies - run: pip install pyyaml - - name: Sync versions - run: python .github/scripts/gradle_to_chart.py - - name: Run pre-commit helm-docs-built - uses: pre-commit/action@v3.0.1 - with: - extra_args: helm-docs-built - - name: Set up git config - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "github-actions[bot]@users.noreply.github.com" - - name: Run git add - run: | - git add . - git diff --staged --quiet || git commit -m ":floppy_disk: Sync Versions - > Made via sync_files.yml" || echo "no changes" - - name: Create Pull Request - uses: peter-evans/create-pull-request@v6 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: Update files - committer: GitHub Action - author: GitHub Action - signoff: true - branch: sync_version - title: ":floppy_disk: Update Version" - body: | - Auto-generated by [create-pull-request][1] - - [1]: https://github.com/peter-evans/create-pull-request - draft: false - delete-branch: true - labels: github-actions sync-readme: runs-on: ubuntu-latest steps: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 125f0b50..45ce3639 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,9 +37,3 @@ repos: language: python exclude: ^(src/main/resources/static/pdfjs|src/main/resources/static/pdfjs-legacy) files: ^.*(\.html|\.css|\.js)$ - - repo: https://github.com/norwoodj/helm-docs - rev: v1.14.2 - hooks: - - id: helm-docs-built - args: - - --chart-search-root=chart diff --git a/Endpoint-groups.md b/Endpoint-groups.md index a1a29817..0c31c5da 100644 --- a/Endpoint-groups.md +++ b/Endpoint-groups.md @@ -1,47 +1,46 @@ -| 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 | | | | ✔️ | | | | | | | ✔️ | +| Operation | PageOps | Convert | Security | Other | CLI | Python | OpenCV | LibreOffice | OCRmyPDF | Java | Javascript | Unoconv | Ghostscript | +| ------------------- | ------- | ------- | -------- | ----- | --- | ------ | ------ | ----------- | -------- | ---- | ---------- | ------- | ----------- | +| 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 | | ✔️ | | | ✔️ | | | ✔️ | | | | | | +| 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 | | | | ✔️ | | | | | | | ✔️ | | | diff --git a/HowToUseOCR.md b/HowToUseOCR.md index ecb187c5..6f168111 100644 --- a/HowToUseOCR.md +++ b/HowToUseOCR.md @@ -80,3 +80,23 @@ dnf search -C tesseract-langpack- # View installed languages: rpm -qa | grep tesseract-langpack | sed 's/tesseract-langpack-//g' ``` + +For Windows: + +Ensure ocrmypdf in installed with +``pip install ocrmypdf`` + +Additional languages must be downloaded manually: +Download desired .traineddata files from tessdata or tessdata_fast +Place them in the tessdata folder within your Tesseract installation directory +(e.g., C:\Program Files\Tesseract-OCR\tessdata) + +Verify installation: +``tesseract --list-langs`` + +You must then edit your ``/configs/settings.yml`` and change the system.tessdataDir to match the directory containing lang files +``` +system: + tessdataDir: C:/Program Files/Tesseract-OCR/tessdata # path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored. +``` + diff --git a/README.md b/README.md index d8164c13..26ece477 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,8 @@ [![GitHub Repo stars](https://img.shields.io/github/stars/stirling-tools/stirling-pdf?style=social)](https://github.com/Stirling-Tools/stirling-pdf) [![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/Stirling-Tools/Stirling-PDF/tree/digitalOcean&refcode=c3210994b1af) -[Name](https://www.ssdnodes.com/manage/aff.php?aff=2216®ister=true) -Stirling-PDF is a robust, locally hosted web-based PDF manipulation tool using Docker. It enables you to carry out various operations on PDF files, including splitting, merging, converting, reorganizing, adding images, rotating, compressing, and more. This locally hosted web application has evolved to encompass a comprehensive set of features, addressing all your PDF requirements. +[Stirling-PDF](https://www.stirlingpdf.com) is a robust, locally hosted web-based PDF manipulation tool using Docker. It enables you to carry out various operations on PDF files, including splitting, merging, converting, reorganizing, adding images, rotating, compressing, and more. This locally hosted web application has evolved to encompass a comprehensive set of features, addressing all your PDF requirements. Stirling-PDF does not initiate any outbound calls for record-keeping or tracking purposes. @@ -19,6 +18,7 @@ All files and PDFs exist either exclusively on the client side, reside in server ## Features +- Enterprise features like SSO Check [here](https://docs.stirlingpdf.com/Enterprise%20Edition) - Dark mode support - Custom download options - Parallel file processing and downloads @@ -27,6 +27,7 @@ All files and PDFs exist either exclusively on the client side, reside in server - Optional Login and Authentication support (see [here](https://github.com/Stirling-Tools/Stirling-PDF/tree/main#login-authentication) for documentation) - Database Backup and Import (see [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DATABASE.md) for documentation) + ## PDF Features ### Page Operations @@ -46,6 +47,8 @@ All files and PDFs exist either exclusively on the client side, reside in server - Extract page(s) - Convert PDF to a single page - Overlay PDFs on top of each other +- PDF to single page +- Split PDF by sections ### Conversion Operations @@ -53,6 +56,8 @@ All files and PDFs exist either exclusively on the client side, reside in server - Convert any common file to PDF (using LibreOffice) - Convert PDF to Word/PowerPoint/others (using LibreOffice) - Convert HTML to PDF +- Convert PDF to xml +- Convert PDF to CSV - URL to PDF - Markdown to PDF @@ -68,13 +73,16 @@ All files and PDFs exist either exclusively on the client side, reside in server ### Other Operations - Add/generate/write signatures +- Split by Size or PDF - Repair PDFs - Detect and remove blank pages - Compare two PDFs and show differences in text - Add images to PDFs - Compress PDFs to decrease their filesize (using OCRMyPDF) - Extract images from PDF +- Remove images from PDF - Extract images from scans +- Remove annotations - Add page numbers - Auto rename file by detecting PDF header text - OCR on PDF (using OCRMyPDF) @@ -161,6 +169,10 @@ services: Note: Podman is CLI-compatible with Docker, so simply replace "docker" with "podman". +### Kubernetes + +See the kubernetes helm chart [here](https://github.com/Stirling-Tools/Stirling-PDF-chart) + ## Enable OCR/Compression Feature Please view the [HowToUseOCR.md](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR.md). @@ -179,46 +191,63 @@ Stirling-PDF currently supports 36 languages! | Language | Progress | | -------------------------------------------- | -------------------------------------- | | Arabic (العربية) (ar_AR) | ![98%](https://geps.dev/progress/98) | -| Basque (Euskara) (eu_ES) | ![56%](https://geps.dev/progress/56) | -| Bulgarian (Български) (bg_BG) | ![98%](https://geps.dev/progress/98) | -| Catalan (Català) (ca_CA) | ![44%](https://geps.dev/progress/44) | -| Croatian (Hrvatski) (hr_HR) | ![99%](https://geps.dev/progress/99) | -| Czech (Česky) (cs_CZ) | ![99%](https://geps.dev/progress/99) | -| Danish (Dansk) (da_DK) | ![98%](https://geps.dev/progress/98) | -| Dutch (Nederlands) (nl_NL) | ![97%](https://geps.dev/progress/97) | +| Basque (Euskara) (eu_ES) | ![55%](https://geps.dev/progress/55) | +| Bulgarian (Български) (bg_BG) | ![97%](https://geps.dev/progress/97) | +| Catalan (Català) (ca_CA) | ![90%](https://geps.dev/progress/90) | +| Croatian (Hrvatski) (hr_HR) | ![98%](https://geps.dev/progress/98) | +| Czech (Česky) (cs_CZ) | ![98%](https://geps.dev/progress/98) | +| Danish (Dansk) (da_DK) | ![97%](https://geps.dev/progress/97) | +| Dutch (Nederlands) (nl_NL) | ![96%](https://geps.dev/progress/96) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | -| French (Français) (fr_FR) | ![98%](https://geps.dev/progress/98) | -| German (Deutsch) (de_DE) | ![99%](https://geps.dev/progress/99) | +| French (Français) (fr_FR) | ![97%](https://geps.dev/progress/97) | +| German (Deutsch) (de_DE) | ![98%](https://geps.dev/progress/98) | | Greek (Ελληνικά) (el_GR) | ![98%](https://geps.dev/progress/98) | -| Hindi (हिंदी) (hi_IN) | ![96%](https://geps.dev/progress/96) | -| Hungarian (Magyar) (hu_HU) | ![99%](https://geps.dev/progress/99) | -| Indonesian (Bahasa Indonesia) (id_ID) | ![99%](https://geps.dev/progress/99) | -| Irish (Gaeilge) (ga_IE) | ![89%](https://geps.dev/progress/89) | -| Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | +| Hindi (हिंदी) (hi_IN) | ![95%](https://geps.dev/progress/95) | +| Hungarian (Magyar) (hu_HU) | ![98%](https://geps.dev/progress/98) | +| Indonesian (Bahasa Indonesia) (id_ID) | ![98%](https://geps.dev/progress/98) | +| Irish (Gaeilge) (ga_IE) | ![88%](https://geps.dev/progress/88) | +| Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | | Japanese (日本語) (ja_JP) | ![86%](https://geps.dev/progress/86) | -| Korean (한국어) (ko_KR) | ![97%](https://geps.dev/progress/97) | -| Norwegian (Norsk) (no_NB) | ![89%](https://geps.dev/progress/89) | -| Polish (Polski) (pl_PL) | ![98%](https://geps.dev/progress/98) | -| Portuguese (Português) (pt_PT) | ![99%](https://geps.dev/progress/99) | -| Portuguese Brazilian (Português) (pt_BR) | ![99%](https://geps.dev/progress/99) | -| Romanian (Română) (ro_RO) | ![91%](https://geps.dev/progress/91) | -| Russian (Русский) (ru_RU) | ![98%](https://geps.dev/progress/98) | -| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![71%](https://geps.dev/progress/71) | -| Simplified Chinese (简体中文) (zh_CN) | ![92%](https://geps.dev/progress/92) | -| Slovakian (Slovensky) (sk_SK) | ![83%](https://geps.dev/progress/83) | -| Spanish (Español) (es_ES) | ![99%](https://geps.dev/progress/99) | -| Swedish (Svenska) (sv_SE) | ![98%](https://geps.dev/progress/98) | -| Thai (ไทย) (th_TH) | ![97%](https://geps.dev/progress/97) | -| Traditional Chinese (繁體中文) (zh_TW) | ![99%](https://geps.dev/progress/99) | -| Turkish (Türkçe) (tr_TR) | ![93%](https://geps.dev/progress/93) | -| Ukrainian (Українська) (uk_UA) | ![81%](https://geps.dev/progress/81) | +| Korean (한국어) (ko_KR) | ![96%](https://geps.dev/progress/96) | +| Norwegian (Norsk) (no_NB) | ![88%](https://geps.dev/progress/88) | +| Polish (Polski) (pl_PL) | ![97%](https://geps.dev/progress/97) | +| Portuguese (Português) (pt_PT) | ![98%](https://geps.dev/progress/98) | +| Portuguese Brazilian (Português) (pt_BR) | ![98%](https://geps.dev/progress/98) | +| Romanian (Română) (ro_RO) | ![90%](https://geps.dev/progress/90) | +| Russian (Русский) (ru_RU) | ![97%](https://geps.dev/progress/97) | +| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![70%](https://geps.dev/progress/70) | +| Simplified Chinese (简体中文) (zh_CN) | ![91%](https://geps.dev/progress/91) | +| Slovakian (Slovensky) (sk_SK) | ![82%](https://geps.dev/progress/82) | +| Spanish (Español) (es_ES) | ![98%](https://geps.dev/progress/98) | +| Swedish (Svenska) (sv_SE) | ![97%](https://geps.dev/progress/97) | +| Thai (ไทย) (th_TH) | ![96%](https://geps.dev/progress/96) | +| Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | +| Turkish (Türkçe) (tr_TR) | ![92%](https://geps.dev/progress/92) | +| Ukrainian (Українська) (uk_UA) | ![80%](https://geps.dev/progress/80) | | Vietnamese (Tiếng Việt) (vi_VN) | ![89%](https://geps.dev/progress/89) | ## Contributing (Creating Issues, Translations, Fixing Bugs, etc.) Please see our [Contributing Guide](CONTRIBUTING.md). +## Stirling PDF Enterprise + +Stirling PDF offers a Enterprise edition of its software, This is the same great software but with added features and comforts + +### Whats included + +- Prioritised Support tickets via support@stirlingpdf.com to reach directly to Stirling-PDF team for support and 1:1 meetings where applicable (Provided they come from same email domain registered with us) +- Prioritised Enhancements to Stirling-PDF where applicable +- Base SSO support +- Advanced SSO such as automated login handling (Coming very soon) +- SAML SSO (Coming very soon) +- Custom automated metadata handling +- Advanced user configurations (Coming soon) +- Plus other exciting features to come + +Check out of [docs](https://docs.stirlingpdf.com/Enterprise%20Edition) on it or our official [website](https://www.stirlingpdf.com) + ## Customization Stirling-PDF allows easy customization of the app, including things like: @@ -335,6 +364,8 @@ AutomaticallyGenerated: There is an additional config file `/configs/custom_settings.yml` where users familiar with Java and Spring `application.properties` can input their own settings on top of Stirling-PDF's existing ones. + + ### Extra Notes - **Endpoints**: Currently, the `ENDPOINTS_TO_REMOVE` and `GROUPS_TO_REMOVE` endpoints can include comma-separated lists of endpoints and groups to disable. For example, `ENDPOINTS_TO_REMOVE=img-to-pdf,remove-pages` would disable both image-to-pdf and remove pages, while `GROUPS_TO_REMOVE=LibreOffice` would disable all things that use LibreOffice. You can see a list of all endpoints and groups [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md). @@ -385,7 +416,7 @@ For API usage, you must provide a header with `X-API-Key` and the associated API - Multi-page layout (stitch PDF pages together) support x rows y columns and custom page sizing - Fill forms manually or automatically -### Q2: Why is my application downloading .htm files? +### Q2: Why is my application downloading .htm files? Why am i getting HTTP error 413? This is an issue commonly caused by your NGINX configuration. The default file upload size for NGINX is 1MB. You need to add the following in your Nginx sites-available file: `client_max_body_size SIZE;` (where "SIZE" is 50M for example for 50MB files). diff --git a/Version-groups.md b/Version-groups.md index 84bf749d..93c5b4b0 100644 --- a/Version-groups.md +++ b/Version-groups.md @@ -54,3 +54,15 @@ The 'Fat' container contains all those found in 'Full' with security jar along w | ocr-pdf | | ✔️ | | pdf-to-pdfa | | ✔️ | | remove-blanks | | ✔️ | +pdf-to-text | ✔️ | ✔️ +pdf-to-html | | ✔️ +pdf-to-word | | ✔️ +pdf-to-presentation | | ✔️ +pdf-to-xml | | ✔️ +remove-annotations | ✔️ | ✔️ +remove-cert-sign | ✔️ | ✔️ +remove-image-pdf | ✔️ | ✔️ +file-to-pdf | | ✔️ +html-to-pdf | | ✔️ +url-to-pdf | | ✔️ +repair | | ✔️ diff --git a/build.gradle b/build.gradle index bb0b6bac..6d321618 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ ext { } group = "stirling.software" -version = "0.31.1" +version = "0.32.0" java { // 17 is lowest but we support and recommend 21 diff --git a/chart/stirling-pdf/Chart.yaml b/chart/stirling-pdf/Chart.yaml deleted file mode 100644 index 1aa262e1..00000000 --- a/chart/stirling-pdf/Chart.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v2 -appVersion: 0.31.1 -description: locally hosted web application that allows you to perform various operations - on PDF files -home: https://github.com/Stirling-Tools/Stirling-PDF -keywords: -- stirling-pdf -- helm -- charts repo -maintainers: -- name: Stirling-Tools - url: https://github.com/Stirling-Tools/Stirling-PDF -name: stirling-pdf-chart -sources: -- https://github.com/Stirling-Tools/Stirling-PDF -version: 1.0.1 diff --git a/chart/stirling-pdf/README.md b/chart/stirling-pdf/README.md deleted file mode 100644 index 7536c6f0..00000000 --- a/chart/stirling-pdf/README.md +++ /dev/null @@ -1,95 +0,0 @@ -# stirling-pdf-chart - -![Version: 1.0.0](https://img.shields.io/badge/Version-1.0.0-informational?style=flat-square) ![AppVersion: 0.30.1](https://img.shields.io/badge/AppVersion-0.30.1-informational?style=flat-square) - -locally hosted web application that allows you to perform various operations on PDF files - -**Homepage:** - -## Maintainers - -| Name | Email | Url | -| ---- | ------ | --- | -| Stirling-Tools | | | - -## Source Code - -* - -## Chart Repo - -Add the following repo to use the chart: - -```console -helm repo add stirling-pdf https://stirling-tools.github.io/Stirling-PDF -``` - -## Values - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| commonLabels | object | `{}` | Labels to apply to all resources | -| containerSecurityContext | object | `{}` | | -| deployment.annotations | object | `{}` | Stirling-pdf Deployment annotations | -| deployment.extraVolumeMounts | list | `[]` | Additional volumes to mount | -| deployment.extraVolumes | list | `[]` | Additional volumes | -| deployment.labels | object | `{}` | | -| deployment.sidecarContainers | object | `{}` | of the chart's content, send notifications... | -| envs | list | `[]` | | -| extraArgs | list | `[]` | | -| image.pullPolicy | string | `"IfNotPresent"` | | -| image.repository | string | `"frooodle/s-pdf"` | | -| image.tag | string | `nil` | | -| ingress | object | `{"annotations":{},"enabled":false,"hosts":[],"ingressClassName":null,"labels":{},"pathType":"ImplementationSpecific"}` | Ingress for load balancer | -| ingress.annotations | object | `{}` | Stirling-pdf Ingress annotations | -| ingress.hosts | list | `[]` | Must be provided if Ingress is enabled | -| ingress.ingressClassName | string | `nil` | See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress | -| ingress.labels | object | `{}` | Stirling-pdf Ingress labels | -| nodeSelector | object | `{}` | | -| persistence.accessMode | string | `"ReadWriteOnce"` | | -| persistence.enabled | bool | `false` | | -| persistence.labels | object | `{}` | | -| persistence.path | string | `"/tmp"` | | -| persistence.pv | object | `{"accessMode":"ReadWriteOnce","capacity":{"storage":"8Gi"},"enabled":false,"nfs":{"path":null,"server":null},"pvname":null}` | stirling-pdf data Persistent Volume Storage Class If defined, storageClassName: If set to "-", storageClassName: "", which disables dynamic provisioning If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. (gp2 on AWS, standard on GKE, AWS & OpenStack) storageClass: "-" volumeName: | -| persistence.size | string | `"8Gi"` | | -| podAnnotations | object | `{}` | Read more about kube2iam to provide access to s3 https://github.com/jtblin/kube2iam | -| podLabels | object | `{}` | ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ | -| priorityClassName | string | `""` | | -| probes.liveness.failureThreshold | int | `3` | | -| probes.liveness.initialDelaySeconds | int | `5` | | -| probes.liveness.periodSeconds | int | `10` | | -| probes.liveness.successThreshold | int | `1` | | -| probes.liveness.timeoutSeconds | int | `1` | | -| probes.livenessHttpGetConfig.scheme | string | `"HTTP"` | | -| probes.readiness.failureThreshold | int | `3` | | -| probes.readiness.initialDelaySeconds | int | `5` | | -| probes.readiness.periodSeconds | int | `10` | | -| probes.readiness.successThreshold | int | `1` | | -| probes.readiness.timeoutSeconds | int | `1` | | -| probes.readinessHttpGetConfig.scheme | string | `"HTTP"` | | -| replicaCount | int | `1` | | -| resources | object | `{}` | | -| rootPath | string | `"/"` | Rootpath for the application | -| secret.labels | object | `{}` | | -| securityContext | object | `{"enabled":true,"fsGroup":1000}` | does not allow this, try setting securityContext: {} | -| service.annotations | object | `{}` | | -| service.externalPort | int | `8080` | | -| service.externalTrafficPolicy | string | `"Local"` | | -| service.labels | object | `{}` | | -| service.loadBalancerIP | string | `nil` | Only valid if service.type: LoadBalancer | -| service.loadBalancerSourceRanges | list | `[]` | Only valid if service.type: LoadBalancer | -| service.nodePort | string | `nil` | | -| service.servicename | string | `nil` | | -| service.targetPort | string | `nil` | from deployment above. Leave empty to use stirling-pdf directly. | -| service.type | string | `"ClusterIP"` | | -| serviceAccount.annotations | object | `{}` | | -| serviceAccount.automountServiceAccountToken | bool | `false` | | -| serviceAccount.create | bool | `true` | | -| serviceAccount.name | string | `""` | | -| serviceMonitor.enabled | bool | `false` | | -| serviceMonitor.labels | object | `{}` | | -| serviceMonitor.metricsPath | string | `"/metrics"` | | -| strategy.type | string | `"RollingUpdate"` | | -| tolerations | list | `[]` | | -| volumePermissions | object | `{"image":{"pullPolicy":"Always","registry":"docker.io","repository":"bitnami/minideb","tag":"buster"}}` | volumePermissions: Change the owner of the persistent volume mountpoint to RunAsUser:fsGroup | diff --git a/chart/stirling-pdf/README.md.gotmpl b/chart/stirling-pdf/README.md.gotmpl deleted file mode 100644 index caaddb04..00000000 --- a/chart/stirling-pdf/README.md.gotmpl +++ /dev/null @@ -1,25 +0,0 @@ -{{ template "chart.header" . }} - -{{ template "chart.deprecationWarning" . }} - -{{ template "chart.badgesSection" . }} - -{{ template "chart.description" . }} - -{{ template "chart.homepageLine" . }} - -{{ template "chart.maintainersSection" . }} - -{{ template "chart.sourcesSection" . }} - -{{ template "chart.requirementsSection" . }} - -## Chart Repo - -Add the following repo to use the chart: - -```console -helm repo add stirling-pdf https://docs.stirlingpdf.com/Stirling-PDF/ -``` - -{{ template "chart.valuesSection" . }} diff --git a/chart/stirling-pdf/templates/NOTES.txt b/chart/stirling-pdf/templates/NOTES.txt deleted file mode 100644 index 3b432f00..00000000 --- a/chart/stirling-pdf/templates/NOTES.txt +++ /dev/null @@ -1,30 +0,0 @@ -** Please be patient while the chart is being deployed ** - -Get the stirlingpdf URL by running: - -{{- if contains "NodePort" .Values.service.type }} - - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "stirlingpdf.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT/ - -{{- else if contains "LoadBalancer" .Values.service.type }} - -** Please ensure an external IP is associated to the {{ template "stirlingpdf.fullname" . }} service before proceeding ** -** Watch the status using: kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "stirlingpdf.fullname" . }} ** - - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "stirlingpdf.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - echo http://$SERVICE_IP:{{ .Values.service.externalPort }}/ - -OR - - export SERVICE_HOST=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "stirlingpdf.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].hostname}') - echo http://$SERVICE_HOST:{{ .Values.service.externalPort }}/ - -{{- else if contains "ClusterIP" .Values.service.type }} - - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "stirlingpdf.name" . }}" -l "release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - echo http://127.0.0.1:8080/ - kubectl port-forward $POD_NAME 8080:8080 --namespace {{ .Release.Namespace }} - -{{- end }} diff --git a/chart/stirling-pdf/templates/_helpers.tpl b/chart/stirling-pdf/templates/_helpers.tpl deleted file mode 100644 index 4c862604..00000000 --- a/chart/stirling-pdf/templates/_helpers.tpl +++ /dev/null @@ -1,129 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "stirlingpdf.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "stirlingpdf.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{- /* -Create chart name and version as used by the chart label. - -It does minimal escaping for use in Kubernetes labels. - -Example output: - -stirlingpdf-0.4.5 -*/ -}} -{{- define "stirlingpdf.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end -}} - -{{/* -Common labels -*/}} -{{- define "stirlingpdf.labels" -}} -helm.sh/chart: {{ include "stirlingpdf.chart" . }} -{{ include "stirlingpdf.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -{{- if .Values.commonLabels}} -{{ toYaml .Values.commonLabels }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "stirlingpdf.selectorLabels" -}} -app.kubernetes.io/name: {{ include "stirlingpdf.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "stirlingpdf.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "stirlingpdf.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - -{{/* -Return the proper image name to change the volume permissions -*/}} -{{- define "stirlingpdf.volumePermissions.image" -}} -{{- $registryName := .Values.volumePermissions.image.registry -}} -{{- $repositoryName := .Values.volumePermissions.image.repository -}} -{{- $tag := .Values.volumePermissions.image.tag | toString -}} -{{/* -Helm 2.11 supports the assignment of a value to a variable defined in a different scope, -but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic. -Also, we can't use a single if because lazy evaluation is not an option -*/}} -{{- if .Values.global }} - {{- if .Values.global.imageRegistry }} - {{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}} - {{- else -}} - {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} - {{- end -}} -{{- else -}} - {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names -*/}} -{{- define "stirlingpdf.imagePullSecrets" -}} -{{/* -Helm 2.11 supports the assignment of a value to a variable defined in a different scope, -but Helm 2.9 and 2.10 does not support it, so we need to implement this if-else logic. -Also, we can not use a single if because lazy evaluation is not an option -*/}} -{{- if .Values.global }} -{{- if .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range .Values.global.imagePullSecrets }} - - name: {{ . }} -{{- end }} -{{- else if or .Values.image.pullSecrets .Values.volumePermissions.image.pullSecrets }} -imagePullSecrets: -{{- range .Values.image.pullSecrets }} - - name: {{ . }} -{{- end }} -{{- range .Values.volumePermissions.image.pullSecrets }} - - name: {{ . }} -{{- end }} -{{- end -}} -{{- else if or .Values.image.pullSecrets .Values.volumePermissions.image.pullSecrets }} -imagePullSecrets: -{{- range .Values.image.pullSecrets }} - - name: {{ . }} -{{- end }} -{{- range .Values.volumePermissions.image.pullSecrets }} - - name: {{ . }} -{{- end }} -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/chart/stirling-pdf/templates/deployment.yaml b/chart/stirling-pdf/templates/deployment.yaml deleted file mode 100644 index d91e8097..00000000 --- a/chart/stirling-pdf/templates/deployment.yaml +++ /dev/null @@ -1,131 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "stirlingpdf.fullname" . }} - {{- with .Values.deployment.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- if .Values.deployment.labels }} - {{- toYaml .Values.deployment.labels | nindent 4 }} - {{- end }} -spec: - selector: - matchLabels: - {{- include "stirlingpdf.selectorLabels" . | nindent 6 }} - replicas: {{ .Values.replicaCount }} - strategy: -{{ toYaml .Values.strategy | indent 4 }} - revisionHistoryLimit: 10 - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "stirlingpdf.selectorLabels" . | nindent 8 }} - {{- if .Values.podLabels }} - {{- toYaml .Values.podLabels | nindent 8 }} - {{- end }} - spec: - {{- if .Values.priorityClassName }} - priorityClassName: "{{ .Values.priorityClassName }}" - {{- end }} - {{- if .Values.securityContext.enabled }} - securityContext: - fsGroup: {{ .Values.securityContext.fsGroup }} - {{- if .Values.securityContext.runAsNonRoot }} - runAsNonRoot: {{ .Values.securityContext.runAsNonRoot }} - {{- end }} - {{- if .Values.securityContext.supplementalGroups }} - supplementalGroups: {{ .Values.securityContext.supplementalGroups }} - {{- end }} - {{- else if .Values.persistence.enabled }} - initContainers: - - name: volume-permissions - image: {{ template "stirlingpdf.volumePermissions.image" . }} - imagePullPolicy: "{{ .Values.volumePermissions.image.pullPolicy }}" - securityContext: - {{- toYaml .Values.containerSecurityContext | nindent 10 }} - command: ['sh', '-c', 'chown -R {{ .Values.securityContext.fsGroup }}:{{ .Values.securityContext.fsGroup }} {{ .Values.persistence.path }}'] - volumeMounts: - - mountPath: {{ .Values.persistence.path }} - name: storage-volume - {{- end }} -{{- include "stirlingpdf.imagePullSecrets" . | indent 6 }} - containers: - - name: {{ .Chart.Name }} - image: {{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - securityContext: - {{- toYaml .Values.containerSecurityContext | nindent 10 }} - env: - - name: SYSTEM_ROOTURIPATH - value: {{ .Values.rootPath}} -{{- if .Values.envs }} -{{ toYaml .Values.envs | indent 8 }} -{{- end }} -{{- if .Values.extraArgs }} - args: -{{ toYaml .Values.extraArgs | indent 8 }} -{{- end }} - ports: - - name: http - containerPort: 8080 - livenessProbe: - httpGet: - path: {{ .Values.rootPath}} - port: http -{{ toYaml .Values.probes.livenessHttpGetConfig | indent 12 }} -{{ toYaml .Values.probes.liveness | indent 10 }} - readinessProbe: - httpGet: - path: {{ .Values.rootPath}} - port: http -{{ toYaml .Values.probes.readinessHttpGetConfig | indent 12 }} -{{ toYaml .Values.probes.readiness | indent 10 }} - volumeMounts: -{{- if .Values.deployment.extraVolumeMounts }} - {{- toYaml .Values.deployment.extraVolumeMounts | nindent 8 }} -{{- end }} -{{- if .Values.deployment.sidecarContainers }} -{{- range $name, $spec := .Values.deployment.sidecarContainers }} - - name: {{ $name }} -{{- toYaml $spec | nindent 8 }} -{{- end }} -{{- end }} - {{- with .Values.resources }} - resources: -{{ toYaml . | indent 10 }} - {{- end }} - {{- with .Values.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - {{- if .Values.schedulerName }} - schedulerName: {{ .Values.schedulerName }} - {{- end }} - serviceAccountName: {{ include "stirlingpdf.serviceAccountName" . }} - automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} - volumes: - {{- if .Values.deployment.extraVolumes }} - {{- toYaml .Values.deployment.extraVolumes | nindent 6 }} - {{- end }} - - name: storage-volume - {{- if .Values.persistence.enabled }} - persistentVolumeClaim: - claimName: {{ .Values.persistence.existingClaim | default (include "stirlingpdf.fullname" .) }} - {{- else }} - emptyDir: {} - {{- end }} diff --git a/chart/stirling-pdf/templates/ingress.yaml b/chart/stirling-pdf/templates/ingress.yaml deleted file mode 100644 index c09fef68..00000000 --- a/chart/stirling-pdf/templates/ingress.yaml +++ /dev/null @@ -1,85 +0,0 @@ -{{- if .Values.ingress.enabled }} -{{- $servicePort := .Values.service.externalPort -}} -{{- $serviceName := include "stirlingpdf.fullname" . -}} -{{- $ingressExtraPaths := .Values.ingress.extraPaths -}} ---- -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion }} -apiVersion: extensions/v1beta1 -{{- else if semverCompare "<1.19-0" .Capabilities.KubeVersion.GitVersion }} -apiVersion: networking.k8s.io/v1beta1 -{{- else }} -apiVersion: networking.k8s.io/v1 -{{- end }} -kind: Ingress -metadata: - name: {{ include "stirlingpdf.fullname" . }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- with .Values.ingress.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- with .Values.ingress.ingressClassName }} - ingressClassName: {{ . }} - {{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .name }} - http: - paths: - {{- range $ingressExtraPaths }} - - path: {{ default "/" .path | quote }} - backend: - {{- if semverCompare "<1.19-0" $.Capabilities.KubeVersion.GitVersion }} - {{- if $.Values.service.servicename }} - serviceName: {{ $.Values.service.servicename }} - {{- else }} - serviceName: {{ default $serviceName .service }} - {{- end }} - servicePort: {{ default $servicePort .port }} - {{- else }} - service: - {{- if $.Values.service.servicename }} - name: {{ $.Values.service.servicename }} - {{- else }} - name: {{ default $serviceName .service }} - {{- end }} - port: - number: {{ default $servicePort .port }} - pathType: {{ default $.Values.ingress.pathType .pathType }} - {{- end }} - {{- end }} - - path: {{ default "/" .path | quote }} - backend: - {{- if semverCompare "<1.19-0" $.Capabilities.KubeVersion.GitVersion }} - {{- if $.Values.service.servicename }} - serviceName: {{ $.Values.service.servicename }} - {{- else }} - serviceName: {{ default $serviceName .service }} - {{- end }} - servicePort: {{ default $servicePort .servicePort }} - {{- else }} - service: - {{- if $.Values.service.servicename }} - name: {{ $.Values.service.servicename }} - {{- else }} - name: {{ default $serviceName .service }} - {{- end }} - port: - number: {{ default $servicePort .port }} - pathType: {{ $.Values.ingress.pathType }} - {{- end }} - {{- end }} - tls: - {{- range .Values.ingress.hosts }} - {{- if .tls }} - - hosts: - - {{ .name }} - secretName: {{ .tlsSecret }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/chart/stirling-pdf/templates/pv.yaml b/chart/stirling-pdf/templates/pv.yaml deleted file mode 100644 index aa99c6a9..00000000 --- a/chart/stirling-pdf/templates/pv.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if .Values.persistence.pv.enabled -}} -apiVersion: v1 -kind: PersistentVolume -metadata: - name: {{ .Values.persistence.pv.pvname | default (include "stirlingpdf.fullname" .) }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} -spec: - capacity: - storage: {{ .Values.persistence.pv.capacity.storage }} - accessModes: - - {{ .Values.persistence.pv.accessMode | quote }} - nfs: - server: {{ .Values.persistence.pv.nfs.server }} - path: {{ .Values.persistence.pv.nfs.path | quote }} -{{- end }} \ No newline at end of file diff --git a/chart/stirling-pdf/templates/pvc.yaml b/chart/stirling-pdf/templates/pvc.yaml deleted file mode 100644 index f7a21722..00000000 --- a/chart/stirling-pdf/templates/pvc.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ include "stirlingpdf.fullname" . }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- with .Values.persistence.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - accessModes: - - {{ .Values.persistence.accessMode | quote }} - resources: - requests: - storage: {{ .Values.persistence.size | quote }} -{{- if .Values.persistence.storageClass }} -{{- if (eq "-" .Values.persistence.storageClass) }} - storageClassName: "" -{{- else }} - storageClassName: "{{ .Values.persistence.storageClass }}" -{{- end }} -{{- if .Values.persistence.volumeName }} - volumeName: "{{ .Values.persistence.volumeName }}" -{{- end }} -{{- end }} -{{- end }} diff --git a/chart/stirling-pdf/templates/service.yaml b/chart/stirling-pdf/templates/service.yaml deleted file mode 100644 index 13ee2420..00000000 --- a/chart/stirling-pdf/templates/service.yaml +++ /dev/null @@ -1,48 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ .Values.service.servicename | default (include "stirlingpdf.fullname" .) }} - {{- with .Values.service.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- with .Values.service.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - type: {{ .Values.service.type }} - {{- if (or (eq .Values.service.type "LoadBalancer") (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort)))) }} - externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy }} - {{- end }} - {{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerIP) }} - loadBalancerIP: {{ .Values.service.loadBalancerIP }} - {{- end }} - {{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerSourceRanges) }} - loadBalancerSourceRanges: - {{- with .Values.service.loadBalancerSourceRanges }} -{{ toYaml . | indent 2 }} - {{- end }} - {{- end }} - {{- if eq .Values.service.type "ClusterIP" }} - {{- if .Values.service.clusterIP }} - clusterIP: {{ .Values.service.clusterIP }} - {{- end }} - {{- end }} - ports: - - port: {{ .Values.service.externalPort }} -{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }} - nodePort: {{.Values.service.nodePort}} -{{- end }} -{{- if .Values.service.targetPort }} - targetPort: {{ .Values.service.targetPort }} - name: {{ .Values.service.targetPort }} -{{- else }} - targetPort: http - name: http -{{- end }} - protocol: TCP - - selector: - {{- include "stirlingpdf.selectorLabels" . | nindent 4 }} diff --git a/chart/stirling-pdf/templates/serviceaccount.yaml b/chart/stirling-pdf/templates/serviceaccount.yaml deleted file mode 100644 index 7156e4a4..00000000 --- a/chart/stirling-pdf/templates/serviceaccount.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.serviceAccount.create -}} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "stirlingpdf.serviceAccountName" . }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{ toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} -{{- end }} diff --git a/chart/stirling-pdf/templates/servicemonitor.yaml b/chart/stirling-pdf/templates/servicemonitor.yaml deleted file mode 100644 index ca0d31bb..00000000 --- a/chart/stirling-pdf/templates/servicemonitor.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if and ( .Capabilities.APIVersions.Has "monitoring.coreos.com/v1" ) ( .Values.serviceMonitor.enabled ) }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "stirlingpdf.fullname" . }} - namespace: {{ .Values.serviceMonitor.namespace | default .Release.Namespace }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- with .Values.serviceMonitor.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - endpoints: - - targetPort: 8080 -{{- if .Values.serviceMonitor.interval }} - interval: {{ .Values.serviceMonitor.interval }} -{{- end }} -{{- if .Values.serviceMonitor.metricsPath }} - path: {{ .Values.serviceMonitor.metricsPath }} -{{- end }} -{{- if .Values.serviceMonitor.timeout }} - scrapeTimeout: {{ .Values.serviceMonitor.timeout }} -{{- end }} - jobLabel: {{ include "stirlingpdf.fullname" . }} - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - selector: - matchLabels: - {{- include "stirlingpdf.selectorLabels" . | nindent 6 }} -{{- end }} diff --git a/chart/stirling-pdf/values.yaml b/chart/stirling-pdf/values.yaml deleted file mode 100644 index eec1856e..00000000 --- a/chart/stirling-pdf/values.yaml +++ /dev/null @@ -1,239 +0,0 @@ -extraArgs: - [] - # - --storage-timestamp-tolerance 1s -replicaCount: 1 -strategy: - type: RollingUpdate -image: - repository: frooodle/s-pdf - # took Chart appVersion by default - tag: ~ - pullPolicy: IfNotPresent -secret: - labels: {} -# -- Labels to apply to all resources -commonLabels: {} -# team_name: dev - -# -- Rootpath for the application -rootPath: / - -envs: [] -# - name: UI_APP_NAME -# value: "Stirling PDF" -# - name: UI_HOME_DESCRIPTION -# value: "Your locally hosted one-stop-shop for all your PDF needs." -# - name: UI_APP_NAVBAR_NAME -# value: "Stirling PDF" -# - name: ALLOW_GOOGLE_VISIBILITY -# value: "true" -# - name: APP_LOCALE -# value: "en_GB" - -deployment: - # -- Stirling-pdf Deployment annotations - annotations: {} - # name: value - labels: {} - # name: value - # -- Additional volumes - extraVolumes: [] - # - name: nginx-config - # secret: - # secretName: nginx-config - # -- Additional volumes to mount - extraVolumeMounts: [] - # -- sidecarContainers for the stirling-pdf - # -- Can be used to add a proxy to the pod that does - # -- scanning for secrets, signing, authentication, validation - # -- of the chart's content, send notifications... - sidecarContainers: {} - ## Example sidecarContainer which uses an extraVolume from above and - ## a named port that can be referenced in the service as targetPort. - # proxy: - # image: nginx:latest - # ports: - # - name: proxy - # containerPort: 8081 - # volumeMounts: - # - name: nginx-config - # readOnly: true - # mountPath: /etc/nginx - -# -- Pod annotations -# -- ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ -# -- Read more about kube2iam to provide access to s3 https://github.com/jtblin/kube2iam -podAnnotations: - {} - # iam.amazonaws.com/role: role-arn - -# -- Pod labels -# -- ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ -podLabels: - {} - # name: value - -service: - servicename: - type: ClusterIP - externalTrafficPolicy: Local - # -- Uses pre-assigned IP address from cloud provider - # -- Only valid if service.type: LoadBalancer - loadBalancerIP: - # -- Limits which cidr blocks can connect to service's load balancer - # -- Only valid if service.type: LoadBalancer - loadBalancerSourceRanges: [] - # clusterIP: None - externalPort: 8080 - # -- targetPort of the container to use. If a sidecar should handle the - # -- requests first, use the named port from the sidecar. See sidecar example - # -- from deployment above. Leave empty to use stirling-pdf directly. - targetPort: - nodePort: - annotations: {} - labels: {} - -serviceMonitor: - enabled: false - # namespace: prometheus - labels: {} - metricsPath: "/metrics" - # timeout: 60 - # interval: 60 - -resources: {} -# limits: -# cpu: 100m -# memory: 128Mi -# requests: -# cpu: 80m -# memory: 64Mi - -probes: - liveness: - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - livenessHttpGetConfig: - scheme: HTTP - readiness: - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - readinessHttpGetConfig: - scheme: HTTP - -serviceAccount: - create: true - name: "" - automountServiceAccountToken: false - ## Annotations for the Service Account - annotations: {} - -# -- UID/GID 1000 is the default user "stirling-pdf" used in -# -- the container image starting in v0.8.0 and above. This -# -- is required for local persistent storage. If your cluster -# -- does not allow this, try setting securityContext: {} -securityContext: - enabled: true - fsGroup: 1000 - ## Optionally, specify supplementalGroups and/or - ## runAsNonRoot for security purposes - # runAsNonRoot: true - # supplementalGroups: [1000] - -containerSecurityContext: {} - -priorityClassName: "" - -nodeSelector: {} - -tolerations: [] - -affinity: {} - -persistence: - enabled: false - accessMode: ReadWriteOnce - size: 8Gi - labels: - {} - # name: value - path: /tmp - ## A manually managed Persistent Volume and Claim - ## Requires persistence.enabled: true - ## If defined, PVC must be created manually before volume will be bound - # existingClaim: - - # -- stirling-pdf data Persistent Volume Storage Class - # If defined, storageClassName: - # If set to "-", storageClassName: "", which disables dynamic provisioning - # If undefined (the default) or set to null, no storageClassName spec is - # set, choosing the default provisioner. (gp2 on AWS, standard on - # GKE, AWS & OpenStack) - # storageClass: "-" - # volumeName: - pv: - enabled: false - pvname: - capacity: - storage: 8Gi - accessMode: ReadWriteOnce - nfs: - server: - path: - -# -- Init containers parameters: -# -- volumePermissions: Change the owner of the persistent volume mountpoint to RunAsUser:fsGroup -volumePermissions: - image: - registry: docker.io - repository: bitnami/minideb - tag: buster - pullPolicy: Always - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## - # pullSecrets: - # - myRegistryKeySecretName - -# -- Ingress for load balancer -ingress: - enabled: false - pathType: "ImplementationSpecific" - # -- Stirling-pdf Ingress labels - labels: - {} - # dns: "route53" - - # -- Stirling-pdf Ingress annotations - annotations: - {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - - # -- Stirling-pdf Ingress hostnames - # -- Must be provided if Ingress is enabled - hosts: - [] - # - name: stirling-pdf.domain1.com - # path: / - # tls: false - # - name: stirling-pdf.domain2.com - # path: / - # - # ## Set this to true in order to enable TLS on the ingress record - # tls: true - # - # ## If TLS is set to true, you must declare what secret will store the key/certificate for TLS - # ## Secrets must be added manually to the namespace - # tlsSecret: stirling-pdf.domain2-tls - - # -- For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName - # -- See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress - ingressClassName: diff --git a/cr.yaml b/cr.yaml deleted file mode 100644 index 7a948c73..00000000 --- a/cr.yaml +++ /dev/null @@ -1,2 +0,0 @@ -skip-existing: true -generate-release-notes: true \ No newline at end of file diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index 1bf28d2e..284b4e70 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -13,7 +13,6 @@ ignore = [ 'PDFToText.tags', 'adminUserSettings.admin', 'language.direction', - 'survey.button', 'watermark.type.1', ] @@ -33,6 +32,7 @@ ignore = [ ignore = [ 'AddStampRequest.alphabet', 'AddStampRequest.position', + 'home.pipeline.title' 'PDFToBook.selectText.1', 'PDFToText.tags', 'addPageNumbers.selectText.3', @@ -42,9 +42,11 @@ ignore = [ 'licenses.version', 'pipeline.title', 'pipelineOptions.pipelineHeader', + 'pro', 'sponsor', 'text', 'watermark.type.1', + 'certSign.name', ] [el_GR] diff --git a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java index 45b658e8..64f56045 100644 --- a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java @@ -117,7 +117,6 @@ public class EndpointConfiguration { addEndpointToGroup("Convert", "img-to-pdf"); addEndpointToGroup("Convert", "pdf-to-pdfa"); addEndpointToGroup("Convert", "file-to-pdf"); - addEndpointToGroup("Convert", "xlsx-to-pdf"); addEndpointToGroup("Convert", "pdf-to-word"); addEndpointToGroup("Convert", "pdf-to-presentation"); addEndpointToGroup("Convert", "pdf-to-text"); @@ -163,7 +162,6 @@ public class EndpointConfiguration { addEndpointToGroup("CLI", "repair"); addEndpointToGroup("CLI", "pdf-to-pdfa"); addEndpointToGroup("CLI", "file-to-pdf"); - addEndpointToGroup("CLI", "xlsx-to-pdf"); addEndpointToGroup("CLI", "pdf-to-word"); addEndpointToGroup("CLI", "pdf-to-presentation"); addEndpointToGroup("CLI", "pdf-to-html"); @@ -184,6 +182,7 @@ public class EndpointConfiguration { addEndpointToGroup("Python", "html-to-pdf"); addEndpointToGroup("Python", "url-to-pdf"); addEndpointToGroup("Python", "pdf-to-img"); + addEndpointToGroup("Python", "file-to-pdf"); // openCV addEndpointToGroup("OpenCV", "extract-image-scans"); @@ -191,14 +190,15 @@ public class EndpointConfiguration { // LibreOffice addEndpointToGroup("LibreOffice", "repair"); addEndpointToGroup("LibreOffice", "file-to-pdf"); - addEndpointToGroup("Unoconv", "file-to-pdf"); - addEndpointToGroup("LibreOffice", "xlsx-to-pdf"); addEndpointToGroup("LibreOffice", "pdf-to-word"); addEndpointToGroup("LibreOffice", "pdf-to-presentation"); addEndpointToGroup("LibreOffice", "pdf-to-rtf"); addEndpointToGroup("LibreOffice", "pdf-to-html"); addEndpointToGroup("LibreOffice", "pdf-to-xml"); + // Unoconv + addEndpointToGroup("Unoconv", "file-to-pdf"); + // OCRmyPDF addEndpointToGroup("OCRmyPDF", "compress-pdf"); addEndpointToGroup("OCRmyPDF", "pdf-to-pdfa"); @@ -251,6 +251,7 @@ public class EndpointConfiguration { // Ghostscript dependent endpoints addEndpointToGroup("Ghostscript", "compress-pdf"); addEndpointToGroup("Ghostscript", "pdf-to-pdfa"); + addEndpointToGroup("Ghostscript", "repair"); // Weasyprint dependent endpoints addEndpointToGroup("Weasyprint", "html-to-pdf"); diff --git a/src/main/java/stirling/software/SPDF/config/security/UserService.java b/src/main/java/stirling/software/SPDF/config/security/UserService.java index a95ee135..6b1457dc 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserService.java @@ -19,10 +19,12 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Service; +import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.config.interfaces.DatabaseBackupInterface; import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface; +import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.AuthenticationType; import stirling.software.SPDF.model.Authority; import stirling.software.SPDF.model.Role; @@ -31,6 +33,7 @@ import stirling.software.SPDF.repository.AuthorityRepository; import stirling.software.SPDF.repository.UserRepository; @Service +@Slf4j public class UserService implements UserServiceInterface { @Autowired private UserRepository userRepository; @@ -45,6 +48,8 @@ public class UserService implements UserServiceInterface { @Autowired DatabaseBackupInterface databaseBackupHelper; + @Autowired ApplicationProperties applicationProperties; + // Handle OAUTH2 login and user auto creation. public boolean processOAuth2PostLogin(String username, boolean autoCreateUser) throws IllegalArgumentException, IOException { @@ -299,7 +304,13 @@ public class UserService implements UserServiceInterface { boolean isValidEmail = username.matches( "^(?=.{1,64}@)[A-Za-z0-9]+(\\.[A-Za-z0-9_+.-]+)*@[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$"); - return isValidSimpleUsername || isValidEmail; + + List notAllowedUserList = new ArrayList<>(); + notAllowedUserList.add("ALL_USERS".toLowerCase()); + + boolean notAllowedUser = notAllowedUserList.contains(username.toLowerCase()); + + return (isValidSimpleUsername || isValidEmail) && !notAllowedUser; } private String getInvalidUsernameMessage() { @@ -354,6 +365,14 @@ public class UserService implements UserServiceInterface { if (principal instanceof UserDetails) { return ((UserDetails) principal).getUsername(); + } else if (principal instanceof OAuth2User) { + return ((OAuth2User) principal) + .getAttribute( + applicationProperties.getSecurity().getOauth2().getUseAsUsername()); + } else if (principal instanceof CustomSaml2AuthenticatedPrincipal) { + return ((CustomSaml2AuthenticatedPrincipal) principal).getName(); + } else if (principal instanceof String) { + return (String) principal; } else { return principal.toString(); } diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java index c7296a1b..65085b1d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java @@ -13,12 +13,14 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import stirling.software.SPDF.model.api.misc.ReplaceAndInvertColorRequest; import stirling.software.SPDF.service.misc.ReplaceAndInvertColorService; @RestController @RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") public class ReplaceAndInvertColorController { private ReplaceAndInvertColorService replaceAndInvertColorService; diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java index de7efd71..a885fcdb 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java @@ -187,18 +187,31 @@ public class WatermarkController { float watermarkHeight = heightSpacer + fontSize * textLines.length; float pageWidth = page.getMediaBox().getWidth(); float pageHeight = page.getMediaBox().getHeight(); - int watermarkRows = (int) (pageHeight / watermarkHeight + 1); - int watermarkCols = (int) (pageWidth / watermarkWidth + 1); + + // Calculating the new width and height depending on the angle. + float radians = (float) Math.toRadians(rotation); + float newWatermarkWidth = + (float) + (Math.abs(watermarkWidth * Math.cos(radians)) + + Math.abs(watermarkHeight * Math.sin(radians))); + float newWatermarkHeight = + (float) + (Math.abs(watermarkWidth * Math.sin(radians)) + + Math.abs(watermarkHeight * Math.cos(radians))); + + // Calculating the number of rows and columns. + int watermarkRows = (int) (pageHeight / newWatermarkHeight + 1); + int watermarkCols = (int) (pageWidth / newWatermarkWidth + 1); // Add the text watermark - for (int i = 0; i < watermarkRows; i++) { - for (int j = 0; j < watermarkCols; j++) { + for (int i = 0; i <= watermarkRows; i++) { + for (int j = 0; j <= watermarkCols; j++) { contentStream.beginText(); contentStream.setTextMatrix( Matrix.getRotateInstance( (float) Math.toRadians(rotation), - j * watermarkWidth, - i * watermarkHeight)); + j * newWatermarkWidth, + i * newWatermarkHeight)); for (int k = 0; k < textLines.length; ++k) { contentStream.showText(textLines[k]); diff --git a/src/main/java/stirling/software/SPDF/controller/web/SignatureController.java b/src/main/java/stirling/software/SPDF/controller/web/SignatureController.java index eba4e1c4..eb375663 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/SignatureController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/SignatureController.java @@ -15,7 +15,7 @@ import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface; import stirling.software.SPDF.service.SignatureService; @Controller -@RequestMapping("/api/v1/general/") +@RequestMapping("/api/v1/general") public class SignatureController { @Autowired private SignatureService signatureService; diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 1d0acb1e..bfc1bb96 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -141,6 +141,7 @@ navbar.language=اللغات navbar.settings=إعدادات navbar.allTools=أدوات navbar.multiTool=أدوات متعددة +navbar.search=Search navbar.sections.organize=تنظيم navbar.sections.convertTo=تحويل الى PDF navbar.sections.convertFrom=تحويل من PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(مثال: 1,3,2 أو 4-8,2,10-12 أو 2n-1) multiTool.title=أداة متعددة PDF multiTool.header=أداة متعددة PDF multiTool.uploadPrompts=اسم الملف - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=عرض PDF viewPdf.header=عرض PDF diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 4d92ae1f..34cf2b6d 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -141,6 +141,7 @@ navbar.language=Езици navbar.settings=Настройки navbar.allTools=Инструменти navbar.multiTool=Мулти инструменти +navbar.search=Search navbar.sections.organize=Организирайте navbar.sections.convertTo=Преобразуване в PDF navbar.sections.convertFrom=Преобразуване от PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1) multiTool.title=PDF Мулти инструмент multiTool.header=PDF Мулти инструмент multiTool.uploadPrompts=Име на файл - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Преглед на PDF viewPdf.header=Преглед на PDF diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 02d1c556..45bcc122 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Mida del tipus de lletra +addPageNumbers.fontName=Nom del tipus de lletra pdfPrompt=Selecciona PDF(s) multiPdfPrompt=Selecciona PDFs (2+) multiPdfDropPrompt=Selecciona (o arrossega) els documents PDF @@ -12,17 +12,17 @@ imgPrompt=Selecciona Imatge(s) genericSubmit=Envia processTimeWarning=Alerta: Aquest procés pot tardar 1 minut depenent de la mida de l'arxiu pageOrderPrompt=Ordre de Pàgines (Llista separada per comes) : -pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : +pageSelectionPrompt=Selecció de pàgines personalitzada (Introdueix una llista separada per comes de números de pàgina, 1,5,6 o funcions com 2n+1): goToPage=Anar true=Verdader false=Fals unknown=Desconegut save=Desa -saveToBrowser=Save to Browser +saveToBrowser=Desa al navegador close=Tanca filesSelected=fitxers seleccionats noFavourites=No s'ha afegit cap favorit -downloadComplete=Download Complete +downloadComplete=Descarrega completa bored=Avorrit esperant? alphabet=Alfabet downloadPdf=Descarregueu PDF @@ -46,107 +46,108 @@ red=Vermell green=Verd blue=Blau custom=Personalitzat... -WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! -poweredBy=Powered by -yes=Yes +WorkInProgess=En desenvolupament, pot no funcionar o contenir errors. Si us plau, informa de qualsevol problema! +poweredBy=Impulsat per +yes=Si no=No -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. -invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. -deleteCurrentUserMessage=Cannot delete currently logged in user. -deleteUsernameExistsMessage=The username does not exist and cannot be deleted. +changedCredsMessage=Credencials canviades! +notAuthenticatedMessage=Usuari no autenticat. +userNotFoundMessage=Usuari no trobat. +incorrectPasswordMessage=La contrasenya actual és incorrecta. +usernameExistsMessage=El nou nom d’usuari ja existeix. +invalidUsernameMessage=Nom d’usuari no vàlid, només pot contenir lletres, números i els següents caràcters especials @._+- o ha de ser una adreça de correu electrònic vàlida. +invalidPasswordMessage=La contrasenya no pot estar buida ni tenir espais al principi o al final. +confirmPasswordErrorMessage=La contrasenya no pot estar buida ni tenir espais al principi o al final. +deleteCurrentUserMessage=No es pot eliminar l’usuari actualment connectat. +deleteUsernameExistsMessage=El nom d’usuari no existeix i no es pot eliminar. downgradeCurrentUserMessage=No es pot reduir la funció de l'usuari actual -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=L’usuari actual no pot ser deshabilitat downgradeCurrentUserLongMessage=No es pot baixar la funció de l'usuari actual. Per tant, no es mostrarà l'usuari actual. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. +userAlreadyExistsOAuthMessage=L’usuari ja existeix com a usuari OAuth2. +userAlreadyExistsWebMessage=L’usuari ja existeix com a usuari web. error=Error oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate +help=Ajuda +goHomepage=Vés a la pàgina principal +joinDiscord=Uneix-te al nostre servidor de Discord +seeDockerHub=Veure Docker Hub +visitGithub=Visita el repositori de GitHub +donate=Fes una donació color=Color -sponsor=Sponsor -info=Info +sponsor=Patrocinador +info=Informació pro=Pro -page=Page -pages=Pages -loading=Loading... -addToDoc=Add to Document +page=Pàgina +pages=Pàgines +loading=Carregant... +addToDoc=Afegeix al document -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Política de Privacitat +legal.terms=Termes i condicions +legal.accessibility=Accessibilitat +legal.cookie=Política de galetes +legal.impressum=Avís Legal ############### # Pipeline # ############### -pipeline.header=Pipeline Menu (Beta) -pipeline.uploadButton=Upload Custom -pipeline.configureButton=Configure -pipeline.defaultOption=Custom -pipeline.submitButton=Submit -pipeline.help=Pipeline Help -pipeline.scanHelp=Folder Scanning Help -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.header=Menú de Processos (Beta) +pipeline.uploadButton=Càrrega personalitzada +pipeline.configureButton=Configura +pipeline.defaultOption=Personalitzat +pipeline.submitButton=Envia-ho +pipeline.help=Ajuda de Processos +pipeline.scanHelp=Ajuda per a l’Escaneig de Carpetes +pipeline.deletePrompt=Estàs segur que vols eliminar els processos? ###################### # Pipeline Options # ###################### -pipelineOptions.header=Pipeline Configuration -pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Operation Settings -pipelineOptions.pipelineNamePrompt=Enter pipeline name here -pipelineOptions.selectOperation=Select Operation -pipelineOptions.addOperationButton=Add operation -pipelineOptions.pipelineHeader=Pipeline: -pipelineOptions.saveButton=Download -pipelineOptions.validateButton=Validate +pipelineOptions.header=Configuració del Procés +pipelineOptions.pipelineNameLabel=Nom del Procés +pipelineOptions.saveSettings=Desa la configuració de l'operació +pipelineOptions.pipelineNamePrompt=Introdueix el nom del procés aquí +pipelineOptions.selectOperation=Selecciona Operació +pipelineOptions.addOperationButton=Afegeix operació +pipelineOptions.pipelineHeader=Procés: +pipelineOptions.saveButton=Descarrega +pipelineOptions.validateButton=Valida ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Actualitza a Pro +enterpriseEdition.warning=Aquesta funció només està disponible per a usuaris Pro. +enterpriseEdition.yamlAdvert=Stirling PDF Pro admet fitxers de configuració YAML i altres funcions d'SSO. +enterpriseEdition.ssoAdvert=Busques més funcions de gestió d'usuaris? Consulta Stirling PDF Pro ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=Vols ajudar a millorar Stirling PDF? +analytics.paragraph1=Stirling PDF té analítiques opcionals per ajudar-nos a millorar el producte. No recopilem cap informació personal ni el contingut dels fitxers. +analytics.paragraph2=Si us plau, considera habilitar les analítiques per ajudar Stirling PDF a créixer i permetre'ns entendre millor els nostres usuaris. +analytics.enable=Habilita analítiques +analytics.disable=Desactiva analítiques +analytics.settings=Pots canviar la configuració de les analítiques al fitxer config/settings.yml ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=Favorits navbar.darkmode=Mode Fosc -navbar.language=Languages +navbar.language=Idiomes navbar.settings=Opcions -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=Eines +navbar.multiTool=Multi Tool +navbar.search=Search +navbar.sections.organize=Organitzar +navbar.sections.convertTo=Convertir a PDF +navbar.sections.convertFrom=Convertir des de PDF +navbar.sections.security=Signatura i Seguretat +navbar.sections.advance=Avançat +navbar.sections.edit=Visualitzar i Editar navbar.sections.popular=Popular ############# @@ -154,113 +155,113 @@ navbar.sections.popular=Popular ############# settings.title=Opcions settings.update=Actualització Disponible -settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. -settings.appVersion=Versió App: -settings.downloadOption.title=Trieu l'opció de descàrrega (per a descàrregues d'un sol fitxer no zip): -settings.downloadOption.1=Obre mateixa finestra -settings.downloadOption.2=Obre mateixa finestra -settings.downloadOption.3=Descarrega Arxiu +settings.updateAvailable=La versió actual instal·lada és {0}. Una nova versió ({1}) està disponible. +settings.appVersion=Versió de l'App: +settings.downloadOption.title=Trieu l'opció de descàrrega (per a descàrregues d'un sol fitxer no comprimit): +settings.downloadOption.1=Obre en la mateixa finestra +settings.downloadOption.2=Obre en una finestra nova +settings.downloadOption.3=Descarrega fitxer settings.zipThreshold=Comprimiu els fitxers quan el nombre de fitxers baixats superi settings.signOut=Sortir -settings.accountSettings=Account Settings -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.accountSettings=Configuració del Compte +settings.bored.help=Activa un joc ocult +settings.cacheInputs.name=Desa els valors del formulari +settings.cacheInputs.help=Habilita per guardar els valors utilitzats prèviament per a futures execucions -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changePassword=You are using default login credentials. Please enter a new password -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes +changeCreds.title=Canvia les Credencials +changeCreds.header=Actualitza les Dades del Compte +changeCreds.changePassword=Estàs utilitzant les credencials d'inici de sessió per defecte. Si us plau, introdueix una nova contrasenya +changeCreds.newUsername=Nou Nom d'Usuari +changeCreds.oldPassword=Contrasenya Actual +changeCreds.newPassword=Nova Contrasenya +changeCreds.confirmNewPassword=Confirma la Nova Contrasenya +changeCreds.submit=Envia els Canvis account.title=Opcions del compte account.accountSettings=Opcions del compte -account.adminSettings=Opcions d'Admin - Veure i afegir usuaris +account.adminSettings=Opcions d'Administrador - Veure i afegir usuaris account.userControlSettings=Opcions de Control d'Usuari -account.changeUsername=Canvia nom usuari +account.changeUsername=Canvia el nom d'usuari account.newUsername=Nom d'usuari nou account.password=Confirma contrasenya -account.oldPassword=Password Antic -account.newPassword=Password Nou -account.changePassword=Canvia contrasenya -account.confirmNewPassword=Confirma Nova contrasenya +account.oldPassword=Contrasenya Antiga +account.newPassword=Nova Contrasenya +account.changePassword=Canvia la contrasenya +account.confirmNewPassword=Confirma la Nova Contrasenya account.signOut=Sortir account.yourApiKey=Clau API -account.syncTitle=Sincronitza opcions navegador amb compte -account.settingsCompare=Comparador Opcions: +account.syncTitle=Sincronitza les opcions del navegador amb el compte +account.settingsCompare=Comparador d'Opcions: account.property=Propietat: -account.webBrowserSettings=Opcins Navegador +account.webBrowserSettings=Opcions del Navegador account.syncToBrowser=Sincronitza Compte -> Navegador account.syncToAccount=Sincronitza Compte <- Navegador -adminUserSettings.title=Opcions Control Usuari -adminUserSettings.header=Usuari Admin Opcions Control +adminUserSettings.title=Opcions de Control d'Usuari +adminUserSettings.header=Opcions de Control d'Usuari Admin adminUserSettings.admin=Admin adminUserSettings.user=Usuari adminUserSettings.addUser=Afegir Usuari -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? -adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +adminUserSettings.deleteUser=Elimina Usuari +adminUserSettings.confirmDeleteUser=Vols eliminar aquest usuari? +adminUserSettings.confirmChangeUserStatus=Vols deshabilitar/habilitar aquest usuari? +adminUserSettings.usernameInfo=El nom d'usuari només pot contenir lletres, números i els següents caràcters especials: @._+- o ha de ser una adreça de correu electrònic vàlida. adminUserSettings.roles=Rols adminUserSettings.role=Rol adminUserSettings.actions=Accions adminUserSettings.apiUser=Usuari amb API limitada -adminUserSettings.extraApiUser=Additional Limited API User +adminUserSettings.extraApiUser=Usuari Addicional amb API limitada adminUserSettings.webOnlyUser=Usuari només WEB -adminUserSettings.demoUser=Demo User (No custom settings) -adminUserSettings.internalApiUser=Internal API User -adminUserSettings.forceChange=Force user to change password on login -adminUserSettings.submit=Desar Usuari +adminUserSettings.demoUser=Usuari de Demo (Sense configuracions personalitzades) +adminUserSettings.internalApiUser=Usuari d'API Interna +adminUserSettings.forceChange=Força l'usuari a canviar la contrasenya en iniciar sessió +adminUserSettings.submit=Desa Usuari adminUserSettings.changeUserRole=Canvia el rol de l'usuari -adminUserSettings.authenticated=Authenticated -adminUserSettings.editOwnProfil=Edit own profile -adminUserSettings.enabledUser=enabled user -adminUserSettings.disabledUser=disabled user -adminUserSettings.activeUsers=Active Users: -adminUserSettings.disabledUsers=Disabled Users: -adminUserSettings.totalUsers=Total Users: -adminUserSettings.lastRequest=Last Request +adminUserSettings.authenticated=Autenticat +adminUserSettings.editOwnProfil=Edita el propi perfil +adminUserSettings.enabledUser=usuari habilitat +adminUserSettings.disabledUser=usuari deshabilitat +adminUserSettings.activeUsers=Usuaris Actius: +adminUserSettings.disabledUsers=Usuaris Deshabilitats: +adminUserSettings.totalUsers=Total d'Usuaris: +adminUserSettings.lastRequest=Darrera Sol·licitud -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=Importació/Exportació de Base de Dades +database.header=Importació/Exportació de Base de Dades +database.fileName=Nom del Fitxer +database.creationDate=Data de Creació +database.fileSize=Mida del Fitxer +database.deleteBackupFile=Elimina el Fitxer de Còpia de Seguretat +database.importBackupFile=Importa el Fitxer de Còpia de Seguretat +database.downloadBackupFile=Descarrega el Fitxer de Còpia de Seguretat +database.info_1=Quan importis dades, és crucial assegurar-se que l'estructura sigui correcta. Si no estàs segur del que fas, busca l'assessorament d'un professional. Un error en l'estructura pot causar malfuncionaments de l'aplicació, fins i tot impossibilitar-ne l'execució. +database.info_2=El nom del fitxer no importa quan es puja. Es renombrarà després per seguir el format backup_user_yyyyMMddHHmm.sql, assegurant una convenció de nomenclatura consistent. +database.submit=Importa la Còpia de Seguretat +database.importIntoDatabaseSuccessed=Importació a la base de dades completada amb èxit +database.fileNotFound=Fitxer no trobat +database.fileNullOrEmpty=El fitxer no ha de ser nul o buit +database.failedImportFile=Error en la importació del fitxer -session.expired=Your session has expired. Please refresh the page and try again. -session.refreshPage=Refresh Page +session.expired=La teva sessió ha expirat. Si us plau, actualitza la pàgina i torna a intentar-ho. +session.refreshPage=Actualitza la pàgina ############# # HOME-PAGE # ############# -home.desc=L'eina allotjada localment per a necessitats PDF. -home.searchBar=Search for features... +home.desc=L'eina allotjada localment per a necessitats de PDF. +home.searchBar=Cerca funcions... -home.viewPdf.title=View PDF -home.viewPdf.desc=View, annotate, add text or images +home.viewPdf.title=Visualitza PDF +home.viewPdf.desc=Visualitza, anota, afegeix text o imatges viewPdf.tags=view,read,annotate,text,image -home.multiTool.title=PDF Multi Tool -home.multiTool.desc=Fusiona, Rota, Reorganitza, i Esborra pàgines +home.multiTool.title=Eina Multifunció de PDF +home.multiTool.desc=Fusiona, Rota, Reorganitza i Esborra pàgines multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side home.merge.title=Fusiona @@ -345,7 +346,7 @@ home.PDFToWord.desc=Converteix PDF a formats de Word (DOC, DOCX and ODT) PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile home.PDFToPresentation.title=PDF a Presentació -home.PDFToPresentation.desc=Convert PDF to Presentation formats (PPT, PPTX and ODP) +home.PDFToPresentation.desc=Converteix PDF a formats de Presentació (PPT, PPTX i ODP) PDFToPresentation.tags=slides,show,office,microsoft home.PDFToText.title=PDF a Text/RTF @@ -381,8 +382,8 @@ home.removeBlanks.title=Elimina les pàgines en blanc home.removeBlanks.desc=Detecta i elimina les pàgines en blanc d'un document removeBlanks.tags=cleanup,streamline,non-content,organize -home.removeAnnotations.title=Remove Annotations -home.removeAnnotations.desc=Removes all comments/annotations from a PDF +home.removeAnnotations.title=Elimina Anotacions +home.removeAnnotations.desc=Elimina tots els comentaris/anotacions d'un PDF removeAnnotations.tags=comments,highlight,notes,markup,remove home.compare.title=Compara @@ -390,31 +391,31 @@ home.compare.desc=Compara i mostra les diferències entre 2 documents PDF compare.tags=differentiate,contrast,changes,analysis home.certSign.title=Signa amb Certificat -home.certSign.desc=Sign PDF amb Certificate/Clau (PEM/P12) +home.certSign.desc=Signa PDF amb Certificat/Clau (PEM/P12) certSign.tags=authentica,PEM,P12,official,encripta -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF +home.removeCertSign.title=Elimina Signatura de Certificat +home.removeCertSign.desc=Elimina la signatura de certificat d'un 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 +home.pageLayout.title=Disposició Multi-Pàgina +home.pageLayout.desc=Fusiona diverses pàgines d'un document PDF en una sola pàgina pageLayout.tags=merge,composite,single-view,organize -home.scalePages.title=Adjust page size/scale -home.scalePages.desc=Change the size/scale of page and/or its contents. +home.scalePages.title=Ajusta la mida/escala de la pàgina +home.scalePages.desc=Canvia la mida/escala de la pàgina i/o del seu contingut. scalePages.tags=resize,modify,dimension,adapt -home.pipeline.title=Pipeline -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts +home.pipeline.title=Procés +home.pipeline.desc=Executa múltiples accions en PDFs definint scripts de procés pipeline.tags=automate,sequence,scripted,batch-process home.add-page-numbers.title=Afegir Números de Pàgina home.add-page-numbers.desc=Afegir Números de Pàgina en una localització add-page-numbers.tags=pagina,etiqueta,organitza,indexa -home.auto-rename.title=Auto Rename PDF File -home.auto-rename.desc=Auto renames a PDF file based on its detected header +home.auto-rename.title=Canvia Automàticament el Nom del Fitxer PDF +home.auto-rename.desc=Canvia automàticament el nom d'un fitxer PDF en funció de la capçalera detectada auto-rename.tags=auto-detect,header-based,organize,relabel home.adjust-contrast.title=Ajusta Colors/Contrast @@ -425,109 +426,109 @@ home.crop.title=Talla PDF home.crop.desc=Talla PDF per reduïr la mida (manté text!) crop.tags=trim,shrink,edit,shape -home.autoSplitPDF.title=Auto Split Pages -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code +home.autoSplitPDF.title=Divisió Automàtica de Pàgines +home.autoSplitPDF.desc=Divideix automàticament un PDF escanejat amb un codi QR de separació de pàgines escanejades autoSplitPDF.tags=QR-based,separate,scan-segment,organize -home.sanitizePdf.title=Sanitize -home.sanitizePdf.desc=Remove scripts and other elements from PDF files +home.sanitizePdf.title=Neteja +home.sanitizePdf.desc=Elimina scripts i altres elements dels fitxers PDF sanitizePdf.tags=clean,secure,safe,remove-threats -home.URLToPDF.title=URL/Website To PDF -home.URLToPDF.desc=Converts any http(s)URL to PDF +home.URLToPDF.title=URL/Lloc Web a PDF +home.URLToPDF.desc=Converteix qualsevol URL http(s) a PDF URLToPDF.tags=web-capture,save-page,web-to-doc,archive -home.HTMLToPDF.title=HTML to PDF -home.HTMLToPDF.desc=Converts any HTML file or zip to PDF +home.HTMLToPDF.title=HTML a PDF +home.HTMLToPDF.desc=Converteix qualsevol fitxer HTML o arxiu comprimit a PDF HTMLToPDF.tags=markup,web-content,transformation,convert -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF +home.MarkdownToPDF.title=Markdown a PDF +home.MarkdownToPDF.desc=Converteix qualsevol fitxer Markdown a PDF MarkdownToPDF.tags=markup,web-content,transformation,convert -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs +home.getPdfInfo.title=Obteniu Tota la Informació sobre el PDF +home.getPdfInfo.desc=Recupera tota la informació possible sobre els PDFs getPdfInfo.tags=infomation,data,stats,statistics -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF +home.extractPage.title=Extreu pàgina(es) +home.extractPage.desc=Extreu pàgines seleccionades d'un PDF extractPage.tags=extract -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page +home.PdfToSinglePage.title=PDF a Una Sola Pàgina Gran +home.PdfToSinglePage.desc=Fusiona totes les pàgines d'un PDF en una sola pàgina gran PdfToSinglePage.tags=single page -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF +home.showJS.title=Mostra Javascript +home.showJS.desc=Cerca i mostra qualsevol JS injectat en un PDF showJS.tags=JS -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text +home.autoRedact.title=Redacció Automàtica +home.autoRedact.desc=Redacta automàticament (enfosqueix) text en un PDF basat en el text introduït autoRedact.tags=Redact,Hide,black out,black,marker,hidden -home.tableExtraxt.title=PDF to CSV -home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV +home.tableExtraxt.title=PDF a CSV +home.tableExtraxt.desc=Extreu taules d'un PDF convertint-les a CSV tableExtraxt.tags=CSV,Table Extraction,extract,convert -home.autoSizeSplitPDF.title=Auto Split by Size/Count -home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count +home.autoSizeSplitPDF.title=Divisió Automàtica per Mida/Quantitat +home.autoSizeSplitPDF.desc=Divideix un únic PDF en múltiples documents basant-se en la mida, el nombre de pàgines o el nombre de documents autoSizeSplitPDF.tags=pdf,split,document,organization -home.overlay-pdfs.title=Overlay PDFs -home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF +home.overlay-pdfs.title=Superposar PDFs +home.overlay-pdfs.desc=Superposa PDFs sobre un altre PDF overlay-pdfs.tags=Overlay -home.split-by-sections.title=Split PDF by Sections -home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections +home.split-by-sections.title=Divideix PDF per Seccions +home.split-by-sections.desc=Divideix cada pàgina d'un PDF en seccions horitzontals i verticals més petites split-by-sections.tags=Section Split, Divide, Customize -home.AddStampRequest.title=Add Stamp to PDF -home.AddStampRequest.desc=Add text or add image stamps at set locations +home.AddStampRequest.title=Afegeix Segell al PDF +home.AddStampRequest.desc=Afegeix segells de text o imatge en ubicacions establertes AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize -home.PDFToBook.title=PDF to Book -home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre +home.PDFToBook.title=PDF a Llibre +home.PDFToBook.desc=Converteix PDF a formats de llibre/còmic utilitzant Calibre PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.BookToPDF.title=Book to PDF -home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre +home.BookToPDF.title=Llibre a PDF +home.BookToPDF.desc=Converteix formats de llibres/còmics a PDF utilitzant Calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size +home.removeImagePdf.title=Elimina imatge +home.removeImagePdf.desc=Elimina imatges d'un PDF per reduir la mida del fitxer removeImagePdf.tags=Remove Image,Page operations,Back end,server side -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. +home.splitPdfByChapters.title=Divideix PDF per Capítols +home.splitPdfByChapters.desc=Divideix un PDF en múltiples fitxers segons la seva estructura de capítols. splitPdfByChapters.tags=split,chapters,bookmarks,organize #replace-invert-color -replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF -home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +replace-color.title=Reemplaça-Inverteix-Color +replace-color.header=Reemplaça-Inverteix Color en PDF +home.replaceColorPdf.title=Reemplaça i Inverteix Color +home.replaceColorPdf.desc=Reemplaça el color del text i el fons en un PDF i inverteix tot el color del PDF per reduir la mida del fitxer +replaceColorPdf.tags=Reemplaça Color,Operacions de pàgina,Back end,Costat servidor +replace-color.selectText.1=Opcions per Reemplaçar o Invertir color +replace-color.selectText.2=Per defecte (Colors d'alt contrast per defecte) +replace-color.selectText.3=Personalitzat (Colors personalitzats) +replace-color.selectText.4=Inversió completa (Inverteix tots els colors) +replace-color.selectText.5=Opcions de color d'alt contrast +replace-color.selectText.6=Text blanc sobre fons negre +replace-color.selectText.7=Text negre sobre fons blanc +replace-color.selectText.8=Text groc sobre fons negre +replace-color.selectText.9=Text verd sobre fons negre +replace-color.selectText.10=Tria el color del text +replace-color.selectText.11=Tria el color del fons +replace-color.submit=Reemplaça @@ -541,61 +542,61 @@ login.title=Accedir login.header=Accedir login.signin=Accedir login.rememberme=Recordar -login.invalid=Nom usuari / password no vàlid +login.invalid=Nom d'usuari/contrasenya no vàlid login.locked=Compte bloquejat login.signinTitle=Autenticat -login.ssoSignIn=Inicia sessió mitjançant l'inici de sessió ún -login.oauth2AutoCreateDisabled=L'usuari de creació automàtica OAUTH2 està desactivat -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. -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.oauth2InvalidIdToken=Invalid Id Token -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.ssoSignIn=Inicia sessió mitjançant inici de sessió únic +login.oauth2AutoCreateDisabled=La creació automàtica d'usuaris OAUTH2 està desactivada +login.oauth2AdminBlockedUser=El registre o inici de sessió d'usuaris no registrats està actualment bloquejat. Si us plau, contacta amb l'administrador. +login.oauth2RequestNotFound=Sol·licitud d'autorització no trobada +login.oauth2InvalidUserInfoResponse=Resposta d'informació d'usuari no vàlida +login.oauth2invalidRequest=Sol·licitud no vàlida +login.oauth2AccessDenied=Accés denegat +login.oauth2InvalidTokenResponse=Resposta de token no vàlida +login.oauth2InvalidIdToken=ID Token no vàlid +login.userIsDisabled=L'usuari està desactivat, l'inici de sessió està actualment bloquejat amb aquest nom d'usuari. Si us plau, contacta amb l'administrador. +login.alreadyLoggedIn=Ja has iniciat sessió a +login.alreadyLoggedIn2=dispositius. Si us plau, tanca la sessió en els dispositius i torna-ho a intentar. +login.toManySessions=Tens massa sessions actives #auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit +autoRedact.title=Redacció Automàtica +autoRedact.header=Redacció Automàtica +autoRedact.colorLabel=Color +autoRedact.textsToRedactLabel=Text a Redactar (separat per línies) +autoRedact.textsToRedactPlaceholder=p. ex. \nConfidencial \nMolt Secret +autoRedact.useRegexLabel=Utilitza Regex +autoRedact.wholeWordSearchLabel=Cerca de Paraula Completa +autoRedact.customPaddingLabel=Espai Extra Personalitzat +autoRedact.convertPDFToImageLabel=Converteix PDF a Imatge PDF (S'utilitza per eliminar text darrere del quadre) +autoRedact.submitButton=Envia #showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show +showJS.title=Mostra Javascript +showJS.header=Mostra Javascript +showJS.downloadJS=Descarrega Javascript +showJS.submit=Mostra #pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page +pdfToSinglePage.title=PDF a Pàgina Única +pdfToSinglePage.header=PDF a Pàgina Única +pdfToSinglePage.submit=Converteix a Pàgina Única #pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.title=Extreu Pàgines +pageExtracter.header=Extreu Pàgines +pageExtracter.submit=Extreu +pageExtracter.placeholder=(p. ex. 1,2,8 o 4,7,12-16 o 2n-1) #getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON +getPdfInfo.title=Obteniu Informació del PDF +getPdfInfo.header=Obteniu Informació del PDF +getPdfInfo.submit=Obteniu Informació +getPdfInfo.downloadJson=Descarrega JSON #markdown-to-pdf @@ -608,187 +609,187 @@ MarkdownToPDF.credit=Uses WeasyPrint #url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint +URLToPDF.title=URL a PDF +URLToPDF.header=URL a PDF +URLToPDF.submit=Converteix +URLToPDF.credit=Utilitza WeasyPrint #html-to-pdf -HTMLToPDF.title=HTML To PDF -HTMLToPDF.header=HTML To PDF -HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required -HTMLToPDF.submit=Convert -HTMLToPDF.credit=Uses WeasyPrint -HTMLToPDF.zoom=Zoom level for displaying the website. -HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) -HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) -HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) -HTMLToPDF.printBackground=Render the background of websites. -HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) -HTMLToPDF.cssMediaType=Change the CSS media type of the page. -HTMLToPDF.none=None -HTMLToPDF.print=Print -HTMLToPDF.screen=Screen +HTMLToPDF.title=HTML a PDF +HTMLToPDF.header=HTML a PDF +HTMLToPDF.help=Accepta fitxers HTML i arxius ZIP que contenen html/css/imatges, etc. necessaris +HTMLToPDF.submit=Converteix +HTMLToPDF.credit=Utilitza WeasyPrint +HTMLToPDF.zoom=Nivell de zoom per mostrar el lloc web. +HTMLToPDF.pageWidth=Amplada de la pàgina en centímetres. (En blanc per defecte) +HTMLToPDF.pageHeight=Alçada de la pàgina en centímetres. (En blanc per defecte) +HTMLToPDF.marginTop=Margen superior de la pàgina en mil·límetres. (En blanc per defecte) +HTMLToPDF.marginBottom=Marge inferior de la pàgina en mil·límetres. (En blanc per defecte) +HTMLToPDF.marginLeft=Marge esquerre de la pàgina en mil·límetres. (En blanc per defecte) +HTMLToPDF.marginRight=Marge dret de la pàgina en mil·límetres. (En blanc per defecte) +HTMLToPDF.printBackground=Renderitza el fons dels llocs web. +HTMLToPDF.defaultHeader=Habilita la Capçalera per Defecte (Nom i número de pàgina) +HTMLToPDF.cssMediaType=Canvia el tipus de mitjà CSS de la pàgina. +HTMLToPDF.none=Cap +HTMLToPDF.print=Imprimir +HTMLToPDF.screen=Pantalla #AddStampRequest -AddStampRequest.header=Stamp PDF -AddStampRequest.title=Stamp PDF -AddStampRequest.stampType=Stamp Type -AddStampRequest.stampText=Stamp Text -AddStampRequest.stampImage=Stamp Image -AddStampRequest.alphabet=Alphabet -AddStampRequest.fontSize=Font/Image Size -AddStampRequest.rotation=Rotation -AddStampRequest.opacity=Opacity -AddStampRequest.position=Position -AddStampRequest.overrideX=Override X Coordinate -AddStampRequest.overrideY=Override Y Coordinate -AddStampRequest.customMargin=Custom Margin -AddStampRequest.customColor=Custom Text Color -AddStampRequest.submit=Submit +AddStampRequest.header=Segella PDF +AddStampRequest.title=Segella PDF +AddStampRequest.stampType=Tipus de Segell +AddStampRequest.stampText=Text del Segell +AddStampRequest.stampImage=Imatge del Segell +AddStampRequest.alphabet=Alfabet +AddStampRequest.fontSize=Mida de la Font/Imatge +AddStampRequest.rotation=Rotació +AddStampRequest.opacity=Opacitat +AddStampRequest.position=Posició +AddStampRequest.overrideX=Modifica la Coordenada X +AddStampRequest.overrideY=Modifica la Coordenada Y +AddStampRequest.customMargin=Marge Personalitzat +AddStampRequest.customColor=Color de Text Personalitzat +AddStampRequest.submit=Envia #sanitizePDF -sanitizePDF.title=Sanitize PDF -sanitizePDF.header=Sanitize a PDF file -sanitizePDF.selectText.1=Remove JavaScript actions -sanitizePDF.selectText.2=Remove embedded files -sanitizePDF.selectText.3=Remove metadata -sanitizePDF.selectText.4=Remove links -sanitizePDF.selectText.5=Remove fonts -sanitizePDF.submit=Sanitize PDF +sanitizePDF.title=Neteja PDF +sanitizePDF.header=Neteja un fitxer PDF +sanitizePDF.selectText.1=Elimina accions JavaScript +sanitizePDF.selectText.2=Elimina fitxers incrustats +sanitizePDF.selectText.3=Elimina metadades +sanitizePDF.selectText.4=Elimina enllaços +sanitizePDF.selectText.5=Elimina fonts +sanitizePDF.submit=Neteja PDF #addPageNumbers addPageNumbers.title=Afegir Números de Pàgina addPageNumbers.header=Afegir Números de Pàgina addPageNumbers.selectText.1=Selecciona PDF: -addPageNumbers.selectText.2=Mida Marge +addPageNumbers.selectText.2=Mida del Marge addPageNumbers.selectText.3=Posició addPageNumbers.selectText.4=Número Inicial -addPageNumbers.selectText.5=Pàgines a enumerar +addPageNumbers.selectText.5=Pàgines a Enumerar addPageNumbers.selectText.6=Text Personalitzat addPageNumbers.customTextDesc=Text Personalitzat -addPageNumbers.numberPagesDesc=Pàgines a enumerar, defecte 'totes', accepta 1-5 o 2,5,9 etc -addPageNumbers.customNumberDesc=Defecte a {n}, accepta 'Pàgina {n} de {total}', 'Text-{n}', '{filename}-{n} +addPageNumbers.numberPagesDesc=Pàgines a enumerar, per defecte 'totes', accepta 1-5 o 2,5,9, etc. +addPageNumbers.customNumberDesc=Per defecte {n}, accepta 'Pàgina {n} de {total}', 'Text-{n}', '{filename}-{n}' addPageNumbers.submit=Afegir Números de Pàgina #auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename +auto-rename.title=Canvi de Nom Automàtic +auto-rename.header=Canvi de Nom Automàtic de PDF +auto-rename.submit=Canvi de Nom Automàtic #adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast +adjustContrast.title=Ajusta el Contrast +adjustContrast.header=Ajusta el Contrast adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download +adjustContrast.brightness=Brillantor: +adjustContrast.saturation=Saturació: +adjustContrast.download=Descarrega #crop crop.title=Talla crop.header=Talla PDF -crop.submit=Submit +crop.submit=Envia #autoSplitPDF -autoSplitPDF.title=Auto Split PDF -autoSplitPDF.header=Auto Split PDF -autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed. -autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine). -autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them. -autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest. -autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. -autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: -autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) -autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Submit +autoSplitPDF.title=Divisió Automàtica de PDF +autoSplitPDF.header=Divisió Automàtica de PDF +autoSplitPDF.description=Imprimeix, insereix, escaneja, puja i deixa que el sistema separi automàticament els teus documents. No cal ordenar manualment. +autoSplitPDF.selectText.1=Imprimeix algunes fulles divisòries de les opcions següents (en blanc i negre està bé). +autoSplitPDF.selectText.2=Escaneja tots els teus documents alhora inserint una fulla divisòria entre cada document. +autoSplitPDF.selectText.3=Puja el fitxer PDF escanejat gran i deixa que Stirling PDF faci la resta. +autoSplitPDF.selectText.4=Les pàgines divisòries es detecten i eliminen automàticament, garantint un document final ordenat. +autoSplitPDF.formPrompt=Envia un PDF que contingui les pàgines divisòries de Stirling-PDF: +autoSplitPDF.duplexMode=Mode Dúplex (Escaneig de davant i darrere) +autoSplitPDF.dividerDownload1=Descarrega 'Divisor Automàtic (mínim).pdf' +autoSplitPDF.dividerDownload2=Descarrega 'Divisor Automàtic (amb instruccions).pdf' +autoSplitPDF.submit=Envia #pipeline -pipeline.title=Pipeline +pipeline.title=Procés #pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -pageLayout.addBorder=Add Borders -pageLayout.submit=Submit +pageLayout.title=Disposició de Múltiples Pàgines +pageLayout.header=Disposició de Múltiples Pàgines +pageLayout.pagesPerSheet=Pàgines per full: +pageLayout.addBorder=Afegeix Marcs +pageLayout.submit=Envia #scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.keepPageSize=Original Size -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit +scalePages.title=Ajusta l'escala de la pàgina +scalePages.header=Ajusta l'escala de la pàgina +scalePages.pageSize=Mida d'una pàgina del document. +scalePages.keepPageSize=Mida Original +scalePages.scaleFactor=Nivell de zoom (retall) d'una pàgina. +scalePages.submit=Envia #certSign -certSign.title=Significació del certificat -certSign.header=Firmar un PDF amb el vostre certificat (Treball en curs) +certSign.title=Signatura amb Certificat +certSign.header=Signa un PDF amb el teu certificat (Treball en curs) certSign.selectPDF=Seleccioneu un fitxer PDF per signar: -certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. +certSign.jksNote=Nota: Si el vostre tipus de certificat no es troba a la llista, convertiu-lo a un fitxer de Java Keystore (.jks) utilitzant l'eina de línia de comandes keytool. A continuació, trieu l'opció de fitxer .jks més avall. certSign.selectKey=Seleccioneu el vostre fitxer de clau privada (format PKCS#8, podria ser .pem o .der): certSign.selectCert=Seleccioneu el vostre fitxer de certificat (format X.509, podria ser .pem o .der): certSign.selectP12=Seleccioneu el vostre fitxer de magatzem de claus PKCS#12 (.p12 o .pfx) (Opcional, si es proporciona, hauria de contenir la vostra clau privada i certificat): -certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): +certSign.selectJKS=Seleccioneu el vostre fitxer de Java Keystore (.jks o .keystore): certSign.certType=Tipus de certificat -certSign.password=Introduïu el vostre magatzem de claus o contrasenya de clau privada (si n'hi ha): +certSign.password=Introduïu la contrasenya del vostre magatzem de claus o clau privada (si n'hi ha): certSign.showSig=Mostra la signatura certSign.reason=Motiu certSign.location=Ubicació certSign.name=Nom -certSign.showLogo=Show Logo -certSign.submit=Firma PDF +certSign.showLogo=Mostra el logotip +certSign.submit=Signa 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 +removeCertSign.title=Elimina la Signatura del Certificat +removeCertSign.header=Elimina el certificat digital del PDF +removeCertSign.selectPDF=Seleccioneu un fitxer PDF: +removeCertSign.submit=Elimina Signatura #removeBlanks removeBlanks.title=Elimina els espais en blanc removeBlanks.header=Elimina les pàgines en blanc removeBlanks.threshold=Llindar: -removeBlanks.thresholdDesc=Llindar per determinar el blanc que ha de ser un píxel blanc -removeBlanks.whitePercent=Percentatge blanc (%): -removeBlanks.whitePercentDesc=Percentatge de pàgina que ha de ser blanca per eliminar-la +removeBlanks.thresholdDesc=Llindar per determinar el nivell de blanc que ha de tenir un píxel per considerar-lo blanc +removeBlanks.whitePercent=Percentatge de blanc (%): +removeBlanks.whitePercentDesc=Percentatge de la pàgina que ha de ser blanca per eliminar-la removeBlanks.submit=Elimina els espais en blanc #removeAnnotations -removeAnnotations.title=Remove Annotations -removeAnnotations.header=Remove Annotations -removeAnnotations.submit=Remove +removeAnnotations.title=Elimina Anotacions +removeAnnotations.header=Elimina Anotacions +removeAnnotations.submit=Elimina #compare compare.title=Comparar compare.header=Compara PDF -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Color de Ressaltat 1: +compare.highlightColor.2=Color de Ressaltat 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Comparar -compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced -compare.large.file.message=One or Both of the provided documents are too large to process -compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. +compare.complex.message=Un o tots dos documents proporcionats són fitxers grans; la precisió de la comparació pot veure's reduïda. +compare.large.file.message=Un o tots dos documents proporcionats són massa grans per ser processats. +compare.no.text.message=Un o tots dos dels PDFs seleccionats no tenen contingut de text. Si us plau, trieu PDFs amb text per a la comparació. #BookToPDF BookToPDF.title=Books and Comics to PDF @@ -797,25 +798,25 @@ BookToPDF.credit=Uses Calibre BookToPDF.submit=Convert #PDFToBook -PDFToBook.title=PDF to Book -PDFToBook.header=PDF to Book +PDFToBook.title=PDF a Llibre +PDFToBook.header=PDF a Llibre PDFToBook.selectText.1=Format -PDFToBook.credit=Uses Calibre -PDFToBook.submit=Convert +PDFToBook.credit=Utilitza Calibre +PDFToBook.submit=Converteix #sign -sign.title=Sign -sign.header=Firma els PDF +sign.title=Signa +sign.header=Signa els PDF sign.upload=Penja la imatge sign.draw=Dibuixa la signatura sign.text=Entrada de text -sign.clear=Esborrar +sign.clear=Esborra sign.add=Afegeix -sign.saved=Saved Signatures -sign.save=Save Signature -sign.personalSigs=Personal Signatures -sign.sharedSigs=Shared Signatures -sign.noSavedSigs=No saved signatures found +sign.saved=Signatures Desades +sign.save=Desa Signatura +sign.personalSigs=Signatures Personals +sign.sharedSigs=Signatures Compartides +sign.noSavedSigs=No s'han trobat signatures desades #repair @@ -827,41 +828,41 @@ repair.submit=Reparar #flatten flatten.title=Aplanar flatten.header=Aplana els PDF -flatten.flattenOnlyForms=Flatten only forms +flatten.flattenOnlyForms=Aplana només els formularis flatten.submit=Aplanar #ScannerImageSplit ScannerImageSplit.selectText.1=Llindar d'angle: -ScannerImageSplit.selectText.2=Estableix l'angle absolut mínim necessari perquè la imatge es giri (per defecte: 10). +ScannerImageSplit.selectText.2=Estableix l'angle mínim absolut necessari perquè la imatge es giri (per defecte: 10). ScannerImageSplit.selectText.3=Tolerància: ScannerImageSplit.selectText.4=Determina l'interval de variació de color al voltant del color de fons estimat (per defecte: 30). ScannerImageSplit.selectText.5=Àrea Mínima: ScannerImageSplit.selectText.6=Estableix el llindar d'àrea mínima per a una foto (per defecte: 10000). ScannerImageSplit.selectText.7=Àrea de contorn mínima: ScannerImageSplit.selectText.8=Estableix el llindar mínim de l'àrea de contorn per a una foto -ScannerImageSplit.selectText.9=Mida Vora: +ScannerImageSplit.selectText.9=Mida de Vora: ScannerImageSplit.selectText.10=Estableix la mida de la vora afegida i eliminada per evitar vores blanques a la sortida (per defecte: 1). -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Python no està instal·lat. És necessari per executar-ho. #OCR -ocr.title=OCR / Neteja escaneig -ocr.header=Neteja Escanejos / OCR (Reconeixement òptic de caràcters) +ocr.title=OCR / Neteja Escanejats +ocr.header=Neteja Escanejats / OCR (Reconeixement Òptic de Caràcters) ocr.selectText.1=Selecciona els idiomes que s'han de detectar dins del PDF (els que s'indiquen són els detectats): -ocr.selectText.2=Produeix un fitxer de text que contingui text OCR juntament amb el PDF editat per OCR -ocr.selectText.3=Corregeix pàgines escanejades amb un angle esbiaixat girant-les de nou al seu lloc -ocr.selectText.4=Neteja la pàgina, de manera que és menys probable que l'OCR trobi soroll de text de fons. (Sense canvis de sortida) -ocr.selectText.5=Neteja la pàgina, de manera que és menys probable que l'OCR trobi text al soroll de fons, mantenint la neteja a la sortida. +ocr.selectText.2=Genera un fitxer de text que contingui el text OCR juntament amb el PDF editat per OCR +ocr.selectText.3=Corregeix pàgines escanejades amb un angle esbiaixat girant-les a la seva posició correcta +ocr.selectText.4=Neteja la pàgina, de manera que és menys probable que l'OCR trobi soroll de text de fons. (Sense canvis en la sortida) +ocr.selectText.5=Neteja la pàgina, de manera que és menys probable que l'OCR trobi text en el soroll de fons, mantenint la neteja en la sortida. ocr.selectText.6=Ignora les pàgines que tenen text interactiu, només les pàgines OCR que són imatges ocr.selectText.7=Força OCR, l'OCR de cada pàgina elimina tots els elements de text originals ocr.selectText.8=Normal (error si el PDF conté text) ocr.selectText.9=Opcions Addicionals ocr.selectText.10=Mode OCR -ocr.selectText.11=Elimia Imatges després de l'OCR (Alimina TOTES les imatges, útil si és part d'un procés de conversió) +ocr.selectText.11=Elimina Imatges després de l'OCR (Elimina TOTES les imatges, útil si forma part d'un procés de conversió) ocr.selectText.12=Tipus de Renderització (Avançat) -ocr.help=Llegiu aquesta documentació sobre com utilitzar-la per a altres idiomes i/o no utilitzar-la a Docker -ocr.credit=Aquest servei empra OCRmyPDF i Tesseract per OCR. +ocr.help=Llegeix aquesta documentació sobre com utilitzar-la per a altres idiomes i/o no utilitzar-la a Docker +ocr.credit=Aquest servei fa servir OCRmyPDF i Tesseract per a OCR. ocr.submit=Processa PDF amb OCR @@ -869,7 +870,7 @@ ocr.submit=Processa PDF amb OCR extractImages.title=Extreu Imatges extractImages.header=Extreu Imatges extractImages.selectText=Selecciona el format d'imatge al qual convertir les imatges extretes -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=Desa imatges duplicades extractImages.submit=Extreu @@ -877,8 +878,8 @@ extractImages.submit=Extreu fileToPDF.title=Arxiu a PDF fileToPDF.header=Converteix arxiu a PDF fileToPDF.credit=Utilitza LibreOffice i Unoconv per a la conversió. -fileToPDF.supportedFileTypesInfo=Supported File types -fileToPDF.supportedFileTypes=Els tipus de fitxers admesos haurien d'incloure el següent, però per obtenir una llista completa actualitzada dels formats compatibles, consulteu la documentació de LibreOffice +fileToPDF.supportedFileTypesInfo=Tipus de fitxers admesos +fileToPDF.supportedFileTypes=Els tipus de fitxers admesos haurien d'incloure els següents, però per obtenir una llista completa actualitzada dels formats compatibles, consulteu la documentació de LibreOffice fileToPDF.submit=Converteix a PDF @@ -889,7 +890,7 @@ compress.credit=Aquest servei utilitza Ghostscript per a la compressió/optimitz compress.selectText.1=Mode manual: de l'1 al 4 compress.selectText.2=Nivell d'optimització: compress.selectText.3=4 (terrible per a imatges de text) -compress.selectText.4=Mode automàtic: ajusta automàticament la qualitat per tal que el PDF tingui la mida exacta +compress.selectText.4=Mode automàtic: ajusta automàticament la qualitat perquè el PDF tingui la mida exacta compress.selectText.5=Mida esperada del PDF (p. ex. 25 MB, 10,8 MB, 25 KB) compress.submit=Comprimir @@ -905,45 +906,52 @@ addImage.submit=Afegir Imatge #merge merge.title=Fusiona merge.header=Fusiona múltiples PDFs (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.removeCertSign=Remove digital signature in the merged file? +merge.sortByName=Ordena per nom +merge.sortByDate=Ordena per data +merge.removeCertSign=Eliminar la signatura digital en el fitxer fusionat? merge.submit=Fusiona #pdfOrganiser -pdfOrganiser.title=Organitzador de pàgines -pdfOrganiser.header=Organitzador de pàgines PDF +pdfOrganiser.title=Organitzador de Pàgines +pdfOrganiser.header=Organitzador de Pàgines PDF pdfOrganiser.submit=Reorganitza Pàgines pdfOrganiser.mode=Mode -pdfOrganiser.mode.1=Custom Page Order -pdfOrganiser.mode.2=Reverse Order -pdfOrganiser.mode.3=Duplex Sort -pdfOrganiser.mode.4=Booklet Sort -pdfOrganiser.mode.5=Side Stitch Booklet Sort -pdfOrganiser.mode.6=Odd-Even Split -pdfOrganiser.mode.7=Remove First -pdfOrganiser.mode.8=Remove Last -pdfOrganiser.mode.9=Remove First and Last -pdfOrganiser.mode.10=Odd-Even Merge -pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) +pdfOrganiser.mode.1=Ordre Personalitzat de Pàgines +pdfOrganiser.mode.2=Ordre Invertit +pdfOrganiser.mode.3=Classificació Dúplex +pdfOrganiser.mode.4=Classificació en Llibret +pdfOrganiser.mode.5=Classificació en Llibret de Puntada Lateral +pdfOrganiser.mode.6=Divisió Parells-Senars +pdfOrganiser.mode.7=Eliminar Primer +pdfOrganiser.mode.8=Eliminar Últim +pdfOrganiser.mode.9=Eliminar Primer i Últim +pdfOrganiser.mode.10=Fusionar Parells-Senars +pdfOrganiser.placeholder=(p. ex. 1,3,2 o 4-8,2,10-12 o 2n-1) #multiTool -multiTool.title=PDF Multi Tool -multiTool.header=PDF Multi Tool -multiTool.uploadPrompts=File Name - +multiTool.title=Eina Multifunció de PDF +multiTool.header=Eina Multifunció de PDF +multiTool.uploadPrompts=Nom del fitxer +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf -viewPdf.title=View PDF -viewPdf.header=View PDF +viewPdf.title=Visualitza PDF +viewPdf.header=Visualitza PDF #pageRemover -pageRemover.title=Eliminació Pàgines -pageRemover.header=Eliminació Pàgines PDF -pageRemover.pagesToDelete=Pàgines a esborrar (Números de pàgina) : +pageRemover.title=Eliminació de Pàgines +pageRemover.header=Eliminació de Pàgines PDF +pageRemover.pagesToDelete=Pàgines a eliminar (Números de pàgines): pageRemover.submit=Esborra Pàgines -pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) +pageRemover.placeholder=(p. ex. 1,2,6 o 1-10,15-30) #rotate @@ -956,15 +964,15 @@ rotate.submit=Rota #split-pdfs split.title=Divideix PDF split.header=Divideix PDF -split.desc.1=Els números seleccionats són el número de pàgina en què voleu fer la divisió -split.desc.2=Per tant, seleccionant 1,3,7-9 dividiria un document de 10 pàgines en 6 PDFS separats amb: +split.desc.1=Els números seleccionats indiquen les pàgines on vols realitzar la divisió +split.desc.2=Per exemple, seleccionant 1,3,7-9 dividiries un document de 10 pàgines en 6 PDFs separats amb: split.desc.3=Document #1: Pàgina 1 split.desc.4=Document #2: Pàgina 2 i 3 split.desc.5=Document #3: Pàgina 4, 5, 6 i 7 split.desc.6=Document #4: Pàgina 8 split.desc.7=Document #5: Pàgina 9 split.desc.8=Document #6: Pàgina 10 -split.splitPages=Introdueix pàgines per dividir-les: +split.splitPages=Introdueix les pàgines per dividir-les: split.submit=Divideix @@ -972,123 +980,123 @@ split.submit=Divideix imageToPDF.title=Imatge a PDF imageToPDF.header=Imatge a PDF imageToPDF.submit=Converteix -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=Auto rota PDF +imageToPDF.selectLabel=Opcions d'Ajust de la Imatge +imageToPDF.fillPage=Omple la Pàgina +imageToPDF.fitDocumentToImage=Ajusta la Pàgina a la Imatge +imageToPDF.maintainAspectRatio=Manté la Proporció de la Imatge +imageToPDF.selectText.2=Rota automàticament el PDF imageToPDF.selectText.3=Lògica de diversos fitxers (només està activada si es treballa amb diverses imatges) imageToPDF.selectText.4=Combina en un únic PDF -imageToPDF.selectText.5=Converteix per separar PDFs +imageToPDF.selectText.5=Converteix per separar els PDFs #pdfToImage pdfToImage.title=PDF a Imatge pdfToImage.header=PDF a Imatge -pdfToImage.selectText=Format Imatge -pdfToImage.singleOrMultiple=Tipus Imatge Resultant +pdfToImage.selectText=Format d'Imatge +pdfToImage.singleOrMultiple=Tipus d'Imatge Resultant pdfToImage.single=Única Imatge Gran pdfToImage.multi=Múltiples Imatges -pdfToImage.colorType=Tipus Color +pdfToImage.colorType=Tipus de Color pdfToImage.color=Color pdfToImage.grey=Escala de Grisos pdfToImage.blackwhite=Blanc i Negre (Pot perdre dades!) pdfToImage.submit=Converteix -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Python no està instal·lat. És necessari per a la conversió a WebP. #addPassword -addPassword.title=Afegir Password -addPassword.header=Afegir password (Encriptat) +addPassword.title=Afegir Contrasenya +addPassword.header=Afegir contrasenya (Encriptat) addPassword.selectText.1=PDF a encriptar -addPassword.selectText.2=Password -addPassword.selectText.3=Longitud clau de xifratge +addPassword.selectText.2=Contrasenya +addPassword.selectText.3=Longitud de la clau de xifratge addPassword.selectText.4=Valors més alts són més forts, però els valors més baixos tenen una millor compatibilitat. addPassword.selectText.5=Permissos a Establir -addPassword.selectText.6=Evita muntatge del document -addPassword.selectText.7=Evita extracció de contingut -addPassword.selectText.8=Evita extracció per accessibilitat +addPassword.selectText.6=Evita el muntatge del document +addPassword.selectText.7=Evita l'extracció de contingut +addPassword.selectText.8=Evita l'extracció per accessibilitat addPassword.selectText.9=Evita emplenar formularis addPassword.selectText.10=Evita modificacions addPassword.selectText.11=Evita modificacions d'annotacions addPassword.selectText.12=Evita impressió -addPassword.selectText.13=Evita impressió de diferents formats -addPassword.selectText.14=Owner Password -addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers) -addPassword.selectText.16=Restricts the opening of the document itself +addPassword.selectText.13=Evita impressió en diferents formats +addPassword.selectText.14=Contrasenya d'Administrador +addPassword.selectText.15=Restringeix el que es pot fer amb el document un cop obert (No compatible amb tots els lectors) +addPassword.selectText.16=Restringeix l'obertura del document addPassword.submit=Encripta #watermark watermark.title=Afegir Marca d'Aigua watermark.header=Afegir Marca d'Aigua -watermark.selectText.1=Seleciona PDF per afegir Marca d'Aigua: +watermark.selectText.1=Selecciona el PDF per afegir la Marca d'Aigua: watermark.selectText.2=Text de la Marca d'Aigua watermark.selectText.3=Mida de la Font: watermark.selectText.4=Rotació (0-360): -watermark.selectText.5=separació d'amplada (Espai horitzontal entre cada Marca d'Aigua): -watermark.selectText.6=separació d'alçada (Espai vertical entre cada Marca d'Aigua): +watermark.selectText.5=Separació d'amplada (Espai horitzontal entre cada Marca d'Aigua): +watermark.selectText.6=Separació d'alçada (Espai vertical entre cada Marca d'Aigua): watermark.selectText.7=Opacitat (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.8=Tipus de Marca d'Aigua: +watermark.selectText.9=Imatge de la Marca d'Aigua: +watermark.selectText.10=Converteix PDF a PDF-Image watermark.submit=Afegir Marca d'Aigua watermark.type.1=Text -watermark.type.2=Image +watermark.type.2=Imatge #Change permissions permissions.title=Canviar Permissos permissions.header=Canviar Permissos -permissions.warning=Advertència perquè aquests permisos siguin inalterables, es recomana establir-los amb una contrasenya a través de la pàgina d'afegir contrasenya -permissions.selectText.1=Selecciona PDF per Canviar Permissos +permissions.warning=Advertència: per fer que aquests permisos siguin inalterables, es recomana establir-los amb una contrasenya a través de la pàgina d'afegir contrasenya +permissions.selectText.1=Selecciona el PDF per Canviar Permissos permissions.selectText.2=Permissos a canviar -permissions.selectText.3=Evita muntatge del document -permissions.selectText.4=Evita extracció de contingut -permissions.selectText.5=evita extracció de contingut per accessibilitat +permissions.selectText.3=Evita el muntatge del document +permissions.selectText.4=Evita l'extracció de contingut +permissions.selectText.5=Evita l'extracció de contingut per accessibilitat permissions.selectText.6=Evita emplenar formularis permissions.selectText.7=Evita modificacions permissions.selectText.8=Evita modificacions d'annotacions permissions.selectText.9=Evita impressió -permissions.selectText.10=Evita impressió de diferents formats +permissions.selectText.10=Evita impressió en diferents formats permissions.submit=Canviar Permissos #remove password -removePassword.title=Treure Password -removePassword.header=Treure Password (Decriptar) -removePassword.selectText.1=Selecciona PDF a Decriptar -removePassword.selectText.2=Password -removePassword.submit=Treu Password +removePassword.title=Eliminar Contrasenya +removePassword.header=Eliminar Contrasenya (Desxifrar) +removePassword.selectText.1=Selecciona el PDF a Desxifrar +removePassword.selectText.2=Contrasenya +removePassword.submit=Eliminar Contrasenya #changeMetadata changeMetadata.title=Títol: changeMetadata.header=Canvia Metadades -changeMetadata.selectText.1=Edit les variables a canviar -changeMetadata.selectText.2=Neteja totes les matadades +changeMetadata.selectText.1=Edita les variables a canviar +changeMetadata.selectText.2=Neteja totes les metadades changeMetadata.selectText.3=Mostra Metadades Personalitzades: changeMetadata.author=Autor: -changeMetadata.creationDate=Data Creació (yyyy/MM/dd HH:mm:ss): +changeMetadata.creationDate=Data de Creació (yyyy/MM/dd HH:mm:ss): changeMetadata.creator=Creador: -changeMetadata.keywords=Keywords: -changeMetadata.modDate=Data Modificació (yyyy/MM/dd HH:mm:ss): +changeMetadata.keywords=Paraules clau: +changeMetadata.modDate=Data de Modificació (yyyy/MM/dd HH:mm:ss): changeMetadata.producer=Productor: changeMetadata.subject=Assumpte: changeMetadata.trapped=Atrapat: changeMetadata.selectText.4=Altres Metadades: -changeMetadata.selectText.5=Afegir entrada personalizada +changeMetadata.selectText.5=Afegir entrada personalitzada changeMetadata.submit=Canvia #pdfToPDFA pdfToPDFA.title=PDF a PDF/A pdfToPDFA.header=PDF a PDF/A -pdfToPDFA.credit=Utilitza ghostscript per la conversió a PDF/A +pdfToPDFA.credit=Utilitza Ghostscript per a 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. +pdfToPDFA.tip=Actualment no funciona per a múltiples entrades al mateix temps +pdfToPDFA.outputFormat=Format de sortida +pdfToPDFA.pdfWithDigitalSignature=El PDF conté una signatura digital. Aquesta serà eliminada en el següent pas. #PDFToWord @@ -1131,104 +1139,104 @@ PDFToXML.submit=Converteix #PDFToCSV PDFToCSV.title=PDF a CSV PDFToCSV.header=PDF a CSV -PDFToCSV.prompt=Choose page to extract table -PDFToCSV.submit=Extracte +PDFToCSV.prompt=Selecciona la pàgina per extreure la taula +PDFToCSV.submit=Extreu #split-by-size-or-count -split-by-size-or-count.title=Split PDF by Size or Count -split-by-size-or-count.header=Split PDF by Size or Count -split-by-size-or-count.type.label=Select Split Type -split-by-size-or-count.type.size=By Size -split-by-size-or-count.type.pageCount=By Page Count -split-by-size-or-count.type.docCount=By Document Count -split-by-size-or-count.value.label=Enter Value -split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5) -split-by-size-or-count.submit=Submit +split-by-size-or-count.title=Divideix PDF per Mida o Nombre +split-by-size-or-count.header=Divideix PDF per Mida o Nombre +split-by-size-or-count.type.label=Selecciona el Tipus de Divisió +split-by-size-or-count.type.size=Per Mida +split-by-size-or-count.type.pageCount=Per Nombre de Pàgines +split-by-size-or-count.type.docCount=Per Nombre de Documents +split-by-size-or-count.value.label=Introdueix el Valor +split-by-size-or-count.value.placeholder=Introdueix la mida (p. ex., 2MB o 3KB) o el nombre (p. ex., 5) +split-by-size-or-count.submit=Envia #overlay-pdfs -overlay-pdfs.header=Overlay PDF Files -overlay-pdfs.baseFile.label=Select Base PDF File -overlay-pdfs.overlayFiles.label=Select Overlay PDF Files -overlay-pdfs.mode.label=Select Overlay Mode -overlay-pdfs.mode.sequential=Sequential Overlay -overlay-pdfs.mode.interleaved=Interleaved Overlay -overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay -overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode) -overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1) -overlay-pdfs.position.label=Select Overlay Position -overlay-pdfs.position.foreground=Foreground -overlay-pdfs.position.background=Background -overlay-pdfs.submit=Submit +overlay-pdfs.header=Superposar Fitxers PDF +overlay-pdfs.baseFile.label=Selecciona el Fitxer PDF Base +overlay-pdfs.overlayFiles.label=Selecciona els Fitxers PDF a Superposar +overlay-pdfs.mode.label=Selecciona el Mode de Superposició +overlay-pdfs.mode.sequential=Superposició Seqüencial +overlay-pdfs.mode.interleaved=Superposició Intercalada +overlay-pdfs.mode.fixedRepeat=Superposició de Repte Fix +overlay-pdfs.counts.label=Nombre de Superposicions (per al Mode de Repte Fix) +overlay-pdfs.counts.placeholder=Introdueix els nombres separats per comes (p. ex., 2,3,1) +overlay-pdfs.position.label=Selecciona la Posició de la Superposició +overlay-pdfs.position.foreground=Primer pla +overlay-pdfs.position.background=Fons +overlay-pdfs.submit=Envia #split-by-sections -split-by-sections.title=Split PDF by Sections -split-by-sections.header=Split PDF into Sections -split-by-sections.horizontal.label=Horizontal Divisions -split-by-sections.vertical.label=Vertical Divisions -split-by-sections.horizontal.placeholder=Enter number of horizontal divisions -split-by-sections.vertical.placeholder=Enter number of vertical divisions -split-by-sections.submit=Split PDF -split-by-sections.merge=Merge Into One PDF +split-by-sections.title=Divideix PDF per Seccions +split-by-sections.header=Divideix el PDF en Seccions +split-by-sections.horizontal.label=Divisions Horitzontals +split-by-sections.vertical.label=Divisions Verticals +split-by-sections.horizontal.placeholder=Introdueix el nombre de divisions horitzontals +split-by-sections.vertical.placeholder=Introdueix el nombre de divisions verticals +split-by-sections.submit=Divideix PDF +split-by-sections.merge=Fusiona en un sol PDF #printFile -printFile.title=Print File -printFile.header=Print File to Printer -printFile.selectText.1=Select File to Print -printFile.selectText.2=Enter Printer Name -printFile.submit=Print +printFile.title=Imprimir Fitxer +printFile.header=Imprimir Fitxer a la Impresora +printFile.selectText.1=Selecciona el Fitxer per Imprimir +printFile.selectText.2=Introdueix el Nom de la Impresora +printFile.submit=Imprimir #licenses -licenses.nav=Licenses -licenses.title=3rd Party Licenses -licenses.header=3rd Party Licenses -licenses.module=Module -licenses.version=Version -licenses.license=License +licenses.nav=Llicències +licenses.title=Llicències de Tercers +licenses.header=Llicències de Tercers +licenses.module=Mòdul +licenses.version=Versió +licenses.license=Llicència #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding -survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.nav=Enquesta +survey.title=Enquesta Stirling-PDF +survey.description=Stirling-PDF no fa seguiment, així que volem escoltar els nostres usuaris per millorar Stirling-PDF! +survey.changes=Stirling-PDF ha canviat des de l'última enquesta! Per saber-ne més, consulta la nostra publicació al blog aquí: +survey.changes2=Amb aquests canvis, estem rebent suport empresarial i finançament +survey.please=Si us plau, considera fer la nostra enquesta! +survey.disabled=(El popup de l'enquesta es desactivarà en les següents actualitzacions, però estarà disponible al peu de la pàgina) +survey.button=Fes l'Enquesta +survey.dontShowAgain=No mostrar més #error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=Ho sentim pel problema! +error.needHelp=Necessites ajuda / Has trobat un problema? +error.contactTip=Si encara tens problemes, no dubtis a contactar-nos per a ajuda. Pots enviar una sol·licitud a la nostra pàgina de GitHub o contactar-nos a través de Discord: +error.404.head=404 - Pàgina No Trovada | Ooops, hem fet un error en el codi! +error.404.1=Semblem no poder trobar la pàgina que estàs buscant. +error.404.2=Alguna cosa ha anat malament +error.github=Envia una sol·licitud a GitHub +error.showStack=Mostra la Pila d'Errors +error.copyStack=Copia la Pila d'Errors +error.githubSubmit=GitHub - Envia una sol·licitud +error.discordSubmit=Discord - Envia una sol·licitud d'ajuda #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image +removeImage.title=Eliminar imatge +removeImage.header=Eliminar imatge +removeImage.removeImage=Eliminar imatge +removeImage.submit=Eliminar imatge -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF +splitByChapters.title=Divideix PDF per Capítols +splitByChapters.header=Divideix PDF per Capítols +splitByChapters.bookmarkLevel=Nivell de Marcadors +splitByChapters.includeMetadata=Incloure Metadades +splitByChapters.allowDuplicates=Permetre Duplicats +splitByChapters.desc.1=Aquesta eina divideix un fitxer PDF en diversos PDFs segons l'estructura dels seus capítols. +splitByChapters.desc.2=Nivell de Marcadors: Tria el nivell de marcadors que s'utilitzarà per dividir (0 per al nivell superior, 1 per al segon nivell, etc.). +splitByChapters.desc.3=Incloure Metadades: Si està marcat, les metadades del PDF original s'inclouran en cada PDF dividit. +splitByChapters.desc.4=Permetre Duplicats: Si està marcat, permet diversos marcadors a la mateixa pàgina per crear PDFs separats. +splitByChapters.submit=Divideix PDF diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index d8282674..a6a91b61 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -141,6 +141,7 @@ navbar.language=Jazyky navbar.settings=Nastavení navbar.allTools=Nástroje navbar.multiTool=Multifunkční nástroje +navbar.search=Search navbar.sections.organize=Organizovat navbar.sections.convertTo=Převést do PDF navbar.sections.convertFrom=Převést z PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(např. 1,3,2 nebo 4-8,2,10-12 nebo 2n-1) multiTool.title=Vícefunkční nástroj pro PDF multiTool.header=Vícefunkční nástroj pro PDF multiTool.uploadPrompts=Název souboru - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Zobrazit PDF viewPdf.header=Zobrazit PDF diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index 48ad3a9b..0844523d 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -141,6 +141,7 @@ navbar.language=Sprog navbar.settings=Indstillinger navbar.allTools=Værktøjer navbar.multiTool=Multi Værktøjer +navbar.search=Search navbar.sections.organize=Organisér navbar.sections.convertTo=Konvertér til PDF navbar.sections.convertFrom=Konvertér fra PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1) multiTool.title=PDF Multi Værktøj multiTool.header=PDF Multi Værktøj multiTool.uploadPrompts=Filnavn - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Se PDF viewPdf.header=Se PDF diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index 4a96cc70..af99617b 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -141,6 +141,7 @@ navbar.language=Sprachen navbar.settings=Einstellungen navbar.allTools=Werkzeuge navbar.multiTool=Multitools +navbar.search=Suche navbar.sections.organize=Organisieren navbar.sections.convertTo=In PDF konvertieren navbar.sections.convertFrom=Konvertieren von PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1) multiTool.title=PDF-Multitool multiTool.header=PDF-Multitool multiTool.uploadPrompts=Dateiname - +multiTool.selectAll=Alle auswählen +multiTool.deselectAll=Auswahl aufheben +multiTool.selectPages=Seiten auswählen +multiTool.selectedPages=Ausgewählte Seiten +multiTool.page=Seite +multiTool.deleteSelected=Auswahl löschen +multiTool.downloadAll=Downloaden +multiTool.downloadSelected=Auswahl downloaden #view pdf viewPdf.title=PDF anzeigen viewPdf.header=PDF anzeigen diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index 819ba8e6..78f9d742 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -141,6 +141,7 @@ navbar.language=Γλώσσες navbar.settings=Ρυθμίσεις navbar.allTools=Εργαλεία navbar.multiTool=Multi Tools +navbar.search=Search navbar.sections.organize=Οργάνωση navbar.sections.convertTo=Μετατροπή σε PDF navbar.sections.convertFrom=Μετατροπή από PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1) multiTool.title=PDF Πολυεργαλείο multiTool.header=PDF Πολυεργαλείο multiTool.uploadPrompts=Όνομα αρχείου - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Προβολή PDF viewPdf.header=Προβολή PDF diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index ebfce1f5..d04c674f 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -141,6 +141,7 @@ navbar.language=Languages navbar.settings=Settings navbar.allTools=Tools navbar.multiTool=Multi Tool +navbar.search=Search navbar.sections.organize=Organize navbar.sections.convertTo=Convert to PDF navbar.sections.convertFrom=Convert from PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) multiTool.title=PDF Multi Tool multiTool.header=PDF Multi Tool multiTool.uploadPrompts=File Name - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=View PDF viewPdf.header=View PDF diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 363e8345..0ca78048 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -141,6 +141,7 @@ navbar.language=Languages navbar.settings=Settings navbar.allTools=Tools navbar.multiTool=Multi Tool +navbar.search=Search navbar.sections.organize=Organize navbar.sections.convertTo=Convert to PDF navbar.sections.convertFrom=Convert from PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) multiTool.title=PDF Multi Tool multiTool.header=PDF Multi Tool multiTool.uploadPrompts=File Name - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=View PDF viewPdf.header=View PDF diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index c0af0d0b..ac18e2ff 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -141,6 +141,7 @@ navbar.language=Idiomas navbar.settings=Configuración navbar.allTools=Herramientas navbar.multiTool=Multi herramientas +navbar.search=Search navbar.sections.organize=Organizar navbar.sections.convertTo=Convertir a PDF navbar.sections.convertFrom=Convertir desde PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(por ej., 1,3,2 o 4-8,2,10-12 o 2n-1) multiTool.title=Multi-herramienta PDF multiTool.header=Multi-herramienta PDF multiTool.uploadPrompts=Nombre del archivo - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Ver PDF viewPdf.header=Ver PDF diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index a778d12a..9e05c04e 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -141,6 +141,7 @@ navbar.language=Languages navbar.settings=Ezarpenak navbar.allTools=Tools navbar.multiTool=Multi Tools +navbar.search=Search navbar.sections.organize=Organize navbar.sections.convertTo=Convert to PDF navbar.sections.convertFrom=Convert from PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) multiTool.title=PDF erabilera anitzeko tresna multiTool.header=PDF erabilera anitzeko tresna multiTool.uploadPrompts=File Name - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=View PDF viewPdf.header=View PDF diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index 93cece6e..35873b9c 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -141,6 +141,7 @@ navbar.language=Langues navbar.settings=Paramètres navbar.allTools=Outils navbar.multiTool=Outils Multiples +navbar.search=Search navbar.sections.organize=Organisation navbar.sections.convertTo=Convertir en PDF navbar.sections.convertFrom=Convertir depuis PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(par exemple 1,3,2 ou 4-8,2,10-12 ou 2n-1) multiTool.title=Outil multifonction PDF multiTool.header=Outil multifonction PDF multiTool.uploadPrompts=Nom du fichier - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Visualiser un PDF viewPdf.header=Visualiser un PDF diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties index c4d7fde6..e2b0c03f 100644 --- a/src/main/resources/messages_ga_IE.properties +++ b/src/main/resources/messages_ga_IE.properties @@ -141,6 +141,7 @@ navbar.language=Teangacha navbar.settings=Socruithe navbar.allTools=Uirlisí navbar.multiTool=Uirlisí Il +navbar.search=Search navbar.sections.organize=Eagraigh navbar.sections.convertTo=Tiontaigh go PDF navbar.sections.convertFrom=Tiontaigh ó PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(m.sh. 1,3,2 nó 4-8,2,10-12 nó 2n-1) multiTool.title=Il-uirlis PDF multiTool.header=Il-uirlis PDF multiTool.uploadPrompts=Ainm comhaid - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Féach PDF viewPdf.header=Féach PDF diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index cc2ce5c8..5c1de12e 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -141,6 +141,7 @@ navbar.language=भाषा navbar.settings=सेटिंग्स navbar.allTools=साधन navbar.multiTool=विभिन्न साधन +navbar.search=Search navbar.sections.organize=संगठित करें navbar.sections.convertTo=पीडीएफ में कनवर्ट करें navbar.sections.convertFrom=पीडीएफ से कनवर्ट करें @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(जैसे 1,3,2 या 4-8,2,10-12 या 2n-1) multiTool.title=पीडीएफ मल्टी टूल multiTool.header=पीडीएफ मल्टी टूल multiTool.uploadPrompts=फाइल का नाम - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=पीडीएफ देखें viewPdf.header=पीडीएफ देखें diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index 19562f62..f5566900 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -141,6 +141,7 @@ navbar.language=Jezici navbar.settings=Postavke navbar.allTools=Alati navbar.multiTool=Multi Tools (Alati) +navbar.search=Search navbar.sections.organize=Organizirati navbar.sections.convertTo=Pretvori u PDF navbar.sections.convertFrom=Pretvori iz PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1) multiTool.title=PDF Višenamjenski alat multiTool.header=PDF Višenamjenski alat multiTool.uploadPrompts=Naziv datoteke - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Pogledaj viewPdf.header=Pogledaj PDF diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index ce89e659..8732213b 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -141,6 +141,7 @@ navbar.language=Nyelvek navbar.settings=Beállítások navbar.allTools=Eszközök navbar.multiTool=Multi Tools +navbar.search=Search navbar.sections.organize=Összeállítás navbar.sections.convertTo=Átalakítás PDF-be navbar.sections.convertFrom=PDF-ből átalakítás @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(pl.: 1,3,2 vagy 4-8,2,10-12 vagy 2n-1) multiTool.title=PDF többfunkciós eszköz multiTool.header=PDF többfunkciós eszköz multiTool.uploadPrompts=Fájl neve - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=PDF megtekintése viewPdf.header=PDF megtekintése diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index d33054d6..95a9d41e 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -141,6 +141,7 @@ navbar.language=Bahasa navbar.settings=Pengaturan navbar.allTools=Alat navbar.multiTool=Alat Multi +navbar.search=Search navbar.sections.organize=Atur navbar.sections.convertTo=Konversi ke PDF navbar.sections.convertFrom=Konversi dari PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(misalnya 1,3,2 atau 4-8,2,10-12 atau 2n-1) multiTool.title=Alat Multi PDF multiTool.header=Alat Multi PDF multiTool.uploadPrompts=Nama Berkas - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Lihat PDF viewPdf.header=Lihat PDF diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index b21ab883..2ec95615 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -141,6 +141,7 @@ navbar.language=Lingue navbar.settings=Impostazioni navbar.allTools=Strumenti navbar.multiTool=Strumenti multipli +navbar.search=Search navbar.sections.organize=Organizza navbar.sections.convertTo=Converti in PDF navbar.sections.convertFrom=Converti da PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1) multiTool.title=Multifunzione PDF multiTool.header=Multifunzione PDF multiTool.uploadPrompts=Nome file - +multiTool.selectAll=Seleziona tutto +multiTool.deselectAll=Deseleziona tutto +multiTool.selectPages=Seleziona pagina +multiTool.selectedPages=Seleziona pagine +multiTool.page=Pagina +multiTool.deleteSelected=Elimina selezionata +multiTool.downloadAll=Esporta +multiTool.downloadSelected=Esporta selezionata #view pdf viewPdf.title=Visualizza PDF viewPdf.header=Visualizza PDF diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 94e6ba1b..39ad7925 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -141,6 +141,7 @@ navbar.language=言語 navbar.settings=設定 navbar.allTools=ツール navbar.multiTool=マルチツール +navbar.search=Search navbar.sections.organize=整理 navbar.sections.convertTo=PDFへ変換 navbar.sections.convertFrom=PDFから変換 @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(例:1,3,2または4-8,2,10-12または2n-1) multiTool.title=PDFマルチツール multiTool.header=PDFマルチツール multiTool.uploadPrompts=ファイル名 - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=PDFを表示 viewPdf.header=PDFを表示 diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 723f096e..d0f00808 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -141,6 +141,7 @@ navbar.language=언어 navbar.settings=설정 navbar.allTools=도구 navbar.multiTool=Multi Tools +navbar.search=Search navbar.sections.organize=조직 navbar.sections.convertTo=PDF로 변환 navbar.sections.convertFrom=PDF에서 변환 @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(예: 1,3,2 또는 4-8,2,10-12 또는 2n-1) multiTool.title=PDF 멀티툴 multiTool.header=PDF 멀티툴 multiTool.uploadPrompts=파일 이름 - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=PDF 뷰어 viewPdf.header=PDF 뷰어 diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index c314b118..f563c634 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -141,6 +141,7 @@ navbar.language=Talen navbar.settings=Instellingen navbar.allTools=Tools navbar.multiTool=Multitools +navbar.search=Search navbar.sections.organize=Organizeren navbar.sections.convertTo=Converteren naar PDF navbar.sections.convertFrom=Converteren van PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(bijv. 1,3,2 of 4-8,2,10-12 of 2n-1) multiTool.title=PDF Multitool multiTool.header=PDF Multitool multiTool.uploadPrompts=Bestandsnaam - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=PDF bekijken viewPdf.header=PDF bekijken diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index e86f4b9e..d7c2c1e4 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -141,6 +141,7 @@ navbar.language=Språk navbar.settings=Innstillinger navbar.allTools=Verktøy navbar.multiTool=Multi Verktøy +navbar.search=Search navbar.sections.organize=Organisere navbar.sections.convertTo=Konverter til PDF navbar.sections.convertFrom=Konverter fra PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1) multiTool.title=PDF-multiverktøy multiTool.header=PDF-multiverktøy multiTool.uploadPrompts=Filnavn - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Vis PDF viewPdf.header=Vis PDF diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 4db148c1..1c997329 100755 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -141,6 +141,7 @@ navbar.language=Języki navbar.settings=Ustawienia navbar.allTools=Narzędzia navbar.multiTool=Narzędzie Wielofunkcyjne +navbar.search=Search navbar.sections.organize=Organizuj navbar.sections.convertTo=Przetwórz na PDF navbar.sections.convertFrom=Przetwórz z PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(przykład 1,3,2 lub 4-8,2,10-12 lub 2n-1) multiTool.title=Narzędzie Wielofunkcyjne PDF multiTool.header=Narzędzie Wielofunkcyjne PDF multiTool.uploadPrompts=Nazwa pliku - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Podejrzyj PDF viewPdf.header=Podejrzyj PDF diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index 917fb99d..79fbfa20 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -141,6 +141,7 @@ navbar.language=Idiomas navbar.settings=Configurações navbar.allTools=Ferramentas navbar.multiTool=Multiferramentas +navbar.search=Search navbar.sections.organize=Organizar navbar.sections.convertTo=Converter para PDF navbar.sections.convertFrom=Converter de PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(por exemplo 1,3,2 ou 4-8,2,10-12 ou 2n-1) multiTool.title=Multiferramenta de PDF multiTool.header=Multiferramenta de PDF multiTool.uploadPrompts=Nome do arquivo - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Visualizar PDF viewPdf.header=Visualizar PDF diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 2bf6a5dd..09ef384e 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -141,6 +141,7 @@ navbar.language=Idiomas navbar.settings=Configurações navbar.allTools=Ferramentas navbar.multiTool=Multi Tools +navbar.search=Search navbar.sections.organize=Organizar navbar.sections.convertTo=Converter para PDF navbar.sections.convertFrom=Converter de PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(ex: 1,3,2 ou 4-8,2,10-12 ou 2n-1) multiTool.title=Multiferramenta de PDF multiTool.header=Multiferramenta de PDF multiTool.uploadPrompts=Nome do Arquivo - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Visualizar PDF viewPdf.header=Visualizar PDF diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index f86a2d73..f8caf9d2 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -141,6 +141,7 @@ navbar.language=Limbi navbar.settings=Setări navbar.allTools=Instrumente navbar.multiTool=Instrumente Multiple +navbar.search=Search navbar.sections.organize=Organizează navbar.sections.convertTo=Convertește în PDF navbar.sections.convertFrom=Convertește din PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(ex. 1,3,2 sau 4-8,2,10-12 sau 2n-1) multiTool.title=Instrument PDF multiplu multiTool.header=Instrument PDF multiplu multiTool.uploadPrompts=Nume Fișier - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Vizualizează PDF viewPdf.header=Vizualizează PDF diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 2773d066..ea753427 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -141,6 +141,7 @@ navbar.language=Языки navbar.settings=Настройки navbar.allTools=Конвейеры navbar.multiTool=Multi Tools +navbar.search=Search navbar.sections.organize=Организация navbar.sections.convertTo=Перевести в PDF navbar.sections.convertFrom=Перевести из PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(например, 1,3,2 или 4-8,2,10-12 или 2n-1 multiTool.title=Мультиинструмент PDF multiTool.header=Мультиинструмент PDF multiTool.uploadPrompts=Имя файла - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Просмотреть PDF viewPdf.header=Просмотреть PDF diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index f2881d77..bfc0b04c 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -141,6 +141,7 @@ navbar.language=Languages navbar.settings=Nastavenia navbar.allTools=Tools navbar.multiTool=Multi Tools +navbar.search=Search navbar.sections.organize=Organize navbar.sections.convertTo=Convert to PDF navbar.sections.convertFrom=Convert from PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(napr. 1,3,2 alebo 4-8,2,10-12 alebo 2n-1) multiTool.title=PDF Multi Nástroj multiTool.header=PDF Multi Nástroj multiTool.uploadPrompts=File Name - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Zobraziť PDF viewPdf.header=Zobraziť PDF diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index f0ff41eb..9f5a8d6e 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -141,6 +141,7 @@ navbar.language=Languages navbar.settings=Podešavanja navbar.allTools=Tools navbar.multiTool=Multi Tools +navbar.search=Search navbar.sections.organize=Organize navbar.sections.convertTo=Convert to PDF navbar.sections.convertFrom=Convert from PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) multiTool.title=PDF Multi Alatka multiTool.header=PDF Multi Alatka multiTool.uploadPrompts=File Name - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Prikaz viewPdf.header=Prikaz PDF-a diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index 0a10edec..9cb280dd 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -141,6 +141,7 @@ navbar.language=Språk navbar.settings=Inställningar navbar.allTools=Verktyg navbar.multiTool=Multiverktyg +navbar.search=Search navbar.sections.organize=Organisera navbar.sections.convertTo=Konvertera till PDF navbar.sections.convertFrom=Konvertera från PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(t.ex. 1,3,2 eller 4-8,2,10-12 eller 2n-1) multiTool.title=PDF-multiverktyg multiTool.header=PDF Multi-verktyg multiTool.uploadPrompts=Filnamn - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Visa PDF viewPdf.header=Visa PDF diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index 3624b84e..e1e90bd4 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -141,6 +141,7 @@ navbar.language=ภาษา navbar.settings=การตั้งค่า navbar.allTools=เครื่องมือทั้งหมด navbar.multiTool=เครื่องมือหลายตัว +navbar.search=Search navbar.sections.organize=จัดระเบียบ navbar.sections.convertTo=แปลงเป็น PDF navbar.sections.convertFrom=แปลงจาก PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(เช่น 1,3,2 หรือ 4-8,2,10-12 หรื multiTool.title=เครื่องมือ PDF หลายตัว multiTool.header=เครื่องมือ PDF หลายตัว multiTool.uploadPrompts=ชื่อไฟล์ - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=ดู PDF viewPdf.header=ดู PDF diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index b731da02..4d7048d6 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -141,6 +141,7 @@ navbar.language=Diller navbar.settings=Ayarlar navbar.allTools=Araçlar navbar.multiTool=Çoklu Araçlar +navbar.search=Search navbar.sections.organize=Düzenle navbar.sections.convertTo=PDF'ye dönüştür navbar.sections.convertFrom=PDF'den dönüştür @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1) multiTool.title=PDF Çoklu Araç multiTool.header=PDF Çoklu Araç multiTool.uploadPrompts=Dosya Adı - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=PDF Görüntüle viewPdf.header=PDF Görüntüle diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index ca018b93..aee6943b 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -141,6 +141,7 @@ navbar.language=Мови navbar.settings=Налаштування navbar.allTools=Інструменти navbar.multiTool=Мультіінструмент +navbar.search=Search navbar.sections.organize=Організувати navbar.sections.convertTo=Конвертувати в PDF navbar.sections.convertFrom=Конвертувати з PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(наприклад, 1,3,2 або 4-8,2,10-12 або 2n multiTool.title=Мультіінструмент PDF multiTool.header=Мультіінструмент PDF multiTool.uploadPrompts=Ім'я файлу - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Переглянути PDF viewPdf.header=Переглянути PDF diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties index 15ca0653..3e26c406 100644 --- a/src/main/resources/messages_vi_VN.properties +++ b/src/main/resources/messages_vi_VN.properties @@ -141,6 +141,7 @@ navbar.language=Ngôn ngữ navbar.settings=Cài đặt navbar.allTools=Công cụ navbar.multiTool=Đa công cụ +navbar.search=Search navbar.sections.organize=Sắp xếp navbar.sections.convertTo=Chuyển đổi sang PDF navbar.sections.convertFrom=Chuyển đổi từ PDF @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(ví dụ: 1,3,2 hoặc 4-8,2,10-12 hoặc 2n-1) multiTool.title=Công cụ đa năng PDF multiTool.header=Công cụ đa năng PDF multiTool.uploadPrompts=Tên tệp - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Xem PDF viewPdf.header=Xem PDF diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 506dee41..d8cac5db 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -141,6 +141,7 @@ navbar.language=语言 navbar.settings=设置 navbar.allTools=工具箱 navbar.multiTool=多功能工具 +navbar.search=Search navbar.sections.organize=组织 navbar.sections.convertTo=转换成PDF navbar.sections.convertFrom=从PDF转换 @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(例如:1,3,2 或 4-8,2,10-12 或 2n-1) multiTool.title=PDF多功能工具 multiTool.header=PDF多功能工具 multiTool.uploadPrompts=文件名 - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=浏览PDF viewPdf.header=浏览PDF diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index 55a049ed..9ec0f2d8 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -141,6 +141,7 @@ navbar.language=語言 navbar.settings=設定 navbar.allTools=工具 navbar.multiTool=複合工具 +navbar.search=Search navbar.sections.organize=整理 navbar.sections.convertTo=轉換為 PDF navbar.sections.convertFrom=從 PDF 轉換 @@ -933,7 +934,14 @@ pdfOrganiser.placeholder=(例如 1,3,2 或 4-8,2,10-12 或 2n-1) multiTool.title=PDF 複合工具 multiTool.header=PDF 複合工具 multiTool.uploadPrompts=檔名 - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=檢視 PDF viewPdf.header=檢視 PDF diff --git a/src/main/resources/static/css/multi-tool.css b/src/main/resources/static/css/multi-tool.css index 9687470a..60514fcc 100644 --- a/src/main/resources/static/css/multi-tool.css +++ b/src/main/resources/static/css/multi-tool.css @@ -212,15 +212,81 @@ label { .page-number { position: absolute; top: 5px; - right: 0px; - color: var(--md-sys-color-on-surface); - background-color: var(--md-sys-color-surface-5); + left: 5px; + color: var(--md-sys-color-on-secondary); + background-color: rgba(162, 201, 255, 0.8); padding: 6px 8px; border-radius: 8px; font-size: 16px; z-index: 2; + font-weight: 450; } .tool-header { margin: 0.5rem 1rem 2rem; } + +#select-pages-button { + opacity: 0.5; +} + +.selected-pages-container { + background-color: var(--md-sys-color-surface); + border-radius: 16px; + padding: 15px; + width: 100%; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + font-family: Arial, sans-serif; +} + +.selected-pages-container h3 { + color: var(--md-sys-color-on-surface); + font-size: 1.2em; + margin-bottom: 10px; +} + +.pages-list { + display: flex; + flex-wrap: wrap; + gap: 10px; + padding: 0; + list-style: none; + max-height: 10rem; + overflow: auto; +} + +.page-item { + background-color: var(--md-sys-color-surface-container-low); + border-radius: 8px; + padding: 8px 12px; + display: flex; + align-items: center; + gap: 8px; + font-weight: bold; + color: var(--md-sys-color-on-surface); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + width: 7rem; + height: 2.5rem; +} + +.selected-page-number { + width: 4rem; + font-size: small; +} + +.remove-btn { + cursor: pointer; + color: var(--md-sys-color-on-surface); + font-size: 1.2em; +} + +.checkbox-container { + align-items: center; + justify-content: center; + display: flex; + flex-direction: column; +} + +.checkbox-label { + font-size: medium; +} diff --git a/src/main/resources/static/css/pdfActions.css b/src/main/resources/static/css/pdfActions.css index b76e45b1..c3845445 100644 --- a/src/main/resources/static/css/pdfActions.css +++ b/src/main/resources/static/css/pdfActions.css @@ -126,3 +126,28 @@ html[dir="rtl"] .pdf-actions_container:last-child>.pdf-actions_insert-file-butto aspect-ratio: 1; border-radius: 100px; } + + +.pdf-actions_checkbox { + position: absolute; + top: 5px; + right: 3px; + color: var(--md-sys-color-on-surface); + background-color: var(--md-sys-color-surface-5); + padding: 6px 8px; + border-radius: 8px; + font-size: 16px; + z-index: 2; +} + +.hidden { + display: none; +} +.pdf-actions_insert-file-blank-button { + position: absolute; + top: 75%; + right: 50%; + translate: 0% -50%; + aspect-ratio: 1; + border-radius: 100px; +} diff --git a/src/main/resources/static/css/theme/font.css b/src/main/resources/static/css/theme/font.css index 547db7ca..a90b14a9 100644 --- a/src/main/resources/static/css/theme/font.css +++ b/src/main/resources/static/css/theme/font.css @@ -5,6 +5,8 @@ src: url(../../fonts/google-symbol.woff2) format('woff2'); } + + .material-symbols-rounded { font-family: 'Material Symbols Rounded'; font-weight: 300; diff --git a/src/main/resources/static/js/homecard.js b/src/main/resources/static/js/homecard.js index efc5314e..723f3717 100644 --- a/src/main/resources/static/js/homecard.js +++ b/src/main/resources/static/js/homecard.js @@ -83,14 +83,16 @@ function syncFavorites() { cards.forEach(card => { const isFavorite = localStorage.getItem(card.id) === "favorite"; const starIcon = card.querySelector(".favorite-icon span.material-symbols-rounded"); - if (isFavorite) { - starIcon.classList.remove("no-fill"); - starIcon.classList.add("fill"); - card.classList.add("favorite"); - } else { - starIcon.classList.remove("fill"); - starIcon.classList.add("no-fill"); - card.classList.remove("favorite"); + if (starIcon) { + if (isFavorite) { + starIcon.classList.remove("no-fill"); + starIcon.classList.add("fill"); + card.classList.add("favorite"); + } else { + starIcon.classList.remove("fill"); + starIcon.classList.add("no-fill"); + card.classList.remove("favorite"); + } } }); updateFavoritesSection(); @@ -260,4 +262,4 @@ document.addEventListener("DOMContentLoaded", function () { }, 500); showFavoritesOnly(); -}); \ No newline at end of file +}); diff --git a/src/main/resources/static/js/multitool/PdfActionsManager.js b/src/main/resources/static/js/multitool/PdfActionsManager.js index 033b3991..b4da3718 100644 --- a/src/main/resources/static/js/multitool/PdfActionsManager.js +++ b/src/main/resources/static/js/multitool/PdfActionsManager.js @@ -1,6 +1,7 @@ class PdfActionsManager { pageDirection; pagesContainer; + static selectedPages = []; // Static property shared across all instances constructor(id) { this.pagesContainer = document.getElementById(id); @@ -73,6 +74,11 @@ class PdfActionsManager { this.addFiles(imgContainer); } + insertFileBlankButtonCallback(e) { + var imgContainer = this.getPageContainer(e.target); + this.addFiles(imgContainer, true); + } + splitFileButtonCallback(e) { var imgContainer = this.getPageContainer(e.target); imgContainer.classList.toggle("split-before"); @@ -89,9 +95,11 @@ class PdfActionsManager { this.rotateCWButtonCallback = this.rotateCWButtonCallback.bind(this); this.deletePageButtonCallback = this.deletePageButtonCallback.bind(this); this.insertFileButtonCallback = this.insertFileButtonCallback.bind(this); + this.insertFileBlankButtonCallback = this.insertFileBlankButtonCallback.bind(this); this.splitFileButtonCallback = this.splitFileButtonCallback.bind(this); } + adapt(div) { div.classList.add("pdf-actions_container"); const leftDirection = this.pageDirection === "rtl" ? "right" : "left"; @@ -132,6 +140,45 @@ class PdfActionsManager { div.appendChild(buttonContainer); + //enerate checkbox to select individual pages + const selectCheckbox = document.createElement("input"); + selectCheckbox.type = "checkbox"; + selectCheckbox.classList.add("pdf-actions_checkbox", "form-check-input"); + selectCheckbox.id = `selectPageCheckbox`; + selectCheckbox.checked = window.selectAll; + + div.appendChild(selectCheckbox); + + //only show whenpage select mode is active + if (!window.selectPage) { + selectCheckbox.classList.add("hidden"); + } else { + selectCheckbox.classList.remove("hidden"); + } + + selectCheckbox.onchange = () => { + const pageNumber = Array.from(div.parentNode.children).indexOf(div) + 1; + if (selectCheckbox.checked) { + //adds to array of selected pages + window.selectedPages.push(pageNumber); + } else { + //remove page from selected pages array + const index = window.selectedPages.indexOf(pageNumber); + if (index !== -1) { + window.selectedPages.splice(index, 1); + } + } + + if (window.selectedPages.length > 0 && !window.selectPage) { + window.toggleSelectPageVisibility(); + } + if (window.selectedPages.length == 0 && window.selectPage) { + window.toggleSelectPageVisibility(); + } + + window.updateSelectedPagesDisplay(); + }; + const insertFileButtonContainer = document.createElement("div"); insertFileButtonContainer.classList.add( @@ -152,6 +199,12 @@ class PdfActionsManager { splitFileButton.onclick = this.splitFileButtonCallback; insertFileButtonContainer.appendChild(splitFileButton); + const insertFileBlankButton = document.createElement("button"); + insertFileBlankButton.classList.add("btn", "btn-primary", "pdf-actions_insert-file-blank-button"); + insertFileBlankButton.innerHTML = `insert_page_break`; + insertFileBlankButton.onclick = this.insertFileBlankButtonCallback; + insertFileButtonContainer.appendChild(insertFileBlankButton); + div.appendChild(insertFileButtonContainer); // add this button to every element, but only show it on the last one :D @@ -179,15 +232,29 @@ class PdfActionsManager { }; div.addEventListener("mouseenter", () => { + window.updatePageNumbersAndCheckboxes(); const pageNumber = Array.from(div.parentNode.children).indexOf(div) + 1; adaptPageNumber(pageNumber, div); + const checkbox = document.getElementById(`selectPageCheckbox-${pageNumber}`); + if (checkbox && !window.selectPage) { + checkbox.classList.remove("hidden"); + } }); div.addEventListener("mouseleave", () => { + const pageNumber = Array.from(div.parentNode.children).indexOf(div) + 1; const pageNumberElement = div.querySelector(".page-number"); if (pageNumberElement) { div.removeChild(pageNumberElement); } + const checkbox = document.getElementById(`selectPageCheckbox-${pageNumber}`); + if (checkbox && !window.selectPage) { + checkbox.classList.add("hidden"); + } + }); + + document.addEventListener("selectedPagesUpdated", () => { + window.updateSelectedPagesDisplay(); }); return div; diff --git a/src/main/resources/static/js/multitool/PdfContainer.js b/src/main/resources/static/js/multitool/PdfContainer.js index 0cc1a110..a9642bb4 100644 --- a/src/main/resources/static/js/multitool/PdfContainer.js +++ b/src/main/resources/static/js/multitool/PdfContainer.js @@ -22,6 +22,12 @@ class PdfContainer { this.nameAndArchiveFiles = this.nameAndArchiveFiles.bind(this); this.splitPDF = this.splitPDF.bind(this); this.splitAll = this.splitAll.bind(this); + this.deleteSelected = this.deleteSelected.bind(this); + this.toggleSelectAll = this.toggleSelectAll.bind(this); + this.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay.bind(this); + this.toggleSelectPageVisibility = this.toggleSelectPageVisibility.bind(this); + this.updatePagesFromCSV = this.updatePagesFromCSV.bind(this); + this.addFilesBlankAll = this.addFilesBlankAll.bind(this) this.pdfAdapters = pdfAdapters; @@ -31,6 +37,7 @@ class PdfContainer { addFiles: this.addFiles, rotateElement: this.rotateElement, updateFilename: this.updateFilename, + deleteSelected: this.deleteSelected, }); }); @@ -38,6 +45,14 @@ class PdfContainer { window.exportPdf = this.exportPdf; window.rotateAll = this.rotateAll; window.splitAll = this.splitAll; + window.deleteSelected = this.deleteSelected; + window.toggleSelectAll = this.toggleSelectAll; + window.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay; + window.toggleSelectPageVisibility = this.toggleSelectPageVisibility; + window.updatePagesFromCSV = this.updatePagesFromCSV; + window.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay; + window.updatePageNumbersAndCheckboxes = this.updatePageNumbersAndCheckboxes; + window.addFilesBlankAll = this.addFilesBlankAll const filenameInput = document.getElementById("filename-input"); const downloadBtn = document.getElementById("export-button"); @@ -77,19 +92,27 @@ class PdfContainer { } } - addFiles(nextSiblingElement) { - var input = document.createElement("input"); - input.type = "file"; - input.multiple = true; - input.setAttribute("accept", "application/pdf,image/*"); - input.onchange = async (e) => { - const files = e.target.files; + addFiles(nextSiblingElement, blank = false) { + if (blank) { - this.addFilesFromFiles(files, nextSiblingElement); - this.updateFilename(files ? files[0].name : ""); - }; + this.addFilesBlank(nextSiblingElement); - input.click(); + } else { + var input = document.createElement("input"); + input.type = "file"; + input.multiple = true; + input.setAttribute("accept", "application/pdf,image/*"); + input.onchange = async (e) => { + const files = e.target.files; + + this.addFilesFromFiles(files, nextSiblingElement); + this.updateFilename(files ? files[0].name : ""); + const selectAll = document.getElementById("select-pages-container"); + selectAll.classList.toggle("hidden", false); + }; + + input.click(); + } } async addFilesFromFiles(files, nextSiblingElement) { @@ -108,6 +131,47 @@ class PdfContainer { }); } + async addFilesBlank(nextSiblingElement) { + const pdfContent = ` + %PDF-1.4 + 1 0 obj + << /Type /Catalog /Pages 2 0 R >> + endobj + 2 0 obj + << /Type /Pages /Kids [3 0 R] /Count 1 >> + endobj + 3 0 obj + << /Type /Page /Parent 2 0 R /MediaBox [0 0 595 842] /Contents 5 0 R >> + endobj + 5 0 obj + << /Length 44 >> + stream + 0 0 0 595 0 842 re + W + n + endstream + endobj + xref + 0 6 + 0000000000 65535 f + 0000000010 00000 n + 0000000071 00000 n + 0000000121 00000 n + 0000000205 00000 n + 0000000400 00000 n + trailer + << /Size 6 /Root 1 0 R >> + startxref + 278 + %%EOF + `; + const blob = new Blob([pdfContent], { type: 'application/pdf' }); + const url = URL.createObjectURL(blob); + const file = new File([blob], "blank_page.pdf", { type: "application/pdf" }); + await this.addPdfFile(file, nextSiblingElement); + } + + rotateElement(element, deg) { var lastTransform = element.style.rotate; if (!lastTransform) { @@ -215,28 +279,246 @@ class PdfContainer { } rotateAll(deg) { - for (var i = 0; i < this.pagesContainer.childNodes.length; i++) { + for (let i = 0; i < this.pagesContainer.childNodes.length; i++) { const child = this.pagesContainer.children[i]; if (!child) continue; + + const pageIndex = i + 1; + //if in page select mode is active rotate only selected pages + if (window.selectPage && !window.selectedPages.includes(pageIndex)) continue; + const img = child.querySelector("img"); if (!img) continue; + this.rotateElement(img, deg); } } + deleteSelected() { + window.selectedPages.sort((a, b) => a - b); + let deletions = 0; + + window.selectedPages.forEach((pageIndex) => { + const adjustedIndex = pageIndex - 1 - deletions; + const child = this.pagesContainer.children[adjustedIndex]; + if (child) { + this.pagesContainer.removeChild(child); + deletions++; + } + }); + + if (this.pagesContainer.childElementCount === 0) { + const filenameInput = document.getElementById("filename-input"); + const filenameParagraph = document.getElementById("filename"); + const downloadBtn = document.getElementById("export-button"); + + if (filenameInput) + filenameInput.disabled = true; + filenameInput.value = ""; + if (filenameParagraph) + filenameParagraph.innerText = ""; + + downloadBtn.disabled = true; + } + + window.selectedPages = []; + this.updatePageNumbersAndCheckboxes(); + document.dispatchEvent(new Event("selectedPagesUpdated")); + } + + toggleSelectAll() { + const checkboxes = document.querySelectorAll(".pdf-actions_checkbox"); + window.selectAll = !window.selectAll; + const selectIcon = document.getElementById("select-icon"); + const deselectIcon = document.getElementById("deselect-icon"); + + if (selectIcon.style.display === "none") { + selectIcon.style.display = "inline"; + deselectIcon.style.display = "none"; + } else { + selectIcon.style.display = "none"; + deselectIcon.style.display = "inline"; + } + checkboxes.forEach((checkbox) => { + + checkbox.checked = window.selectAll; + + const pageNumber = Array.from(checkbox.parentNode.parentNode.children).indexOf(checkbox.parentNode) + 1; + + if (checkbox.checked) { + if (!window.selectedPages.includes(pageNumber)) { + window.selectedPages.push(pageNumber); + } + } else { + const index = window.selectedPages.indexOf(pageNumber); + if (index !== -1) { + window.selectedPages.splice(index, 1); + } + } + }); + + this.updateSelectedPagesDisplay(); + } + + parseCSVInput(csvInput, maxPageIndex) { + const pages = new Set(); + + csvInput.split(",").forEach((item) => { + const range = item.split("-").map((p) => parseInt(p.trim())); + if (range.length === 2) { + const [start, end] = range; + for (let i = start; i <= end && i <= maxPageIndex; i++) { + if (i > 0) { // Ensure the page number is greater than 0 + pages.add(i); + } + } + } else if (range.length === 1 && Number.isInteger(range[0])) { + const page = range[0]; + if (page > 0 && page <= maxPageIndex) { // Ensure page is within valid range + pages.add(page); + } + } + }); + + return Array.from(pages).sort((a, b) => a - b); + } + + updatePagesFromCSV() { + const csvInput = document.getElementById("csv-input").value; + + const allPages = this.pagesContainer.querySelectorAll(".page-container"); + const maxPageIndex = allPages.length; + + window.selectedPages = this.parseCSVInput(csvInput, maxPageIndex); + + this.updateSelectedPagesDisplay(); + + const allCheckboxes = document.querySelectorAll(".pdf-actions_checkbox"); + allCheckboxes.forEach((checkbox) => { + const page = parseInt(checkbox.getAttribute("data-page-number")); + checkbox.checked = window.selectedPages.includes(page); + }); + } + + formatSelectedPages(pages) { + if (pages.length === 0) return ""; + + pages.sort((a, b) => a - b); // Sort the page numbers in ascending order + const ranges = []; + let start = pages[0]; + let end = start; + + for (let i = 1; i < pages.length; i++) { + if (pages[i] === end + 1) { + // Consecutive page, update end + end = pages[i]; + } else { + // Non-consecutive page, finalize current range + ranges.push(start === end ? `${start}` : `${start}-${end}`); + start = pages[i]; + end = start; + } + } + // Add the last range + ranges.push(start === end ? `${start}` : `${start}-${end}`); + + return ranges.join(", "); + } + + updateSelectedPagesDisplay() { + const selectedPagesList = document.getElementById("selected-pages-list"); + const selectedPagesInput = document.getElementById("csv-input"); + selectedPagesList.innerHTML = ""; // Clear the list + + window.selectedPages.forEach((page) => { + const pageItem = document.createElement("div"); + pageItem.className = "page-item"; + + const pageNumber = document.createElement("span"); + const pagelabel = /*[[#{multiTool.page}]]*/ 'Page'; + pageNumber.className = "selected-page-number"; + pageNumber.innerText = `${pagelabel} ${page}`; + pageItem.appendChild(pageNumber); + + const removeBtn = document.createElement("span"); + removeBtn.className = "remove-btn"; + removeBtn.innerHTML = "✕"; + + // Remove page from selected pages list and update display and checkbox + removeBtn.onclick = () => { + window.selectedPages = window.selectedPages.filter((p) => p !== page); + this.updateSelectedPagesDisplay(); + + const checkbox = document.getElementById(`selectPageCheckbox-${page}`); + if (checkbox) { + checkbox.checked = false; + } + }; + + pageItem.appendChild(removeBtn); + selectedPagesList.appendChild(pageItem); + }); + + // Update the input field with the formatted page list + selectedPagesInput.value = this.formatSelectedPages(window.selectedPages); + } + + parsePageRanges(ranges) { + const pages = new Set(); + + ranges.split(',').forEach(range => { + const [start, end] = range.split('-').map(Number); + if (end) { + for (let i = start; i <= end; i++) { + pages.add(i); + } + } else { + pages.add(start); + } + }); + + return Array.from(pages).sort((a, b) => a - b); + } + + addFilesBlankAll() { + const allPages = this.pagesContainer.querySelectorAll(".page-container"); + allPages.forEach((page, index) => { + if (index !== 0) { + this.addFiles(page, true) + } + }); + } + splitAll() { const allPages = this.pagesContainer.querySelectorAll(".page-container"); - if (this.pagesContainer.querySelectorAll(".split-before").length > 0) { - allPages.forEach(page => { - page.classList.remove("split-before"); - }); - } else { - allPages.forEach(page => { - page.classList.add("split-before"); - }); + + if (!window.selectPage) { + const hasSplit = this.pagesContainer.querySelectorAll(".split-before").length > 0; + if (hasSplit) { + allPages.forEach(page => { + page.classList.remove("split-before"); + }); + } else { + allPages.forEach(page => { + page.classList.add("split-before"); + }); + } + return; } + + allPages.forEach((page, index) => { + const pageIndex = index; + if (window.selectPage && !window.selectedPages.includes(pageIndex)) return; + + if (page.classList.contains("split-before")) { + page.classList.remove("split-before"); + } else { + page.classList.add("split-before"); + } + }); } + async splitPDF(baseDocBytes, splitters) { const baseDocument = await PDFLib.PDFDocument.load(baseDocBytes); const pageNum = baseDocument.getPages().length; @@ -279,52 +561,54 @@ class PdfContainer { return zip; } - async exportPdf() { + async exportPdf(selected) { const pdfDoc = await PDFLib.PDFDocument.create(); const pageContainers = this.pagesContainer.querySelectorAll(".page-container"); // Select all .page-container elements for (var i = 0; i < pageContainers.length; i++) { - const img = pageContainers[i].querySelector("img"); // Find the img element within each .page-container - if (!img) continue; - let page; - if (img.doc) { - const pages = await pdfDoc.copyPages(img.doc, [img.pageIdx]); - page = pages[0]; - pdfDoc.addPage(page); - } else { - page = pdfDoc.addPage([img.naturalWidth, img.naturalHeight]); - const imageBytes = await fetch(img.src).then((res) => res.arrayBuffer()); - const uint8Array = new Uint8Array(imageBytes); - const imageType = detectImageType(uint8Array); + if (!selected || window.selectedPages.includes(i + 1)) { + const img = pageContainers[i].querySelector("img"); // Find the img element within each .page-container + if (!img) continue; + let page; + if (img.doc) { + const pages = await pdfDoc.copyPages(img.doc, [img.pageIdx]); + page = pages[0]; + pdfDoc.addPage(page); + } else { + page = pdfDoc.addPage([img.naturalWidth, img.naturalHeight]); + const imageBytes = await fetch(img.src).then((res) => res.arrayBuffer()); + const uint8Array = new Uint8Array(imageBytes); + const imageType = detectImageType(uint8Array); - let image; - switch (imageType) { - case 'PNG': - image = await pdfDoc.embedPng(imageBytes); - break; - case 'JPEG': - image = await pdfDoc.embedJpg(imageBytes); - break; - case 'TIFF': - image = await pdfDoc.embedTiff(imageBytes); - break; - case 'GIF': - console.warn(`Unsupported image type: ${imageType}`); - continue; // Skip this image - default: - console.warn(`Unsupported image type: ${imageType}`); - continue; // Skip this image + let image; + switch (imageType) { + case 'PNG': + image = await pdfDoc.embedPng(imageBytes); + break; + case 'JPEG': + image = await pdfDoc.embedJpg(imageBytes); + break; + case 'TIFF': + image = await pdfDoc.embedTiff(imageBytes); + break; + case 'GIF': + console.warn(`Unsupported image type: ${imageType}`); + continue; // Skip this image + default: + console.warn(`Unsupported image type: ${imageType}`); + continue; // Skip this image + } + page.drawImage(image, { + x: 0, + y: 0, + width: img.naturalWidth, + height: img.naturalHeight, + }); + } + const rotation = img.style.rotate; + if (rotation) { + const rotationAngle = parseInt(rotation.replace(/[^\d-]/g, "")); + page.setRotation(PDFLib.degrees(page.getRotation().angle + rotationAngle)); } - page.drawImage(image, { - x: 0, - y: 0, - width: img.naturalWidth, - height: img.naturalHeight, - }); - } - const rotation = img.style.rotate; - if (rotation) { - const rotationAngle = parseInt(rotation.replace(/[^\d-]/g, "")); - page.setRotation(PDFLib.degrees(page.getRotation().angle + rotationAngle)); } } pdfDoc.setCreator(stirlingPDFLabel); @@ -436,7 +720,44 @@ class PdfContainer { // filenameInput.value.replace('.',''); // } } + + + toggleSelectPageVisibility() { + window.selectPage = !window.selectPage; + const checkboxes = document.querySelectorAll(".pdf-actions_checkbox"); + checkboxes.forEach(checkbox => { + checkbox.classList.toggle("hidden", !window.selectPage); + }); + const deleteButton = document.getElementById("delete-button"); + deleteButton.classList.toggle("hidden", !window.selectPage); + const selectedPages = document.getElementById("selected-pages-display"); + selectedPages.classList.toggle("hidden", !window.selectPage); + const selectAll = document.getElementById("select-All-Container"); + selectedPages.classList.toggle("hidden", !window.selectPage); + const exportSelected = document.getElementById("export-selected-button"); + exportSelected.classList.toggle("hidden", !window.selectPage); + const selectPagesButton = document.getElementById("select-pages-button"); + selectPagesButton.style.opacity = window.selectPage ? "1" : "0.5"; + + if (window.selectPage) { + this.updatePageNumbersAndCheckboxes(); + } + } + + + updatePageNumbersAndCheckboxes() { + const pageDivs = document.querySelectorAll(".pdf-actions_container"); + + pageDivs.forEach((div, index) => { + const pageNumber = index + 1; + const checkbox = div.querySelector(".pdf-actions_checkbox"); + checkbox.id = `selectPageCheckbox-${pageNumber}`; + checkbox.setAttribute("data-page-number", pageNumber); + checkbox.checked = window.selectedPages.includes(pageNumber); + }); + } } + function detectImageType(uint8Array) { // Check for PNG signature if (uint8Array[0] === 137 && uint8Array[1] === 80 && uint8Array[2] === 78 && uint8Array[3] === 71) { @@ -450,7 +771,7 @@ function detectImageType(uint8Array) { // Check for TIFF signature (little-endian and big-endian) if ((uint8Array[0] === 73 && uint8Array[1] === 73 && uint8Array[2] === 42 && uint8Array[3] === 0) || - (uint8Array[0] === 77 && uint8Array[1] === 77 && uint8Array[2] === 0 && uint8Array[3] === 42)) { + (uint8Array[0] === 77 && uint8Array[1] === 77 && uint8Array[2] === 0 && uint8Array[3] === 42)) { return 'TIFF'; } @@ -461,4 +782,7 @@ function detectImageType(uint8Array) { return 'UNKNOWN'; } + + + export default PdfContainer; diff --git a/src/main/resources/templates/convert/markdown-to-pdf.html b/src/main/resources/templates/convert/markdown-to-pdf.html index cacc2716..9f9c52e2 100644 --- a/src/main/resources/templates/convert/markdown-to-pdf.html +++ b/src/main/resources/templates/convert/markdown-to-pdf.html @@ -18,7 +18,7 @@
-
+

diff --git a/src/main/resources/templates/crop.html b/src/main/resources/templates/crop.html index c0a0542e..4031b92a 100644 --- a/src/main/resources/templates/crop.html +++ b/src/main/resources/templates/crop.html @@ -24,16 +24,20 @@ -
- - +
+ +
+
+