diff --git a/.gitattributes b/.gitattributes index a51c05176..77083f516 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,6 @@ # Ignore all JavaScript files in a directory src/main/resources/static/pdfjs/* linguist-vendored +src/main/resources/static/pdfjs/** linguist-vendored src/main/resources/static/css/bootstrap-icons.css linguist-vendored src/main/resources/static/css/bootstrap.min.css linguist-vendored src/main/resources/static/css/fonts/* linguist-vendored diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..e73caa3f5 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,4 @@ +# License Agreement for Contributions +By submitting this pull request, I acknowledge and agree that my contributions will be included in Stirling-PDF and that they can be relicensed in the future under MPL 2.0 (Mozilla Public License Version 2.0) license. + +(This does not change the general open-source nature of Stirling-PDF, simply moving from one license to another license) diff --git a/.github/workflows/pull_request_template.md b/.github/workflows/pull_request_template.md new file mode 100644 index 000000000..bc8f5d04f --- /dev/null +++ b/.github/workflows/pull_request_template.md @@ -0,0 +1,3 @@ +# License Agreement for Contributions +By submitting this pull request, I acknowledge and agree that my contributions will be included in Stirling-PDF and that they can be relicensed in the future under MPL 2.0 (Mozilla Public License Version 2.0) license. +(This does not change the open-source nature of Stirling-PDF, simply moving from one license to another license) diff --git a/.github/workflows/push-docker.yml b/.github/workflows/push-docker.yml index 50d03bcc3..10a348379 100644 --- a/.github/workflows/push-docker.yml +++ b/.github/workflows/push-docker.yml @@ -139,4 +139,10 @@ jobs: cache-to: type=gha,mode=max tags: ${{ steps.meta3.outputs.tags }} labels: ${{ steps.meta3.outputs.labels }} + build-args: + VERSION_TAG=${{ steps.versionNumber.outputs.versionNumber }} platforms: linux/amd64,linux/arm64/v8 + - name: Build and Push Helm Chart + run: | + helm package chart/stirling-pdf + helm push stirling-pdf-chart-1.0.0.tgz oci://registry-1.docker.io/frooodle diff --git a/.gitignore b/.gitignore index ff9a3bc59..14f1c1399 100644 --- a/.gitignore +++ b/.gitignore @@ -119,4 +119,5 @@ watchedFolders/ *.db /build -/.vscode \ No newline at end of file +/.vscode +/.idea \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 6b17228ed..6d8303466 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,31 +1,45 @@ -# Build jbig2enc in a separate stage -FROM frooodle/stirling-pdf-base:beta4 +# Use the base image +FROM frooodle/stirling-pdf-base:version8 ARG VERSION_TAG -ENV VERSION_TAG=$VERSION_TAG -ENV DOCKER_ENABLE_SECURITY=false +# Set Environment Variables +ENV DOCKER_ENABLE_SECURITY=false \ + HOME=/home/stirlingpdfuser \ + VERSION_TAG=$VERSION_TAG +# PUID=1000 \ +# PGID=1000 \ +# UMASK=022 \ + -# Create scripts folder and copy local scripts -RUN mkdir /scripts +# Create user and group +##RUN groupadd -g $PGID stirlingpdfgroup && \ +## useradd -u $PUID -g stirlingpdfgroup -s /bin/sh stirlingpdfuser && \ +## mkdir -p $HOME && chown stirlingpdfuser:stirlingpdfgroup $HOME + +# Set up necessary directories and permissions +RUN mkdir -p /scripts /usr/share/fonts/opentype/noto /usr/share/tesseract-ocr /configs /customFiles +##&& \ +## chown -R stirlingpdfuser:stirlingpdfgroup /scripts /usr/share/fonts/opentype/noto /usr/share/tesseract-ocr /configs /customFiles && \ +## chown -R stirlingpdfuser:stirlingpdfgroup /usr/share/tesseract-ocr-original + +# Copy necessary files COPY ./scripts/* /scripts/ - -#Install fonts -RUN mkdir /usr/share/fonts/opentype/noto/ COPY src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/ COPY src/main/resources/static/fonts/*.otf /usr/share/fonts/opentype/noto/ -RUN fc-cache -f -v - -# Always copy the JAR COPY build/libs/*.jar app.jar -# Expose the application port +# Set font cache and permissions +RUN fc-cache -f -v && chmod +x /scripts/* + +##&& \ +## chown stirlingpdfuser:stirlingpdfgroup /app.jar && \ +## chmod +x /scripts/init.sh + +# Expose necessary ports EXPOSE 8080 -# Set environment variables -ENV APP_HOME_NAME="Stirling PDF" - -# Run the application -RUN chmod +x /scripts/init.sh +# Set user and run command +##USER stirlingpdfuser ENTRYPOINT ["/scripts/init.sh"] CMD ["java", "-jar", "/app.jar"] diff --git a/Dockerfile-lite b/Dockerfile-lite index 0f3fcb5f9..9d7349429 100644 --- a/Dockerfile-lite +++ b/Dockerfile-lite @@ -1,26 +1,63 @@ # Build jbig2enc in a separate stage FROM bellsoft/liberica-openjdk-debian:17 + +ARG VERSION_TAG + RUN apt-get update && \ apt-get install -y --no-install-recommends \ - libreoffice-core-nogui \ + libreoffice-core \ libreoffice-common \ - libreoffice-writer-nogui \ - libreoffice-calc-nogui \ - libreoffice-impress-nogui \ + libreoffice-writer \ + libreoffice-calc \ + libreoffice-impress \ unoconv && \ rm -rf /var/lib/apt/lists/* -# Copy the application JAR file + +# Set Environment Variables +ENV DOCKER_ENABLE_SECURITY=false \ + HOME=/home/stirlingpdfuser \ + VERSION_TAG=$VERSION_TAG +# PUID=1000 \ +# PGID=1000 \ +# UMASK=022 \ + +# Create user and group +#RUN groupadd -g $PGID stirlingpdfgroup && \ +# useradd -u $PUID -g stirlingpdfgroup -s /bin/sh stirlingpdfuser && \ +# mkdir -p $HOME && chown stirlingpdfuser:stirlingpdfgroup $HOME + +# Set up necessary directories and permissions +RUN mkdir -p /scripts /usr/share/fonts/opentype/noto /configs /customFiles + +# chown -R stirlingpdfuser:stirlingpdfgroup /usr/share/fonts/opentype/noto /configs /customFiles + +# Copy necessary files +COPY ./scripts/download-security-jar.sh /scripts/download-security-jar.sh +COPY ./scripts/init-without-ocr.sh /scripts/init-without-ocr.sh +COPY src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/ +COPY src/main/resources/static/fonts/*.otf /usr/share/fonts/opentype/noto/ COPY build/libs/*.jar app.jar +# Set font cache and permissions +RUN fc-cache -f -v && \ +chmod +x /scripts/init-without-ocr.sh && \ +chmod +x /scripts/download-security-jar.sh + + +# chown stirlingpdfuser:stirlingpdfgroup /app.jar + + # Expose the application port EXPOSE 8080 # Set environment variables -ENV GROUPS_TO_REMOVE=Python,OpenCV,OCRmyPDF +ENV ENDPOINTS_GROUPS_TO_REMOVE=Python,OpenCV,OCRmyPDF ENV DOCKER_ENABLE_SECURITY=false # Run the application +#USER stirlingpdfuser +ENTRYPOINT ["/scripts/init-without-ocr.sh"] CMD ["java", "-jar", "/app.jar"] diff --git a/Dockerfile-ultra-lite b/Dockerfile-ultra-lite index 04e58c429..b49b90231 100644 --- a/Dockerfile-ultra-lite +++ b/Dockerfile-ultra-lite @@ -1,17 +1,45 @@ # Build jbig2enc in a separate stage FROM bellsoft/liberica-openjdk-alpine:17 -# Copy the application JAR file +ARG VERSION_TAG + +# Set Environment Variables +ENV DOCKER_ENABLE_SECURITY=false \ + HOME=/home/stirlingpdfuser \ + VERSION_TAG=$VERSION_TAG +# PUID=1000 \ +# PGID=1000 \ +# UMASK=022 \ + +# Create user and group using Alpine's addgroup and adduser +#RUN addgroup -g $PGID stirlingpdfgroup && \ +# adduser -u $PUID -G stirlingpdfgroup -s /bin/sh -D stirlingpdfuser && \ +# mkdir -p $HOME && chown stirlingpdfuser:stirlingpdfgroup $HOME + +# Set up necessary directories and permissions +#RUN mkdir -p /scripts /configs /customFiles && \ +# chown -R stirlingpdfuser:stirlingpdfgroup /scripts /configs /customFiles + +RUN mkdir -p /scripts /usr/share/fonts/opentype/noto /configs /customFiles +COPY ./scripts/download-security-jar.sh /scripts/download-security-jar.sh +COPY ./scripts/init-without-ocr.sh /scripts/init-without-ocr.sh + COPY build/libs/*.jar app.jar +# Set font cache and permissions +#RUN chown stirlingpdfuser:stirlingpdfgroup /app.jar + +RUN chmod +x /scripts/init-without-ocr.sh && \ +chmod +x /scripts/download-security-jar.sh && \ +apk add --no-cache curl + # Expose the application port EXPOSE 8080 - - # Set environment variables -ENV GROUPS_TO_REMOVE=CLI -ENV DOCKER_ENABLE_SECURITY=false +ENV ENDPOINTS_GROUPS_TO_REMOVE=CLI + +ENTRYPOINT ["/scripts/init-without-ocr.sh"] # Run the application CMD ["java", "-jar", "/app.jar"] diff --git a/DockerfileBase b/DockerfileBase index d1c2df74b..c913635ff 100644 --- a/DockerfileBase +++ b/DockerfileBase @@ -1,37 +1,50 @@ # Main stage -FROM bellsoft/liberica-openjdk-debian:17 AS base +FROM ubuntu:latest AS base + + + +# JDK for app RUN apt-get update && \ apt-get install -y --no-install-recommends \ - libreoffice-core-nogui \ + openjdk-17-jre + +# Doc conversion +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + libreoffice-core \ libreoffice-common \ - libreoffice-writer-nogui \ - libreoffice-calc-nogui \ - libreoffice-impress-nogui \ - python3-uno \ + libreoffice-writer \ + libreoffice-calc \ + libreoffice-impress \ + python3-uno \ + curl \ + unoconv + + +# OCR MY PDF (unpaper for descew and other advanced featues) +RUN apt-get update && apt-get install -y --no-install-recommends software-properties-common gnupg2 && \ +add-apt-repository ppa:alex-p/tesseract-ocr5 && apt install -y --no-install-recommends tesseract-ocr && \ +apt-get update && \ + apt-get install -y --no-install-recommends \ + ghostscript \ python3-pip \ - unoconv \ - pngquant \ - unpaper \ - ocrmypdf && \ - rm -rf /var/lib/apt/lists/* && \ + ocrmypdf \ + unpaper && \ + pip install --upgrade pip && \ + pip install --no-cache-dir --upgrade ocrmypdf && \ + pip install --no-cache-dir --upgrade pillow==10.0.1 reportlab==3.6.13 wheel==0.38.1 setuptools==65.5.1 pyjwt==2.4.0 cryptography==39.0.1 + + +#CV and HTML +RUN pip install --no-cache-dir opencv-python-headless WeasyPrint + + +# cleanup and etc +RUN rm -rf /var/lib/apt/lists/* && \ mkdir /usr/share/tesseract-ocr-original && \ cp -r /usr/share/tesseract-ocr/* /usr/share/tesseract-ocr-original && \ rm -rf /usr/share/tesseract-ocr -# Python packages stage -FROM base AS python-packages -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - build-essential \ - libffi-dev \ - libssl-dev \ - zlib1g-dev \ - libjpeg-dev && \ - pip install --upgrade pip && \ - pip install --no-cache-dir \ - opencv-python-headless WeasyPrint && \ - rm -rf /var/lib/apt/lists/* -# Final stage: Copy necessary files from the previous stage -FROM base -COPY --from=python-packages /usr/local /usr/local \ No newline at end of file + + \ No newline at end of file diff --git a/HowToAddNewLanguage.md b/HowToAddNewLanguage.md index 26a398bf3..b6a7fa4a4 100644 --- a/HowToAddNewLanguage.md +++ b/HowToAddNewLanguage.md @@ -8,7 +8,7 @@ Fork Stirling-PDF and make a new branch out of Main Then add reference to the language in the navbar by adding a new language entry to the dropdown -https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/templates/fragments/navbar.html#L306 +https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/templates/fragments/languages.html and add a flag svg file to https://github.com/Frooodle/Stirling-PDF/tree/main/src/main/resources/static/images/flags Any SVG flags are fine, i got most of mine from [here](https://flagicons.lipis.dev/) @@ -25,7 +25,7 @@ The data-language-code is the code used to reference the file in the next step. Start by copying the existing english property file -[https://github.com/Frooodle/Stirling-PDF/tree/langSetup/src/main/resources/messages_en_GB.properties](https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/messages_en_US.properties) +[https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties](https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties) Copy and rename it to messages_{your data-language-code here}.properties, in the polish example you would set the name to messages_pl_PL.properties diff --git a/HowToUseOCR.md b/HowToUseOCR.md index 37e33b5c9..d83d0fd2b 100644 --- a/HowToUseOCR.md +++ b/HowToUseOCR.md @@ -2,6 +2,9 @@ This document provides instructions on how to add additional language packs for the OCR tab in Stirling-PDF, both inside and outside of Docker. +## My OCR used to work and now doesnt! +Please update your tesseract docker volume path version from 4.00 to 5 + ## How does the OCR Work Stirling-PDF uses [OCRmyPDF](https://github.com/ocrmypdf/OCRmyPDF) which in turn uses tesseract for its text recognition. All credit goes to them for this awesome work! @@ -18,9 +21,9 @@ Depending on your requirements, you can choose the appropriate language pack for ### Installing Language Packs 1. Download the desired language pack(s) by selecting the `.traineddata` file(s) for the language(s) you need. -2. Place the `.traineddata` files in the Tesseract tessdata directory: `/usr/share/tesseract-ocr/4.00/tessdata` (Debian) or `/usr/share/tesseract/tessdata` (Fedora) +2. Place the `.traineddata` files in the Tesseract tessdata directory: `/usr/share/tesseract-ocr/5/tessdata` (Debian) or `/usr/share/tesseract/tessdata` (Fedora) -# DO NOT REMOVE EXISTING ENG.TRAINEDDATA, ITS REQUIRED. +# DO NOT REMOVE EXISTING ENG.TRAINEDDATA, IT'S REQUIRED. #### Docker @@ -34,14 +37,14 @@ services: your_service_name: image: your_docker_image_name volumes: - - /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata + - /location/of/trainingData:/usr/share/tesseract-ocr/5/tessdata ``` #### Docker run Add the following to your existing docker run command ```bash --v /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata +-v /location/of/trainingData:/usr/share/tesseract-ocr/5/tessdata ``` #### Non-Docker diff --git a/Jenkinsfile b/Jenkinsfile index dce948a4d..d3cbe2c82 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -22,12 +22,24 @@ pipeline { def appVersion = sh(returnStdout: true, script: './gradlew printVersion -q').trim() def image = "frooodle/s-pdf:$appVersion" withCredentials([string(credentialsId: 'docker_hub_access_token', variable: 'DOCKER_HUB_ACCESS_TOKEN')]) { - sh "docker login --username frooodle --password $DOCKER_HUB_ACCESS_TOKEN" + sh "docker login --username frooodle --password $DOCKER_HUB_ACCESS_TOKEN" sh "docker push $image" } } } - - } - } + } + stage('Helm Push') { + steps { + script { + //TODO: Read chartVersion from Chart.yaml + def chartVersion = '1.0.0' + withCredentials([string(credentialsId: 'docker_hub_access_token', variable: 'DOCKER_HUB_ACCESS_TOKEN')]) { + sh "docker login --username frooodle --password $DOCKER_HUB_ACCESS_TOKEN" + sh "helm package chart/stirling-pdf" + sh "helm push stirling-pdf-chart-1.0.0.tgz oci://registry-1.docker.io/frooodle" + } + } + } + } + } } \ No newline at end of file diff --git a/LocalRunGuide.md b/LocalRunGuide.md index 8293aee17..782e8b695 100644 --- a/LocalRunGuide.md +++ b/LocalRunGuide.md @@ -1,5 +1,5 @@ -To run the application without Docker, you will need to manually install all dependencies and build the necessary components. +To run the application without Docker/Podman, you will need to manually install all dependencies and build the necessary components. Note that some dependencies might not be available in the standard repositories of all Linux distributions, and may require additional steps to install. @@ -8,6 +8,8 @@ The following guide assumes you have a basic understanding of using a command li It should work on most Linux distributions and MacOS. For Windows, you might need to use Windows Subsystem for Linux (WSL) for certain steps. The amount of dependencies is to actually reduce overall size, ie installing LibreOffice sub components rather than full LibreOffice package. +You could theoretically use a Distrobox/Toolbox, if your Distribution has old or not all Packages. But you might just as well use the Docker Container then. + ### Step 1: Prerequisites Install the following software, if not already installed: @@ -137,7 +139,7 @@ Easiest is to use the langpacks provided by your repositories. Skip the other st Manual: 1. Download the desired language pack(s) by selecting the `.traineddata` file(s) for the language(s) you need. -2. Place the `.traineddata` files in the Tesseract tessdata directory: `/usr/share/tesseract-ocr/4.00/tessdata` +2. Place the `.traineddata` files in the Tesseract tessdata directory: `/usr/share/tesseract-ocr/5/tessdata` 3. Please view [OCRmyPDF install guide](https://ocrmypdf.readthedocs.io/en/latest/installation.html) for more info. **IMPORTANT:** DO NOT REMOVE EXISTING `eng.traineddata`, IT'S REQUIRED. diff --git a/README.md b/README.md index b6830a4f1..ff362f5af 100644 --- a/README.md +++ b/README.md @@ -19,54 +19,74 @@ Any file which has been downloaded by the user will have already been deleted fr Feel free to request any features or bug fixes either in github issues or our [Discord](https://discord.gg/Cn8pWhQRxZ) - ![stirling-home](images/stirling-home.png) ## Features -- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages. -- Split PDFs into multiple files at specified page numbers or extract all pages as individual files. -- Merge multiple PDFs together into a single resultant file -- Convert PDFs to and from images -- Reorganize PDF pages into different orders. -- Add/Generate signatures -- Format PDFs into a multi-paged page -- Scale page contents size by set % -- Adjust Contrast -- Crop PDF -- Auto Split PDF (With physically scanned page dividers) -- Flatten PDFs -- Repair PDFs -- Detect and remove blank pages -- Compare 2 PDFs and show differences in text -- Add images to PDFs -- Rotating PDFs in 90 degree increments. -- Compressing PDFs to decrease their filesize. (Using OCRMyPDF) -- Add and remove passwords -- Set PDF Permissions -- Add watermark(s) -- Convert Any common file to PDF (using LibreOffice) -- Convert PDF to Word/Powerpoint/Others (using LibreOffice) -- Convert HTML to PDF -- URL to PDF -- Extract images from PDF -- Extract images from Scans -- Add page numbers -- Auto rename file by detecting PDF header text -- OCR on PDF (Using OCRMyPDF) -- PDF/A conversion (Using OCRMyPDF) -- Edit metadata - Dark mode support. - Custom download options (see [here](https://github.com/Frooodle/Stirling-PDF/blob/main/images/settings.png) for example) - Parallel file processing and downloads - API for integration with external scripts +- Optional Login and Authentication support (see [here](https://github.com/Frooodle/Stirling-PDF/tree/main#login-authentication) for documentation) -For a overview of the tasks and the technology each uses please view [groups.md](https://github.com/Frooodle/Stirling-PDF/blob/main/Groups.md) + +## **PDF Features** + +### **Page Operations** +- View and modify PDFs - View multi page PDFs with custom viewing sorting and searching. Plus on page edit features like annotate, draw and adding text and images. (Using PDF.js with Joxit and Liberation.Liberation fonts) +- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages. +- Merge multiple PDFs together into a single resultant file. +- Split PDFs into multiple files at specified page numbers or extract all pages as individual files. +- Reorganize PDF pages into different orders. +- Rotate PDFs in 90-degree increments. +- Remove pages. +- Multi-page layout (Format PDFs into a multi-paged page). +- Scale page contents size by set %. +- Adjust Contrast. +- Crop PDF. +- Auto Split PDF (With physically scanned page dividers). +- Extract page(s). +- Convert PDF to a single page. + +### **Conversion Operations** +- Convert PDFs to and from images. +- Convert any common file to PDF (using LibreOffice). +- Convert PDF to Word/Powerpoint/Others (using LibreOffice). +- Convert HTML to PDF. +- URL to PDF. +- Markdown to PDF. + +### **Security & Permissions** +- Add and remove passwords. +- Change/set PDF Permissions. +- Add watermark(s). +- Certify/sign PDFs. +- Sanitize PDFs. +- Auto-redact text. + +### **Other Operations** +- Add/Generate/Write signatures. +- Repair PDFs. +- Detect and remove blank pages. +- Compare 2 PDFs and show differences in text. +- Add images to PDFs. +- Compress PDFs to decrease their filesize (Using OCRMyPDF). +- Extract images from PDF. +- Extract images from Scans. +- Add page numbers. +- Auto rename file by detecting PDF header text. +- OCR on PDF (Using OCRMyPDF). +- PDF/A conversion (Using OCRMyPDF). +- Edit metadata. +- Flatten PDFs. +- Get all information on a PDF to view or export as JSON. + + +For a overview of the tasks and the technology each uses please view [Endpoint-groups.md](https://github.com/Frooodle/Stirling-PDF/blob/main/Endpoint-groups.md) Hosted instance/demo of the app can be seen [here](https://pdf.adminforge.de/) hosted by the team at adminforge.de ## Technologies used - Spring Boot + Thymeleaf - PDFBox -- IText7 - [LibreOffice](https://www.libreoffice.org/discover/libreoffice/) for advanced conversions - [OcrMyPdf](https://github.com/ocrmypdf/OCRmyPDF) - HTML, CSS, JavaScript @@ -79,7 +99,7 @@ Hosted instance/demo of the app can be seen [here](https://pdf.adminforge.de/) h ### Locally Please view https://github.com/Frooodle/Stirling-PDF/blob/main/LocalRunGuide.md -### Docker +### Docker / Podman https://hub.docker.com/r/frooodle/s-pdf Stirling PDF has 3 different versions, a Full version, Lite, and ultra-Lite. Depending on the types of features you use you may want a smaller image to save on space. @@ -93,8 +113,10 @@ Docker Run ``` docker run -d \ -p 8080:8080 \ - -v /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata \ + -v /location/of/trainingData:/usr/share/tesseract-ocr/5/tessdata \ -v /location/of/extraConfigs:/configs \ + -v /location/of/logs:/logs \ + -e DOCKER_ENABLE_SECURITY=false \ --name stirling-pdf \ frooodle/s-pdf:latest @@ -112,19 +134,23 @@ services: ports: - '8080:8080' volumes: - - /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata #Required for extra OCR languages + - /location/of/trainingData:/usr/share/tesseract-ocr/5/tessdata #Required for extra OCR languages - /location/of/extraConfigs:/configs # - /location/of/customFiles:/customFiles/ - +# - /location/of/logs:/logs/ + environment: + - DOCKER_ENABLE_SECURITY=false ``` +Note: Podman is CLI-compatible with Docker, so simply replace "docker" with "podman". ## Enable OCR/Compression feature Please view https://github.com/Frooodle/Stirling-PDF/blob/main/HowToUseOCR.md ## Want to add your own language? -Stirling PDF currently supports 16! +Stirling PDF currently supports 20! - English (English) (en_GB) +- English (US) (en_US) - Arabic (العربية) (ar_AR) - German (Deutsch) (de_DE) - French (Français) (fr_FR) @@ -140,6 +166,9 @@ Stirling PDF currently supports 16! - Russian (Русский) (ru_RU) - Basque (Euskara) (eu_ES) - Japanese (日本語) (ja_JP) +- Dutch (Nederlands) (nl_NL) +- Greek (el_GR) +- Turkish (Türkçe) (tr_TR) If you want to add your own language to Stirling-PDF please refer https://github.com/Frooodle/Stirling-PDF/blob/main/HowToAddNewLanguage.md @@ -174,9 +203,6 @@ The Current list of settings is ``` security: enableLogin: false # set to 'true' to enable login - initialLogin: - username: 'username' # Specify the initial username for first boot (e.g. 'admin') - password: 'password' # Specify the initial password for first boot (e.g. 'password123') csrfDisabled: true system: @@ -194,14 +220,14 @@ endpoints: groupsToRemove: [] # List groups to disable (e.g. ['LibreOffice']) metrics: - enabled: true # 'true' to enable Info APIs (`/api/*`) endpoints, 'false' to disable + enabled: true # 'true' to enable Info APIs endpoints (view http://localhost:8080/swagger-ui/index.html#/API to learn more), 'false' to disable ``` ### Extra notes -- Endpoints. Currently, the endpoints ENDPOINTS_TO_REMOVE and GROUPS_TO_REMOVE can include comma separate lists of endpoints and groups to disable as example ENDPOINTS_TO_REMOVE=img-to-pdf,remove-pages would disable both image-to-pdf and remove pages, 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/Frooodle/Stirling-PDF/blob/main/groups.md) +- Endpoints. Currently, the endpoints ENDPOINTS_TO_REMOVE and GROUPS_TO_REMOVE can include comma separate lists of endpoints and groups to disable as example ENDPOINTS_TO_REMOVE=img-to-pdf,remove-pages would disable both image-to-pdf and remove pages, 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/Frooodle/Stirling-PDF/blob/main/Endpoint-groups.md) - customStaticFilePath. Customise static files such as the app logo by placing files in the /customFiles/static/ directory. An example of customising app logo is placing a /customFiles/static/favicon.svg to override current SVG. This can be used to change any images/icons/css/fonts/js etc in Stirling-PDF ### Environment only parameters -- ``SYSTEM_ROOTURIPATH`` ie set to ``pdf-app`` to Set the application's root URI tp ``localhost:8080/pdf-app`` +- ``SYSTEM_ROOTURIPATH`` ie set to ``/pdf-app`` to Set the application's root URI to ``localhost:8080/pdf-app`` - ``SYSTEM_CONNECTIONTIMEOUTMINUTES`` to set custom connection timeout values - ``DOCKER_ENABLE_SECURITY`` to tell docker to download security jar (required as true for auth login) @@ -211,14 +237,16 @@ For those wanting to use Stirling-PDFs backend API to link with their own custom ## Login authentication +![stirling-login](images/login-light.png) ### Prerequisites: - User must have the folder ./configs volumed within docker so that it is retained during updates. - Docker uses must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables. -- Now the initial user must be generated. Navigate to your settings.yaml and configure your security settings along with the username and password (only required on the first boot to create the initial user, ignored after.). Alternatively, you can set these via the environment variables ``SECURITY_ENABLELOGIN : true`` ``SECURITY_INITIALLOGIN_USERNAME: username`` ``SECURITY_INITIALLOGIN_PASSWORD: password`` +- Then either enable login via the settings.yml file or via setting ``SECURITY_ENABLE_LOGIN`` to ``true`` +- Now the initial user will be generated with username ``admin`` and password ``stirling``. On login you will be forced to change the password to a new one. You can also use the environment variables ``SECURITY_INITIALLOGIN_USERNAME`` and ``SECURITY_INITIALLOGIN_PASSWORD`` to set your own straight away (Recommended to remove them after user creation). Once the above has been done, on restart, a new stirling-pdf-DB.mv.db will show if everything worked. -When you login to Stirling PDF you will be redirected to /login page to login with those credentials. After login everything should function as normal +When you login to Stirling PDF you will be redirected to /login page to login with those default credentials. After login everything should function as normal To access your account settings go to Account settings in the settings cog menu (top right in navbar) This Account settings menu is also where you find your API key. @@ -233,11 +261,13 @@ For API usage you must provide a header with 'X-API-Key' and the associated API - Progress bar/Tracking - Full custom logic pipelines to combine multiple operations together. - Folder support with auto scanning to perform operations on -- Redact text (Via UI) +- Redact text (Via UI not just automated way) - Add Forms -- Annotations - Multi page layout (Stich PDF pages together) support x rows y columns and custom page sizing - Fill forms mannual and automatic ### Q2: Why is my application downloading .htm files? -This is a issue caused commonly by your NGINX congifuration. 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. +This is a issue caused commonly 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. + +### Q3: Why is my download timing out +NGINX has timeout values by default so if you are running Stirling-PDF behind NGINX you may need to set a timeout value such as adding the config ``proxy_read_timeout 3600;`` diff --git a/Version-groups.md b/Version-groups.md index 900205796..4fcbfe5ac 100644 --- a/Version-groups.md +++ b/Version-groups.md @@ -19,6 +19,7 @@ add-image | ✔️ | ✔️ | ✔️ add-watermark | ✔️ | ✔️ | ✔️ adjust-contrast | ✔️ | ✔️ | ✔️ auto-split-pdf | ✔️ | ✔️ | ✔️ +auto-redact | ✔️ | ✔️ | ✔️ auto-rename | ✔️ | ✔️ | ✔️ cert-sign | ✔️ | ✔️ | ✔️ crop | ✔️ | ✔️ | ✔️ @@ -33,7 +34,9 @@ img-to-pdf | ✔️ | ✔️ | ✔️ markdown-to-pdf | ✔️ | ✔️ | ✔️ merge-pdfs | ✔️ | ✔️ | ✔️ multi-page-layout | ✔️ | ✔️ | ✔️ +overlay-pdf | ✔️ | ✔️ | ✔️ pdf-organizer | ✔️ | ✔️ | ✔️ +pdf-to-csv | ✔️ | ✔️ | ✔️ pdf-to-img | ✔️ | ✔️ | ✔️ pdf-to-single-page | ✔️ | ✔️ | ✔️ remove-pages | ✔️ | ✔️ | ✔️ @@ -43,6 +46,8 @@ sanitize-pdf | ✔️ | ✔️ | ✔️ scale-pages | ✔️ | ✔️ | ✔️ sign | ✔️ | ✔️ | ✔️ show-javascript | ✔️ | ✔️ | ✔️ +split-by-size-or-count | ✔️ | ✔️ | ✔️ +split-pdf-by-sections | ✔️ | ✔️ | ✔️ split-pdfs | ✔️ | ✔️ | ✔️ file-to-pdf | | ✔️ | ✔️ pdf-to-html | | ✔️ | ✔️ diff --git a/build.gradle b/build.gradle index c8cb5d3a0..66de762ea 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,14 @@ plugins { id 'java' id 'org.springframework.boot' version '3.1.2' - id 'io.spring.dependency-management' version '1.1.2' - id 'org.springdoc.openapi-gradle-plugin' version '1.6.0' - id "io.swagger.swaggerhub" version "1.2.0" - id 'edu.sc.seis.launch4j' version '3.0.3' + id 'io.spring.dependency-management' version '1.1.3' + id 'org.springdoc.openapi-gradle-plugin' version '1.8.0' + id "io.swagger.swaggerhub" version "1.3.2" + id 'edu.sc.seis.launch4j' version '3.0.5' } group = 'stirling.software' -version = '0.13.1' +version = '0.17.2' sourceCompatibility = '17' repositories { @@ -32,9 +32,8 @@ sourceSets { } } - openApi { - apiDocsUrl = "http://localhost:8080/v3/api-docs" + apiDocsUrl = "http://localhost:8080/v1/api-docs" outputDir = file("$projectDir") outputFileName = "SwaggerDoc.json" } @@ -46,15 +45,15 @@ launch4j { outfile="Stirling-PDF.exe" headerType="console" jarTask = tasks.bootJar - + errTitle="Encountered error, Do you have Java 17?" - downloadUrl="https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe" + downloadUrl="https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe" variables=["BROWSER_OPEN=true"] jreMinVersion="17" - + mutexName="Stirling-PDF" windowTitle="Stirling-PDF" - + messagesStartupError="An error occurred while starting Stirling-PDF" //messagesJreNotFoundError="This application requires a Java Runtime Environment, Please download Java 17." messagesJreVersionError="You are running the wrong version of Java, Please download Java 17." @@ -63,44 +62,79 @@ launch4j { } dependencies { - implementation 'org.yaml:snakeyaml:2.1' - implementation 'org.springframework.boot:spring-boot-starter-web:3.1.2' - implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.1.2' + //security updates + implementation 'ch.qos.logback:logback-classic:1.4.14' + implementation 'ch.qos.logback:logback-core:1.4.14' + implementation 'org.springframework:spring-webmvc:6.0.15' - if (System.getenv('DOCKER_ENABLE_SECURITY') != 'false') { - implementation 'org.springframework.boot:spring-boot-starter-security:3.1.2' + implementation 'org.yaml:snakeyaml:2.1' + implementation 'org.springframework.boot:spring-boot-starter-web:3.1.6' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.1.6' + + if (System.getenv('DOCKER_ENABLE_SECURITY') != 'false') { + implementation 'org.springframework.boot:spring-boot-starter-security:3.1.6' implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.2.RELEASE' implementation "org.springframework.boot:spring-boot-starter-data-jpa" - implementation "com.h2database:h2" + implementation "com.h2database:h2" } - - testImplementation 'org.springframework.boot:spring-boot-starter-test:3.1.2' - - - // https://mvnrepository.com/artifact/org.apache.pdfbox/jbig2-imageio - implementation group: 'org.apache.pdfbox', name: 'jbig2-imageio', version: '3.0.4' - implementation 'commons-io:commons-io:2.13.0' - - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0' + testImplementation 'org.springframework.boot:spring-boot-starter-test:3.1.6' + + // Batik + implementation 'org.apache.xmlgraphics:batik-all:1.17' + + // TwelveMonkeys + implementation 'com.twelvemonkeys.imageio:imageio-batik:3.10.1' + implementation 'com.twelvemonkeys.imageio:imageio-bmp:3.10.1' + // implementation 'com.twelvemonkeys.imageio:imageio-hdr:3.10.1' + // implementation 'com.twelvemonkeys.imageio:imageio-icns:3.10.1' + // implementation 'com.twelvemonkeys.imageio:imageio-iff:3.10.1' + implementation 'com.twelvemonkeys.imageio:imageio-jpeg:3.10.1' + // implementation 'com.twelvemonkeys.imageio:imageio-pcx:3.10.1' + // implementation 'com.twelvemonkeys.imageio:imageio-pict:3.10.1' + // implementation 'com.twelvemonkeys.imageio:imageio-pnm:3.10.1' + // implementation 'com.twelvemonkeys.imageio:imageio-psd:3.10.1' + // implementation 'com.twelvemonkeys.imageio:imageio-sgi:3.10.1' + // implementation 'com.twelvemonkeys.imageio:imageio-tga:3.10.1' + // implementation 'com.twelvemonkeys.imageio:imageio-thumbsdb:3.10.1' + implementation 'com.twelvemonkeys.imageio:imageio-tiff:3.10.1' + implementation 'com.twelvemonkeys.imageio:imageio-webp:3.10.1' + // implementation 'com.twelvemonkeys.imageio:imageio-xwd:3.10.1' + + implementation 'commons-io:commons-io:2.15.1' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' + + //general PDF + + // https://mvnrepository.com/artifact/com.opencsv/opencsv + implementation ('com.opencsv:opencsv:5.7.1') { + exclude group: 'commons-logging', module: 'commons-logging' + } - //general PDF - implementation 'org.apache.pdfbox:pdfbox:2.0.29' - implementation 'org.bouncycastle:bcprov-jdk15on:1.70' - implementation 'org.bouncycastle:bcpkix-jdk15on:1.70' - implementation 'com.itextpdf:itext7-core:7.2.5' + implementation ('org.apache.pdfbox:pdfbox:2.0.29'){ + exclude group: 'commons-logging', module: 'commons-logging' + } + + implementation ('org.apache.pdfbox:xmpbox:2.0.29'){ + exclude group: 'commons-logging', module: 'commons-logging' + } + + implementation 'org.bouncycastle:bcprov-jdk18on:1.77' + implementation 'org.bouncycastle:bcpkix-jdk18on:1.77' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'io.micrometer:micrometer-core' - implementation group: 'com.google.zxing', name: 'core', version: '3.5.1' + implementation group: 'com.google.zxing', name: 'core', version: '3.5.2' // https://mvnrepository.com/artifact/org.commonmark/commonmark - implementation 'org.commonmark:commonmark:0.21.0' + implementation 'org.commonmark:commonmark:0.21.0' // https://mvnrepository.com/artifact/com.github.vladimir-bukhtoyarov/bucket4j-core - implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0' - - developmentOnly("org.springframework.boot:spring-boot-devtools") + implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0' + developmentOnly("org.springframework.boot:spring-boot-devtools") + compileOnly 'org.projectlombok:lombok:1.18.30' + annotationProcessor 'org.projectlombok:lombok:1.18.28' } + task writeVersion { def propsFile = file('src/main/resources/version.properties') def props = new Properties() @@ -126,7 +160,7 @@ jar { attributes 'Implementation-Title': 'Stirling-PDF', 'Implementation-Version': project.version } - + } tasks.named('test') { diff --git a/chart/stirling-pdf/Chart.yaml b/chart/stirling-pdf/Chart.yaml new file mode 100644 index 000000000..a69894a08 --- /dev/null +++ b/chart/stirling-pdf/Chart.yaml @@ -0,0 +1,15 @@ +apiVersion: v2 +appVersion: 0.14.2 +description: locally hosted web application that allows you to perform various operations on PDF files +home: https://github.com/Frooodle/Stirling-PDF +keywords: +- stirling-pdf +- helm +- charts repo +maintainers: +- name: Frooodle + url: https://github.com/Frooodle/Stirling-PDF +name: stirling-pdf-chart +sources: +- https://github.com/Frooodle/Stirling-PDF +version: 1.0.0 diff --git a/chart/stirling-pdf/templates/NOTES.txt b/chart/stirling-pdf/templates/NOTES.txt new file mode 100644 index 000000000..3b432f00e --- /dev/null +++ b/chart/stirling-pdf/templates/NOTES.txt @@ -0,0 +1,30 @@ +** 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 new file mode 100644 index 000000000..4c8626044 --- /dev/null +++ b/chart/stirling-pdf/templates/_helpers.tpl @@ -0,0 +1,129 @@ +{{/* +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 new file mode 100644 index 000000000..290a56c91 --- /dev/null +++ b/chart/stirling-pdf/templates/deployment.yaml @@ -0,0 +1,129 @@ +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 }} +{{- if .Values.envs }} + env: +{{ toYaml .Values.envs | indent 8 }} +{{- end }} +{{- if .Values.extraArgs }} + args: +{{ toYaml .Values.extraArgs | indent 8 }} +{{- end }} + ports: + - name: http + containerPort: 8080 + livenessProbe: + httpGet: + path: / + port: http +{{ toYaml .Values.probes.livenessHttpGetConfig | indent 12 }} +{{ toYaml .Values.probes.liveness | indent 10 }} + readinessProbe: + httpGet: + path: / + 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 new file mode 100644 index 000000000..c09fef68e --- /dev/null +++ b/chart/stirling-pdf/templates/ingress.yaml @@ -0,0 +1,85 @@ +{{- 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 new file mode 100644 index 000000000..aa99c6a9e --- /dev/null +++ b/chart/stirling-pdf/templates/pv.yaml @@ -0,0 +1,16 @@ +{{- 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 new file mode 100644 index 000000000..f7a217228 --- /dev/null +++ b/chart/stirling-pdf/templates/pvc.yaml @@ -0,0 +1,27 @@ +{{- 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 new file mode 100644 index 000000000..a529c3f2a --- /dev/null +++ b/chart/stirling-pdf/templates/service.yaml @@ -0,0 +1,48 @@ +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 new file mode 100644 index 000000000..7156e4a4f --- /dev/null +++ b/chart/stirling-pdf/templates/serviceaccount.yaml @@ -0,0 +1,13 @@ +{{- 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 new file mode 100644 index 000000000..ca0d31bba --- /dev/null +++ b/chart/stirling-pdf/templates/servicemonitor.yaml @@ -0,0 +1,31 @@ +{{- 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 new file mode 100644 index 000000000..3c4ca8884 --- /dev/null +++ b/chart/stirling-pdf/values.yaml @@ -0,0 +1,239 @@ +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 + +envs: [] +# - name: PP_HOME_NAME +# value: "Stirling PDF" +# - name: APP_HOME_DESCRIPTION +# value: "Your locally hosted one-stop-shop for all your PDF needs." +# - name: APP_NAVBAR_NAME +# value: "Stirling PDF" +# - name: ALLOW_GOOGLE_VISIBILITY +# value: "true" +# - name: APP_ROOT_PATH +# value: "/" +# - 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/scripts/detect-blank-pages.py b/scripts/detect-blank-pages.py index 6712dc121..474c27352 100644 --- a/scripts/detect-blank-pages.py +++ b/scripts/detect-blank-pages.py @@ -1,5 +1,4 @@ import cv2 -import numpy as np import sys import argparse diff --git a/scripts/download-security-jar.sh b/scripts/download-security-jar.sh new file mode 100644 index 000000000..c0b710ad9 --- /dev/null +++ b/scripts/download-security-jar.sh @@ -0,0 +1,19 @@ +echo "Running Stirling PDF with DOCKER_ENABLE_SECURITY=${DOCKER_ENABLE_SECURITY} and VERSION_TAG=${VERSION_TAG}" +# Check for DOCKER_ENABLE_SECURITY and download the appropriate JAR if required +if [ "$DOCKER_ENABLE_SECURITY" = "true" ] && [ "$VERSION_TAG" != "alpha" ]; then + if [ ! -f app-security.jar ]; then + echo "Trying to download from: https://github.com/Frooodle/Stirling-PDF/releases/download/v$VERSION_TAG/Stirling-PDF-with-login.jar" + curl -L -o app-security.jar https://github.com/Frooodle/Stirling-PDF/releases/download/v$VERSION_TAG/Stirling-PDF-with-login.jar + + # If the first download attempt failed, try with the 'v' prefix + if [ $? -ne 0 ]; then + echo "Trying to download from: https://github.com/Frooodle/Stirling-PDF/releases/download/$VERSION_TAG/Stirling-PDF-with-login.jar" + curl -L -o app-security.jar https://github.com/Frooodle/Stirling-PDF/releases/download/$VERSION_TAG/Stirling-PDF-with-login.jar + fi + + if [ $? -eq 0 ]; then # checks if curl was successful + rm -f app.jar + ln -s app-security.jar app.jar + fi + fi +fi \ No newline at end of file diff --git a/scripts/init-without-ocr.sh b/scripts/init-without-ocr.sh new file mode 100644 index 000000000..2aced6a4a --- /dev/null +++ b/scripts/init-without-ocr.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +/scripts/download-security-jar.sh + +# Run the main command +exec "$@" \ No newline at end of file diff --git a/scripts/init.sh b/scripts/init.sh index e65914c4c..8f1f96db4 100644 --- a/scripts/init.sh +++ b/scripts/init.sh @@ -3,7 +3,11 @@ # Copy the original tesseract-ocr files to the volume directory without overwriting existing files echo "Copying original files without overwriting existing files" mkdir -p /usr/share/tesseract-ocr -cp -rn /usr/share/tesseract-ocr-original/* /usr/share/tesseract-ocr +cp -rn /usr/share/tesseract-ocr-original/* /usr/share/tesseract-ocr + +if [ -d /usr/share/tesseract-ocr/4.00/tessdata ]; then + cp -r /usr/share/tesseract-ocr/4.00/tessdata/* /usr/share/tesseract-ocr/5/tessdata/ || true; +fi # Check if TESSERACT_LANGS environment variable is set and is not empty if [[ -n "$TESSERACT_LANGS" ]]; then @@ -16,25 +20,7 @@ if [[ -n "$TESSERACT_LANGS" ]]; then done fi -# Check for DOCKER_ENABLE_SECURITY and download the appropriate JAR if required -if [ "$DOCKER_ENABLE_SECURITY" = "true" ] && [ "$VERSION_TAG" != "alpha" ]; then - if [ ! -f app-security.jar ]; then - echo "Trying to download from: https://github.com/Frooodle/Stirling-PDF/releases/download/v$VERSION_TAG/Stirling-PDF-with-login.jar" - curl -L -o app-security.jar https://github.com/Frooodle/Stirling-PDF/releases/download/v$VERSION_TAG/Stirling-PDF-with-login.jar - - # If the first download attempt failed, try with the 'v' prefix - if [ $? -ne 0 ]; then - echo "Trying to download from: https://github.com/Frooodle/Stirling-PDF/releases/download/$VERSION_TAG/Stirling-PDF-with-login.jar" - curl -L -o app-security.jar https://github.com/Frooodle/Stirling-PDF/releases/download/$VERSION_TAG/Stirling-PDF-with-login.jar - fi - - if [ $? -eq 0 ]; then # checks if curl was successful - rm -f app.jar - ln -s app-security.jar app.jar - fi - fi -fi - +/scripts/download-security-jar.sh # Run the main command exec "$@" \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/SPdfApplication.java b/src/main/java/stirling/software/SPDF/SPdfApplication.java index c26999d07..5dd7fed36 100644 --- a/src/main/java/stirling/software/SPDF/SPdfApplication.java +++ b/src/main/java/stirling/software/SPDF/SPdfApplication.java @@ -9,7 +9,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.env.Environment; - import jakarta.annotation.PostConstruct; import stirling.software.SPDF.config.ConfigInitializer; import stirling.software.SPDF.utils.GeneralUtils; @@ -66,7 +65,6 @@ public class SPdfApplication { GeneralUtils.createDir("customFiles/static/"); GeneralUtils.createDir("customFiles/templates/"); - GeneralUtils.createDir("config"); diff --git a/src/main/java/stirling/software/SPDF/config/AppConfig.java b/src/main/java/stirling/software/SPDF/config/AppConfig.java index c2b265380..4d02f974f 100644 --- a/src/main/java/stirling/software/SPDF/config/AppConfig.java +++ b/src/main/java/stirling/software/SPDF/config/AppConfig.java @@ -8,12 +8,12 @@ import stirling.software.SPDF.model.ApplicationProperties; @Configuration public class AppConfig { + @Autowired ApplicationProperties applicationProperties; @Bean(name = "loginEnabled") public boolean loginEnabled() { - System.out.println(applicationProperties.toString()); return applicationProperties.getSecurity().getEnableLogin(); } diff --git a/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java b/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java index dec375673..894d50d83 100644 --- a/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java +++ b/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java @@ -13,7 +13,7 @@ import jakarta.servlet.http.HttpServletResponse; public class CleanUrlInterceptor implements HandlerInterceptor { - private static final List ALLOWED_PARAMS = Arrays.asList("lang", "endpoint", "endpoints", "logout", "error", "file"); + private static final List ALLOWED_PARAMS = Arrays.asList("lang", "endpoint", "endpoints", "logout", "error", "file", "messageType"); @Override @@ -22,7 +22,6 @@ public class CleanUrlInterceptor implements HandlerInterceptor { String queryString = request.getQueryString(); if (queryString != null && !queryString.isEmpty()) { String requestURI = request.getRequestURI(); - Map parameters = new HashMap<>(); // Keep only the allowed parameters @@ -32,7 +31,6 @@ public class CleanUrlInterceptor implements HandlerInterceptor { if (keyValue.length != 2) { continue; } - if (ALLOWED_PARAMS.contains(keyValue[0])) { parameters.put(keyValue[0], keyValue[1]); } diff --git a/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java b/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java index 49f0c2f7f..862f5718b 100644 --- a/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java +++ b/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java @@ -1,24 +1,34 @@ package stirling.software.SPDF.config; + +import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; public class ConfigInitializer implements ApplicationContextInitializer { - @Override - public void initialize(ConfigurableApplicationContext applicationContext) { - try { - ensureConfigExists(); - } catch (IOException e) { - throw new RuntimeException("Failed to initialize application configuration", e); - } - } + @Override + public void initialize(ConfigurableApplicationContext applicationContext) { + try { + ensureConfigExists(); + } catch (IOException e) { + throw new RuntimeException("Failed to initialize application configuration", e); + } + } public void ensureConfigExists() throws IOException { // Define the path to the external config directory @@ -37,7 +47,83 @@ public class ConfigInitializer implements ApplicationContextInitializer templateLines; + try (InputStream in = getClass().getClassLoader().getResourceAsStream("settings.yml.template")) { + templateLines = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)).lines() + .collect(Collectors.toList()); + } + + mergeYamlFiles(templateLines, destPath, destPath); } } -} + public void mergeYamlFiles(List templateLines, Path userFilePath, Path outputPath) throws IOException { + List userLines = Files.readAllLines(userFilePath); + List mergedLines = new ArrayList<>(); + boolean insideAutoGenerated = false; + boolean beforeFirstKey = true; + + Function isCommented = line -> line.trim().startsWith("#"); + Function extractKey = line -> { + String[] parts = line.split(":"); + return parts.length > 0 ? parts[0].trim().replace("#", "").trim() : ""; + }; + + Set userKeys = userLines.stream().map(extractKey).collect(Collectors.toSet()); + + for (String line : templateLines) { + String key = extractKey.apply(line); + + if (line.trim().equalsIgnoreCase("AutomaticallyGenerated:")) { + insideAutoGenerated = true; + mergedLines.add(line); + continue; + } else if (insideAutoGenerated && line.trim().isEmpty()) { + insideAutoGenerated = false; + mergedLines.add(line); + continue; + } + + if (beforeFirstKey && (isCommented.apply(line) || line.trim().isEmpty())) { + // Handle top comments and empty lines before the first key. + mergedLines.add(line); + continue; + } + + if (!key.isEmpty()) + beforeFirstKey = false; + + if (userKeys.contains(key)) { + // If user has any version (commented or uncommented) of this key, skip the + // template line + Optional userValue = userLines.stream() + .filter(l -> extractKey.apply(l).equalsIgnoreCase(key) && !isCommented.apply(l)).findFirst(); + if (userValue.isPresent()) + mergedLines.add(userValue.get()); + continue; + } + + if (isCommented.apply(line) || line.trim().isEmpty() || !userKeys.contains(key)) { + mergedLines.add(line); // If line is commented, empty or key not present in user's file, retain the + // template line + continue; + } + } + + // Add any additional uncommented user lines that are not present in the + // template + for (String userLine : userLines) { + String userKey = extractKey.apply(userLine); + boolean isPresentInTemplate = templateLines.stream().map(extractKey) + .anyMatch(templateKey -> templateKey.equalsIgnoreCase(userKey)); + if (!isPresentInTemplate && !isCommented.apply(userLine)) { + mergedLines.add(userLine); + } + } + + Files.write(outputPath, mergedLines, StandardCharsets.UTF_8); + } + +} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java index ee17e0b9a..ebba98155 100644 --- a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java @@ -81,6 +81,10 @@ public class EndpointConfiguration { addEndpointToGroup("PageOps", "auto-split-pdf"); addEndpointToGroup("PageOps", "extract-page"); addEndpointToGroup("PageOps", "pdf-to-single-page"); + addEndpointToGroup("PageOps", "split-by-size-or-count"); + addEndpointToGroup("PageOps", "overlay-pdf"); + addEndpointToGroup("PageOps", "split-pdf-by-sections"); + // Adding endpoints to "Convert" group addEndpointToGroup("Convert", "pdf-to-img"); @@ -96,6 +100,8 @@ public class EndpointConfiguration { addEndpointToGroup("Convert", "html-to-pdf"); addEndpointToGroup("Convert", "url-to-pdf"); addEndpointToGroup("Convert", "markdown-to-pdf"); + addEndpointToGroup("Convert", "pdf-to-csv"); + // Adding endpoints to "Security" group addEndpointToGroup("Security", "add-password"); @@ -104,6 +110,7 @@ public class EndpointConfiguration { addEndpointToGroup("Security", "add-watermark"); addEndpointToGroup("Security", "cert-sign"); addEndpointToGroup("Security", "sanitize-pdf"); + addEndpointToGroup("Security", "auto-redact"); // Adding endpoints to "Other" group @@ -117,6 +124,7 @@ public class EndpointConfiguration { addEndpointToGroup("Other", "flatten"); addEndpointToGroup("Other", "repair"); addEndpointToGroup("Other", "remove-blanks"); + addEndpointToGroup("Other", "remove-annotations"); addEndpointToGroup("Other", "compare"); addEndpointToGroup("Other", "add-page-numbers"); addEndpointToGroup("Other", "auto-rename"); @@ -197,6 +205,11 @@ public class EndpointConfiguration { addEndpointToGroup("Java", "pdf-to-single-page"); addEndpointToGroup("Java", "markdown-to-pdf"); addEndpointToGroup("Java", "show-javascript"); + addEndpointToGroup("Java", "auto-redact"); + addEndpointToGroup("Java", "pdf-to-csv"); + addEndpointToGroup("Java", "split-by-size-or-count"); + addEndpointToGroup("Java", "overlay-pdf"); + addEndpointToGroup("Java", "split-pdf-by-sections"); //Javascript addEndpointToGroup("Javascript", "pdf-organizer"); diff --git a/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java b/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java index 573873daa..2583277e3 100644 --- a/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java +++ b/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java @@ -1,9 +1,5 @@ package stirling.software.SPDF.config; -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -18,14 +14,9 @@ public class OpenApiConfig { public OpenAPI customOpenAPI() { String version = getClass().getPackage().getImplementationVersion(); if (version == null) { - Properties props = new Properties(); - try (InputStream input = getClass().getClassLoader().getResourceAsStream("version.properties")) { - props.load(input); - version = props.getProperty("version"); - } catch (IOException ex) { - ex.printStackTrace(); + version = "1.0.0"; // default version if all else fails - } + } return new OpenAPI().components(new Components()).info( diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java index 9f52a5e31..f286f149e 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java @@ -16,6 +16,8 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { + String ip = request.getRemoteAddr(); + logger.error("Failed login attempt from IP: " + ip); if (exception.getClass().isAssignableFrom(BadCredentialsException.class)) { setDefaultFailureUrl("/login?error=badcredentials"); } else if (exception.getClass().isAssignableFrom(LockedException.class)) { diff --git a/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java b/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java new file mode 100644 index 000000000..8e612464d --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java @@ -0,0 +1,53 @@ +package stirling.software.SPDF.config.security; + +import java.io.IOException; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import stirling.software.SPDF.model.User; + +@Component +public class FirstLoginFilter extends OncePerRequestFilter { + + @Autowired + @Lazy + private UserService userService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + String method = request.getMethod(); + String requestURI = request.getRequestURI(); + // Check if the request is for static resources + boolean isStaticResource = requestURI.startsWith("/css/") + || requestURI.startsWith("/js/") + || requestURI.startsWith("/images/") + || requestURI.startsWith("/public/") + || requestURI.endsWith(".svg"); + + // If it's a static resource, just continue the filter chain and skip the logic below + if (isStaticResource) { + filterChain.doFilter(request, response); + return; + } + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null && authentication.isAuthenticated()) { + Optional user = userService.findByUsername(authentication.getName()); + if ("GET".equalsIgnoreCase(method) && user.isPresent() && user.get().isFirstLogin() && !"/change-creds".equals(requestURI)) { + response.sendRedirect("/change-creds"); + return; + } + } + filterChain.doFilter(request, response); + } +} diff --git a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java index 08b939b7f..842375d82 100644 --- a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java +++ b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java @@ -11,28 +11,34 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import jakarta.annotation.PostConstruct; -import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.Role; - @Component public class InitialSecuritySetup { @Autowired private UserService userService; + @Autowired ApplicationProperties applicationProperties; @PostConstruct public void init() { if (!userService.hasUsers()) { + + String initialUsername = applicationProperties.getSecurity().getInitialLogin().getUsername(); String initialPassword = applicationProperties.getSecurity().getInitialLogin().getPassword(); if (initialUsername != null && initialPassword != null) { userService.saveUser(initialUsername, initialPassword, Role.ADMIN.getRoleId()); + } else { + initialUsername = "admin"; + initialPassword = "stirling"; + userService.saveUser(initialUsername, initialPassword, Role.ADMIN.getRoleId(), true); } - + + } } diff --git a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java index 2e0b83457..dfe782acb 100644 --- a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java @@ -1,15 +1,14 @@ package stirling.software.SPDF.config.security; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; - import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; @@ -42,6 +41,9 @@ public class SecurityConfiguration { @Autowired private UserAuthenticationFilter userAuthenticationFilter; + @Autowired + private FirstLoginFilter firstLoginFilter; + @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.addFilterBefore(userAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); @@ -49,6 +51,7 @@ public class SecurityConfiguration { if(loginEnabledValue) { http.csrf(csrf -> csrf.disable()); + http.addFilterAfter(firstLoginFilter, UsernamePasswordAuthenticationFilter.class); http .formLogin(formLogin -> formLogin .loginPage("/login") diff --git a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java index 1d5aab880..eca7f70eb 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java @@ -44,7 +44,7 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { filterChain.doFilter(request, response); return; } - + String requestURI = request.getRequestURI(); Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); // Check for API key in the request headers if no authentication exists @@ -74,13 +74,14 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { // If we still don't have any authentication, deny the request if (authentication == null || !authentication.isAuthenticated()) { String method = request.getMethod(); - if ("GET".equalsIgnoreCase(method)) { + if ("GET".equalsIgnoreCase(method) && !"/login".equals(requestURI)) { response.sendRedirect("/login"); // redirect to the login page return; + } else { + response.setStatus(HttpStatus.UNAUTHORIZED.value()); + response.getWriter().write("Authentication required. Please provide a X-API-KEY in request header.\nThis is found in Settings -> Account Settings -> API Key\nAlternativly you can disable authentication if this is unexpected"); + return; } - response.setStatus(HttpStatus.UNAUTHORIZED.value()); - response.getWriter().write("Authentication required. Please provide a X-API-KEY in request header.\nThis is found in Settings -> Account Settings -> API Key\nAlternativly you can disable authentication if this is unexpected"); - return; } filterChain.doFilter(request, response); 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 19bf007b0..46c5aeff9 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserService.java @@ -113,12 +113,23 @@ public class UserService { userRepository.save(user); } + public void saveUser(String username, String password, String role, boolean firstLogin) { + User user = new User(); + user.setUsername(username); + user.setPassword(passwordEncoder.encode(password)); + user.addAuthority(new Authority(role, user)); + user.setEnabled(true); + user.setFirstLogin(firstLogin); + userRepository.save(user); + } + public void saveUser(String username, String password, String role) { User user = new User(); user.setUsername(username); user.setPassword(passwordEncoder.encode(password)); user.addAuthority(new Authority(role, user)); user.setEnabled(true); + user.setFirstLogin(false); userRepository.save(user); } @@ -168,6 +179,12 @@ public class UserService { userRepository.save(user); } + public void changeFirstUse(User user, boolean firstUse) { + user.setFirstLogin(firstUse); + userRepository.save(user); + } + + public boolean isPasswordCorrect(User user, String currentPassword) { return passwordEncoder.matches(currentPassword, user.getPassword()); } diff --git a/src/main/java/stirling/software/SPDF/controller/api/CropController.java b/src/main/java/stirling/software/SPDF/controller/api/CropController.java index 090787289..d2723cce8 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/CropController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/CropController.java @@ -4,75 +4,83 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import org.apache.pdfbox.multipdf.LayerUtility; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import com.itextpdf.kernel.geom.PageSize; -import com.itextpdf.kernel.pdf.PdfDocument; -import com.itextpdf.kernel.pdf.PdfPage; -import com.itextpdf.kernel.pdf.PdfReader; -import com.itextpdf.kernel.pdf.PdfWriter; -import com.itextpdf.kernel.pdf.canvas.PdfCanvas; -import com.itextpdf.kernel.pdf.xobject.PdfFormXObject; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.general.CropPdfForm; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") public class CropController { - private static final Logger logger = LoggerFactory.getLogger(CropController.class); - + private static final Logger logger = LoggerFactory.getLogger(CropController.class); @PostMapping(value = "/crop", consumes = "multipart/form-data") @Operation(summary = "Crops a PDF document", description = "This operation takes an input PDF file and crops it according to the given coordinates. Input:PDF Output:PDF Type:SISO") - public ResponseEntity cropPdf( - @Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file, - @Parameter(description = "The x-coordinate of the top-left corner of the crop area", required = true, schema = @Schema(type = "number")) @RequestParam("x") float x, - @Parameter(description = "The y-coordinate of the top-left corner of the crop area", required = true, schema = @Schema(type = "number")) @RequestParam("y") float y, - @Parameter(description = "The width of the crop area", required = true, schema = @Schema(type = "number")) @RequestParam("width") float width, - @Parameter(description = "The height of the crop area", required = true, schema = @Schema(type = "number")) @RequestParam("height") float height) throws IOException { - byte[] bytes = file.getBytes(); - System.out.println("x=" + x + ", " + "y=" + y + ", " + "width=" + width + ", " +"height=" + height ); - PdfReader reader = new PdfReader(new ByteArrayInputStream(bytes)); - PdfDocument pdfDoc = new PdfDocument(reader); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PdfWriter writer = new PdfWriter(baos); - PdfDocument outputPdf = new PdfDocument(writer); - - int totalPages = pdfDoc.getNumberOfPages(); - - for (int i = 1; i <= totalPages; i++) { - PdfPage page = outputPdf.addNewPage(new PageSize(width, height)); - PdfCanvas pdfCanvas = new PdfCanvas(page); + public ResponseEntity cropPdf(@ModelAttribute CropPdfForm form) + throws IOException { - PdfFormXObject formXObject = pdfDoc.getPage(i).copyAsFormXObject(outputPdf); - // Save the graphics state, apply the transformations, add the object, and then - // restore the graphics state - pdfCanvas.saveState(); - pdfCanvas.rectangle(x, y, width, height); - pdfCanvas.clip(); - pdfCanvas.addXObject(formXObject, -x, -y); - pdfCanvas.restoreState(); - } - + - outputPdf.close(); - byte[] pdfContent = baos.toByteArray(); - pdfDoc.close(); - return WebResponseUtils.bytesToWebResponse(pdfContent, - file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_cropped.pdf"); +PDDocument sourceDocument = PDDocument.load(new ByteArrayInputStream(form.getFileInput().getBytes())); + +PDDocument newDocument = new PDDocument(); + +int totalPages = sourceDocument.getNumberOfPages(); + +LayerUtility layerUtility = new LayerUtility(newDocument); + +for (int i = 0; i < totalPages; i++) { + PDPage sourcePage = sourceDocument.getPage(i); + + // Create a new page with the size of the source page + PDPage newPage = new PDPage(sourcePage.getMediaBox()); + newDocument.addPage(newPage); + PDPageContentStream contentStream = new PDPageContentStream(newDocument, newPage); + + // Import the source page as a form XObject + PDFormXObject formXObject = layerUtility.importPageAsForm(sourceDocument, i); + + contentStream.saveGraphicsState(); + + // Define the crop area + contentStream.addRect(form.getX(), form.getY(), form.getWidth(), form.getHeight()); + contentStream.clip(); + + // Draw the entire formXObject + contentStream.drawForm(formXObject); + + contentStream.restoreGraphicsState(); + + contentStream.close(); + + // Now, set the new page's media box to the cropped size + newPage.setMediaBox(new PDRectangle(form.getX(), form.getY(), form.getWidth(), form.getHeight())); +} + +ByteArrayOutputStream baos = new ByteArrayOutputStream(); +newDocument.save(baos); +newDocument.close(); +sourceDocument.close(); + +byte[] pdfContent = baos.toByteArray(); +return WebResponseUtils.bytesToWebResponse(pdfContent, form.getFileInput().getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_cropped.pdf"); } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java index e51db38e8..7db00a314 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java @@ -1,125 +1,114 @@ package stirling.software.SPDF.controller.api; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; - +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.pdfbox.io.MemoryUsageSetting; +import org.apache.pdfbox.multipdf.PDFMergerUtility; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.general.MergePdfsRequest; import stirling.software.SPDF.utils.WebResponseUtils; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + @RestController +@RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") public class MergeController { private static final Logger logger = LoggerFactory.getLogger(MergeController.class); -private PDDocument mergeDocuments(List documents) throws IOException { - PDDocument mergedDoc = new PDDocument(); - for (PDDocument doc : documents) { - for (PDPage page : doc.getPages()) { - mergedDoc.addPage(page); - } - } - return mergedDoc; -} - -private Comparator getSortComparator(String sortType) { - switch (sortType) { - case "byFileName": - return Comparator.comparing(MultipartFile::getOriginalFilename); - case "byDateModified": - return (file1, file2) -> { - try { - BasicFileAttributes attr1 = Files.readAttributes(Paths.get(file1.getOriginalFilename()), BasicFileAttributes.class); - BasicFileAttributes attr2 = Files.readAttributes(Paths.get(file2.getOriginalFilename()), BasicFileAttributes.class); - return attr1.lastModifiedTime().compareTo(attr2.lastModifiedTime()); - } catch (IOException e) { - return 0; // If there's an error, treat them as equal - } - }; - case "byDateCreated": - return (file1, file2) -> { - try { - BasicFileAttributes attr1 = Files.readAttributes(Paths.get(file1.getOriginalFilename()), BasicFileAttributes.class); - BasicFileAttributes attr2 = Files.readAttributes(Paths.get(file2.getOriginalFilename()), BasicFileAttributes.class); - return attr1.creationTime().compareTo(attr2.creationTime()); - } catch (IOException e) { - return 0; // If there's an error, treat them as equal - } - }; - case "byPDFTitle": - return (file1, file2) -> { - try (PDDocument doc1 = PDDocument.load(file1.getInputStream()); - PDDocument doc2 = PDDocument.load(file2.getInputStream())) { - String title1 = doc1.getDocumentInformation().getTitle(); - String title2 = doc2.getDocumentInformation().getTitle(); - return title1.compareTo(title2); - } catch (IOException e) { - return 0; - } - }; - case "orderProvided": - default: - return (file1, file2) -> 0; // Default is the order provided - } -} - -@PostMapping(consumes = "multipart/form-data", value = "/merge-pdfs") -@Operation(summary = "Merge multiple PDF files into one", - description = "This endpoint merges multiple PDF files into a single PDF file. The merged file will contain all pages from the input files in the order they were provided. Input:PDF Output:PDF Type:MISO") -public ResponseEntity mergePdfs( - @RequestPart(required = true, value = "fileInput") MultipartFile[] files, - @RequestParam(value = "sortType", defaultValue = "orderProvided") - @Parameter(schema = @Schema(description = "The type of sorting to be applied on the input files before merging.", - allowableValues = { - "orderProvided", - "byFileName", - "byDateModified", - "byDateCreated", - "byPDFTitle" - })) - String sortType) throws IOException { - - Arrays.sort(files, getSortComparator(sortType)); - - List documents = new ArrayList<>(); - for (MultipartFile file : files) { - try (InputStream is = file.getInputStream()) { - documents.add(PDDocument.load(is)); - } - } - - try (PDDocument mergedDoc = mergeDocuments(documents)) { - ResponseEntity response = WebResponseUtils.pdfDocToWebResponse(mergedDoc, files[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_merged.pdf"); - return response; - } finally { + private PDDocument mergeDocuments(List documents) throws IOException { + PDDocument mergedDoc = new PDDocument(); for (PDDocument doc : documents) { - if (doc != null) { - doc.close(); + for (PDPage page : doc.getPages()) { + mergedDoc.addPage(page); } } + return mergedDoc; + } + + private Comparator getSortComparator(String sortType) { + switch (sortType) { + case "byFileName": + return Comparator.comparing(MultipartFile::getOriginalFilename); + case "byDateModified": + return (file1, file2) -> { + try { + BasicFileAttributes attr1 = Files.readAttributes(Paths.get(file1.getOriginalFilename()), BasicFileAttributes.class); + BasicFileAttributes attr2 = Files.readAttributes(Paths.get(file2.getOriginalFilename()), BasicFileAttributes.class); + return attr1.lastModifiedTime().compareTo(attr2.lastModifiedTime()); + } catch (IOException e) { + return 0; // If there's an error, treat them as equal + } + }; + case "byDateCreated": + return (file1, file2) -> { + try { + BasicFileAttributes attr1 = Files.readAttributes(Paths.get(file1.getOriginalFilename()), BasicFileAttributes.class); + BasicFileAttributes attr2 = Files.readAttributes(Paths.get(file2.getOriginalFilename()), BasicFileAttributes.class); + return attr1.creationTime().compareTo(attr2.creationTime()); + } catch (IOException e) { + return 0; // If there's an error, treat them as equal + } + }; + case "byPDFTitle": + return (file1, file2) -> { + try (PDDocument doc1 = PDDocument.load(file1.getInputStream()); + PDDocument doc2 = PDDocument.load(file2.getInputStream())) { + String title1 = doc1.getDocumentInformation().getTitle(); + String title2 = doc2.getDocumentInformation().getTitle(); + return title1.compareTo(title2); + } catch (IOException e) { + return 0; + } + }; + case "orderProvided": + default: + return (file1, file2) -> 0; // Default is the order provided + } + } + + @PostMapping(consumes = "multipart/form-data", value = "/merge-pdfs") + @Operation(summary = "Merge multiple PDF files into one", + description = "This endpoint merges multiple PDF files into a single PDF file. The merged file will contain all pages from the input files in the order they were provided. Input:PDF Output:PDF Type:MISO") + public ResponseEntity mergePdfs(@ModelAttribute MergePdfsRequest form) throws IOException { + try { + MultipartFile[] files = form.getFileInput(); + Arrays.sort(files, getSortComparator(form.getSortType())); + + PDFMergerUtility mergedDoc = new PDFMergerUtility(); + ByteArrayOutputStream docOutputstream = new ByteArrayOutputStream(); + + for (MultipartFile file : files) { + mergedDoc.addSource(new ByteArrayInputStream(file.getBytes())); + } + + mergedDoc.setDestinationFileName(files[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_merged.pdf"); + mergedDoc.setDestinationStream(docOutputstream); + mergedDoc.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly()); + + return WebResponseUtils.bytesToWebResponse(docOutputstream.toByteArray(), mergedDoc.getDestinationFileName()); + } catch (Exception ex) { + logger.error("Error in merge pdf process", ex); + throw ex; + } } } - -} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java index 9bf0a3d75..ebe81ffd5 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -1,101 +1,124 @@ package stirling.software.SPDF.controller.api; -import java.io.ByteArrayInputStream; + +import java.awt.Color; import java.io.ByteArrayOutputStream; import java.io.IOException; +import org.apache.pdfbox.multipdf.LayerUtility; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; +import org.apache.pdfbox.util.Matrix; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.itextpdf.kernel.geom.PageSize; -import com.itextpdf.kernel.geom.Rectangle; -import com.itextpdf.kernel.pdf.PdfDocument; -import com.itextpdf.kernel.pdf.PdfPage; -import com.itextpdf.kernel.pdf.PdfReader; -import com.itextpdf.kernel.pdf.PdfWriter; -import com.itextpdf.kernel.pdf.canvas.PdfCanvas; -import com.itextpdf.kernel.pdf.xobject.PdfFormXObject; - import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.general.MergeMultiplePagesRequest; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") public class MultiPageLayoutController { private static final Logger logger = LoggerFactory.getLogger(MultiPageLayoutController.class); @PostMapping(value = "/multi-page-layout", consumes = "multipart/form-data") - @Operation(summary = "Merge multiple pages of a PDF document into a single page", description = "This operation takes an input PDF file and the number of pages to merge into a single sheet in the output PDF file. Input:PDF Output:PDF Type:SISO") - public ResponseEntity mergeMultiplePagesIntoOne( - @Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file, - @Parameter(description = "The number of pages to fit onto a single sheet in the output PDF. Acceptable values are 2, 3, 4, 9, 16.", required = true, schema = @Schema(type = "integer", allowableValues = { - "2", "3", "4", "9", "16" })) @RequestParam("pagesPerSheet") int pagesPerSheet) - throws IOException { + @Operation( + summary = "Merge multiple pages of a PDF document into a single page", + description = "This operation takes an input PDF file and the number of pages to merge into a single sheet in the output PDF file. Input:PDF Output:PDF Type:SISO" + ) + public ResponseEntity mergeMultiplePagesIntoOne(@ModelAttribute MergeMultiplePagesRequest request) + throws IOException { - if (pagesPerSheet != 2 && pagesPerSheet != 3 - && pagesPerSheet != (int) Math.sqrt(pagesPerSheet) * Math.sqrt(pagesPerSheet)) { - throw new IllegalArgumentException("pagesPerSheet must be 2, 3 or a perfect square"); - } + int pagesPerSheet = request.getPagesPerSheet(); + MultipartFile file = request.getFileInput(); + boolean addBorder = request.isAddBorder(); + + if (pagesPerSheet != 2 && pagesPerSheet != 3 && pagesPerSheet != (int) Math.sqrt(pagesPerSheet) * Math.sqrt(pagesPerSheet)) { + throw new IllegalArgumentException("pagesPerSheet must be 2, 3 or a perfect square"); + } - int cols = pagesPerSheet == 2 || pagesPerSheet == 3 ? pagesPerSheet : (int) Math.sqrt(pagesPerSheet); - int rows = pagesPerSheet == 2 || pagesPerSheet == 3 ? 1 : (int) Math.sqrt(pagesPerSheet); + int cols = pagesPerSheet == 2 || pagesPerSheet == 3 ? pagesPerSheet : (int) Math.sqrt(pagesPerSheet); + int rows = pagesPerSheet == 2 || pagesPerSheet == 3 ? 1 : (int) Math.sqrt(pagesPerSheet); - byte[] bytes = file.getBytes(); - PdfReader reader = new PdfReader(new ByteArrayInputStream(bytes)); - PdfDocument pdfDoc = new PdfDocument(reader); + PDDocument sourceDocument = PDDocument.load(file.getInputStream()); + PDDocument newDocument = new PDDocument(); + PDPage newPage = new PDPage(PDRectangle.A4); + newDocument.addPage(newPage); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PdfWriter writer = new PdfWriter(baos); - PdfDocument outputPdf = new PdfDocument(writer); - PageSize pageSize = new PageSize(PageSize.A4.rotate()); + int totalPages = sourceDocument.getNumberOfPages(); + float cellWidth = newPage.getMediaBox().getWidth() / cols; + float cellHeight = newPage.getMediaBox().getHeight() / rows; - int totalPages = pdfDoc.getNumberOfPages(); - float cellWidth = pageSize.getWidth() / cols; - float cellHeight = pageSize.getHeight() / rows; + PDPageContentStream contentStream = new PDPageContentStream(newDocument, newPage, PDPageContentStream.AppendMode.APPEND, true, true); + LayerUtility layerUtility = new LayerUtility(newDocument); - for (int i = 1; i <= totalPages; i += pagesPerSheet) { - PdfPage page = outputPdf.addNewPage(pageSize); - PdfCanvas pdfCanvas = new PdfCanvas(page); + float borderThickness = 1.5f; // Specify border thickness as required + contentStream.setLineWidth(borderThickness); + contentStream.setStrokingColor(Color.BLACK); + + for (int i = 0; i < totalPages; i++) { + if (i != 0 && i % pagesPerSheet == 0) { + // Close the current content stream and create a new page and content stream + contentStream.close(); + newPage = new PDPage(PDRectangle.A4); + newDocument.addPage(newPage); + contentStream = new PDPageContentStream(newDocument, newPage, PDPageContentStream.AppendMode.APPEND, true, true); + } - for (int row = 0; row < rows; row++) { - for (int col = 0; col < cols; col++) { - int index = i + row * cols + col; - if (index <= totalPages) { - // Get the page and calculate scaling factors - Rectangle rect = pdfDoc.getPage(index).getPageSize(); - float scaleWidth = cellWidth / rect.getWidth(); - float scaleHeight = cellHeight / rect.getHeight(); - float scale = Math.min(scaleWidth, scaleHeight); + PDPage sourcePage = sourceDocument.getPage(i); + PDRectangle rect = sourcePage.getMediaBox(); + float scaleWidth = cellWidth / rect.getWidth(); + float scaleHeight = cellHeight / rect.getHeight(); + float scale = Math.min(scaleWidth, scaleHeight); - PdfFormXObject formXObject = pdfDoc.getPage(index).copyAsFormXObject(outputPdf); - float x = col * cellWidth + (cellWidth - rect.getWidth() * scale) / 2; - float y = (rows - 1 - row) * cellHeight + (cellHeight - rect.getHeight() * scale) / 2; + int adjustedPageIndex = i % pagesPerSheet; // This will reset the index for every new page + int rowIndex = adjustedPageIndex / cols; + int colIndex = adjustedPageIndex % cols; - // Save the graphics state, apply the transformations, add the object, and then - // restore the graphics state - pdfCanvas.saveState(); - pdfCanvas.concatMatrix(scale, 0, 0, scale, x, y); - pdfCanvas.addXObject(formXObject, 0, 0); - pdfCanvas.restoreState(); - } - } - } - } + float x = colIndex * cellWidth + (cellWidth - rect.getWidth() * scale) / 2; + float y = newPage.getMediaBox().getHeight() - ((rowIndex + 1) * cellHeight - (cellHeight - rect.getHeight() * scale) / 2); - outputPdf.close(); - byte[] pdfContent = baos.toByteArray(); - pdfDoc.close(); - - return WebResponseUtils.bytesToWebResponse(pdfContent, file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_layoutChanged.pdf"); + contentStream.saveGraphicsState(); + contentStream.transform(Matrix.getTranslateInstance(x, y)); + contentStream.transform(Matrix.getScaleInstance(scale, scale)); + + PDFormXObject formXObject = layerUtility.importPageAsForm(sourceDocument, i); + contentStream.drawForm(formXObject); + + contentStream.restoreGraphicsState(); + + if(addBorder) { + // Draw border around each page + float borderX = colIndex * cellWidth; + float borderY = newPage.getMediaBox().getHeight() - (rowIndex + 1) * cellHeight; + contentStream.addRect(borderX, borderY, cellWidth, cellHeight); + contentStream.stroke(); + } + } + + + contentStream.close(); // Close the final content stream + sourceDocument.close(); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + newDocument.save(baos); + newDocument.close(); + + byte[] result = baos.toByteArray(); + return WebResponseUtils.bytesToWebResponse(result, file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_layoutChanged.pdf"); } + } diff --git a/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java b/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java new file mode 100644 index 000000000..1dc81e9f0 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java @@ -0,0 +1,125 @@ +package stirling.software.SPDF.controller.api; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.pdfbox.multipdf.Overlay; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.general.OverlayPdfsRequest; +import stirling.software.SPDF.utils.GeneralUtils; +import stirling.software.SPDF.utils.WebResponseUtils; +@RestController +@RequestMapping("/api/v1/general") +@Tag(name = "General", description = "General APIs") +public class PdfOverlayController { + + @PostMapping(value = "/overlay-pdfs", consumes = "multipart/form-data") + @Operation(summary = "Overlay PDF files in various modes", description = "Overlay PDF files onto a base PDF with different modes: Sequential, Interleaved, or Fixed Repeat. Input:PDF Output:PDF Type:MIMO") + public ResponseEntity overlayPdfs(@ModelAttribute OverlayPdfsRequest request) throws IOException { + MultipartFile baseFile = request.getFileInput(); + int overlayPos = request.getOverlayPosition(); + + MultipartFile[] overlayFiles = request.getOverlayFiles(); + File[] overlayPdfFiles = new File[overlayFiles.length]; + try{ + for (int i = 0; i < overlayFiles.length; i++) { + overlayPdfFiles[i] = GeneralUtils.multipartToFile(overlayFiles[i]); + } + + String mode = request.getOverlayMode(); // "SequentialOverlay", "InterleavedOverlay", "FixedRepeatOverlay" + int[] counts = request.getCounts(); // Used for FixedRepeatOverlay mode + + try (PDDocument basePdf = PDDocument.load(baseFile.getInputStream()); + Overlay overlay = new Overlay()) { + Map overlayGuide = prepareOverlayGuide(basePdf.getNumberOfPages(), overlayPdfFiles, mode, counts); + + overlay.setInputPDF(basePdf); + if(overlayPos == 0) { + overlay.setOverlayPosition(Overlay.Position.FOREGROUND); + } else { + overlay.setOverlayPosition(Overlay.Position.BACKGROUND); + } + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + overlay.overlay(overlayGuide).save(outputStream); + byte[] data = outputStream.toByteArray(); + String outputFilename = baseFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_overlayed.pdf"; // Remove file extension and append .pdf + + return WebResponseUtils.bytesToWebResponse(data, outputFilename, MediaType.APPLICATION_PDF); + } + } finally { + for (File overlayPdfFile : overlayPdfFiles) { + if (overlayPdfFile != null) overlayPdfFile.delete(); + } + } + } + + private Map prepareOverlayGuide(int basePageCount, File[] overlayFiles, String mode, int[] counts) throws IOException { + Map overlayGuide = new HashMap<>(); + switch (mode) { + case "SequentialOverlay": + sequentialOverlay(overlayGuide, overlayFiles, basePageCount); + break; + case "InterleavedOverlay": + interleavedOverlay(overlayGuide, overlayFiles, basePageCount); + break; + case "FixedRepeatOverlay": + fixedRepeatOverlay(overlayGuide, overlayFiles, counts, basePageCount); + break; + default: + throw new IllegalArgumentException("Invalid overlay mode"); + } + return overlayGuide; + } + + private void sequentialOverlay(Map overlayGuide, File[] overlayFiles, int basePageCount) throws IOException { + if (overlayFiles.length != 1 || basePageCount != PDDocument.load(overlayFiles[0]).getNumberOfPages()) { + throw new IllegalArgumentException("Overlay file count and base page count must match for sequential overlay."); + } + + File overlayFile = overlayFiles[0]; + try (PDDocument overlayPdf = PDDocument.load(overlayFile)) { + for (int i = 1; i <= overlayPdf.getNumberOfPages(); i++) { + if (i > basePageCount) break; + overlayGuide.put(i, overlayFile.getAbsolutePath()); + } + } + } + + + private void interleavedOverlay(Map overlayGuide, File[] overlayFiles, int basePageCount) throws IOException { + for (int i = 0; i < basePageCount; i++) { + File overlayFile = overlayFiles[i % overlayFiles.length]; + overlayGuide.put(i + 1, overlayFile.getAbsolutePath()); + } + } + + private void fixedRepeatOverlay(Map overlayGuide, File[] overlayFiles, int[] counts, int basePageCount) throws IOException { + if (overlayFiles.length != counts.length) { + throw new IllegalArgumentException("Counts array length must match the number of overlay files"); + } + int currentPage = 1; + for (int i = 0; i < overlayFiles.length; i++) { + File overlayFile = overlayFiles[i]; + int repeatCount = counts[i]; + for (int j = 0; j < repeatCount; j++) { + if (currentPage > basePageCount) break; + overlayGuide.put(currentPage++, overlayFile.getAbsolutePath()); + } + } + } +} + +// Additional classes like OverlayPdfsRequest, WebResponseUtils, etc. are assumed to be defined elsewhere. diff --git a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java index d9cb26864..b20bd99b1 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java @@ -9,20 +9,21 @@ import org.apache.pdfbox.pdmodel.PDPage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.SortTypes; +import stirling.software.SPDF.model.api.PDFWithPageNums; +import stirling.software.SPDF.model.api.general.RearrangePagesRequest; import stirling.software.SPDF.utils.GeneralUtils; import stirling.software.SPDF.utils.WebResponseUtils; - @RestController +@RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") public class RearrangePagesPDFController { @@ -30,11 +31,12 @@ public class RearrangePagesPDFController { @PostMapping(consumes = "multipart/form-data", value = "/remove-pages") @Operation(summary = "Remove pages from a PDF file", description = "This endpoint removes specified pages from a given PDF file. Users can provide a comma-separated list of page numbers or ranges to delete. Input:PDF Output:PDF Type:SISO") - public ResponseEntity deletePages( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file from which pages will be removed") MultipartFile pdfFile, - @RequestParam("pagesToDelete") @Parameter(description = "Comma-separated list of pages or page ranges to delete, e.g., '1,3,5-8'") String pagesToDelete) + public ResponseEntity deletePages(@ModelAttribute PDFWithPageNums request ) throws IOException { + MultipartFile pdfFile = request.getFileInput(); + String pagesToDelete = request.getPageNumbers(); + PDDocument document = PDDocument.load(pdfFile.getBytes()); // Split the page order string into an array of page numbers or range of numbers @@ -51,9 +53,7 @@ public class RearrangePagesPDFController { } - private enum CustomMode { - REVERSE_ORDER, DUPLEX_SORT, BOOKLET_SORT, ODD_EVEN_SPLIT, REMOVE_FIRST, REMOVE_LAST, REMOVE_FIRST_AND_LAST, - } + private List removeFirst(int totalPages) { if (totalPages <= 1) @@ -114,6 +114,18 @@ public class RearrangePagesPDFController { return newPageOrder; } + private List sideStitchBooklet(int totalPages) { + List newPageOrder = new ArrayList<>(); + for (int i = 0; i < (totalPages + 3) / 4; i++) { + int begin = i * 4; + newPageOrder.add(Math.min(begin + 3, totalPages - 1)); + newPageOrder.add(Math.min(begin, totalPages - 1)); + newPageOrder.add(Math.min(begin + 1, totalPages - 1)); + newPageOrder.add(Math.min(begin + 2, totalPages - 1)); + } + return newPageOrder; + } + private List oddEvenSplit(int totalPages) { List newPageOrder = new ArrayList<>(); for (int i = 1; i <= totalPages; i += 2) { @@ -125,9 +137,9 @@ public class RearrangePagesPDFController { return newPageOrder; } - private List processCustomMode(String customMode, int totalPages) { + private List processSortTypes(String sortTypes, int totalPages) { try { - CustomMode mode = CustomMode.valueOf(customMode.toUpperCase()); + SortTypes mode = SortTypes.valueOf(sortTypes.toUpperCase()); switch (mode) { case REVERSE_ORDER: return reverseOrder(totalPages); @@ -135,6 +147,8 @@ public class RearrangePagesPDFController { return duplexSort(totalPages); case BOOKLET_SORT: return bookletSort(totalPages); + case SIDE_STITCH_BOOKLET_SORT: + return sideStitchBooklet(totalPages); case ODD_EVEN_SPLIT: return oddEvenSplit(totalPages); case REMOVE_FIRST: @@ -154,16 +168,10 @@ public class RearrangePagesPDFController { @PostMapping(consumes = "multipart/form-data", value = "/rearrange-pages") @Operation(summary = "Rearrange pages in a PDF file", description = "This endpoint rearranges pages in a given PDF file based on the specified page order or custom mode. Users can provide a page order as a comma-separated list of page numbers or page ranges, or a custom mode. Input:PDF Output:PDF") - public ResponseEntity rearrangePages( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to rearrange pages") MultipartFile pdfFile, - @RequestParam(required = false, value = "pageOrder") @Parameter(description = "The new page order as a comma-separated list of page numbers, page ranges (e.g., '1,3,5-7'), or functions in the format 'an+b' where 'a' is the multiplier of the page number 'n', and 'b' is a constant (e.g., '2n+1', '3n', '6n-5')") String pageOrder, - @RequestParam(required = false, value = "customMode") @Parameter(schema = @Schema(implementation = CustomMode.class, description = "The custom mode for page rearrangement. " - + "Valid values are:\n" + "REVERSE_ORDER: Reverses the order of all pages.\n" - + "DUPLEX_SORT: Sorts pages as if all fronts were scanned then all backs in reverse (1, n, 2, n-1, ...). " - + "BOOKLET_SORT: Arranges pages for booklet printing (last, first, second, second last, ...).\n" - + "ODD_EVEN_SPLIT: Splits and arranges pages into odd and even numbered pages.\n" - + "REMOVE_FIRST: Removes the first page.\n" + "REMOVE_LAST: Removes the last page.\n" - + "REMOVE_FIRST_AND_LAST: Removes both the first and the last pages.\n")) String customMode) { + public ResponseEntity rearrangePages(@ModelAttribute RearrangePagesRequest request) throws IOException { + MultipartFile pdfFile = request.getFileInput(); + String pageOrder = request.getPageNumbers(); + String sortType = request.getCustomMode(); try { // Load the input PDF PDDocument document = PDDocument.load(pdfFile.getInputStream()); @@ -171,15 +179,14 @@ public class RearrangePagesPDFController { // Split the page order string into an array of page numbers or range of numbers String[] pageOrderArr = pageOrder != null ? pageOrder.split(",") : new String[0]; int totalPages = document.getNumberOfPages(); - System.out.println("pageOrder=" + pageOrder); - System.out.println("customMode length =" + customMode.length()); List newPageOrder; - if (customMode != null && customMode.length() > 0) { - newPageOrder = processCustomMode(customMode, totalPages); + if (sortType != null && sortType.length() > 0) { + newPageOrder = processSortTypes(sortType, totalPages); } else { newPageOrder = GeneralUtils.parsePageList(pageOrderArr, totalPages); } - + logger.info("newPageOrder = " +newPageOrder); + logger.info("totalPages = " +totalPages); // Create a new list to hold the pages in the new order List newPages = new ArrayList<>(); for (int i = 0; i < newPageOrder.size(); i++) { diff --git a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java b/src/main/java/stirling/software/SPDF/controller/api/RotationController.java index 916d2afb5..ed527549d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RotationController.java @@ -8,18 +8,19 @@ import org.apache.pdfbox.pdmodel.PDPageTree; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.general.RotatePDFRequest; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") public class RotationController { @@ -31,13 +32,9 @@ public class RotationController { description = "This endpoint rotates a given PDF file by a specified angle. The angle must be a multiple of 90. Input:PDF Output:PDF Type:SISO" ) public ResponseEntity rotatePDF( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The PDF file to be rotated", required = true) - MultipartFile pdfFile, - @RequestParam("angle") - @Parameter(description = "The angle by which to rotate the PDF file. This should be a multiple of 90.", example = "90", required = true) - Integer angle) throws IOException { - + @ModelAttribute RotatePDFRequest request) throws IOException { + MultipartFile pdfFile = request.getFileInput(); + Integer angle = request.getAngle(); // Load the PDF document PDDocument document = PDDocument.load(pdfFile.getBytes()); diff --git a/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java b/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java index e3b4434a4..743ea6b13 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java @@ -1,48 +1,32 @@ package stirling.software.SPDF.controller.api; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.Set; +import org.apache.pdfbox.multipdf.LayerUtility; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; +import org.apache.pdfbox.util.Matrix; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.itextpdf.kernel.geom.PageSize; -import com.itextpdf.kernel.geom.Rectangle; -import com.itextpdf.kernel.pdf.PdfDocument; -import com.itextpdf.kernel.pdf.PdfPage; -import com.itextpdf.kernel.pdf.PdfReader; -import com.itextpdf.kernel.pdf.PdfWriter; -import com.itextpdf.kernel.pdf.canvas.PdfCanvas; -import com.itextpdf.kernel.pdf.canvas.parser.EventType; -import com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor; -import com.itextpdf.kernel.pdf.canvas.parser.data.IEventData; -import com.itextpdf.kernel.pdf.canvas.parser.data.TextRenderInfo; -import com.itextpdf.kernel.pdf.canvas.parser.listener.IEventListener; -import com.itextpdf.kernel.pdf.xobject.PdfFormXObject; - -import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.general.ScalePagesRequest; import stirling.software.SPDF.utils.WebResponseUtils; - @RestController +@RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") public class ScalePagesController { @@ -50,194 +34,77 @@ public class ScalePagesController { @PostMapping(value = "/scale-pages", consumes = "multipart/form-data") @Operation(summary = "Change the size of a PDF page/document", description = "This operation takes an input PDF file and the size to scale the pages to in the output PDF file. Input:PDF Output:PDF Type:SISO") - public ResponseEntity scalePages( - @Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file, - @Parameter(description = "The scale of pages in the output PDF. Acceptable values are A0-A10, B0-B9, LETTER, TABLOID, LEDGER, LEGAL, EXECUTIVE.", required = true, schema = @Schema(type = "string", allowableValues = { - "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "B0", "B1", "B2", "B3", "B4", - "B5", "B6", "B7", "B8", "B9", "LETTER", "TABLOID", "LEDGER", "LEGAL", - "EXECUTIVE" })) @RequestParam("pageSize") String targetPageSize, - @Parameter(description = "The scale of the content on the pages of the output PDF. Acceptable values are floats.", required = true, schema = @Schema(type = "integer")) @RequestParam("scaleFactor") float scaleFactor) - throws IOException { + public ResponseEntity scalePages(@ModelAttribute ScalePagesRequest request) throws IOException { + MultipartFile file = request.getFileInput(); + String targetPDRectangle = request.getPageSize(); + float scaleFactor = request.getScaleFactor(); - Map sizeMap = new HashMap<>(); + Map sizeMap = new HashMap<>(); // Add A0 - A10 - sizeMap.put("A0", PageSize.A0); - sizeMap.put("A1", PageSize.A1); - sizeMap.put("A2", PageSize.A2); - sizeMap.put("A3", PageSize.A3); - sizeMap.put("A4", PageSize.A4); - sizeMap.put("A5", PageSize.A5); - sizeMap.put("A6", PageSize.A6); - sizeMap.put("A7", PageSize.A7); - sizeMap.put("A8", PageSize.A8); - sizeMap.put("A9", PageSize.A9); - sizeMap.put("A10", PageSize.A10); - // Add B0 - B9 - sizeMap.put("B0", PageSize.B0); - sizeMap.put("B1", PageSize.B1); - sizeMap.put("B2", PageSize.B2); - sizeMap.put("B3", PageSize.B3); - sizeMap.put("B4", PageSize.B4); - sizeMap.put("B5", PageSize.B5); - sizeMap.put("B6", PageSize.B6); - sizeMap.put("B7", PageSize.B7); - sizeMap.put("B8", PageSize.B8); - sizeMap.put("B9", PageSize.B9); + sizeMap.put("A0", PDRectangle.A0); + sizeMap.put("A1", PDRectangle.A1); + sizeMap.put("A2", PDRectangle.A2); + sizeMap.put("A3", PDRectangle.A3); + sizeMap.put("A4", PDRectangle.A4); + sizeMap.put("A5", PDRectangle.A5); + sizeMap.put("A6", PDRectangle.A6); + // Add other sizes - sizeMap.put("LETTER", PageSize.LETTER); - sizeMap.put("TABLOID", PageSize.TABLOID); - sizeMap.put("LEDGER", PageSize.LEDGER); - sizeMap.put("LEGAL", PageSize.LEGAL); - sizeMap.put("EXECUTIVE", PageSize.EXECUTIVE); + sizeMap.put("LETTER", PDRectangle.LETTER); + sizeMap.put("LEGAL", PDRectangle.LEGAL); - if (!sizeMap.containsKey(targetPageSize)) { + if (!sizeMap.containsKey(targetPDRectangle)) { throw new IllegalArgumentException( - "Invalid pageSize. It must be one of the following: A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10"); + "Invalid PDRectangle. It must be one of the following: A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10"); } - PageSize pageSize = sizeMap.get(targetPageSize); + PDRectangle targetSize = sizeMap.get(targetPDRectangle); - byte[] bytes = file.getBytes(); - PdfReader reader = new PdfReader(new ByteArrayInputStream(bytes)); - PdfDocument pdfDoc = new PdfDocument(reader); + PDDocument sourceDocument = PDDocument.load(file.getBytes()); + PDDocument outputDocument = new PDDocument(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PdfWriter writer = new PdfWriter(baos); - PdfDocument outputPdf = new PdfDocument(writer); + int totalPages = sourceDocument.getNumberOfPages(); + for (int i = 0; i < totalPages; i++) { + PDPage sourcePage = sourceDocument.getPage(i); + PDRectangle sourceSize = sourcePage.getMediaBox(); + + float scaleWidth = targetSize.getWidth() / sourceSize.getWidth(); + float scaleHeight = targetSize.getHeight() / sourceSize.getHeight(); + float scale = Math.min(scaleWidth, scaleHeight) * scaleFactor; + + PDPage newPage = new PDPage(targetSize); + outputDocument.addPage(newPage); + + PDPageContentStream contentStream = new PDPageContentStream(outputDocument, newPage, PDPageContentStream.AppendMode.APPEND, true); + + float x = (targetSize.getWidth() - sourceSize.getWidth() * scale) / 2; + float y = (targetSize.getHeight() - sourceSize.getHeight() * scale) / 2; + + contentStream.saveGraphicsState(); + contentStream.transform(Matrix.getTranslateInstance(x, y)); + contentStream.transform(Matrix.getScaleInstance(scale, scale)); + + LayerUtility layerUtility = new LayerUtility(outputDocument); + PDFormXObject form = layerUtility.importPageAsForm(sourceDocument, i); + contentStream.drawForm(form); - int totalPages = pdfDoc.getNumberOfPages(); + contentStream.restoreGraphicsState(); + contentStream.close(); + } - for (int i = 1; i <= totalPages; i++) { - PdfPage page = outputPdf.addNewPage(pageSize); - PdfCanvas pdfCanvas = new PdfCanvas(page); - // Get the page and calculate scaling factors - Rectangle rect = pdfDoc.getPage(i).getPageSize(); - float scaleWidth = pageSize.getWidth() / rect.getWidth(); - float scaleHeight = pageSize.getHeight() / rect.getHeight(); - float scale = Math.min(scaleWidth, scaleHeight) * scaleFactor; - System.out.println("Scale: " + scale); - PdfFormXObject formXObject = pdfDoc.getPage(i).copyAsFormXObject(outputPdf); - float x = (pageSize.getWidth() - rect.getWidth() * scale) / 2; // Center Page - float y = (pageSize.getHeight() - rect.getHeight() * scale) / 2; - // Save the graphics state, apply the transformations, add the object, and then - // restore the graphics state - pdfCanvas.saveState(); - pdfCanvas.concatMatrix(scale, 0, 0, scale, x, y); - pdfCanvas.addXObject(formXObject, 0, 0); - pdfCanvas.restoreState(); - } - outputPdf.close(); - byte[] pdfContent = baos.toByteArray(); - pdfDoc.close(); - return WebResponseUtils.bytesToWebResponse(pdfContent, + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + outputDocument.save(baos); + outputDocument.close(); + sourceDocument.close(); + + + return WebResponseUtils.bytesToWebResponse(baos.toByteArray(), file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_scaled.pdf"); } - //TODO - @Hidden - @PostMapping(value = "/auto-crop", consumes = "multipart/form-data") - public ResponseEntity cropPdf(@RequestParam("fileInput") MultipartFile file) throws IOException { - byte[] bytes = file.getBytes(); - PdfReader reader = new PdfReader(new ByteArrayInputStream(bytes)); - PdfDocument pdfDoc = new PdfDocument(reader); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PdfWriter writer = new PdfWriter(baos); - PdfDocument outputPdf = new PdfDocument(writer); - - int totalPages = pdfDoc.getNumberOfPages(); - for (int i = 1; i <= totalPages; i++) { - PdfPage page = pdfDoc.getPage(i); - Rectangle originalMediaBox = page.getMediaBox(); - - Rectangle contentBox = determineContentBox(page); - - // Make sure we don't go outside the original media box. - Rectangle intersection = originalMediaBox.getIntersection(contentBox); - page.setCropBox(intersection); - - // Copy page to the new document - outputPdf.addPage(page.copyTo(outputPdf)); - } - - outputPdf.close(); - byte[] pdfContent = baos.toByteArray(); - pdfDoc.close(); - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" - + file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_cropped.pdf\"") - .contentType(MediaType.APPLICATION_PDF).body(pdfContent); - } - - private Rectangle determineContentBox(PdfPage page) { - // Extract the text from the page and find the bounding box. - TextBoundingRectangleFinder finder = new TextBoundingRectangleFinder(); - PdfCanvasProcessor processor = new PdfCanvasProcessor(finder); - processor.processPageContent(page); - return finder.getBoundingBox(); - } - - private static class TextBoundingRectangleFinder implements IEventListener { - private List allTextBoxes = new ArrayList<>(); - - public Rectangle getBoundingBox() { - // Sort the text boxes based on their vertical position - allTextBoxes.sort(Comparator.comparingDouble(Rectangle::getTop)); - - // Consider a box an outlier if its top is more than 1.5 times the IQR above the - // third quartile. - int q1Index = allTextBoxes.size() / 4; - int q3Index = 3 * allTextBoxes.size() / 4; - double iqr = allTextBoxes.get(q3Index).getTop() - allTextBoxes.get(q1Index).getTop(); - double threshold = allTextBoxes.get(q3Index).getTop() + 1.5 * iqr; - - // Initialize boundingBox to the first non-outlier box - int i = 0; - while (i < allTextBoxes.size() && allTextBoxes.get(i).getTop() > threshold) { - i++; - } - if (i == allTextBoxes.size()) { - // If all boxes are outliers, just return the first one - return allTextBoxes.get(0); - } - Rectangle boundingBox = allTextBoxes.get(i); - - // Extend the bounding box to include all non-outlier boxes - for (; i < allTextBoxes.size(); i++) { - Rectangle textBoundingBox = allTextBoxes.get(i); - if (textBoundingBox.getTop() > threshold) { - // This box is an outlier, skip it - continue; - } - float left = Math.min(boundingBox.getLeft(), textBoundingBox.getLeft()); - float bottom = Math.min(boundingBox.getBottom(), textBoundingBox.getBottom()); - float right = Math.max(boundingBox.getRight(), textBoundingBox.getRight()); - float top = Math.max(boundingBox.getTop(), textBoundingBox.getTop()); - - // Add a small padding around the bounding box - float padding = 10; - boundingBox = new Rectangle(left - padding, bottom - padding, right - left + 2 * padding, - top - bottom + 2 * padding); - } - return boundingBox; - } - - @Override - public void eventOccurred(IEventData data, EventType type) { - if (type == EventType.RENDER_TEXT) { - TextRenderInfo renderInfo = (TextRenderInfo) data; - allTextBoxes.add(renderInfo.getBaseline().getBoundingRectangle()); - } - } - - @Override - public Set getSupportedEvents() { - return Collections.singleton(EventType.RENDER_TEXT); - } - } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java index abc201ab7..0651949ec 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java @@ -17,19 +17,19 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.utils.GeneralUtils; +import stirling.software.SPDF.model.api.PDFWithPageNums; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") public class SplitPDFController { @@ -38,35 +38,16 @@ public class SplitPDFController { @PostMapping(consumes = "multipart/form-data", value = "/split-pages") @Operation(summary = "Split a PDF file into separate documents", description = "This endpoint splits a given PDF file into separate documents based on the specified page numbers or ranges. Users can specify pages using individual numbers, ranges, or 'all' for every page. Input:PDF Output:PDF Type:SIMO") - public ResponseEntity splitPdf( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file to be split") - MultipartFile file, - @RequestParam("pages") - @Parameter(description = "The pages to be included in separate documents. Specify individual page numbers (e.g., '1,3,5'), ranges (e.g., '1-3,5-7'), or 'all' for every page.") - String pages) throws IOException { - // parse user input - + public ResponseEntity splitPdf(@ModelAttribute PDFWithPageNums request) throws IOException { + MultipartFile file = request.getFileInput(); + String pages = request.getPageNumbers(); // open the pdf document InputStream inputStream = file.getInputStream(); PDDocument document = PDDocument.load(inputStream); - List pageNumbers = new ArrayList<>(); - pages = pages.replaceAll("\\s+", ""); // remove whitespaces - if (pages.toLowerCase().equals("all")) { - for (int i = 0; i < document.getNumberOfPages(); i++) { - pageNumbers.add(i); - } - } else { - String[] splitPoints = pages.split(","); - for (String splitPoint : splitPoints) { - List orderedPages = GeneralUtils.parsePageList(new String[] {splitPoint}, document.getNumberOfPages()); - pageNumbers.addAll(orderedPages); - } - // Add the last page as a split point - pageNumbers.add(document.getNumberOfPages() - 1); - } - + List pageNumbers = request.getPageNumbersList(document); + if(!pageNumbers.contains(document.getNumberOfPages() - 1)) + pageNumbers.add(document.getNumberOfPages()- 1); logger.info("Splitting PDF into pages: {}", pageNumbers.stream().map(String::valueOf).collect(Collectors.joining(","))); // split the document @@ -127,4 +108,4 @@ public class SplitPDFController { } -} +} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java new file mode 100644 index 000000000..29a2f4268 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java @@ -0,0 +1,135 @@ +package stirling.software.SPDF.controller.api; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.apache.pdfbox.multipdf.LayerUtility; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; +import org.apache.pdfbox.util.Matrix; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.SplitPdfBySectionsRequest; +import stirling.software.SPDF.utils.WebResponseUtils; +@RestController +@RequestMapping("/api/v1/general") +@Tag(name = "Misc", description = "Miscellaneous APIs") +public class SplitPdfBySectionsController { + + + @PostMapping(value = "/split-pdf-by-sections", consumes = "multipart/form-data") + @Operation(summary = "Split PDF pages into smaller sections", description = "Split each page of a PDF into smaller sections based on the user's choice (halves, thirds, quarters, etc.), both vertically and horizontally. Input: PDF, Split Parameters. Output: ZIP containing split documents.") + public ResponseEntity splitPdf(@ModelAttribute SplitPdfBySectionsRequest request) throws Exception { + List splitDocumentsBoas = new ArrayList<>(); + + MultipartFile file = request.getFileInput(); + PDDocument sourceDocument = PDDocument.load(file.getInputStream()); + + // Process the PDF based on split parameters + int horiz = request.getHorizontalDivisions() + 1; + int verti = request.getVerticalDivisions() + 1; + + List splitDocuments = splitPdfPages(sourceDocument, verti, horiz); + for (PDDocument doc : splitDocuments) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + doc.save(baos); + doc.close(); + splitDocumentsBoas.add(baos); + } + + sourceDocument.close(); + + Path zipFile = Files.createTempFile("split_documents", ".zip"); + String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); + byte[] data; + + + + try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { + int pageNum = 1; + for (int i = 0; i < splitDocumentsBoas.size(); i++) { + ByteArrayOutputStream baos = splitDocumentsBoas.get(i); + int sectionNum = (i % (horiz * verti)) + 1; + String fileName = filename + "_" + pageNum + "_" + sectionNum + ".pdf"; + byte[] pdf = baos.toByteArray(); + ZipEntry pdfEntry = new ZipEntry(fileName); + zipOut.putNextEntry(pdfEntry); + zipOut.write(pdf); + zipOut.closeEntry(); + + if (sectionNum == horiz * verti) pageNum++; + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + data = Files.readAllBytes(zipFile); + Files.delete(zipFile); + } + + return WebResponseUtils.bytesToWebResponse(data, filename + "_split.zip", MediaType.APPLICATION_OCTET_STREAM); + } + + public List splitPdfPages(PDDocument document, int horizontalDivisions, int verticalDivisions) throws IOException { + List splitDocuments = new ArrayList<>(); + + for (PDPage originalPage : document.getPages()) { + PDRectangle originalMediaBox = originalPage.getMediaBox(); + float width = originalMediaBox.getWidth(); + float height = originalMediaBox.getHeight(); + float subPageWidth = width / horizontalDivisions; + float subPageHeight = height / verticalDivisions; + + LayerUtility layerUtility = new LayerUtility(document); + + for (int i = 0; i < horizontalDivisions; i++) { + for (int j = 0; j < verticalDivisions; j++) { + PDDocument subDoc = new PDDocument(); + PDPage subPage = new PDPage(new PDRectangle(subPageWidth, subPageHeight)); + subDoc.addPage(subPage); + + PDFormXObject form = layerUtility.importPageAsForm(document, document.getPages().indexOf(originalPage)); + + try (PDPageContentStream contentStream = new PDPageContentStream(subDoc, subPage)) { + // Set clipping area and position + float translateX = -subPageWidth * i; + float translateY = height - subPageHeight * (verticalDivisions - j); + + contentStream.saveGraphicsState(); + contentStream.addRect(0, 0, subPageWidth, subPageHeight); + contentStream.clip(); + contentStream.transform(new Matrix(1, 0, 0, 1, translateX, translateY)); + + // Draw the form + contentStream.drawForm(form); + contentStream.restoreGraphicsState(); + } + + splitDocuments.add(subDoc); + } + } + } + + return splitDocuments; + } + + + + + +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java new file mode 100644 index 000000000..83e7b7235 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java @@ -0,0 +1,153 @@ +package stirling.software.SPDF.controller.api; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.general.SplitPdfBySizeOrCountRequest; +import stirling.software.SPDF.utils.GeneralUtils; +import stirling.software.SPDF.utils.WebResponseUtils; + +@RestController +@RequestMapping("/api/v1/general") +@Tag(name = "Misc", description = "Miscellaneous APIs") +public class SplitPdfBySizeController { + + + @PostMapping(value = "/split-by-size-or-count", consumes = "multipart/form-data") + @Operation(summary = "Auto split PDF pages into separate documents based on size or count", description = "split PDF into multiple paged documents based on size/count, ie if 20 pages and split into 5, it does 5 documents each 4 pages\r\n" + + " if 10MB and each page is 1MB and you enter 2MB then 5 docs each 2MB (rounded so that it accepts 1.9MB but not 2.1MB) Input:PDF Output:ZIP Type:SIMO") + public ResponseEntity autoSplitPdf(@ModelAttribute SplitPdfBySizeOrCountRequest request) throws Exception { + List splitDocumentsBoas = new ArrayList(); + + + + MultipartFile file = request.getFileInput(); + PDDocument sourceDocument = PDDocument.load(file.getInputStream()); + + //0 = size, 1 = page count, 2 = doc count + int type = request.getSplitType(); + String value = request.getSplitValue(); + + if (type == 0) { // Split by size + long maxBytes = GeneralUtils.convertSizeToBytes(value); + long currentSize = 0; + PDDocument currentDoc = new PDDocument(); + + for (PDPage page : sourceDocument.getPages()) { + ByteArrayOutputStream pageOutputStream = new ByteArrayOutputStream(); + PDDocument tempDoc = new PDDocument(); + tempDoc.addPage(page); + tempDoc.save(pageOutputStream); + tempDoc.close(); + + long pageSize = pageOutputStream.size(); + if (currentSize + pageSize > maxBytes) { + // Save and reset current document + splitDocumentsBoas.add(currentDocToByteArray(currentDoc)); + currentDoc = new PDDocument(); + currentSize = 0; + } + + currentDoc.addPage(page); + currentSize += pageSize; + } + // Add the last document if it contains any pages + if (currentDoc.getPages().getCount() != 0) { + splitDocumentsBoas.add(currentDocToByteArray(currentDoc)); + } + } else if (type == 1) { // Split by page count + int pageCount = Integer.parseInt(value); + int currentPageCount = 0; + PDDocument currentDoc = new PDDocument(); + + for (PDPage page : sourceDocument.getPages()) { + currentDoc.addPage(page); + currentPageCount++; + + if (currentPageCount == pageCount) { + // Save and reset current document + splitDocumentsBoas.add(currentDocToByteArray(currentDoc)); + currentDoc = new PDDocument(); + currentPageCount = 0; + } + } + // Add the last document if it contains any pages + if (currentDoc.getPages().getCount() != 0) { + splitDocumentsBoas.add(currentDocToByteArray(currentDoc)); + } + } else if (type == 2) { // Split by doc count + int documentCount = Integer.parseInt(value); + int totalPageCount = sourceDocument.getNumberOfPages(); + int pagesPerDocument = totalPageCount / documentCount; + int extraPages = totalPageCount % documentCount; + int currentPageIndex = 0; + + for (int i = 0; i < documentCount; i++) { + PDDocument currentDoc = new PDDocument(); + int pagesToAdd = pagesPerDocument + (i < extraPages ? 1 : 0); + + for (int j = 0; j < pagesToAdd; j++) { + currentDoc.addPage(sourceDocument.getPage(currentPageIndex++)); + } + + splitDocumentsBoas.add(currentDocToByteArray(currentDoc)); + } + } else { + throw new IllegalArgumentException("Invalid argument for split type"); + } + + sourceDocument.close(); + + + + Path zipFile = Files.createTempFile("split_documents", ".zip"); + String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); + byte[] data; + + try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { + for (int i = 0; i < splitDocumentsBoas.size(); i++) { + String fileName = filename + "_" + (i + 1) + ".pdf"; + ByteArrayOutputStream baos = splitDocumentsBoas.get(i); + byte[] pdf = baos.toByteArray(); + + ZipEntry pdfEntry = new ZipEntry(fileName); + zipOut.putNextEntry(pdfEntry); + zipOut.write(pdf); + zipOut.closeEntry(); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + data = Files.readAllBytes(zipFile); + Files.delete(zipFile); + } + + return WebResponseUtils.bytesToWebResponse(data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM); + } + + private ByteArrayOutputStream currentDocToByteArray(PDDocument document) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + document.save(baos); + document.close(); + return baos; + } + + +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java b/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java index 42e18e244..22bf1d703 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java @@ -1,30 +1,29 @@ package stirling.software.SPDF.controller.api; +import java.awt.geom.AffineTransform; import java.io.ByteArrayOutputStream; import java.io.IOException; +import org.apache.pdfbox.multipdf.LayerUtility; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import com.itextpdf.kernel.geom.PageSize; -import com.itextpdf.kernel.geom.Rectangle; -import com.itextpdf.kernel.pdf.PdfDocument; -import com.itextpdf.kernel.pdf.PdfReader; -import com.itextpdf.kernel.pdf.PdfWriter; -import com.itextpdf.kernel.pdf.xobject.PdfFormXObject; -import com.itextpdf.layout.Document; -import com.itextpdf.layout.element.Image; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") public class ToSinglePageController { @@ -36,45 +35,52 @@ public class ToSinglePageController { summary = "Convert a multi-page PDF into a single long page PDF", description = "This endpoint converts a multi-page PDF document into a single paged PDF document. The width of the single page will be same as the input's width, but the height will be the sum of all the pages' heights. Input:PDF Output:PDF Type:SISO" ) - public ResponseEntity pdfToSinglePage( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input multi-page PDF file to be converted into a single page", required = true) - MultipartFile file) throws IOException { + public ResponseEntity pdfToSinglePage(@ModelAttribute PDFFile request) throws IOException { - PdfReader reader = new PdfReader(file.getInputStream()); - PdfDocument sourceDocument = new PdfDocument(reader); - - float totalHeight = 0; - float width = 0; + // Load the source document + PDDocument sourceDocument = PDDocument.load(request.getFileInput().getInputStream()); - for (int i = 1; i <= sourceDocument.getNumberOfPages(); i++) { - Rectangle pageSize = sourceDocument.getPage(i).getPageSize(); - totalHeight += pageSize.getHeight(); - if(width < pageSize.getWidth()) - width = pageSize.getWidth(); - } + // Calculate total height and max width + float totalHeight = 0; + float maxWidth = 0; + for (PDPage page : sourceDocument.getPages()) { + PDRectangle pageSize = page.getMediaBox(); + totalHeight += pageSize.getHeight(); + maxWidth = Math.max(maxWidth, pageSize.getWidth()); + } - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PdfWriter writer = new PdfWriter(baos); - PdfDocument newDocument = new PdfDocument(writer); - PageSize newPageSize = new PageSize(width, totalHeight); - newDocument.addNewPage(newPageSize); + // Create new document and page with calculated dimensions + PDDocument newDocument = new PDDocument(); + PDPage newPage = new PDPage(new PDRectangle(maxWidth, totalHeight)); + newDocument.addPage(newPage); - Document layoutDoc = new Document(newDocument); - float yOffset = totalHeight; + // Initialize the content stream of the new page + PDPageContentStream contentStream = new PDPageContentStream(newDocument, newPage); + contentStream.close(); + + LayerUtility layerUtility = new LayerUtility(newDocument); + float yOffset = totalHeight; - for (int i = 1; i <= sourceDocument.getNumberOfPages(); i++) { - PdfFormXObject pageCopy = sourceDocument.getPage(i).copyAsFormXObject(newDocument); - Image copiedPage = new Image(pageCopy); - copiedPage.setFixedPosition(0, yOffset - sourceDocument.getPage(i).getPageSize().getHeight()); - yOffset -= sourceDocument.getPage(i).getPageSize().getHeight(); - layoutDoc.add(copiedPage); - } + // For each page, copy its content to the new page at the correct offset + for (PDPage page : sourceDocument.getPages()) { + PDFormXObject form = layerUtility.importPageAsForm(sourceDocument, sourceDocument.getPages().indexOf(page)); + AffineTransform af = AffineTransform.getTranslateInstance(0, yOffset - page.getMediaBox().getHeight()); + layerUtility.wrapInSaveRestore(newPage); + String defaultLayerName = "Layer" + sourceDocument.getPages().indexOf(page); + layerUtility.appendFormAsLayer(newPage, form, af, defaultLayerName); + yOffset -= page.getMediaBox().getHeight(); + } - layoutDoc.close(); - sourceDocument.close(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + newDocument.save(baos); + newDocument.close(); + sourceDocument.close(); - byte[] result = baos.toByteArray(); - return WebResponseUtils.bytesToWebResponse(result, file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_singlePage.pdf"); + byte[] result = baos.toByteArray(); + return WebResponseUtils.bytesToWebResponse(result, request.getFileInput().getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_singlePage.pdf"); + + + + } } \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java index dbb18df5a..bf4515678 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java @@ -13,10 +13,12 @@ import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import org.springframework.web.servlet.view.RedirectView; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -24,6 +26,7 @@ import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.User; @Controller +@RequestMapping("/api/v1/user") public class UserController { @Autowired @@ -40,59 +43,117 @@ public class UserController { return "redirect:/login?registered=true"; } - @PostMapping("/change-username") - public ResponseEntity changeUsername(Principal principal, @RequestParam String currentPassword, @RequestParam String newUsername, HttpServletRequest request, HttpServletResponse response) { - if (principal == null) { - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("User not authenticated."); - } - - Optional userOpt = userService.findByUsername(principal.getName()); - - if(userOpt == null || userOpt.isEmpty()) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User not found."); - } - User user = userOpt.get(); - - if(!userService.isPasswordCorrect(user, currentPassword)) { - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Current password is incorrect."); - } - - if(userService.usernameExists(newUsername)) { - return ResponseEntity.status(HttpStatus.CONFLICT).body("New username already exists."); - } + @PostMapping("/change-username-and-password") + public RedirectView changeUsernameAndPassword(Principal principal, + @RequestParam String currentPassword, + @RequestParam String newUsername, + @RequestParam String newPassword, + HttpServletRequest request, + HttpServletResponse response, + RedirectAttributes redirectAttributes) { + if (principal == null) { + return new RedirectView("/change-creds?messageType=notAuthenticated"); + } - userService.changeUsername(user, newUsername); + Optional userOpt = userService.findByUsername(principal.getName()); + + if (userOpt == null || userOpt.isEmpty()) { + return new RedirectView("/change-creds?messageType=userNotFound"); + } + + User user = userOpt.get(); + + if (!userService.isPasswordCorrect(user, currentPassword)) { + return new RedirectView("/change-creds?messageType=incorrectPassword"); + } + + if (!user.getUsername().equals(newUsername) && userService.usernameExists(newUsername)) { + return new RedirectView("/change-creds?messageType=usernameExists"); + } + + + userService.changePassword(user, newPassword); + if(newUsername != null && newUsername.length() > 0 && !user.getUsername().equals(newUsername)) { + userService.changeUsername(user, newUsername); + } + userService.changeFirstUse(user, false); // Logout using Spring's utility new SecurityContextLogoutHandler().logout(request, response, null); - - return ResponseEntity.ok("Username updated successfully."); + return new RedirectView("/login?messageType=credsUpdated"); + } + + + + @PostMapping("/change-username") + public RedirectView changeUsername(Principal principal, + @RequestParam String currentPassword, + @RequestParam String newUsername, + HttpServletRequest request, + HttpServletResponse response, + RedirectAttributes redirectAttributes) { + if (principal == null) { + return new RedirectView("/account?messageType=notAuthenticated"); + } + + Optional userOpt = userService.findByUsername(principal.getName()); + + if (userOpt == null || userOpt.isEmpty()) { + return new RedirectView("/account?messageType=userNotFound"); + } + + User user = userOpt.get(); + + if (!userService.isPasswordCorrect(user, currentPassword)) { + return new RedirectView("/account?messageType=incorrectPassword"); + } + + if (!user.getUsername().equals(newUsername) && userService.usernameExists(newUsername)) { + return new RedirectView("/account?messageType=usernameExists"); + } + + if(newUsername != null && newUsername.length() > 0) { + userService.changeUsername(user, newUsername); + } + + // Logout using Spring's utility + new SecurityContextLogoutHandler().logout(request, response, null); + + return new RedirectView("/login?messageType=credsUpdated"); } @PostMapping("/change-password") - public ResponseEntity changePassword(Principal principal, @RequestParam String currentPassword, @RequestParam String newPassword, HttpServletRequest request, HttpServletResponse response) { - if (principal == null) { - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("User not authenticated."); - } + public RedirectView changePassword(Principal principal, + @RequestParam String currentPassword, + @RequestParam String newPassword, + HttpServletRequest request, + HttpServletResponse response, + RedirectAttributes redirectAttributes) { + if (principal == null) { + return new RedirectView("/account?messageType=notAuthenticated"); + } - Optional userOpt = userService.findByUsername(principal.getName()); - - if(userOpt == null || userOpt.isEmpty()) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User not found."); - } - User user = userOpt.get(); - if(!userService.isPasswordCorrect(user, currentPassword)) { - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Current password is incorrect."); - } + Optional userOpt = userService.findByUsername(principal.getName()); + + if (userOpt == null || userOpt.isEmpty()) { + return new RedirectView("/account?messageType=userNotFound"); + } + + User user = userOpt.get(); + + if (!userService.isPasswordCorrect(user, currentPassword)) { + return new RedirectView("/account?messageType=incorrectPassword"); + } userService.changePassword(user, newPassword); // Logout using Spring's utility new SecurityContextLogoutHandler().logout(request, response, null); - - return ResponseEntity.ok("Password updated successfully."); + + return new RedirectView("/login?messageType=credsUpdated"); } + @PostMapping("/updateUserSettings") public String updateUserSettings(HttpServletRequest request, Principal principal) { @@ -115,9 +176,14 @@ public class UserController { @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping("/admin/saveUser") - public String saveUser(@RequestParam String username, @RequestParam String password, @RequestParam String role) { - userService.saveUser(username, password, role); - return "redirect:/addUsers"; // Redirect to account page after adding the user + public RedirectView saveUser(@RequestParam String username, @RequestParam String password, @RequestParam String role, + @RequestParam(name = "forceChange", required = false, defaultValue = "false") boolean forceChange) { + + if(userService.usernameExists(username)) { + return new RedirectView("/addUsers?messageType=usernameExists"); + } + userService.saveUser(username, password, role, forceChange); + return new RedirectView("/addUsers"); // Redirect to account page after adding the user } diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEpubToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEpubToPdf.java index d05e42df2..e821a36a4 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEpubToPdf.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEpubToPdf.java @@ -14,8 +14,9 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import org.w3c.dom.Document; @@ -26,10 +27,12 @@ import org.xml.sax.InputSource; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.GeneralFile; import stirling.software.SPDF.utils.FileToPdf; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/convert") @Tag(name = "Convert", description = "Convert APIs") public class ConvertEpubToPdf { //TODO @@ -40,9 +43,9 @@ public class ConvertEpubToPdf { description = "This endpoint takes an EPUB file input and converts it to a single PDF." ) public ResponseEntity epubToSinglePdf( - @RequestPart(required = true, value = "fileInput") MultipartFile fileInput) + @ModelAttribute GeneralFile request) throws Exception { - + MultipartFile fileInput = request.getFileInput(); if (fileInput == null) { throw new IllegalArgumentException("Please provide an EPUB file for conversion."); } @@ -71,7 +74,7 @@ public class ConvertEpubToPdf { // Assuming a pseudo-code function that merges multiple PDFs into one. private byte[] mergeMultiplePdfsIntoOne(List individualPdfs) { - // You can use a library such as iText or PDFBox to perform the merging here. + // You can use a library such as PDFBox to perform the merging here. // Return the byte[] of the merged PDF. return null; } diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java index 762cbe6b7..5839dd2d2 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java @@ -1,30 +1,33 @@ package stirling.software.SPDF.controller.api.converters; -import java.io.IOException; - import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.GeneralFile; import stirling.software.SPDF.utils.FileToPdf; import stirling.software.SPDF.utils.WebResponseUtils; @RestController @Tag(name = "Convert", description = "Convert APIs") +@RequestMapping("/api/v1/convert") public class ConvertHtmlToPDF { - @PostMapping(consumes = "multipart/form-data", value = "/html-to-pdf") + @PostMapping(consumes = "multipart/form-data", value = "/html/pdf") @Operation( summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF", description = "This endpoint takes an HTML or ZIP file input and converts it to a PDF format." ) public ResponseEntity HtmlToPdf( - @RequestPart(required = true, value = "fileInput") MultipartFile fileInput) throws IOException, InterruptedException { + @ModelAttribute GeneralFile request) + throws Exception { + MultipartFile fileInput = request.getFileInput(); if (fileInput == null) { throw new IllegalArgumentException("Please provide an HTML or ZIP file for conversion."); diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java index d4964196e..f0c60b698 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java @@ -1,6 +1,7 @@ package stirling.software.SPDF.controller.api.converters; import java.io.IOException; +import java.net.URLConnection; import org.apache.pdfbox.rendering.ImageType; import org.slf4j.Logger; @@ -11,44 +12,36 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.converters.ConvertToImageRequest; +import stirling.software.SPDF.model.api.converters.ConvertToPdfRequest; import stirling.software.SPDF.utils.PdfUtils; import stirling.software.SPDF.utils.WebResponseUtils; + @RestController +@RequestMapping("/api/v1/convert") @Tag(name = "Convert", description = "Convert APIs") public class ConvertImgPDFController { private static final Logger logger = LoggerFactory.getLogger(ConvertImgPDFController.class); - @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-img") + @PostMapping(consumes = "multipart/form-data", value = "/pdf/img") @Operation(summary = "Convert PDF to image(s)", description = "This endpoint converts a PDF file to image(s) with the specified image format, color type, and DPI. Users can choose to get a single image or multiple images. Input:PDF Output:Image Type:SI-Conditional") - public ResponseEntity convertToImage( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file to be converted") - MultipartFile file, - @RequestParam("imageFormat") - @Parameter(description = "The output image format", schema = @Schema(allowableValues = {"png", "jpeg", "jpg", "gif"})) - String imageFormat, - @RequestParam("singleOrMultiple") - @Parameter(description = "Choose between a single image containing all pages or separate images for each page", schema = @Schema(allowableValues = {"single", "multiple"})) - String singleOrMultiple, - @RequestParam("colorType") - @Parameter(description = "The color type of the output image(s)", schema = @Schema(allowableValues = {"color", "greyscale", "blackwhite"})) - String colorType, - @RequestParam("dpi") - @Parameter(description = "The DPI (dots per inch) for the output image(s)") - String dpi) throws IOException { - + public ResponseEntity convertToImage(@ModelAttribute ConvertToImageRequest request) throws IOException { + MultipartFile file = request.getFileInput(); + String imageFormat = request.getImageFormat(); + String singleOrMultiple = request.getSingleOrMultiple(); + String colorType = request.getColorType(); + String dpi = request.getDpi(); + byte[] pdfBytes = file.getBytes(); ImageType colorTypeResult = ImageType.RGB; if ("greyscale".equals(colorType)) { @@ -83,37 +76,22 @@ public class ConvertImgPDFController { } } - @PostMapping(consumes = "multipart/form-data", value = "/img-to-pdf") + @PostMapping(consumes = "multipart/form-data", value = "/img/pdf") @Operation(summary = "Convert images to a PDF file", description = "This endpoint converts one or more images to a PDF file. Users can specify whether to stretch the images to fit the PDF page, and whether to automatically rotate the images. Input:Image Output:PDF Type:SISO?") - public ResponseEntity convertToPdf( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input images to be converted to a PDF file") - MultipartFile[] file, - @RequestParam(defaultValue = "false", name = "stretchToFit") - @Parameter(description = "Whether to stretch the images to fit the PDF page or maintain the aspect ratio", example = "false") - boolean stretchToFit, - @RequestParam("colorType") - @Parameter(description = "The color type of the output image(s)", schema = @Schema(allowableValues = {"color", "greyscale", "blackwhite"})) - String colorType, - @RequestParam(defaultValue = "false", name = "autoRotate") - @Parameter(description = "Whether to automatically rotate the images to better fit the PDF page", example = "true") - boolean autoRotate) throws IOException { + public ResponseEntity convertToPdf(@ModelAttribute ConvertToPdfRequest request) throws IOException { + MultipartFile[] file = request.getFileInput(); + String fitOption = request.getFitOption(); + String colorType = request.getColorType(); + boolean autoRotate = request.isAutoRotate(); + // Convert the file to PDF and get the resulting bytes - byte[] bytes = PdfUtils.imageToPdf(file, stretchToFit, autoRotate, colorType); + byte[] bytes = PdfUtils.imageToPdf(file, fitOption, autoRotate, colorType); return WebResponseUtils.bytesToWebResponse(bytes, file[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_converted.pdf"); } private String getMediaType(String imageFormat) { - if (imageFormat.equalsIgnoreCase("PNG")) - return "image/png"; - else if (imageFormat.equalsIgnoreCase("JPEG") || imageFormat.equalsIgnoreCase("JPG")) - return "image/jpeg"; - else if (imageFormat.equalsIgnoreCase("GIF")) - return "image/gif"; - else - return "application/octet-stream"; + String mimeType = URLConnection.guessContentTypeFromName("." + imageFormat); + return mimeType.equals("null") ? "application/octet-stream" : mimeType; } - - } diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java index c1bc1b73a..4191ecdfc 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java @@ -1,33 +1,35 @@ package stirling.software.SPDF.controller.api.converters; -import java.io.IOException; - import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.GeneralFile; import stirling.software.SPDF.utils.FileToPdf; import stirling.software.SPDF.utils.WebResponseUtils; @RestController @Tag(name = "Convert", description = "Convert APIs") +@RequestMapping("/api/v1/convert") public class ConvertMarkdownToPdf { - @PostMapping(consumes = "multipart/form-data", value = "/markdown-to-pdf") + @PostMapping(consumes = "multipart/form-data", value = "/markdown/pdf") @Operation( summary = "Convert a Markdown file to PDF", description = "This endpoint takes a Markdown file input, converts it to HTML, and then to PDF format." ) public ResponseEntity markdownToPdf( - @RequestPart(required = true, value = "fileInput") MultipartFile fileInput) - throws IOException, InterruptedException { + @ModelAttribute GeneralFile request) + throws Exception { + MultipartFile fileInput = request.getFileInput(); if (fileInput == null) { throw new IllegalArgumentException("Please provide a Markdown file for conversion."); diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java index 3b9f278f7..e1c18a49c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java @@ -10,20 +10,22 @@ import java.util.List; import org.apache.commons.io.FilenameUtils; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.GeneralFile; import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; import stirling.software.SPDF.utils.WebResponseUtils; @RestController @Tag(name = "Convert", description = "Convert APIs") +@RequestMapping("/api/v1/convert") public class ConvertOfficeController { public byte[] convertToPdf(MultipartFile inputFile) throws IOException, InterruptedException { @@ -58,19 +60,14 @@ public class ConvertOfficeController { return fileExtension.matches(extensionPattern); } - @PostMapping(consumes = "multipart/form-data", value = "/file-to-pdf") + @PostMapping(consumes = "multipart/form-data", value = "/file/pdf") @Operation( summary = "Convert a file to a PDF using LibreOffice", description = "This endpoint converts a given file to a PDF using LibreOffice API Input:Any Output:PDF Type:SISO" ) - public ResponseEntity processFileToPDF( - @RequestPart(required = true, value = "fileInput") - @Parameter( - description = "The input file to be converted to a PDF file using LibreOffice", - required = true - ) - MultipartFile inputFile - ) throws IOException, InterruptedException { + public ResponseEntity processFileToPDF(@ModelAttribute GeneralFile request) + throws Exception { + MultipartFile inputFile = request.getFileInput(); // unused but can start server instance if startup time is to long // LibreOfficeListener.getInstance().start(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java index 7c99ee4d6..11279a274 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java @@ -3,69 +3,67 @@ package stirling.software.SPDF.controller.api.converters; import java.io.IOException; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.PDFFile; +import stirling.software.SPDF.model.api.converters.PdfToPresentationRequest; +import stirling.software.SPDF.model.api.converters.PdfToTextOrRTFRequest; +import stirling.software.SPDF.model.api.converters.PdfToWordRequest; import stirling.software.SPDF.utils.PDFToFile; @RestController +@RequestMapping("/api/v1/convert") @Tag(name = "Convert", description = "Convert APIs") public class ConvertPDFToOffice { - @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-html") + @PostMapping(consumes = "multipart/form-data", value = "/pdf/html") @Operation(summary = "Convert PDF to HTML", description = "This endpoint converts a PDF file to HTML format. Input:PDF Output:HTML Type:SISO") - public ResponseEntity processPdfToHTML( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to HTML format", required = true) MultipartFile inputFile) - throws IOException, InterruptedException { + public ResponseEntity processPdfToHTML(@ModelAttribute PDFFile request) + throws Exception { + MultipartFile inputFile = request.getFileInput(); PDFToFile pdfToFile = new PDFToFile(); return pdfToFile.processPdfToOfficeFormat(inputFile, "html", "writer_pdf_import"); } - @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-presentation") + @PostMapping(consumes = "multipart/form-data", value = "/pdf/presentation") @Operation(summary = "Convert PDF to Presentation format", description = "This endpoint converts a given PDF file to a Presentation format. Input:PDF Output:PPT Type:SISO") - public ResponseEntity processPdfToPresentation( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file") MultipartFile inputFile, - @RequestParam("outputFormat") @Parameter(description = "The output Presentation format", schema = @Schema(allowableValues = { - "ppt", "pptx", "odp" })) String outputFormat) - throws IOException, InterruptedException { + public ResponseEntity processPdfToPresentation(@ModelAttribute PdfToPresentationRequest request) throws IOException, InterruptedException { + MultipartFile inputFile = request.getFileInput(); + String outputFormat = request.getOutputFormat(); PDFToFile pdfToFile = new PDFToFile(); return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "impress_pdf_import"); } - @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-text") + @PostMapping(consumes = "multipart/form-data", value = "/pdf/text") @Operation(summary = "Convert PDF to Text or RTF format", description = "This endpoint converts a given PDF file to Text or RTF format. Input:PDF Output:TXT Type:SISO") - public ResponseEntity processPdfToRTForTXT( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file") MultipartFile inputFile, - @RequestParam("outputFormat") @Parameter(description = "The output Text or RTF format", schema = @Schema(allowableValues = { - "rtf", "txt:Text" })) String outputFormat) - throws IOException, InterruptedException { + public ResponseEntity processPdfToRTForTXT(@ModelAttribute PdfToTextOrRTFRequest request) throws IOException, InterruptedException { + MultipartFile inputFile = request.getFileInput(); + String outputFormat = request.getOutputFormat(); + PDFToFile pdfToFile = new PDFToFile(); return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "writer_pdf_import"); } - @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-word") + @PostMapping(consumes = "multipart/form-data", value = "/pdf/word") @Operation(summary = "Convert PDF to Word document", description = "This endpoint converts a given PDF file to a Word document format. Input:PDF Output:WORD Type:SISO") - public ResponseEntity processPdfToWord( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file") MultipartFile inputFile, - @RequestParam("outputFormat") @Parameter(description = "The output Word document format", schema = @Schema(allowableValues = { - "doc", "docx", "odt" })) String outputFormat) - throws IOException, InterruptedException { + public ResponseEntity processPdfToWord(@ModelAttribute PdfToWordRequest request) throws IOException, InterruptedException { + MultipartFile inputFile = request.getFileInput(); + String outputFormat = request.getOutputFormat(); PDFToFile pdfToFile = new PDFToFile(); return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "writer_pdf_import"); } - @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-xml") + @PostMapping(consumes = "multipart/form-data", value = "/pdf/xml") @Operation(summary = "Convert PDF to XML", description = "This endpoint converts a PDF file to an XML file. Input:PDF Output:XML Type:SISO") - public ResponseEntity processPdfToXML( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to an XML file", required = true) MultipartFile inputFile) - throws IOException, InterruptedException { + public ResponseEntity processPdfToXML(@ModelAttribute PDFFile request) + throws Exception { + MultipartFile inputFile = request.getFileInput(); PDFToFile pdfToFile = new PDFToFile(); return pdfToFile.processPdfToOfficeFormat(inputFile, "xml", "writer_pdf_import"); diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java index 6a99090bb..32ccb84a6 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java @@ -1,37 +1,37 @@ package stirling.software.SPDF.controller.api.converters; -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/convert") @Tag(name = "Convert", description = "Convert APIs") public class ConvertPDFToPDFA { - @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-pdfa") + @PostMapping(consumes = "multipart/form-data", value = "/pdf/pdfa") @Operation( summary = "Convert a PDF to a PDF/A", description = "This endpoint converts a PDF file to a PDF/A file. PDF/A is a format designed for long-term archiving of digital documents. Input:PDF Output:PDF Type:SISO" ) - public ResponseEntity pdfToPdfA( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file to be converted to a PDF/A file", required = true) - MultipartFile inputFile) throws IOException, InterruptedException { + public ResponseEntity pdfToPdfA(@ModelAttribute PDFFile request) + throws Exception { + MultipartFile inputFile = request.getFileInput(); // Save the uploaded file to a temporary location Path tempInputFile = Files.createTempFile("input_", ".pdf"); diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java index 2268ead5f..7c81edf2a 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java @@ -7,13 +7,14 @@ import java.util.ArrayList; import java.util.List; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; +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.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.converters.UrlToPdfRequest; import stirling.software.SPDF.utils.GeneralUtils; import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; @@ -21,17 +22,16 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @Tag(name = "Convert", description = "Convert APIs") +@RequestMapping("/api/v1/convert") public class ConvertWebsiteToPDF { - @PostMapping(consumes = "multipart/form-data", value = "/url-to-pdf") + @PostMapping(consumes = "multipart/form-data", value = "/url/pdf") @Operation( summary = "Convert a URL to a PDF", description = "This endpoint fetches content from a URL and converts it to a PDF format." ) - public ResponseEntity urlToPdf( - @RequestParam(required = true, value = "urlInput") - @Parameter(description = "The input URL to be converted to a PDF file", required = true) - String URL) throws IOException, InterruptedException { + public ResponseEntity urlToPdf(@ModelAttribute UrlToPdfRequest request) throws IOException, InterruptedException { + String URL = request.getUrlInput(); // Validate the URL format if(!URL.matches("^https?://.*") || !GeneralUtils.isValidURL(URL)) { diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractController.java new file mode 100644 index 000000000..f6fb69c9c --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractController.java @@ -0,0 +1,123 @@ +package stirling.software.SPDF.controller.api.converters; + +import java.io.ByteArrayInputStream; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; + +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ContentDisposition; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.opencsv.CSVWriter; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.controller.api.CropController; +import stirling.software.SPDF.controller.api.strippers.PDFTableStripper; +import stirling.software.SPDF.model.api.extract.PDFFilePage; + +@RestController +@RequestMapping("/api/v1/convert") +@Tag(name = "General", description = "General APIs") +public class ExtractController { + + private static final Logger logger = LoggerFactory.getLogger(CropController.class); + + @PostMapping(value = "/pdf-to-csv", consumes = "multipart/form-data") + @Operation(summary = "Extracts a PDF document to csv", description = "This operation takes an input PDF file and returns CSV file of whole page. Input:PDF Output:CSV Type:SISO") + public ResponseEntity PdfToCsv(@ModelAttribute PDFFilePage form) + throws Exception { + + ArrayList tableData = new ArrayList<>(); + int columnsCount = 0; + + try (PDDocument document = PDDocument.load(new ByteArrayInputStream(form.getFileInput().getBytes()))) { + final double res = 72; // PDF units are at 72 DPI + PDFTableStripper stripper = new PDFTableStripper(); + PDPage pdPage = document.getPage(form.getPageId() - 1); + stripper.extractTable(pdPage); + columnsCount = stripper.getColumns(); + for (int c = 0; c < columnsCount; ++c) { + for(int r=0; r notEmptyColumns = new ArrayList<>(); + + for (String item: tableData) { + if(!item.trim().isEmpty()){ + notEmptyColumns.add(item); + }else{ + columnsCount--; + } + } + + List fullTable = notEmptyColumns.stream().map((entity)-> + entity.replace('\n',' ').replace('\r',' ').trim().replaceAll("\\s{2,}", "|")).toList(); + + int rowsCount = fullTable.get(0).split("\\|").length; + + ArrayList headersList = getTableHeaders(columnsCount,fullTable); + ArrayList recordList = getRecordsList(rowsCount,fullTable); + + if(headersList.size() == 0 && recordList.size() == 0) { + throw new Exception("No table detected, no headers or records found"); + } + + StringWriter writer = new StringWriter(); + try (CSVWriter csvWriter = new CSVWriter(writer)) { + csvWriter.writeNext(headersList.toArray(new String[0])); + for (String record : recordList) { + csvWriter.writeNext(record.split("\\|")); + } + } + + HttpHeaders headers = new HttpHeaders(); + headers.setContentDisposition(ContentDisposition.builder("attachment").filename(form.getFileInput().getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_extracted.csv").build()); + headers.setContentType(MediaType.parseMediaType("text/csv")); + + return ResponseEntity.ok() + .headers(headers) + .body(writer.toString()); + } + + private ArrayList getRecordsList( int rowsCounts ,List items){ + ArrayList recordsList = new ArrayList<>(); + + for (int b=1; b getTableHeaders(int columnsCount, List items){ + ArrayList resultList = new ArrayList<>(); + for (int i=0;i containsText( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to a PDF/A file", required = true) MultipartFile inputFile, - @Parameter(description = "The text to check for", required = true) String text, - @Parameter(description = "The page number to check for text on accepts 'All', ranges like '1-4'", required = false) String pageNumber) - throws IOException, InterruptedException { + public ResponseEntity containsText(@ModelAttribute ContainsTextRequest request) throws IOException, InterruptedException { + MultipartFile inputFile = request.getFileInput(); + String text = request.getText(); + String pageNumber = request.getPageNumbers(); + PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream()); if (PdfUtils.hasText(pdfDocument, pageNumber, text)) return WebResponseUtils.pdfDocToWebResponse(pdfDocument, inputFile.getOriginalFilename()); @@ -38,10 +44,11 @@ public class FilterController { // TODO @PostMapping(consumes = "multipart/form-data", value = "/filter-contains-image") @Operation(summary = "Checks if a PDF contains an image", description = "Input:PDF Output:Boolean Type:SISO") - public ResponseEntity containsImage( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to a PDF/A file", required = true) MultipartFile inputFile, - @Parameter(description = "The page number to check for image on accepts 'All', ranges like '1-4'", required = false) String pageNumber) + public ResponseEntity containsImage(@ModelAttribute PDFWithPageNums request) throws IOException, InterruptedException { + MultipartFile inputFile = request.getFileInput(); + String pageNumber = request.getPageNumbers(); + PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream()); if (PdfUtils.hasImages(pdfDocument, pageNumber)) return WebResponseUtils.pdfDocToWebResponse(pdfDocument, inputFile.getOriginalFilename()); @@ -50,12 +57,10 @@ public class FilterController { @PostMapping(consumes = "multipart/form-data", value = "/filter-page-count") @Operation(summary = "Checks if a PDF is greater, less or equal to a setPageCount", description = "Input:PDF Output:Boolean Type:SISO") - public ResponseEntity pageCount( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file", required = true) MultipartFile inputFile, - @Parameter(description = "Page Count", required = true) String pageCount, - @Parameter(description = "Comparison type", schema = @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = { - "Greater", "Equal", "Less" })) String comparator) - throws IOException, InterruptedException { + public ResponseEntity pageCount(@ModelAttribute PDFComparisonAndCount request) throws IOException, InterruptedException { + MultipartFile inputFile = request.getFileInput(); + String pageCount = request.getPageCount(); + String comparator = request.getComparator(); // Load the PDF PDDocument document = PDDocument.load(inputFile.getInputStream()); int actualPageCount = document.getNumberOfPages(); @@ -83,12 +88,10 @@ public class FilterController { @PostMapping(consumes = "multipart/form-data", value = "/filter-page-size") @Operation(summary = "Checks if a PDF is of a certain size", description = "Input:PDF Output:Boolean Type:SISO") - public ResponseEntity pageSize( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file", required = true) MultipartFile inputFile, - @Parameter(description = "Standard Page Size", required = true) String standardPageSize, - @Parameter(description = "Comparison type", schema = @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = { - "Greater", "Equal", "Less" })) String comparator) - throws IOException, InterruptedException { + public ResponseEntity pageSize(@ModelAttribute PageSizeRequest request) throws IOException, InterruptedException { + MultipartFile inputFile = request.getFileInput(); + String standardPageSize = request.getStandardPageSize(); + String comparator = request.getComparator(); // Load the PDF PDDocument document = PDDocument.load(inputFile.getInputStream()); @@ -126,12 +129,10 @@ public class FilterController { @PostMapping(consumes = "multipart/form-data", value = "/filter-file-size") @Operation(summary = "Checks if a PDF is a set file size", description = "Input:PDF Output:Boolean Type:SISO") - public ResponseEntity fileSize( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file", required = true) MultipartFile inputFile, - @Parameter(description = "File Size", required = true) String fileSize, - @Parameter(description = "Comparison type", schema = @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = { - "Greater", "Equal", "Less" })) String comparator) - throws IOException, InterruptedException { + public ResponseEntity fileSize(@ModelAttribute FileSizeRequest request) throws IOException, InterruptedException { + MultipartFile inputFile = request.getFileInput(); + String fileSize = request.getFileSize(); + String comparator = request.getComparator(); // Get the file size long actualFileSize = inputFile.getSize(); @@ -159,12 +160,10 @@ public class FilterController { @PostMapping(consumes = "multipart/form-data", value = "/filter-page-rotation") @Operation(summary = "Checks if a PDF is of a certain rotation", description = "Input:PDF Output:Boolean Type:SISO") - public ResponseEntity pageRotation( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file", required = true) MultipartFile inputFile, - @Parameter(description = "Rotation in degrees", required = true) int rotation, - @Parameter(description = "Comparison type", schema = @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = { - "Greater", "Equal", "Less" })) String comparator) - throws IOException, InterruptedException { + public ResponseEntity pageRotation(@ModelAttribute PageRotationRequest request) throws IOException, InterruptedException { + MultipartFile inputFile = request.getFileInput(); + int rotation = request.getRotation(); + String comparator = request.getComparator(); // Load the PDF PDDocument document = PDDocument.load(inputFile.getInputStream()); diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/AutoRenameController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java similarity index 86% rename from src/main/java/stirling/software/SPDF/controller/api/other/AutoRenameController.java rename to src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java index eb20f3bd5..fe8337d24 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/AutoRenameController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java @@ -1,4 +1,4 @@ -package stirling.software.SPDF.controller.api.other; +package stirling.software.SPDF.controller.api.misc; import java.io.IOException; import java.util.ArrayList; @@ -11,18 +11,19 @@ import org.apache.pdfbox.text.TextPosition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.misc.ExtractHeaderRequest; import stirling.software.SPDF.utils.WebResponseUtils; @RestController -@Tag(name = "Other", description = "Other APIs") +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") public class AutoRenameController { private static final Logger logger = LoggerFactory.getLogger(AutoRenameController.class); @@ -32,10 +33,9 @@ public class AutoRenameController { @PostMapping(consumes = "multipart/form-data", value = "/auto-rename") @Operation(summary = "Extract header from PDF file", description = "This endpoint accepts a PDF file and attempts to extract its title or header based on heuristics. Input:PDF Output:PDF Type:SISO") - public ResponseEntity extractHeader( - @RequestPart(value = "fileInput") @Parameter(description = "The input PDF file from which the header is to be extracted.", required = true) MultipartFile file, - @RequestParam(required = false, defaultValue = "false") @Parameter(description = "Flag indicating whether to use the first text as a fallback if no suitable title is found. Defaults to false.", required = false) Boolean useFirstTextAsFallback) - throws Exception { + public ResponseEntity extractHeader(@ModelAttribute ExtractHeaderRequest request) throws Exception { + MultipartFile file = request.getFileInput(); + Boolean useFirstTextAsFallback = request.isUseFirstTextAsFallback(); PDDocument document = PDDocument.load(file.getInputStream()); PDFTextStripper reader = new PDFTextStripper() { diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/AutoSplitPdfController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java similarity index 89% rename from src/main/java/stirling/software/SPDF/controller/api/other/AutoSplitPdfController.java rename to src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java index e3e568471..b4b9b9512 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/AutoSplitPdfController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java @@ -1,4 +1,4 @@ -package stirling.software.SPDF.controller.api.other; +package stirling.software.SPDF.controller.api.misc; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.awt.image.DataBufferInt; @@ -16,8 +16,9 @@ import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @@ -30,20 +31,22 @@ import com.google.zxing.Result; import com.google.zxing.common.HybridBinarizer; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.misc.AutoSplitPdfRequest; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") public class AutoSplitPdfController { private static final String QR_CONTENT = "https://github.com/Frooodle/Stirling-PDF"; @PostMapping(value = "/auto-split-pdf", consumes = "multipart/form-data") @Operation(summary = "Auto split PDF pages into separate documents", description = "This endpoint accepts a PDF file, scans each page for a specific QR code, and splits the document at the QR code boundaries. The output is a zip file containing each separate PDF document. Input:PDF Output:ZIP Type:SISO") - public ResponseEntity autoSplitPdf( - @RequestParam("fileInput") @Parameter(description = "The input PDF file which needs to be split into separate documents based on QR code boundaries.", required = true) MultipartFile file, - @RequestParam(value ="duplexMode",defaultValue = "false") @Parameter(description = "Flag indicating if the duplex mode is active, where the page after the divider also gets removed.", required = false) boolean duplexMode) - throws IOException { + public ResponseEntity autoSplitPdf(@ModelAttribute AutoSplitPdfRequest request) throws IOException { + MultipartFile file = request.getFileInput(); + boolean duplexMode = request.isDuplexMode(); InputStream inputStream = file.getInputStream(); PDDocument document = PDDocument.load(inputStream); diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/BlankPageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java similarity index 83% rename from src/main/java/stirling/software/SPDF/controller/api/other/BlankPageController.java rename to src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java index 4f505b738..c52ff61a7 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/BlankPageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java @@ -1,4 +1,4 @@ -package stirling.software.SPDF.controller.api.other; +package stirling.software.SPDF.controller.api.misc; import java.awt.image.BufferedImage; import java.io.IOException; @@ -20,22 +20,23 @@ import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.text.PDFTextStripper; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.misc.RemoveBlankPagesRequest; import stirling.software.SPDF.utils.PdfUtils; import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; import stirling.software.SPDF.utils.WebResponseUtils; @RestController -@Tag(name = "Other", description = "Other APIs") +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") public class BlankPageController { @PostMapping(consumes = "multipart/form-data", value = "/remove-blanks") @@ -43,16 +44,10 @@ public class BlankPageController { summary = "Remove blank pages from a PDF file", description = "This endpoint removes blank pages from a given PDF file. Users can specify the threshold and white percentage to tune the detection of blank pages. Input:PDF Output:PDF Type:SISO" ) - public ResponseEntity removeBlankPages( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file from which blank pages will be removed", required = true) - MultipartFile inputFile, - @RequestParam(defaultValue = "10", name = "threshold") - @Parameter(description = "The threshold value to determine blank pages", example = "10") - int threshold, - @RequestParam(defaultValue = "99.9", name = "whitePercent") - @Parameter(description = "The percentage of white color on a page to consider it as blank", example = "99.9") - float whitePercent) throws IOException, InterruptedException { + public ResponseEntity removeBlankPages(@ModelAttribute RemoveBlankPagesRequest request) throws IOException, InterruptedException { + MultipartFile inputFile = request.getFileInput(); + int threshold = request.getThreshold(); + float whitePercent = request.getWhitePercent(); PDDocument document = null; try { diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/CompressController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java similarity index 90% rename from src/main/java/stirling/software/SPDF/controller/api/other/CompressController.java rename to src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java index 381a68215..dd864bc19 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/CompressController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java @@ -1,4 +1,4 @@ -package stirling.software.SPDF.controller.api.other; +package stirling.software.SPDF.controller.api.misc; import java.awt.Image; import java.awt.image.BufferedImage; @@ -22,35 +22,34 @@ import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.misc.OptimizePdfRequest; import stirling.software.SPDF.utils.GeneralUtils; import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; import stirling.software.SPDF.utils.WebResponseUtils; @RestController -@Tag(name = "Other", description = "Other APIs") +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") public class CompressController { private static final Logger logger = LoggerFactory.getLogger(CompressController.class); @PostMapping(consumes = "multipart/form-data", value = "/compress-pdf") @Operation(summary = "Optimize PDF file", description = "This endpoint accepts a PDF file and optimizes it based on the provided parameters. Input:PDF Output:PDF Type:SISO") - public ResponseEntity optimizePdf( - @RequestPart(value = "fileInput") @Parameter(description = "The input PDF file to be optimized.", required = true) MultipartFile inputFile, - @RequestParam(required = false, value = "optimizeLevel") @Parameter(description = "The level of optimization to apply to the PDF file. Higher values indicate greater compression but may reduce quality.", schema = @Schema(allowableValues = { - "1", "2", "3", "4", "5" })) Integer optimizeLevel, - @RequestParam(value = "expectedOutputSize", required = false) @Parameter(description = "The expected output size, e.g. '100MB', '25KB', etc.", required = false) String expectedOutputSizeString) - throws Exception { + public ResponseEntity optimizePdf(@ModelAttribute OptimizePdfRequest request) throws Exception { + MultipartFile inputFile = request.getFileInput(); + Integer optimizeLevel = request.getOptimizeLevel(); + String expectedOutputSizeString = request.getExpectedOutputSize(); + if(expectedOutputSizeString == null && optimizeLevel == null) { throw new Exception("Both expected output size and optimize level are not specified"); diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/ExtractImageScansController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java similarity index 71% rename from src/main/java/stirling/software/SPDF/controller/api/other/ExtractImageScansController.java rename to src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java index 55ff446ca..d59069702 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/ExtractImageScansController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java @@ -1,4 +1,4 @@ -package stirling.software.SPDF.controller.api.other; +package stirling.software.SPDF.controller.api.misc; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; @@ -24,20 +24,21 @@ import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.misc.ExtractImageScansRequest; import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; import stirling.software.SPDF.utils.WebResponseUtils; - @RestController -@Tag(name = "Other", description = "Other APIs") +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") public class ExtractImageScansController { private static final Logger logger = LoggerFactory.getLogger(ExtractImageScansController.class); @@ -46,26 +47,16 @@ public class ExtractImageScansController { @Operation(summary = "Extract image scans from an input file", description = "This endpoint extracts image scans from a given file based on certain parameters. Users can specify angle threshold, tolerance, minimum area, minimum contour area, and border size. Input:PDF Output:IMAGE/ZIP Type:SIMO") public ResponseEntity extractImageScans( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input file containing image scans") - MultipartFile inputFile, - @RequestParam(name = "angle_threshold", defaultValue = "5") - @Parameter(description = "The angle threshold for the image scan extraction", example = "5") - int angleThreshold, - @RequestParam(name = "tolerance", defaultValue = "20") - @Parameter(description = "The tolerance for the image scan extraction", example = "20") - int tolerance, - @RequestParam(name = "min_area", defaultValue = "8000") - @Parameter(description = "The minimum area for the image scan extraction", example = "8000") - int minArea, - @RequestParam(name = "min_contour_area", defaultValue = "500") - @Parameter(description = "The minimum contour area for the image scan extraction", example = "500") - int minContourArea, - @RequestParam(name = "border_size", defaultValue = "1") - @Parameter(description = "The border size for the image scan extraction", example = "1") - int borderSize) throws IOException, InterruptedException { - - String fileName = inputFile.getOriginalFilename(); + @RequestBody( + description = "Form data containing file and extraction parameters", + required = true, + content = @Content( + mediaType = "multipart/form-data", + schema = @Schema(implementation = ExtractImageScansRequest.class) // This should represent your form's structure + ) + ) + ExtractImageScansRequest form) throws IOException, InterruptedException { + String fileName = form.getFileInput().getOriginalFilename(); String extension = fileName.substring(fileName.lastIndexOf(".") + 1); List images = new ArrayList<>(); @@ -73,7 +64,7 @@ public class ExtractImageScansController { // Check if input file is a PDF if (extension.equalsIgnoreCase("pdf")) { // Load PDF document - try (PDDocument document = PDDocument.load(new ByteArrayInputStream(inputFile.getBytes()))) { + try (PDDocument document = PDDocument.load(new ByteArrayInputStream(form.getFileInput().getBytes()))) { PDFRenderer pdfRenderer = new PDFRenderer(document); int pageCount = document.getNumberOfPages(); images = new ArrayList<>(); @@ -93,7 +84,7 @@ public class ExtractImageScansController { } } else { Path tempInputFile = Files.createTempFile("input_", "." + extension); - Files.copy(inputFile.getInputStream(), tempInputFile, StandardCopyOption.REPLACE_EXISTING); + Files.copy(form.getFileInput().getInputStream(), tempInputFile, StandardCopyOption.REPLACE_EXISTING); // Add input file path to images list images.add(tempInputFile.toString()); } @@ -109,11 +100,11 @@ public class ExtractImageScansController { "./scripts/split_photos.py", images.get(i), tempDir.toString(), - "--angle_threshold", String.valueOf(angleThreshold), - "--tolerance", String.valueOf(tolerance), - "--min_area", String.valueOf(minArea), - "--min_contour_area", String.valueOf(minContourArea), - "--border_size", String.valueOf(borderSize) + "--angle_threshold", String.valueOf(form.getAngleThreshold()), + "--tolerance", String.valueOf(form.getTolerance()), + "--min_area", String.valueOf(form.getMinArea()), + "--min_contour_area", String.valueOf(form.getMinContourArea()), + "--border_size", String.valueOf(form.getBorderSize()) )); diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/ExtractImagesController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java similarity index 82% rename from src/main/java/stirling/software/SPDF/controller/api/other/ExtractImagesController.java rename to src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java index c10dd7b4e..6e18f1f27 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/ExtractImagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java @@ -1,11 +1,12 @@ -package stirling.software.SPDF.controller.api.other; - +package stirling.software.SPDF.controller.api.misc; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.util.HashSet; +import java.util.Set; import java.util.zip.Deflater; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -20,19 +21,19 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.PDFWithImageFormatRequest; import stirling.software.SPDF.utils.WebResponseUtils; @RestController -@Tag(name = "Other", description = "Other APIs") +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") public class ExtractImagesController { private static final Logger logger = LoggerFactory.getLogger(ExtractImagesController.class); @@ -40,13 +41,9 @@ public class ExtractImagesController { @PostMapping(consumes = "multipart/form-data", value = "/extract-images") @Operation(summary = "Extract images from a PDF file", description = "This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format. Input:PDF Output:IMAGE/ZIP Type:SIMO") - public ResponseEntity extractImages( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file containing images") - MultipartFile file, - @RequestParam("format") - @Parameter(description = "The output image format e.g., 'png', 'jpeg', or 'gif'", schema = @Schema(allowableValues = {"png", "jpeg", "gif"})) - String format) throws IOException { + public ResponseEntity extractImages(@ModelAttribute PDFWithImageFormatRequest request) throws IOException { + MultipartFile file = request.getFileInput(); + String format = request.getFormat(); System.out.println(System.currentTimeMillis() + "file=" + file.getName() + ", format=" + format); PDDocument document = PDDocument.load(file.getBytes()); @@ -62,7 +59,8 @@ public class ExtractImagesController { int imageIndex = 1; String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); - int pageNum = 1; + int pageNum = 0; + Set processedImages = new HashSet<>(); // Iterate over each page for (PDPage page : document.getPages()) { ++pageNum; @@ -70,7 +68,12 @@ public class ExtractImagesController { for (COSName name : page.getResources().getXObjectNames()) { if (page.getResources().isImageXObject(name)) { PDImageXObject image = (PDImageXObject) page.getResources().getXObject(name); - + int imageHash = image.hashCode(); + if(processedImages.contains(imageHash)) { + continue; // Skip already processed images + } + processedImages.add(imageHash); + // Convert image to desired format RenderedImage renderedImage = image.getImage(); BufferedImage bufferedImage = null; diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/FakeScanControllerWIP.java b/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java similarity index 88% rename from src/main/java/stirling/software/SPDF/controller/api/other/FakeScanControllerWIP.java rename to src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java index 7a25d28c6..099e84116 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/FakeScanControllerWIP.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java @@ -1,4 +1,4 @@ -package stirling.software.SPDF.controller.api.other; +package stirling.software.SPDF.controller.api.misc; import java.awt.Color; import java.awt.geom.AffineTransform; @@ -9,9 +9,11 @@ import java.awt.image.BufferedImageOp; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; import java.awt.image.RescaleOp; +import java.io.ByteArrayOutputStream; //Required for file input/output import java.io.File; import java.io.IOException; +import java.security.SecureRandom; //Other required classes import java.util.Random; @@ -29,21 +31,21 @@ import org.apache.pdfbox.rendering.PDFRenderer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.itextpdf.io.source.ByteArrayOutputStream; - import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.utils.WebResponseUtils; @RestController -@Tag(name = "Other", description = "Other APIs") +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") public class FakeScanControllerWIP { private static final Logger logger = LoggerFactory.getLogger(FakeScanControllerWIP.class); @@ -55,10 +57,8 @@ public class FakeScanControllerWIP { summary = "Repair a PDF file", description = "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response." ) - public ResponseEntity repairPdf( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file to be repaired", required = true) - MultipartFile inputFile) throws IOException, InterruptedException { + public ResponseEntity repairPdf(@ModelAttribute PDFFile request) throws IOException { + MultipartFile inputFile = request.getFileInput(); PDDocument document = PDDocument.load(inputFile.getBytes()); PDFRenderer pdfRenderer = new PDFRenderer(document); @@ -86,7 +86,7 @@ public class FakeScanControllerWIP { op.filter(sourceImage, destinationImage); // Apply a rotation effect - double rotationRequired = Math.toRadians((new Random().nextInt(3 - 1) + 1)); // Random angle between 1 and 3 degrees + double rotationRequired = Math.toRadians((new SecureRandom().nextInt(3 - 1) + 1)); // Random angle between 1 and 3 degrees double locationX = destinationImage.getWidth() / 2; double locationY = destinationImage.getHeight() / 2; AffineTransform tx = AffineTransform.getRotateInstance(rotationRequired, locationX, locationY); @@ -104,7 +104,7 @@ public class FakeScanControllerWIP { destinationImage = blurOp.filter(destinationImage, null); // Add noise to the image based on the "dirtiness" - Random random = new Random(); + Random random = new SecureRandom(); for (int y = 0; y < destinationImage.getHeight(); y++) { for (int x = 0; x < destinationImage.getWidth(); x++) { if (random.nextInt(100) < dirtiness) { diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/MetadataController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java similarity index 68% rename from src/main/java/stirling/software/SPDF/controller/api/other/MetadataController.java rename to src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java index e3979d10d..027c6240c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/MetadataController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java @@ -1,4 +1,4 @@ -package stirling.software.SPDF.controller.api.other; +package stirling.software.SPDF.controller.api.misc; import java.io.IOException; import java.text.ParseException; @@ -11,19 +11,20 @@ import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocumentInformation; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.misc.MetadataRequest; import stirling.software.SPDF.utils.WebResponseUtils; @RestController -@Tag(name = "Other", description = "Other APIs") +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") public class MetadataController { @@ -41,44 +42,28 @@ public class MetadataController { @PostMapping(consumes = "multipart/form-data", value = "/update-metadata") @Operation(summary = "Update metadata of a PDF file", description = "This endpoint allows you to update the metadata of a given PDF file. You can add, modify, or delete standard and custom metadata fields. Input:PDF Output:PDF Type:SISO") - public ResponseEntity metadata( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file to update metadata") - MultipartFile pdfFile, - @RequestParam(value = "deleteAll", required = false, defaultValue = "false") - @Parameter(description = "Delete all metadata if set to true") - Boolean deleteAll, - @RequestParam(value = "author", required = false) - @Parameter(description = "The author of the document") - String author, - @RequestParam(value = "creationDate", required = false) - @Parameter(description = "The creation date of the document (format: yyyy/MM/dd HH:mm:ss)") - String creationDate, - @RequestParam(value = "creator", required = false) - @Parameter(description = "The creator of the document") - String creator, - @RequestParam(value = "keywords", required = false) - @Parameter(description = "The keywords for the document") - String keywords, - @RequestParam(value = "modificationDate", required = false) - @Parameter(description = "The modification date of the document (format: yyyy/MM/dd HH:mm:ss)") - String modificationDate, - @RequestParam(value = "producer", required = false) - @Parameter(description = "The producer of the document") - String producer, - @RequestParam(value = "subject", required = false) - @Parameter(description = "The subject of the document") - String subject, - @RequestParam(value = "title", required = false) - @Parameter(description = "The title of the document") - String title, - @RequestParam(value = "trapped", required = false) - @Parameter(description = "The trapped status of the document") - String trapped, - @Parameter(description = "Map list of key and value of custom parameters, note these must start with customKey and customValue if they are non standard") - @RequestParam Map allRequestParams) - throws IOException { + public ResponseEntity metadata(@ModelAttribute MetadataRequest request) throws IOException { + + // Extract PDF file from the request object + MultipartFile pdfFile = request.getFileInput(); + // Extract metadata information + Boolean deleteAll = request.isDeleteAll(); + String author = request.getAuthor(); + String creationDate = request.getCreationDate(); + String creator = request.getCreator(); + String keywords = request.getKeywords(); + String modificationDate = request.getModificationDate(); + String producer = request.getProducer(); + String subject = request.getSubject(); + String title = request.getTitle(); + String trapped = request.getTrapped(); + + // Extract additional custom parameters + Map allRequestParams = request.getAllRequestParams(); + if(allRequestParams == null) { + allRequestParams = new java.util.HashMap(); + } // Load the PDF file into a PDDocument PDDocument document = PDDocument.load(pdfFile.getBytes()); diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/OCRController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java similarity index 75% rename from src/main/java/stirling/software/SPDF/controller/api/other/OCRController.java rename to src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java index d6009c8ac..5ea1818e3 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/OCRController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java @@ -1,4 +1,4 @@ -package stirling.software.SPDF.controller.api.other; +package stirling.software.SPDF.controller.api.misc; import java.io.File; import java.io.FileOutputStream; @@ -18,28 +18,28 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.misc.ProcessPdfWithOcrRequest; import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; import stirling.software.SPDF.utils.WebResponseUtils; @RestController -@Tag(name = "Other", description = "Other APIs") +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") public class OCRController { private static final Logger logger = LoggerFactory.getLogger(OCRController.class); public List getAvailableTesseractLanguages() { - String tessdataDir = "/usr/share/tesseract-ocr/4.00/tessdata"; + String tessdataDir = "/usr/share/tesseract-ocr/5/tessdata"; File[] files = new File(tessdataDir).listFiles(); if (files == null) { return Collections.emptyList(); @@ -51,35 +51,16 @@ public class OCRController { @PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf") @Operation(summary = "Process a PDF file with OCR", description = "This endpoint processes a PDF file using OCR (Optical Character Recognition). Users can specify languages, sidecar, deskew, clean, cleanFinal, ocrType, ocrRenderType, and removeImagesAfter options. Input:PDF Output:PDF Type:SI-Conditional") - public ResponseEntity processPdfWithOCR( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file to be processed with OCR") - MultipartFile inputFile, - @RequestParam("languages") - @Parameter(description = "List of languages to use in OCR processing") - List selectedLanguages, - @RequestParam(name = "sidecar", required = false) - @Parameter(description = "Include OCR text in a sidecar text file if set to true") - Boolean sidecar, - @RequestParam(name = "deskew", required = false) - @Parameter(description = "Deskew the input file if set to true") - Boolean deskew, - @RequestParam(name = "clean", required = false) - @Parameter(description = "Clean the input file if set to true") - Boolean clean, - @RequestParam(name = "clean-final", required = false) - @Parameter(description = "Clean the final output if set to true") - Boolean cleanFinal, - @RequestParam(name = "ocrType", required = false) - @Parameter(description = "Specify the OCR type, e.g., 'skip-text', 'force-ocr', or 'Normal'", schema = @Schema(allowableValues = {"skip-text", "force-ocr", "Normal"})) - String ocrType, - @RequestParam(name = "ocrRenderType", required = false, defaultValue = "hocr") - @Parameter(description = "Specify the OCR render type, either 'hocr' or 'sandwich'", schema = @Schema(allowableValues = {"hocr", "sandwich"})) - String ocrRenderType, - @RequestParam(name = "removeImagesAfter", required = false) - @Parameter(description = "Remove images from the output PDF if set to true") - Boolean removeImagesAfter) throws IOException, InterruptedException { - + public ResponseEntity processPdfWithOCR(@ModelAttribute ProcessPdfWithOcrRequest request) throws IOException, InterruptedException { + MultipartFile inputFile = request.getFileInput(); + List selectedLanguages = request.getLanguages(); + Boolean sidecar = request.isSidecar(); + Boolean deskew = request.isDeskew(); + Boolean clean = request.isClean(); + Boolean cleanFinal = request.isCleanFinal(); + String ocrType = request.getOcrType(); + String ocrRenderType = request.getOcrRenderType(); + Boolean removeImagesAfter = request.isRemoveImagesAfter(); // --output-type pdfa if (selectedLanguages == null || selectedLanguages.isEmpty()) { throw new IOException("Please select at least one language."); diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/OverlayImageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java similarity index 57% rename from src/main/java/stirling/software/SPDF/controller/api/other/OverlayImageController.java rename to src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java index 61768f6a1..e28f7535d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/OverlayImageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java @@ -1,4 +1,4 @@ -package stirling.software.SPDF.controller.api.other; +package stirling.software.SPDF.controller.api.misc; import java.io.IOException; @@ -6,20 +6,21 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.misc.OverlayImageRequest; import stirling.software.SPDF.utils.PdfUtils; import stirling.software.SPDF.utils.WebResponseUtils; @RestController -@Tag(name = "Other", description = "Other APIs") +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") public class OverlayImageController { private static final Logger logger = LoggerFactory.getLogger(OverlayImageController.class); @@ -29,22 +30,12 @@ public class OverlayImageController { summary = "Overlay image onto a PDF file", description = "This endpoint overlays an image onto a PDF file at the specified coordinates. The image can be overlaid on every page of the PDF if specified. Input:PDF/IMAGE Output:PDF Type:MF-SISO" ) - public ResponseEntity overlayImage( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file to overlay the image onto.", required = true) - MultipartFile pdfFile, - @RequestParam("fileInput2") - @Parameter(description = "The image file to be overlaid onto the PDF.", required = true) - MultipartFile imageFile, - @RequestParam("x") - @Parameter(description = "The x-coordinate at which to place the top-left corner of the image.", example = "0") - float x, - @RequestParam("y") - @Parameter(description = "The y-coordinate at which to place the top-left corner of the image.", example = "0") - float y, - @RequestParam("everyPage") - @Parameter(description = "Whether to overlay the image onto every page of the PDF.", example = "false") - boolean everyPage) { + public ResponseEntity overlayImage(@ModelAttribute OverlayImageRequest request) { + MultipartFile pdfFile = request.getFileInput(); + MultipartFile imageFile = request.getImageFile(); + float x = request.getX(); + float y = request.getY(); + boolean everyPage = request.isEveryPage(); try { byte[] pdfBytes = pdfFile.getBytes(); byte[] imageBytes = imageFile.getBytes(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java new file mode 100644 index 000000000..61a1ec97d --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java @@ -0,0 +1,135 @@ +package stirling.software.SPDF.controller.api.misc; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; + +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.misc.AddPageNumbersRequest; +import stirling.software.SPDF.utils.GeneralUtils; +import stirling.software.SPDF.utils.WebResponseUtils; + +@RestController +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") +public class PageNumbersController { + + private static final Logger logger = LoggerFactory.getLogger(PageNumbersController.class); + + @PostMapping(value = "/add-page-numbers", consumes = "multipart/form-data") + @Operation(summary = "Add page numbers to a PDF document", description = "This operation takes an input PDF file and adds page numbers to it. Input:PDF Output:PDF Type:SISO") + public ResponseEntity addPageNumbers(@ModelAttribute AddPageNumbersRequest request) throws IOException { + MultipartFile file = request.getFileInput(); + String customMargin = request.getCustomMargin(); + int position = request.getPosition(); + int startingNumber = request.getStartingNumber(); + String pagesToNumber = request.getPagesToNumber(); + String customText = request.getCustomText(); + int pageNumber = startingNumber; + byte[] fileBytes = file.getBytes(); + PDDocument document = PDDocument.load(fileBytes); + + float marginFactor; + switch (customMargin.toLowerCase()) { + case "small": + marginFactor = 0.02f; + break; + case "medium": + marginFactor = 0.035f; + break; + case "large": + marginFactor = 0.05f; + break; + case "x-large": + marginFactor = 0.075f; + break; + + + default: + marginFactor = 0.035f; + break; + } + + float fontSize = 12.0f; + PDType1Font font = PDType1Font.HELVETICA; + if(pagesToNumber == null || pagesToNumber.length() == 0) { + pagesToNumber = "all"; + } + if(customText == null || customText.length() == 0) { + customText = "{n}"; + } + List pagesToNumberList = GeneralUtils.parsePageList(pagesToNumber.split(","), document.getNumberOfPages()); + + for (int i : pagesToNumberList) { + PDPage page = document.getPage(i); + PDRectangle pageSize = page.getMediaBox(); + + String text = customText != null ? customText.replace("{n}", String.valueOf(pageNumber)).replace("{total}", String.valueOf(document.getNumberOfPages())).replace("{filename}", file.getOriginalFilename().replaceFirst("[.][^.]+$", "")) : String.valueOf(pageNumber); + + float x, y; + + int xGroup = (position - 1) % 3; + int yGroup = 2 - (position - 1) / 3; + + switch (xGroup) { + case 0: // left + x = pageSize.getLowerLeftX() + marginFactor * pageSize.getWidth(); + break; + case 1: // center + x = pageSize.getLowerLeftX() + (pageSize.getWidth() / 2); + break; + default: // right + x = pageSize.getUpperRightX() - marginFactor * pageSize.getWidth(); + break; + } + + switch (yGroup) { + case 0: // bottom + y = pageSize.getLowerLeftY() + marginFactor * pageSize.getHeight(); + break; + case 1: // middle + y = pageSize.getLowerLeftY() + (pageSize.getHeight() / 2); + break; + default: // top + y = pageSize.getUpperRightY() - marginFactor * pageSize.getHeight(); + break; + } + + PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true); + contentStream.beginText(); + contentStream.setFont(font, fontSize); + contentStream.newLineAtOffset(x, y); + contentStream.showText(text); + contentStream.endText(); + contentStream.close(); + + pageNumber++; + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + document.save(baos); + document.close(); + + return WebResponseUtils.bytesToWebResponse(baos.toByteArray(), file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_numbersAdded.pdf", MediaType.APPLICATION_PDF); + + } + + + +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/RepairController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java similarity index 82% rename from src/main/java/stirling/software/SPDF/controller/api/other/RepairController.java rename to src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java index 52644080c..f9ae541d1 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/RepairController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java @@ -1,4 +1,4 @@ -package stirling.software.SPDF.controller.api.other; +package stirling.software.SPDF.controller.api.misc; import java.io.IOException; import java.nio.file.Files; @@ -9,20 +9,22 @@ import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; import stirling.software.SPDF.utils.WebResponseUtils; @RestController -@Tag(name = "Other", description = "Other APIs") +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") public class RepairController { private static final Logger logger = LoggerFactory.getLogger(RepairController.class); @@ -32,11 +34,8 @@ public class RepairController { summary = "Repair a PDF file", description = "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response. Input:PDF Output:PDF Type:SISO" ) - public ResponseEntity repairPdf( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file to be repaired", required = true) - MultipartFile inputFile) throws IOException, InterruptedException { - + public ResponseEntity repairPdf(@ModelAttribute PDFFile request) throws IOException, InterruptedException { + MultipartFile inputFile = request.getFileInput(); // Save the uploaded file to a temporary location Path tempInputFile = Files.createTempFile("input_", ".pdf"); inputFile.transferTo(tempInputFile.toFile()); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java new file mode 100644 index 000000000..274313465 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java @@ -0,0 +1,61 @@ +package stirling.software.SPDF.controller.api.misc; + +import java.nio.charset.StandardCharsets; +import java.util.Map; + +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.common.PDNameTreeNode; +import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.PDFFile; +import stirling.software.SPDF.utils.WebResponseUtils; +@RestController +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous APIs") +public class ShowJavascript { + + private static final Logger logger = LoggerFactory.getLogger(ShowJavascript.class); + @PostMapping(consumes = "multipart/form-data", value = "/show-javascript") + public ResponseEntity extractHeader(@ModelAttribute PDFFile request) throws Exception { + MultipartFile inputFile = request.getFileInput(); + String script = ""; + + try (PDDocument document = PDDocument.load(inputFile.getInputStream())) { + + if(document.getDocumentCatalog() != null && document.getDocumentCatalog().getNames() != null) { + PDNameTreeNode jsTree = document.getDocumentCatalog().getNames().getJavaScript(); + + if (jsTree != null) { + Map jsEntries = jsTree.getNames(); + + for (Map.Entry entry : jsEntries.entrySet()) { + String name = entry.getKey(); + PDActionJavaScript jsAction = entry.getValue(); + String jsCodeStr = jsAction.getAction(); + + script += "// File: " + inputFile.getOriginalFilename() + ", Script: " + name + "\n" + jsCodeStr + "\n"; + } + } + } + + if (script.isEmpty()) { + script = "PDF '" + inputFile.getOriginalFilename() + "' does not contain Javascript"; + } + + return WebResponseUtils.bytesToWebResponse(script.getBytes(StandardCharsets.UTF_8), inputFile.getOriginalFilename() + ".js"); + } + } + + + + +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/PageNumbersController.java b/src/main/java/stirling/software/SPDF/controller/api/other/PageNumbersController.java deleted file mode 100644 index 14288c833..000000000 --- a/src/main/java/stirling/software/SPDF/controller/api/other/PageNumbersController.java +++ /dev/null @@ -1,148 +0,0 @@ -package stirling.software.SPDF.controller.api.other; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.net.URLEncoder; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import com.itextpdf.io.font.constants.StandardFonts; -import com.itextpdf.kernel.font.PdfFont; -import com.itextpdf.kernel.font.PdfFontFactory; -import com.itextpdf.kernel.geom.Rectangle; -import com.itextpdf.kernel.pdf.PdfDocument; -import com.itextpdf.kernel.pdf.PdfPage; -import com.itextpdf.kernel.pdf.PdfReader; -import com.itextpdf.kernel.pdf.PdfWriter; -import com.itextpdf.kernel.pdf.canvas.PdfCanvas; -import com.itextpdf.layout.Canvas; -import com.itextpdf.layout.element.Paragraph; -import com.itextpdf.layout.properties.TextAlignment; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.utils.GeneralUtils; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@Tag(name = "Other", description = "Other APIs") -public class PageNumbersController { - - private static final Logger logger = LoggerFactory.getLogger(PageNumbersController.class); - - @PostMapping(value = "/add-page-numbers", consumes = "multipart/form-data") - @Operation(summary = "Add page numbers to a PDF document", description = "This operation takes an input PDF file and adds page numbers to it. Input:PDF Output:PDF Type:SISO") - public ResponseEntity addPageNumbers( - @Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file, - @Parameter(description = "Custom margin: small/medium/large", required = true, schema = @Schema(type = "string", allowableValues = {"small", "medium", "large"})) @RequestParam("customMargin") String customMargin, - @Parameter(description = "Position: 1 of 9 positions", required = true, schema = @Schema(type = "integer", minimum = "1", maximum = "9")) @RequestParam("position") int position, - @Parameter(description = "Starting number", required = true, schema = @Schema(type = "integer", minimum = "1")) @RequestParam("startingNumber") int startingNumber, - @Parameter(description = "Which pages to number, default all", required = false, schema = @Schema(type = "string")) @RequestParam(value = "pagesToNumber", required = false) String pagesToNumber, - @Parameter(description = "Custom text: defaults to just number but can have things like \"Page {n} of {p}\"", required = false, schema = @Schema(type = "string")) @RequestParam(value = "customText", required = false) String customText) - throws IOException { - - byte[] fileBytes = file.getBytes(); - ByteArrayInputStream bais = new ByteArrayInputStream(fileBytes); - - int pageNumber = startingNumber; - float marginFactor; - switch (customMargin.toLowerCase()) { - case "small": - marginFactor = 0.02f; - break; - case "medium": - marginFactor = 0.035f; - break; - case "large": - marginFactor = 0.05f; - break; - case "x-large": - marginFactor = 0.1f; - break; - default: - marginFactor = 0.035f; - break; - } - - float fontSize = 12.0f; - - PdfReader reader = new PdfReader(bais); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PdfWriter writer = new PdfWriter(baos); - - PdfDocument pdfDoc = new PdfDocument(reader, writer); - - List pagesToNumberList = GeneralUtils.parsePageList(pagesToNumber.split(","), pdfDoc.getNumberOfPages()); - - for (int i : pagesToNumberList) { - PdfPage page = pdfDoc.getPage(i+1); - Rectangle pageSize = page.getPageSize(); - PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), pdfDoc); - - String text = customText != null ? customText.replace("{n}", String.valueOf(pageNumber)).replace("{total}", String.valueOf(pdfDoc.getNumberOfPages())).replace("{filename}", file.getOriginalFilename().replaceFirst("[.][^.]+$", "")) : String.valueOf(pageNumber); - - PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA); - float textWidth = font.getWidth(text, fontSize); - float textHeight = font.getAscent(text, fontSize) - font.getDescent(text, fontSize); - - float x, y; - TextAlignment alignment; - - int xGroup = (position - 1) % 3; - int yGroup = 2 - (position - 1) / 3; - - switch (xGroup) { - case 0: // left - x = pageSize.getLeft() + marginFactor * pageSize.getWidth(); - alignment = TextAlignment.LEFT; - break; - case 1: // center - x = pageSize.getLeft() + (pageSize.getWidth()) / 2; - alignment = TextAlignment.CENTER; - break; - default: // right - x = pageSize.getRight() - marginFactor * pageSize.getWidth(); - alignment = TextAlignment.RIGHT; - break; - } - - switch (yGroup) { - case 0: // bottom - y = pageSize.getBottom() + marginFactor * pageSize.getHeight(); - break; - case 1: // middle - y = pageSize.getBottom() + (pageSize.getHeight() ) / 2; - break; - default: // top - y = pageSize.getTop() - marginFactor * pageSize.getHeight(); - break; - } - - new Canvas(pdfCanvas, page.getPageSize()) - .showTextAligned(new Paragraph(text).setFont(font).setFontSize(fontSize), x, y, alignment); - - pageNumber++; - } - - - pdfDoc.close(); - byte[] resultBytes = baos.toByteArray(); - - return WebResponseUtils.bytesToWebResponse(resultBytes, URLEncoder.encode(file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_numbersAdded.pdf", "UTF-8"), MediaType.APPLICATION_PDF); - - } - - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/ShowJavascript.java b/src/main/java/stirling/software/SPDF/controller/api/other/ShowJavascript.java deleted file mode 100644 index 122a1871b..000000000 --- a/src/main/java/stirling/software/SPDF/controller/api/other/ShowJavascript.java +++ /dev/null @@ -1,85 +0,0 @@ -package stirling.software.SPDF.controller.api.other; - -import java.nio.charset.StandardCharsets; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import com.itextpdf.kernel.pdf.PdfArray; -import com.itextpdf.kernel.pdf.PdfDictionary; -import com.itextpdf.kernel.pdf.PdfDocument; -import com.itextpdf.kernel.pdf.PdfName; -import com.itextpdf.kernel.pdf.PdfObject; -import com.itextpdf.kernel.pdf.PdfReader; -import com.itextpdf.kernel.pdf.PdfStream; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.utils.WebResponseUtils; -@RestController -@Tag(name = "Other", description = "Other APIs") -public class ShowJavascript { - - private static final Logger logger = LoggerFactory.getLogger(ShowJavascript.class); - @PostMapping(consumes = "multipart/form-data", value = "/show-javascript") - @Operation(summary = "Extract header from PDF file", description = "This endpoint accepts a PDF file and attempts to extract its title or header based on heuristics. Input:PDF Output:PDF Type:SISO") - public ResponseEntity extractHeader( - @RequestPart(value = "fileInput") @Parameter(description = "The input PDF file from which the javascript is to be extracted.", required = true) MultipartFile inputFile) - throws Exception { - - try ( - PdfDocument itextDoc = new PdfDocument(new PdfReader(inputFile.getInputStream())) - ) { - - String name = ""; - String script = ""; - String entryName = "File: "+inputFile.getOriginalFilename() + ", Script: "; - //Javascript - PdfDictionary namesDict = itextDoc.getCatalog().getPdfObject().getAsDictionary(PdfName.Names); - if (namesDict != null) { - PdfDictionary javascriptDict = namesDict.getAsDictionary(PdfName.JavaScript); - if (javascriptDict != null) { - - PdfArray namesArray = javascriptDict.getAsArray(PdfName.Names); - for (int i = 0; i < namesArray.size(); i += 2) { - if(namesArray.getAsString(i) != null) - name = namesArray.getAsString(i).toString(); - - PdfObject jsCode = namesArray.get(i+1); - if (jsCode instanceof PdfStream) { - byte[] jsCodeBytes = ((PdfStream)jsCode).getBytes(); - String jsCodeStr = new String(jsCodeBytes, StandardCharsets.UTF_8); - script = "//" + entryName + name + "\n" +jsCodeStr; - - } else if (jsCode instanceof PdfDictionary) { - // If the JS code is in a dictionary, you'll need to know the key to use. - // Assuming the key is PdfName.JS: - PdfStream jsCodeStream = ((PdfDictionary)jsCode).getAsStream(PdfName.JS); - if (jsCodeStream != null) { - byte[] jsCodeBytes = jsCodeStream.getBytes(); - String jsCodeStr = new String(jsCodeBytes, StandardCharsets.UTF_8); - script = "//" + entryName + name + "\n" +jsCodeStr; - } - } - } - - } - } - if(script.equals("")) { - script = "PDF '" +inputFile.getOriginalFilename() + "' does not contain Javascript"; - } - return WebResponseUtils.bytesToWebResponse(script.getBytes(), name + ".js"); - } - - } - - - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java index d5a503294..c12fe7246 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java @@ -37,9 +37,9 @@ import org.springframework.http.ResponseEntity; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; @@ -51,9 +51,11 @@ import io.swagger.v3.oas.annotations.tags.Tag; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineOperation; +import stirling.software.SPDF.model.api.HandleDataRequest; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/pipeline") @Tag(name = "Pipeline", description = "Pipeline APIs") public class PipelineController { @@ -418,8 +420,9 @@ public class PipelineController { } @PostMapping("/handleData") - public ResponseEntity handleData(@RequestPart("fileInput") MultipartFile[] files, - @RequestParam("json") String jsonString) { + public ResponseEntity handleData(@ModelAttribute HandleDataRequest request) { + MultipartFile[] files = request.getFileInputs(); + String jsonString = request.getJsonString(); logger.info("Received POST request to /handleData with {} files", files.length); try { List outputFiles = handleFiles(files, jsonString); diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java index 55000dc77..b0e5f2aa7 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java @@ -3,294 +3,256 @@ package stirling.software.SPDF.controller.api.security; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; import java.security.KeyFactory; import java.security.KeyStore; -import java.security.Principal; import java.security.PrivateKey; import java.security.Security; -import java.security.cert.Certificate; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.spec.PKCS8EncodedKeySpec; import java.text.SimpleDateFormat; -import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; import java.util.Date; -import java.util.List; +import org.apache.commons.io.IOUtils; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.PDResources; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream; +import org.apache.pdfbox.pdmodel.interactive.digitalsignature.ExternalSigningSupport; +import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature; +import org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureOptions; +import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; +import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; +import org.bouncycastle.cert.jcajce.JcaCertStore; +import org.bouncycastle.cms.CMSProcessableByteArray; +import org.bouncycastle.cms.CMSSignedData; +import org.bouncycastle.cms.CMSSignedDataGenerator; +import org.bouncycastle.cms.CMSTypedData; +import org.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder; import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.operator.ContentSigner; +import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; +import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder; import org.bouncycastle.util.io.pem.PemReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.itextpdf.io.font.constants.StandardFonts; -import com.itextpdf.kernel.font.PdfFont; -import com.itextpdf.kernel.font.PdfFontFactory; -import com.itextpdf.kernel.geom.Rectangle; -import com.itextpdf.kernel.pdf.PdfDocument; -import com.itextpdf.kernel.pdf.PdfPage; -import com.itextpdf.kernel.pdf.PdfReader; -import com.itextpdf.kernel.pdf.StampingProperties; -import com.itextpdf.signatures.BouncyCastleDigest; -import com.itextpdf.signatures.DigestAlgorithms; -import com.itextpdf.signatures.IExternalDigest; -import com.itextpdf.signatures.IExternalSignature; -import com.itextpdf.signatures.PdfPKCS7; -import com.itextpdf.signatures.PdfSignatureAppearance; -import com.itextpdf.signatures.PdfSigner; -import com.itextpdf.signatures.PrivateKeySignature; -import com.itextpdf.signatures.SignatureUtil; - import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.security.SignPDFWithCertRequest; import stirling.software.SPDF.utils.WebResponseUtils; + @RestController +@RequestMapping("/api/v1/security") @Tag(name = "Security", description = "Security APIs") public class CertSignController { - private static final Logger logger = LoggerFactory.getLogger(CertSignController.class); + private static final Logger logger = LoggerFactory.getLogger(CertSignController.class); - static { - Security.addProvider(new BouncyCastleProvider()); - } + static { + Security.addProvider(new BouncyCastleProvider()); + } - @PostMapping(consumes = "multipart/form-data", value = "/cert-sign") - @Operation(summary = "Sign PDF with a Digital Certificate", - description = "This endpoint accepts a PDF file, a digital certificate and related information to sign the PDF. It then returns the digitally signed PDF file. Input:PDF Output:PDF Type:MF-SISO") - public ResponseEntity signPDF( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file to be signed") - MultipartFile pdf, + @PostMapping(consumes = "multipart/form-data", value = "/cert-sign") + @Operation(summary = "Sign PDF with a Digital Certificate", description = "This endpoint accepts a PDF file, a digital certificate and related information to sign the PDF. It then returns the digitally signed PDF file. Input:PDF Output:PDF Type:MF-SISO") + public ResponseEntity signPDFWithCert(@ModelAttribute SignPDFWithCertRequest request) throws Exception { + MultipartFile pdf = request.getFileInput(); + String certType = request.getCertType(); + MultipartFile privateKeyFile = request.getPrivateKeyFile(); + MultipartFile certFile = request.getCertFile(); + MultipartFile p12File = request.getP12File(); + String password = request.getPassword(); + Boolean showSignature = request.isShowSignature(); + String reason = request.getReason(); + String location = request.getLocation(); + String name = request.getName(); + Integer pageNumber = request.getPageNumber(); - @RequestParam(value = "certType", required = false) - @Parameter(description = "The type of the digital certificate", schema = @Schema(allowableValues = {"PKCS12", "PEM"})) - String certType, + PrivateKey privateKey = null; + X509Certificate cert = null; - @RequestParam(value = "key", required = false) - @Parameter(description = "The private key for the digital certificate (required for PEM type certificates)") - MultipartFile privateKeyFile, + if (certType != null) { + logger.info("Cert type provided: {}", certType); + switch (certType) { + case "PKCS12": + if (p12File != null) { + KeyStore ks = KeyStore.getInstance("PKCS12"); + ks.load(new ByteArrayInputStream(p12File.getBytes()), password.toCharArray()); + String alias = ks.aliases().nextElement(); + if (!ks.isKeyEntry(alias)) { + throw new IllegalArgumentException("The provided PKCS12 file does not contain a private key."); + } + privateKey = (PrivateKey) ks.getKey(alias, password.toCharArray()); + cert = (X509Certificate) ks.getCertificate(alias); + } + break; + case "PEM": + if (privateKeyFile != null && certFile != null) { + // Load private key + KeyFactory keyFactory = KeyFactory.getInstance("RSA", BouncyCastleProvider.PROVIDER_NAME); + if (isPEM(privateKeyFile.getBytes())) { + privateKey = keyFactory + .generatePrivate(new PKCS8EncodedKeySpec(parsePEM(privateKeyFile.getBytes()))); + } else { + privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyFile.getBytes())); + } - @RequestParam(value = "cert", required = false) - @Parameter(description = "The digital certificate (required for PEM type certificates)") - MultipartFile certFile, + // Load certificate + CertificateFactory certFactory = CertificateFactory.getInstance("X.509", + BouncyCastleProvider.PROVIDER_NAME); + if (isPEM(certFile.getBytes())) { + cert = (X509Certificate) certFactory + .generateCertificate(new ByteArrayInputStream(parsePEM(certFile.getBytes()))); + } else { + cert = (X509Certificate) certFactory + .generateCertificate(new ByteArrayInputStream(certFile.getBytes())); + } + } + break; + } + } + PDSignature signature = new PDSignature(); + signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE); // default filter + signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_SHA1); + signature.setName(name); + signature.setLocation(location); + signature.setReason(reason); + signature.setSignDate(Calendar.getInstance()); + + // Load the PDF + try (PDDocument document = PDDocument.load(pdf.getBytes())) { + logger.info("Successfully loaded the provided PDF"); + SignatureOptions signatureOptions = new SignatureOptions(); - @RequestParam(value = "p12", required = false) - @Parameter(description = "The PKCS12 keystore file (required for PKCS12 type certificates)") - MultipartFile p12File, + // If you want to show the signature - @RequestParam(value = "password", required = false) - @Parameter(description = "The password for the keystore or the private key") - String password, + // ATTEMPT 2 + if (showSignature != null && showSignature) { + PDPage page = document.getPage(pageNumber - 1); - @RequestParam(value = "showSignature", required = false) - @Parameter(description = "Whether to visually show the signature in the PDF file") - Boolean showSignature, + PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm(); + if (acroForm == null) { + acroForm = new PDAcroForm(document); + document.getDocumentCatalog().setAcroForm(acroForm); + } - @RequestParam(value = "reason", required = false) - @Parameter(description = "The reason for signing the PDF") - String reason, + // Create a new signature field and widget - @RequestParam(value = "location", required = false) - @Parameter(description = "The location where the PDF is signed") - String location, + PDSignatureField signatureField = new PDSignatureField(acroForm); + PDAnnotationWidget widget = signatureField.getWidgets().get(0); + PDRectangle rect = new PDRectangle(100, 100, 200, 50); // Define the rectangle size here + widget.setRectangle(rect); + page.getAnnotations().add(widget); - @RequestParam(value = "name", required = false) - @Parameter(description = "The name of the signer") - String name, +// Set the appearance for the signature field + PDAppearanceDictionary appearanceDict = new PDAppearanceDictionary(); + PDAppearanceStream appearanceStream = new PDAppearanceStream(document); + appearanceStream.setResources(new PDResources()); + appearanceStream.setBBox(rect); + appearanceDict.setNormalAppearance(appearanceStream); + widget.setAppearance(appearanceDict); - @RequestParam(value = "pageNumber", required = false) - @Parameter(description = "The page number where the signature should be visible. This is required if showSignature is set to true") - Integer pageNumber) throws Exception { - - BouncyCastleProvider provider = new BouncyCastleProvider(); - Security.addProvider(provider); + try (PDPageContentStream contentStream = new PDPageContentStream(document, appearanceStream)) { + contentStream.beginText(); + contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12); + contentStream.newLineAtOffset(110, 130); + contentStream.showText("Digitally signed by: " + (name != null ? name : "Unknown")); + contentStream.newLineAtOffset(0, -15); + contentStream.showText("Date: " + new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z").format(new Date())); + contentStream.newLineAtOffset(0, -15); + if (reason != null && !reason.isEmpty()) { + contentStream.showText("Reason: " + reason); + contentStream.newLineAtOffset(0, -15); + } + if (location != null && !location.isEmpty()) { + contentStream.showText("Location: " + location); + contentStream.newLineAtOffset(0, -15); + } + contentStream.endText(); + } - PrivateKey privateKey = null; - X509Certificate cert = null; - - if (certType != null) { - switch (certType) { - case "PKCS12": - if (p12File != null) { - KeyStore ks = KeyStore.getInstance("PKCS12"); - ks.load(new ByteArrayInputStream(p12File.getBytes()), password.toCharArray()); - String alias = ks.aliases().nextElement(); - privateKey = (PrivateKey) ks.getKey(alias, password.toCharArray()); - cert = (X509Certificate) ks.getCertificate(alias); - } - break; - case "PEM": - if (privateKeyFile != null && certFile != null) { - // Load private key - KeyFactory keyFactory = KeyFactory.getInstance("RSA", provider); - if (isPEM(privateKeyFile.getBytes())) { - privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(parsePEM(privateKeyFile.getBytes()))); - } else { - privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyFile.getBytes())); - } + // Add the widget annotation to the page + page.getAnnotations().add(widget); - // Load certificate - CertificateFactory certFactory = CertificateFactory.getInstance("X.509", provider); - if (isPEM(certFile.getBytes())) { - cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(parsePEM(certFile.getBytes()))); - } else { - cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(certFile.getBytes())); - } - } - break; - } - } + // Add the signature field to the acroform + acroForm.getFields().add(signatureField); - Principal principal = cert.getSubjectDN(); - String dn = principal.getName(); + // Handle multiple signatures by ensuring a unique field name + String baseFieldName = "Signature"; + String signatureFieldName = baseFieldName; + int suffix = 1; + while (acroForm.getField(signatureFieldName) != null) { + suffix++; + signatureFieldName = baseFieldName + suffix; + } + signatureField.setPartialName(signatureFieldName); + } + + document.addSignature(signature, signatureOptions); + logger.info("Signature added to the PDF document"); + // External signing + ExternalSigningSupport externalSigning = document + .saveIncrementalForExternalSigning(new ByteArrayOutputStream()); - // Extract the "CN" (Common Name) field from the distinguished name (if it's present) - String cn = null; - for (String part : dn.split(",")) { - if (part.trim().startsWith("CN=")) { - cn = part.trim().substring("CN=".length()); - break; - } - } - - // Set up the PDF reader and stamper - PdfReader reader = new PdfReader(new ByteArrayInputStream(pdf.getBytes())); - ByteArrayOutputStream signedPdf = new ByteArrayOutputStream(); - PdfSigner signer = new PdfSigner(reader, signedPdf, new StampingProperties()); + byte[] content = IOUtils.toByteArray(externalSigning.getContent()); - // Set up the signing appearance - PdfSignatureAppearance appearance = signer.getSignatureAppearance() - .setReason("Test") - .setLocation("TestLocation"); + // Using BouncyCastle to sign + CMSTypedData cmsData = new CMSProcessableByteArray(content); - if (showSignature != null && showSignature) { - float fontSize = 4; // the font size of the signature - float marginRight = 36; // Margin from the right - float marginBottom = 36; // Margin from the bottom - String signingDate = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z").format(new Date()); + CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); + ContentSigner signer = new JcaContentSignerBuilder("SHA256withRSA") + .setProvider(BouncyCastleProvider.PROVIDER_NAME).build(privateKey); - // Prepare the text for the digital signature - StringBuilder layer2TextBuilder = new StringBuilder(String.format("Digitally signed by: %s\nDate: %s", - name != null ? name : "Unknown", signingDate)); + gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder( + new JcaDigestCalculatorProviderBuilder().setProvider(BouncyCastleProvider.PROVIDER_NAME).build()) + .build(signer, cert)); - if (reason != null && !reason.isEmpty()) { - layer2TextBuilder.append("\nReason: ").append(reason); - } + gen.addCertificates(new JcaCertStore(Collections.singletonList(cert))); + CMSSignedData signedData = gen.generate(cmsData, false); - if (location != null && !location.isEmpty()) { - layer2TextBuilder.append("\nLocation: ").append(location); - } - String layer2Text = layer2TextBuilder.toString(); - // Get the PDF font and measure the width and height of the text block - PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA_BOLD); - float textWidth = Arrays.stream(layer2Text.split("\n")) - .map(line -> font.getWidth(line, fontSize)) - .max(Float::compare) - .orElse(0f); - int numLines = layer2Text.split("\n").length; - float textHeight = numLines * fontSize; + byte[] cmsSignature = signedData.getEncoded(); + logger.info("About to sign content using BouncyCastle"); + externalSigning.setSignature(cmsSignature); + logger.info("Signature set successfully"); - // Calculate the signature rectangle size - float sigWidth = textWidth + marginRight * 2; - float sigHeight = textHeight + marginBottom * 2; + // After setting the signature, return the resultant PDF + try (ByteArrayOutputStream signedPdfOutput = new ByteArrayOutputStream()) { + document.save(signedPdfOutput); + return WebResponseUtils.boasToWebResponse(signedPdfOutput, + pdf.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_signed.pdf"); - // Get the page size - PdfPage page = signer.getDocument().getPage(1); - Rectangle pageSize = page.getPageSize(); + } catch (Exception e) { + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + } - // Define the position and dimension of the signature field - Rectangle rect = new Rectangle( - pageSize.getRight() - sigWidth - marginRight, - pageSize.getBottom() + marginBottom, - sigWidth, - sigHeight - ); + return null; + } - // Configure the appearance of the digital signature - appearance.setPageRect(rect) - .setContact(name != null ? name : "") - .setPageNumber(pageNumber) - .setReason(reason != null ? reason : "") - .setLocation(location != null ? location : "") - .setReuseAppearance(false) - .setLayer2Text(layer2Text.toString()); - - signer.setFieldName("sig"); - } else { - appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.DESCRIPTION); - } - - // Set up the signer - PrivateKeySignature pks = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256, provider.getName()); - IExternalSignature pss = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256, provider.getName()); - IExternalDigest digest = new BouncyCastleDigest(); - - // Call iTex7 to sign the PDF - signer.signDetached(digest, pks, new Certificate[] {cert}, null, null, null, 0, PdfSigner.CryptoStandard.CMS); - - - System.out.println("Signed PDF size: " + signedPdf.size()); - - System.out.println("PDF signed = " + isPdfSigned(signedPdf.toByteArray())); - return WebResponseUtils.bytesToWebResponse(signedPdf.toByteArray(), "example.pdf"); - } - -public boolean isPdfSigned(byte[] pdfData) throws IOException { - InputStream pdfStream = new ByteArrayInputStream(pdfData); - PdfDocument pdfDoc = new PdfDocument(new PdfReader(pdfStream)); - SignatureUtil signatureUtil = new SignatureUtil(pdfDoc); - List names = signatureUtil.getSignatureNames(); - - boolean isSigned = false; - - for (String name : names) { - PdfPKCS7 pkcs7 = signatureUtil.readSignatureData(name); - if (pkcs7 != null) { - System.out.println("Signature found."); - - // Log certificate details - Certificate[] signChain = pkcs7.getSignCertificateChain(); - for (Certificate cert : signChain) { - if (cert instanceof X509Certificate) { - X509Certificate x509 = (X509Certificate) cert; - System.out.println("Certificate Details:"); - System.out.println("Subject: " + x509.getSubjectDN()); - System.out.println("Issuer: " + x509.getIssuerDN()); - System.out.println("Serial: " + x509.getSerialNumber()); - System.out.println("Not Before: " + x509.getNotBefore()); - System.out.println("Not After: " + x509.getNotAfter()); - } - } - - isSigned = true; - } - } - - pdfDoc.close(); - - return isSigned; -} - private byte[] parsePEM(byte[] content) throws IOException { - PemReader pemReader = new PemReader(new InputStreamReader(new ByteArrayInputStream(content))); - return pemReader.readPemObject().getContent(); - } - - private boolean isPEM(byte[] content) { - String contentStr = new String(content); - return contentStr.contains("-----BEGIN") && contentStr.contains("-----END"); - } - - - + private byte[] parsePEM(byte[] content) throws IOException { + PemReader pemReader = new PemReader(new InputStreamReader(new ByteArrayInputStream(content))); + return pemReader.readPemObject().getContent(); + } + private boolean isPEM(byte[] content) { + String contentStr = new String(content); + return contentStr.contains("-----BEGIN") && contentStr.contains("-----END"); + } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java b/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java index 393ac7ed0..791dc736f 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java @@ -1,7 +1,7 @@ package stirling.software.SPDF.controller.api.security; +import java.io.ByteArrayOutputStream; import java.io.IOException; -import org.apache.pdfbox.pdmodel.encryption.AccessPermission; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -11,53 +11,71 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.pdfbox.cos.COSDocument; +import org.apache.pdfbox.cos.COSInputStream; +import org.apache.pdfbox.cos.COSName; +import org.apache.pdfbox.cos.COSObject; +import org.apache.pdfbox.cos.COSStream; import org.apache.pdfbox.cos.COSString; import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDDocumentCatalog; import org.apache.pdfbox.pdmodel.PDDocumentInformation; +import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary; +import org.apache.pdfbox.pdmodel.PDEmbeddedFilesNameTreeNode; +import org.apache.pdfbox.pdmodel.PDJavascriptNameTreeNode; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDResources; +import org.apache.pdfbox.pdmodel.common.PDMetadata; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.common.PDStream; +import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification; +import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile; import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement; import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureNode; import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureTreeRoot; +import org.apache.pdfbox.pdmodel.encryption.AccessPermission; import org.apache.pdfbox.pdmodel.encryption.PDEncryption; +import org.apache.pdfbox.pdmodel.font.PDFont; +import org.apache.pdfbox.pdmodel.font.PDFontDescriptor; +import org.apache.pdfbox.pdmodel.graphics.PDXObject; +import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace; +import org.apache.pdfbox.pdmodel.graphics.color.PDICCBased; +import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; +import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; +import org.apache.pdfbox.pdmodel.graphics.optionalcontent.PDOptionalContentGroup; +import org.apache.pdfbox.pdmodel.graphics.optionalcontent.PDOptionalContentProperties; +import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript; +import org.apache.pdfbox.pdmodel.interactive.action.PDActionURI; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationFileAttachment; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink; +import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem; +import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineNode; +import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; +import org.apache.pdfbox.pdmodel.interactive.form.PDField; import org.apache.pdfbox.text.PDFTextStripper; +import org.apache.xmpbox.XMPMetadata; +import org.apache.xmpbox.xml.DomXmpParser; +import org.apache.xmpbox.xml.XmpParsingException; +import org.apache.xmpbox.xml.XmpSerializer; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.itextpdf.forms.PdfAcroForm; -import com.itextpdf.forms.fields.PdfFormField; -import com.itextpdf.kernel.geom.Rectangle; -import com.itextpdf.kernel.pdf.PdfArray; -import com.itextpdf.kernel.pdf.PdfCatalog; -import com.itextpdf.kernel.pdf.PdfDictionary; -import com.itextpdf.kernel.pdf.PdfDocument; -import com.itextpdf.kernel.pdf.PdfName; -import com.itextpdf.kernel.pdf.PdfObject; -import com.itextpdf.kernel.pdf.PdfOutline; -import com.itextpdf.kernel.pdf.PdfReader; -import com.itextpdf.kernel.pdf.PdfResources; -import com.itextpdf.kernel.pdf.PdfStream; -import com.itextpdf.kernel.pdf.PdfString; -import com.itextpdf.kernel.pdf.annot.PdfAnnotation; -import com.itextpdf.kernel.pdf.annot.PdfFileAttachmentAnnotation; -import com.itextpdf.kernel.pdf.annot.PdfLinkAnnotation; -import com.itextpdf.kernel.pdf.layer.PdfLayer; -import com.itextpdf.kernel.pdf.layer.PdfOCProperties; -import com.itextpdf.kernel.xmp.XMPException; -import com.itextpdf.kernel.xmp.XMPMeta; -import com.itextpdf.kernel.xmp.XMPMetaFactory; -import com.itextpdf.kernel.xmp.options.SerializeOptions; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/security") @Tag(name = "Security", description = "Security APIs") public class GetInfoOnPDF { @@ -65,14 +83,11 @@ public class GetInfoOnPDF { @PostMapping(consumes = "multipart/form-data", value = "/get-info-on-pdf") @Operation(summary = "Summary here", description = "desc. Input:PDF Output:JSON Type:SISO") - public ResponseEntity getPdfInfo( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file to get info on", required = true) MultipartFile inputFile) + public ResponseEntity getPdfInfo(@ModelAttribute PDFFile request) throws IOException { - + MultipartFile inputFile = request.getFileInput(); try ( PDDocument pdfBoxDoc = PDDocument.load(inputFile.getInputStream()); - PdfDocument itextDoc = new PdfDocument(new PdfReader(inputFile.getInputStream())) ) { ObjectMapper objectMapper = new ObjectMapper(); ObjectNode jsonOutput = objectMapper.createObjectNode(); @@ -120,21 +135,17 @@ public class GetInfoOnPDF { boolean hasCompression = false; String compressionType = "None"; - // Check for object streams - for (int i = 1; i <= itextDoc.getNumberOfPdfObjects(); i++) { - PdfObject obj = itextDoc.getPdfObject(i); - if (obj != null && obj.isStream() && ((PdfStream) obj).get(PdfName.Type) == PdfName.ObjStm) { - hasCompression = true; - compressionType = "Object Streams"; - break; + COSDocument cosDoc = pdfBoxDoc.getDocument(); + for (COSObject cosObject : cosDoc.getObjects()) { + if (cosObject.getObject() instanceof COSStream) { + COSStream cosStream = (COSStream) cosObject.getObject(); + if (COSName.OBJ_STM.equals(cosStream.getItem(COSName.TYPE))) { + hasCompression = true; + compressionType = "Object Streams"; + break; + } } } - - // If not compressed using object streams, check for compressed Xref tables - if (!hasCompression && itextDoc.getReader().hasRebuiltXref()) { - hasCompression = true; - compressionType = "Compressed Xref or Rebuilt Xref"; - } basicInfo.put("Compression", hasCompression); if(hasCompression) basicInfo.put("CompressionType", compressionType); @@ -144,9 +155,8 @@ public class GetInfoOnPDF { basicInfo.put("Number of pages", pdfBoxDoc.getNumberOfPages()); - // Page Mode using iText7 - PdfCatalog catalog = itextDoc.getCatalog(); - PdfName pageMode = catalog.getPdfObject().getAsName(PdfName.PageMode); + PDDocumentCatalog catalog = pdfBoxDoc.getDocumentCatalog(); + String pageMode = catalog.getPageMode().name(); // Document Information using PDFBox docInfoNode.put("PDF version", pdfBoxDoc.getVersion()); @@ -157,49 +167,56 @@ public class GetInfoOnPDF { - PdfAcroForm acroForm = PdfAcroForm.getAcroForm(itextDoc, false); + PDAcroForm acroForm = pdfBoxDoc.getDocumentCatalog().getAcroForm(); + ObjectNode formFieldsNode = objectMapper.createObjectNode(); if (acroForm != null) { - for (Map.Entry entry : acroForm.getFormFields().entrySet()) { - formFieldsNode.put(entry.getKey(), entry.getValue().getValueAsString()); + for (PDField field : acroForm.getFieldTree()) { + formFieldsNode.put(field.getFullyQualifiedName(), field.getValueAsString()); } } jsonOutput.set("FormFields", formFieldsNode); + //embeed files TODO size - ArrayNode embeddedFilesArray = objectMapper.createArrayNode(); - if(itextDoc.getCatalog().getPdfObject().getAsDictionary(PdfName.Names) != null) - { - PdfDictionary embeddedFiles = itextDoc.getCatalog().getPdfObject().getAsDictionary(PdfName.Names) - .getAsDictionary(PdfName.EmbeddedFiles); - if (embeddedFiles != null) { - - PdfArray namesArray = embeddedFiles.getAsArray(PdfName.Names); - if(namesArray != null) { - for (int i = 0; i < namesArray.size(); i += 2) { - ObjectNode embeddedFileNode = objectMapper.createObjectNode(); - embeddedFileNode.put("Name", namesArray.getAsString(i).toString()); - // Add other details if required - embeddedFilesArray.add(embeddedFileNode); + if(catalog.getNames() != null) { + PDEmbeddedFilesNameTreeNode efTree = catalog.getNames().getEmbeddedFiles(); + + ArrayNode embeddedFilesArray = objectMapper.createArrayNode(); + if (efTree != null) { + Map efMap = efTree.getNames(); + if (efMap != null) { + for (Map.Entry entry : efMap.entrySet()) { + ObjectNode embeddedFileNode = objectMapper.createObjectNode(); + embeddedFileNode.put("Name", entry.getKey()); + PDEmbeddedFile embeddedFile = entry.getValue().getEmbeddedFile(); + if (embeddedFile != null) { + embeddedFileNode.put("FileSize", embeddedFile.getLength()); // size in bytes + } + embeddedFilesArray.add(embeddedFileNode); + } } - } - + } + other.set("EmbeddedFiles", embeddedFilesArray); } - } - other.set("EmbeddedFiles", embeddedFilesArray); + + //attachments TODO size ArrayNode attachmentsArray = objectMapper.createArrayNode(); - for (int pageNum = 1; pageNum <= itextDoc.getNumberOfPages(); pageNum++) { - for (PdfAnnotation annotation : itextDoc.getPage(pageNum).getAnnotations()) { - if (annotation instanceof PdfFileAttachmentAnnotation) { + for (PDPage page : pdfBoxDoc.getPages()) { + for (PDAnnotation annotation : page.getAnnotations()) { + if (annotation instanceof PDAnnotationFileAttachment) { + PDAnnotationFileAttachment fileAttachmentAnnotation = (PDAnnotationFileAttachment) annotation; + ObjectNode attachmentNode = objectMapper.createObjectNode(); - attachmentNode.put("Name", ((PdfFileAttachmentAnnotation) annotation).getName().toString()); - attachmentNode.put("Description", annotation.getContents().getValue()); + attachmentNode.put("Name", fileAttachmentAnnotation.getAttachmentName()); + attachmentNode.put("Description", fileAttachmentAnnotation.getContents()); + attachmentsArray.add(attachmentNode); } } @@ -207,65 +224,54 @@ public class GetInfoOnPDF { other.set("Attachments", attachmentsArray); //Javascript - PdfDictionary namesDict = itextDoc.getCatalog().getPdfObject().getAsDictionary(PdfName.Names); + PDDocumentNameDictionary namesDict = catalog.getNames(); ArrayNode javascriptArray = objectMapper.createArrayNode(); + if (namesDict != null) { - PdfDictionary javascriptDict = namesDict.getAsDictionary(PdfName.JavaScript); + PDJavascriptNameTreeNode javascriptDict = namesDict.getJavaScript(); if (javascriptDict != null) { + try { + Map jsEntries = javascriptDict.getNames(); - PdfArray namesArray = javascriptDict.getAsArray(PdfName.Names); - for (int i = 0; i < namesArray.size(); i += 2) { - ObjectNode jsNode = objectMapper.createObjectNode(); - if(namesArray.getAsString(i) != null) - jsNode.put("JS Name", namesArray.getAsString(i).toString()); + for (Map.Entry entry : jsEntries.entrySet()) { + ObjectNode jsNode = objectMapper.createObjectNode(); + jsNode.put("JS Name", entry.getKey()); - // Here we check for a PdfStream object and retrieve the JS code from it - PdfObject jsCode = namesArray.get(i+1); - if (jsCode instanceof PdfStream) { - byte[] jsCodeBytes = ((PdfStream)jsCode).getBytes(); - String jsCodeStr = new String(jsCodeBytes, StandardCharsets.UTF_8); - jsNode.put("JS Script Length", jsCodeStr.length()); - } else if (jsCode instanceof PdfDictionary) { - // If the JS code is in a dictionary, you'll need to know the key to use. - // Assuming the key is PdfName.JS: - PdfStream jsCodeStream = ((PdfDictionary)jsCode).getAsStream(PdfName.JS); - if (jsCodeStream != null) { - byte[] jsCodeBytes = jsCodeStream.getBytes(); - String jsCodeStr = new String(jsCodeBytes, StandardCharsets.UTF_8); - jsNode.put("JS Script Character Length", jsCodeStr.length()); + PDActionJavaScript jsAction = entry.getValue(); + if (jsAction != null) { + String jsCodeStr = jsAction.getAction(); + if (jsCodeStr != null) { + jsNode.put("JS Script Length", jsCodeStr.length()); + } } + + javascriptArray.add(jsNode); } - - javascriptArray.add(jsNode); + } catch (IOException e) { + e.printStackTrace(); } - } } other.set("JavaScript", javascriptArray); + //TODO size - PdfOCProperties ocProperties = itextDoc.getCatalog().getOCProperties(false); + PDOptionalContentProperties ocProperties = pdfBoxDoc.getDocumentCatalog().getOCProperties(); ArrayNode layersArray = objectMapper.createArrayNode(); + if (ocProperties != null) { - - for (PdfLayer layer : ocProperties.getLayers()) { + for (PDOptionalContentGroup ocg : ocProperties.getOptionalContentGroups()) { ObjectNode layerNode = objectMapper.createObjectNode(); - layerNode.put("Name", layer.getPdfObject().getAsString(PdfName.Name).toString()); + layerNode.put("Name", ocg.getName()); layersArray.add(layerNode); } - } + other.set("Layers", layersArray); //TODO Security - - - - - // Digital Signatures using iText7 TODO - @@ -282,13 +288,13 @@ public class GetInfoOnPDF { } - boolean isPdfACompliant = checkOutputIntent(itextDoc, "PDF/A"); - boolean isPdfXCompliant = checkOutputIntent(itextDoc, "PDF/X"); - boolean isPdfECompliant = checkForStandard(itextDoc, "PDF/E"); - boolean isPdfVTCompliant = checkForStandard(itextDoc, "PDF/VT"); - boolean isPdfUACompliant = checkForStandard(itextDoc, "PDF/UA"); - boolean isPdfBCompliant = checkForStandard(itextDoc, "PDF/B"); // If you want to check for PDF/Broadcast, though this isn't an official ISO standard. - boolean isPdfSECCompliant = checkForStandard(itextDoc, "PDF/SEC"); // This might not be effective since PDF/SEC was under development in 2021. + boolean isPdfACompliant = checkForStandard(pdfBoxDoc, "PDF/A"); + boolean isPdfXCompliant = checkForStandard(pdfBoxDoc, "PDF/X"); + boolean isPdfECompliant = checkForStandard(pdfBoxDoc, "PDF/E"); + boolean isPdfVTCompliant = checkForStandard(pdfBoxDoc, "PDF/VT"); + boolean isPdfUACompliant = checkForStandard(pdfBoxDoc, "PDF/UA"); + boolean isPdfBCompliant = checkForStandard(pdfBoxDoc, "PDF/B"); // If you want to check for PDF/Broadcast, though this isn't an official ISO standard. + boolean isPdfSECCompliant = checkForStandard(pdfBoxDoc, "PDF/SEC"); // This might not be effective since PDF/SEC was under development in 2021. compliancy.put("IsPDF/ACompliant", isPdfACompliant); compliancy.put("IsPDF/XCompliant", isPdfXCompliant); @@ -302,27 +308,39 @@ public class GetInfoOnPDF { + PDOutlineNode root = pdfBoxDoc.getDocumentCatalog().getDocumentOutline(); ArrayNode bookmarksArray = objectMapper.createArrayNode(); - PdfOutline root = itextDoc.getOutlines(false); + if (root != null) { - for (PdfOutline child : root.getAllChildren()) { + for (PDOutlineItem child : root.children()) { addOutlinesToArray(child, bookmarksArray); } } + other.set("Bookmarks/Outline/TOC", bookmarksArray); - byte[] xmpBytes = itextDoc.getXmpMetadata(); - String xmpString = null; - if (xmpBytes != null) { - try { - XMPMeta xmpMeta = XMPMetaFactory.parseFromBuffer(xmpBytes); - xmpString = new String(XMPMetaFactory.serializeToBuffer(xmpMeta, new SerializeOptions())); - } catch (XMPException e) { - e.printStackTrace(); - } - } - other.put("XMPMetadata", xmpString); - + + + PDMetadata pdMetadata = pdfBoxDoc.getDocumentCatalog().getMetadata(); + + String xmpString = null; + + if (pdMetadata != null) { + try { + COSInputStream is = pdMetadata.createInputStream(); + DomXmpParser domXmpParser = new DomXmpParser(); + XMPMetadata xmpMeta = domXmpParser.parse(is); + + ByteArrayOutputStream os = new ByteArrayOutputStream(); + new XmpSerializer().serialize(xmpMeta, os, true); + xmpString = new String(os.toByteArray(), StandardCharsets.UTF_8); + } catch (XmpParsingException | IOException e) { + e.printStackTrace(); + } + } + + other.put("XMPMetadata", xmpString); + if (pdfBoxDoc.isEncrypted()) { @@ -356,43 +374,65 @@ public class GetInfoOnPDF { ObjectNode pageInfoParent = objectMapper.createObjectNode(); - for (int pageNum = 1; pageNum <= itextDoc.getNumberOfPages(); pageNum++) { + for (int pageNum = 0; pageNum < pdfBoxDoc.getNumberOfPages(); pageNum++) { ObjectNode pageInfo = objectMapper.createObjectNode(); + // Retrieve the page + PDPage page = pdfBoxDoc.getPage(pageNum); + // Page-level Information - Rectangle pageSize = itextDoc.getPage(pageNum).getPageSize(); - pageInfo.put("Width", pageSize.getWidth()); - pageInfo.put("Height", pageSize.getHeight()); - pageInfo.put("Rotation", itextDoc.getPage(pageNum).getRotation()); - pageInfo.put("Page Orientation", getPageOrientation(pageSize.getWidth(),pageSize.getHeight())); - pageInfo.put("Standard Size", getPageSize(pageSize.getWidth(),pageSize.getHeight())); + PDRectangle mediaBox = page.getMediaBox(); + + float width = mediaBox.getWidth(); + float height = mediaBox.getHeight(); + + ObjectNode sizeInfo = objectMapper.createObjectNode(); + getDimensionInfo(sizeInfo, width, height); + + sizeInfo.put("Standard Page", getPageSize(width, height)); + pageInfo.set("Size", sizeInfo); + + pageInfo.put("Rotation", page.getRotation()); + pageInfo.put("Page Orientation", getPageOrientation(width, height)); + + // Boxes - pageInfo.put("MediaBox", itextDoc.getPage(pageNum).getMediaBox().toString()); - pageInfo.put("CropBox", itextDoc.getPage(pageNum).getCropBox().toString()); - pageInfo.put("BleedBox", itextDoc.getPage(pageNum).getBleedBox().toString()); - pageInfo.put("TrimBox", itextDoc.getPage(pageNum).getTrimBox().toString()); - pageInfo.put("ArtBox", itextDoc.getPage(pageNum).getArtBox().toString()); + pageInfo.put("MediaBox", mediaBox.toString()); + + // Assuming the following boxes are defined for your document; if not, you may get null values. + PDRectangle cropBox = page.getCropBox(); + pageInfo.put("CropBox", cropBox == null ? "Undefined" : cropBox.toString()); + + PDRectangle bleedBox = page.getBleedBox(); + pageInfo.put("BleedBox", bleedBox == null ? "Undefined" : bleedBox.toString()); + + PDRectangle trimBox = page.getTrimBox(); + pageInfo.put("TrimBox", trimBox == null ? "Undefined" : trimBox.toString()); + + PDRectangle artBox = page.getArtBox(); + pageInfo.put("ArtBox", artBox == null ? "Undefined" : artBox.toString()); // Content Extraction PDFTextStripper textStripper = new PDFTextStripper(); - textStripper.setStartPage(pageNum -1); - textStripper.setEndPage(pageNum - 1); + textStripper.setStartPage(pageNum + 1); + textStripper.setEndPage(pageNum +1); String pageText = textStripper.getText(pdfBoxDoc); pageInfo.put("Text Characters Count", pageText.length()); // - // Annotations - List annotations = itextDoc.getPage(pageNum).getAnnotations(); + // Annotations + + List annotations = page.getAnnotations(); int subtypeCount = 0; int contentsCount = 0; - for (PdfAnnotation annotation : annotations) { - if(annotation.getSubtype() != null) { + for (PDAnnotation annotation : annotations) { + if (annotation.getSubtype() != null) { subtypeCount++; // Increase subtype count } - if(annotation.getContents() != null) { + if (annotation.getContents() != null) { contentsCount++; // Increase contents count } } @@ -403,25 +443,31 @@ public class GetInfoOnPDF { annotationsObject.put("ContentsCount", contentsCount); pageInfo.set("Annotations", annotationsObject); + + // Images (simplified) // This part is non-trivial as images can be embedded in multiple ways in a PDF. // Here is a basic structure to recognize image XObjects on a page. ArrayNode imagesArray = objectMapper.createArrayNode(); - PdfResources resources = itextDoc.getPage(pageNum).getResources(); - for (PdfName name : resources.getResourceNames()) { - PdfObject obj = resources.getResource(name); - if (obj instanceof PdfStream) { - PdfStream stream = (PdfStream) obj; - if (PdfName.Image.equals(stream.getAsName(PdfName.Subtype))) { - ObjectNode imageNode = objectMapper.createObjectNode(); - imageNode.put("Width", stream.getAsNumber(PdfName.Width).intValue()); - imageNode.put("Height", stream.getAsNumber(PdfName.Height).intValue()); - PdfObject colorSpace = stream.get(PdfName.ColorSpace); - if (colorSpace != null) { - imageNode.put("ColorSpace", colorSpace.toString()); - } - imagesArray.add(imageNode); + PDResources resources = page.getResources(); + + + for (COSName name : resources.getXObjectNames()) { + PDXObject xObject = resources.getXObject(name); + if (xObject instanceof PDImageXObject) { + PDImageXObject image = (PDImageXObject) xObject; + + ObjectNode imageNode = objectMapper.createObjectNode(); + imageNode.put("Width", image.getWidth()); + imageNode.put("Height", image.getHeight()); + if(image.getMetadata() != null && image.getMetadata().getFile() != null && image.getMetadata().getFile().getFile() != null) { + imageNode.put("Name", image.getMetadata().getFile().getFile()); } + if (image.getColorSpace() != null) { + imageNode.put("ColorSpace", image.getColorSpace().getName()); + } + + imagesArray.add(imageNode); } } pageInfo.set("Images", imagesArray); @@ -431,12 +477,13 @@ public class GetInfoOnPDF { ArrayNode linksArray = objectMapper.createArrayNode(); Set uniqueURIs = new HashSet<>(); // To store unique URIs - for (PdfAnnotation annotation : annotations) { - if (annotation instanceof PdfLinkAnnotation) { - PdfLinkAnnotation linkAnnotation = (PdfLinkAnnotation) annotation; - if(linkAnnotation != null && linkAnnotation.getAction() != null) { - String uri = linkAnnotation.getAction().toString(); - uniqueURIs.add(uri); // Add to set to ensure uniqueness + for (PDAnnotation annotation : annotations) { + if (annotation instanceof PDAnnotationLink) { + PDAnnotationLink linkAnnotation = (PDAnnotationLink) annotation; + if (linkAnnotation.getAction() instanceof PDActionURI) { + PDActionURI uriAction = (PDActionURI) linkAnnotation.getAction(); + String uri = uriAction.getURI(); + uniqueURIs.add(uri); // Add to set to ensure uniqueness } } } @@ -449,96 +496,52 @@ public class GetInfoOnPDF { } pageInfo.set("Links", linksArray); - // Fonts + + // Fonts ArrayNode fontsArray = objectMapper.createArrayNode(); - PdfDictionary fontDicts = resources.getResource(PdfName.Font); - Set uniqueSubtypes = new HashSet<>(); // To store unique subtypes - - // Map to store unique fonts and their counts Map uniqueFontsMap = new HashMap<>(); - if (fontDicts != null) { - for (PdfName key : fontDicts.keySet()) { - ObjectNode fontNode = objectMapper.createObjectNode(); // Create a new font node for each font - PdfDictionary font = fontDicts.getAsDictionary(key); + for (COSName fontName : resources.getFontNames()) { + PDFont font = resources.getFont(fontName); + ObjectNode fontNode = objectMapper.createObjectNode(); - boolean isEmbedded = font.containsKey(PdfName.FontFile) || - font.containsKey(PdfName.FontFile2) || - font.containsKey(PdfName.FontFile3); - fontNode.put("IsEmbedded", isEmbedded); + fontNode.put("IsEmbedded", font.isEmbedded()); - if (font.containsKey(PdfName.Encoding)) { - String encoding = font.getAsName(PdfName.Encoding).toString(); - fontNode.put("Encoding", encoding); - } + // PDFBox provides Font's BaseFont (i.e., the font name) directly + fontNode.put("Name", font.getName()); - if (font.getAsString(PdfName.BaseFont) != null) { - fontNode.put("Name", font.getAsString(PdfName.BaseFont).toString()); - } + fontNode.put("Subtype", font.getType()); - String subtype = null; - if (font.containsKey(PdfName.Subtype)) { - subtype = font.getAsName(PdfName.Subtype).toString(); - uniqueSubtypes.add(subtype); // Add to set to ensure uniqueness - } - fontNode.put("Subtype", subtype); + PDFontDescriptor fontDescriptor = font.getFontDescriptor(); - PdfDictionary fontDescriptor = font.getAsDictionary(PdfName.FontDescriptor); - if (fontDescriptor != null) { - if (fontDescriptor.containsKey(PdfName.ItalicAngle)) { - fontNode.put("ItalicAngle", fontDescriptor.getAsNumber(PdfName.ItalicAngle).floatValue()); - } + if (fontDescriptor != null) { + fontNode.put("ItalicAngle", fontDescriptor.getItalicAngle()); + int flags = fontDescriptor.getFlags(); + fontNode.put("IsItalic", (flags & 1) != 0); + fontNode.put("IsBold", (flags & 64) != 0); + fontNode.put("IsFixedPitch", (flags & 2) != 0); + fontNode.put("IsSerif", (flags & 4) != 0); + fontNode.put("IsSymbolic", (flags & 8) != 0); + fontNode.put("IsScript", (flags & 16) != 0); + fontNode.put("IsNonsymbolic", (flags & 32) != 0); - if (fontDescriptor.containsKey(PdfName.Flags)) { - int flags = fontDescriptor.getAsNumber(PdfName.Flags).intValue(); - fontNode.put("IsItalic", (flags & 64) != 0); - fontNode.put("IsBold", (flags & 1 << 16) != 0); - fontNode.put("IsFixedPitch", (flags & 1) != 0); - fontNode.put("IsSerif", (flags & 2) != 0); - fontNode.put("IsSymbolic", (flags & 4) != 0); - fontNode.put("IsScript", (flags & 8) != 0); - fontNode.put("IsNonsymbolic", (flags & 16) != 0); - } + fontNode.put("FontFamily", fontDescriptor.getFontFamily()); + // Font stretch and BBox are not directly available in PDFBox's API, so these are omitted for simplicity + fontNode.put("FontWeight", fontDescriptor.getFontWeight()); + } - if (fontDescriptor.containsKey(PdfName.FontFamily)) { - String fontFamily = fontDescriptor.getAsString(PdfName.FontFamily).toString(); - fontNode.put("FontFamily", fontFamily); - } - if (fontDescriptor.containsKey(PdfName.FontStretch)) { - String fontStretch = fontDescriptor.getAsName(PdfName.FontStretch).toString(); - fontNode.put("FontStretch", fontStretch); - } + // Create a unique key for this font node based on its attributes + String uniqueKey = fontNode.toString(); - if (fontDescriptor.containsKey(PdfName.FontBBox)) { - PdfArray bbox = fontDescriptor.getAsArray(PdfName.FontBBox); - fontNode.put("FontBoundingBox", bbox.toString()); - } - - if (fontDescriptor.containsKey(PdfName.FontWeight)) { - float fontWeight = fontDescriptor.getAsNumber(PdfName.FontWeight).floatValue(); - fontNode.put("FontWeight", fontWeight); - } - } - - if (font.containsKey(PdfName.ToUnicode)) { - fontNode.put("HasToUnicodeMap", true); - } - - if (fontNode.size() > 0) { - // Create a unique key for this font node based on its attributes - String uniqueKey = fontNode.toString(); - - // Increment count if this font exists, or initialize it if new - if (uniqueFontsMap.containsKey(uniqueKey)) { - ObjectNode existingFontNode = uniqueFontsMap.get(uniqueKey); - int count = existingFontNode.get("Count").asInt() + 1; - existingFontNode.put("Count", count); - } else { - fontNode.put("Count", 1); - uniqueFontsMap.put(uniqueKey, fontNode); - } - } + // Increment count if this font exists, or initialize it if new + if (uniqueFontsMap.containsKey(uniqueKey)) { + ObjectNode existingFontNode = uniqueFontsMap.get(uniqueKey); + int count = existingFontNode.get("Count").asInt() + 1; + existingFontNode.put("Count", count); + } else { + fontNode.put("Count", 1); + uniqueFontsMap.put(uniqueKey, fontNode); } } @@ -552,41 +555,49 @@ public class GetInfoOnPDF { - // Access resources dictionary - PdfDictionary resourcesDict = itextDoc.getPage(pageNum).getResources().getPdfObject(); - - // Color Spaces & ICC Profiles + + + + + + + + // Access resources dictionary ArrayNode colorSpacesArray = objectMapper.createArrayNode(); - PdfDictionary colorSpaces = resourcesDict.getAsDictionary(PdfName.ColorSpace); - if (colorSpaces != null) { - for (PdfName name : colorSpaces.keySet()) { - PdfObject colorSpaceObject = colorSpaces.get(name); - if (colorSpaceObject instanceof PdfArray) { - PdfArray colorSpaceArray = (PdfArray) colorSpaceObject; - if (colorSpaceArray.size() > 1 && colorSpaceArray.get(0) instanceof PdfName && PdfName.ICCBased.equals(colorSpaceArray.get(0))) { - ObjectNode iccProfileNode = objectMapper.createObjectNode(); - PdfStream iccStream = (PdfStream) colorSpaceArray.get(1); - byte[] iccData = iccStream.getBytes(); - // TODO: Further decode and analyze the ICC data if needed - iccProfileNode.put("ICC Profile Length", iccData.length); - colorSpacesArray.add(iccProfileNode); - } - } + + Iterable colorSpaceNames = resources.getColorSpaceNames(); + for (COSName name : colorSpaceNames) { + PDColorSpace colorSpace = resources.getColorSpace(name); + if (colorSpace instanceof PDICCBased) { + PDICCBased iccBased = (PDICCBased) colorSpace; + PDStream iccData = iccBased.getPDStream(); + byte[] iccBytes = iccData.toByteArray(); + + // TODO: Further decode and analyze the ICC data if needed + ObjectNode iccProfileNode = objectMapper.createObjectNode(); + iccProfileNode.put("ICC Profile Length", iccBytes.length); + colorSpacesArray.add(iccProfileNode); } } pageInfo.set("Color Spaces & ICC Profiles", colorSpacesArray); + // Other XObjects Map xObjectCountMap = new HashMap<>(); // To store the count for each type - PdfDictionary xObjects = resourcesDict.getAsDictionary(PdfName.XObject); - if (xObjects != null) { - for (PdfName name : xObjects.keySet()) { - PdfStream xObjectStream = xObjects.getAsStream(name); - String xObjectType = xObjectStream.getAsName(PdfName.Subtype).toString(); - - // Increment the count for this type in the map - xObjectCountMap.put(xObjectType, xObjectCountMap.getOrDefault(xObjectType, 0) + 1); + for (COSName name : resources.getXObjectNames()) { + PDXObject xObject = resources.getXObject(name); + String xObjectType; + + if (xObject instanceof PDImageXObject) { + xObjectType = "Image"; + } else if (xObject instanceof PDFormXObject) { + xObjectType = "Form"; + } else { + xObjectType = "Other"; } + + // Increment the count for this type in the map + xObjectCountMap.put(xObjectType, xObjectCountMap.getOrDefault(xObjectType, 0) + 1); } // Add the count map to pageInfo (or wherever you want to store it) @@ -598,19 +609,22 @@ public class GetInfoOnPDF { + ArrayNode multimediaArray = objectMapper.createArrayNode(); - for (PdfAnnotation annotation : annotations) { - if (PdfName.RichMedia.equals(annotation.getSubtype())) { + + for (PDAnnotation annotation : annotations) { + if ("RichMedia".equals(annotation.getSubtype())) { ObjectNode multimediaNode = objectMapper.createObjectNode(); - // Extract details from the dictionary as needed + // Extract details from the annotation as needed multimediaArray.add(multimediaNode); } } + pageInfo.set("Multimedia", multimediaArray); - pageInfoParent.set("Page " + pageNum, pageInfo); + pageInfoParent.set("Page " + (pageNum+1), pageInfo); } @@ -636,17 +650,21 @@ public class GetInfoOnPDF { return null; } - private static void addOutlinesToArray(PdfOutline outline, ArrayNode arrayNode) { + private static void addOutlinesToArray(PDOutlineItem outline, ArrayNode arrayNode) { if (outline == null) return; + ObjectNode outlineNode = objectMapper.createObjectNode(); outlineNode.put("Title", outline.getTitle()); // You can add other properties if needed arrayNode.add(outlineNode); - - for (PdfOutline child : outline.getAllChildren()) { + + PDOutlineItem child = outline.getFirstChild(); + while (child != null) { addOutlinesToArray(child, arrayNode); + child = child.getNextSibling(); } } + public String getPageOrientation(double width, double height) { if (width > height) { return "Landscape"; @@ -656,66 +674,78 @@ public class GetInfoOnPDF { return "Square"; } } - public String getPageSize(double width, double height) { - // Common aspect ratios used for standard paper sizes - double[] aspectRatios = {4.0 / 3.0, 3.0 / 2.0, Math.sqrt(2.0), 16.0 / 9.0}; + public String getPageSize(float width, float height) { + // Define standard page sizes + Map standardSizes = new HashMap<>(); + standardSizes.put("Letter", PDRectangle.LETTER); + standardSizes.put("LEGAL", PDRectangle.LEGAL); + standardSizes.put("A0", PDRectangle.A0); + standardSizes.put("A1", PDRectangle.A1); + standardSizes.put("A2", PDRectangle.A2); + standardSizes.put("A3", PDRectangle.A3); + standardSizes.put("A4", PDRectangle.A4); + standardSizes.put("A5", PDRectangle.A5); + standardSizes.put("A6", PDRectangle.A6); - // Check if the page matches any common aspect ratio - for (double aspectRatio : aspectRatios) { - if (isCloseToAspectRatio(width, height, aspectRatio)) { - return "Standard"; + for (Map.Entry entry : standardSizes.entrySet()) { + PDRectangle size = entry.getValue(); + if (isCloseToSize(width, height, size.getWidth(), size.getHeight())) { + return entry.getKey(); } } - - // If not a standard aspect ratio, consider it as a custom size return "Custom"; } - private boolean isCloseToAspectRatio(double width, double height, double aspectRatio) { - // Calculate the aspect ratio of the page - double pageAspectRatio = width / height; - // Compare the page aspect ratio with the common aspect ratio within a threshold - return Math.abs(pageAspectRatio - aspectRatio) <= 0.05; + private boolean isCloseToSize(float width, float height, float standardWidth, float standardHeight) { + float tolerance = 1.0f; // You can adjust the tolerance as needed + return Math.abs(width - standardWidth) <= tolerance && Math.abs(height - standardHeight) <= tolerance; + } + + + public ObjectNode getDimensionInfo(ObjectNode dimensionInfo, float width, float height) { + float ppi = 72; // Points Per Inch + + float widthInInches = width / ppi; + float heightInInches = height / ppi; + + float widthInCm = widthInInches * 2.54f; + float heightInCm = heightInInches * 2.54f; + + dimensionInfo.put("Width (px)", String.format("%.2f", width)); + dimensionInfo.put("Height (px)", String.format("%.2f", height)); + dimensionInfo.put("Width (in)", String.format("%.2f", widthInInches)); + dimensionInfo.put("Height (in)", String.format("%.2f", heightInInches)); + dimensionInfo.put("Width (cm)", String.format("%.2f", widthInCm)); + dimensionInfo.put("Height (cm)", String.format("%.2f", heightInCm)); + return dimensionInfo; + } + + + +public static boolean checkForStandard(PDDocument document, String standardKeyword) { + // Check XMP Metadata + try { + PDMetadata pdMetadata = document.getDocumentCatalog().getMetadata(); + if (pdMetadata != null) { + COSInputStream metaStream = pdMetadata.createInputStream(); + DomXmpParser domXmpParser = new DomXmpParser(); + XMPMetadata xmpMeta = domXmpParser.parse(metaStream); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + new XmpSerializer().serialize(xmpMeta, baos, true); + String xmpString = new String(baos.toByteArray(), StandardCharsets.UTF_8); + + if (xmpString.contains(standardKeyword)) { + return true; + } + } + } catch (Exception e) { // Catching general exception for brevity, ideally you'd catch specific exceptions. + e.printStackTrace(); } - public boolean checkForStandard(PdfDocument document, String standardKeyword) { - // Check Output Intents - boolean foundInOutputIntents = checkOutputIntent(document, standardKeyword); - if (foundInOutputIntents) return true; + return false; +} - // Check XMP Metadata (rudimentary) - try { - byte[] metadataBytes = document.getXmpMetadata(); - if (metadataBytes != null) { - XMPMeta xmpMeta = XMPMetaFactory.parseFromBuffer(metadataBytes); - String xmpString = xmpMeta.dumpObject(); - if (xmpString.contains(standardKeyword)) { - return true; - } - } - } catch (XMPException e) { - e.printStackTrace(); - } - - return false; - } - - - public boolean checkOutputIntent(PdfDocument document, String standard) { - PdfArray outputIntents = document.getCatalog().getPdfObject().getAsArray(PdfName.OutputIntents); - if (outputIntents != null && !outputIntents.isEmpty()) { - for (int i = 0; i < outputIntents.size(); i++) { - PdfDictionary outputIntentDict = outputIntents.getAsDictionary(i); - if (outputIntentDict != null) { - PdfString s = outputIntentDict.getAsString(PdfName.S); - if (s != null && s.toString().contains(standard)) { - return true; - } - } - } - } - return false; - } public ArrayNode exploreStructureTree(List nodes) { ArrayNode elementsArray = objectMapper.createArrayNode(); @@ -771,7 +801,7 @@ public class GetInfoOnPDF { } } - private String getPageModeDescription(PdfName pageMode) { + private String getPageModeDescription(String pageMode) { return pageMode != null ? pageMode.toString().replaceFirst("/", "") : "Unknown"; } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java b/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java index bcc7e37fb..639b69736 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java @@ -8,18 +8,19 @@ import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.security.AddPasswordRequest; +import stirling.software.SPDF.model.api.security.PDFPasswordRequest; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/security") @Tag(name = "Security", description = "Security APIs") public class PasswordController { @@ -31,13 +32,12 @@ public class PasswordController { summary = "Remove password from a PDF file", description = "This endpoint removes the password from a protected PDF file. Users need to provide the existing password. Input:PDF Output:PDF Type:SISO" ) - public ResponseEntity removePassword( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file from which the password should be removed", required = true) - MultipartFile fileInput, - @RequestParam(name = "password") - @Parameter(description = "The password of the PDF file", required = true) - String password) throws IOException { + public ResponseEntity removePassword(@ModelAttribute PDFPasswordRequest request) throws IOException { + MultipartFile fileInput = request.getFileInput(); + String password = request.getPassword(); + + + PDDocument document = PDDocument.load(fileInput.getBytes(), password); document.setAllSecurityToBeRemoved(true); return WebResponseUtils.pdfDocToWebResponse(document, fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_password_removed.pdf"); @@ -48,44 +48,19 @@ public class PasswordController { summary = "Add password to a PDF file", description = "This endpoint adds password protection to a PDF file. Users can specify a set of permissions that should be applied to the file. Input:PDF Output:PDF" ) - public ResponseEntity addPassword( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file to which the password should be added", required = true) - MultipartFile fileInput, - @RequestParam(value = "", name = "ownerPassword", required = false, defaultValue = "") - @Parameter(description = "The owner password to be added to the PDF file (Restricts what can be done with the document once it is opened)") - String ownerPassword, - @RequestParam( name = "password", required = false, defaultValue = "") - @Parameter(description = "The password to be added to the PDF file (Restricts the opening of the document itself.)") - String password, - @RequestParam( name = "keyLength", required = false, defaultValue = "256") - @Parameter(description = "The length of the encryption key", schema = @Schema(allowableValues = {"40", "128", "256"})) - int keyLength, - @RequestParam( name = "canAssembleDocument", required = false) - @Parameter(description = "Whether the document assembly is allowed", example = "false") - boolean canAssembleDocument, - @RequestParam( name = "canExtractContent", required = false) - @Parameter(description = "Whether content extraction for accessibility is allowed", example = "false") - boolean canExtractContent, - @RequestParam( name = "canExtractForAccessibility", required = false) - @Parameter(description = "Whether content extraction for accessibility is allowed", example = "false") - boolean canExtractForAccessibility, - @RequestParam( name = "canFillInForm", required = false) - @Parameter(description = "Whether form filling is allowed", example = "false") - boolean canFillInForm, - @RequestParam( name = "canModify", required = false) - @Parameter(description = "Whether the document modification is allowed", example = "false") - boolean canModify, - @RequestParam( name = "canModifyAnnotations", required = false) - @Parameter(description = "Whether modification of annotations is allowed", example = "false") - boolean canModifyAnnotations, - @RequestParam(name = "canPrint", required = false) - @Parameter(description = "Whether printing of the document is allowed", example = "false") - boolean canPrint, - @RequestParam( name = "canPrintFaithful", required = false) - @Parameter(description = "Whether faithful printing is allowed", example = "false") - boolean canPrintFaithful - ) throws IOException { + public ResponseEntity addPassword(@ModelAttribute AddPasswordRequest request) throws IOException { + MultipartFile fileInput = request.getFileInput(); + String ownerPassword = request.getOwnerPassword(); + String password = request.getPassword(); + int keyLength = request.getKeyLength(); + boolean canAssembleDocument = request.isCanAssembleDocument(); + boolean canExtractContent = request.isCanExtractContent(); + boolean canExtractForAccessibility = request.isCanExtractForAccessibility(); + boolean canFillInForm = request.isCanFillInForm(); + boolean canModify = request.isCanModify(); + boolean canModifyAnnotations = request.isCanModifyAnnotations(); + boolean canPrint = request.isCanPrint(); + boolean canPrintFaithful = request.isCanPrintFaithful(); PDDocument document = PDDocument.load(fileInput.getBytes()); AccessPermission ap = new AccessPermission(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java index 006968ae3..825544dc4 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java @@ -18,19 +18,20 @@ import org.apache.pdfbox.rendering.PDFRenderer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import stirling.software.SPDF.model.PDFText; +import stirling.software.SPDF.model.api.security.RedactPdfRequest; import stirling.software.SPDF.pdf.TextFinder; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/security") @Tag(name = "Security", description = "Security APIs") public class RedactController { @@ -40,14 +41,14 @@ public class RedactController { @PostMapping(value = "/auto-redact", consumes = "multipart/form-data") @Operation(summary = "Redacts listOfText in a PDF document", description = "This operation takes an input PDF file and redacts the provided listOfText. Input:PDF, Output:PDF, Type:SISO") - public ResponseEntity redactPdf( - @Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file, - @Parameter(description = "List of listOfText to redact from the PDF", required = true, schema = @Schema(type = "string")) @RequestParam("listOfText") String listOfTextString, - @RequestParam(value = "useRegex", required = false) boolean useRegex, - @RequestParam(value = "wholeWordSearch", required = false) boolean wholeWordSearchBool, - @RequestParam(value = "redactColor", required = false, defaultValue = "#000000") String colorString, - @RequestParam(value = "customPadding", required = false) float customPadding, - @RequestParam(value = "convertPDFToImage", required = false) boolean convertPDFToImage) throws Exception { + public ResponseEntity redactPdf(@ModelAttribute RedactPdfRequest request) throws Exception { + MultipartFile file = request.getFileInput(); + String listOfTextString = request.getListOfText(); + boolean useRegex = request.isUseRegex(); + boolean wholeWordSearchBool = request.isWholeWordSearch(); + String colorString = request.getRedactColor(); + float customPadding = request.getCustomPadding(); + boolean convertPDFToImage = request.isConvertPDFToImage(); System.out.println(listOfTextString); String[] listOfText = listOfTextString.split("\n"); diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java b/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java index fa49c6ad9..dab9d1d7d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java @@ -20,41 +20,32 @@ import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; import org.apache.pdfbox.pdmodel.interactive.form.PDField; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.security.SanitizePdfRequest; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/security") +@Tag(name = "Security", description = "Security APIs") public class SanitizeController { @PostMapping(consumes = "multipart/form-data", value = "/sanitize-pdf") @Operation(summary = "Sanitize a PDF file", description = "This endpoint processes a PDF file and removes specific elements based on the provided options. Input:PDF Output:PDF Type:SISO") - public ResponseEntity sanitizePDF( - @RequestPart(required = true, value = "fileInput") - @Parameter(description = "The input PDF file to be sanitized") - MultipartFile inputFile, - @RequestParam(name = "removeJavaScript", required = false, defaultValue = "false") - @Parameter(description = "Remove JavaScript actions from the PDF if set to true") - Boolean removeJavaScript, - @RequestParam(name = "removeEmbeddedFiles", required = false, defaultValue = "false") - @Parameter(description = "Remove embedded files from the PDF if set to true") - Boolean removeEmbeddedFiles, - @RequestParam(name = "removeMetadata", required = false, defaultValue = "false") - @Parameter(description = "Remove metadata from the PDF if set to true") - Boolean removeMetadata, - @RequestParam(name = "removeLinks", required = false, defaultValue = "false") - @Parameter(description = "Remove links from the PDF if set to true") - Boolean removeLinks, - @RequestParam(name = "removeFonts", required = false, defaultValue = "false") - @Parameter(description = "Remove fonts from the PDF if set to true") - Boolean removeFonts) throws IOException { + public ResponseEntity sanitizePDF(@ModelAttribute SanitizePdfRequest request) throws IOException { + MultipartFile inputFile = request.getFileInput(); + boolean removeJavaScript = request.isRemoveJavaScript(); + boolean removeEmbeddedFiles = request.isRemoveEmbeddedFiles(); + boolean removeMetadata = request.isRemoveMetadata(); + boolean removeLinks = request.isRemoveLinks(); + boolean removeFonts = request.isRemoveFonts(); try (PDDocument document = PDDocument.load(inputFile.getInputStream())) { if (removeJavaScript) { 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 efc263f54..b19636cdc 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 @@ -22,40 +22,35 @@ import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState; import org.apache.pdfbox.util.Matrix; import org.springframework.core.io.ClassPathResource; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.api.security.AddWatermarkRequest; import stirling.software.SPDF.utils.WebResponseUtils; @RestController +@RequestMapping("/api/v1/security") @Tag(name = "Security", description = "Security APIs") public class WatermarkController { @PostMapping(consumes = "multipart/form-data", value = "/add-watermark") @Operation(summary = "Add watermark to a PDF file", description = "This endpoint adds a watermark to a given PDF file. Users can specify the watermark type (text or image), rotation, opacity, width spacer, and height spacer. Input:PDF Output:PDF Type:SISO") - public ResponseEntity addWatermark( - @RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to add a watermark") MultipartFile pdfFile, - @RequestParam(required = true) @Parameter(description = "The watermark type (text or image)") String watermarkType, - @RequestParam(required = false) @Parameter(description = "The watermark text") String watermarkText, - @RequestPart(required = false) @Parameter(description = "The watermark image") MultipartFile watermarkImage, - - @RequestParam(defaultValue = "roman", name = "alphabet") @Parameter(description = "The selected alphabet", - schema = @Schema(type = "string", - allowableValues = {"roman","arabic","japanese","korean","chinese"}, - defaultValue = "roman")) String alphabet, - @RequestParam(defaultValue = "30", name = "fontSize") @Parameter(description = "The font size of the watermark text", example = "30") float fontSize, - @RequestParam(defaultValue = "0", name = "rotation") @Parameter(description = "The rotation of the watermark in degrees", example = "0") float rotation, - @RequestParam(defaultValue = "0.5", name = "opacity") @Parameter(description = "The opacity of the watermark (0.0 - 1.0)", example = "0.5") float opacity, - @RequestParam(defaultValue = "50", name = "widthSpacer") @Parameter(description = "The width spacer between watermark elements", example = "50") int widthSpacer, - @RequestParam(defaultValue = "50", name = "heightSpacer") @Parameter(description = "The height spacer between watermark elements", example = "50") int heightSpacer) - throws IOException, Exception { + public ResponseEntity addWatermark(@ModelAttribute AddWatermarkRequest request) throws IOException, Exception { + MultipartFile pdfFile = request.getFileInput(); + String watermarkType = request.getWatermarkType(); + String watermarkText = request.getWatermarkText(); + MultipartFile watermarkImage = request.getWatermarkImage(); + String alphabet = request.getAlphabet(); + float fontSize = request.getFontSize(); + float rotation = request.getRotation(); + float opacity = request.getOpacity(); + int widthSpacer = request.getWidthSpacer(); + int heightSpacer = request.getHeightSpacer(); // Load the input PDF PDDocument document = PDDocument.load(pdfFile.getInputStream()); diff --git a/src/main/java/stirling/software/SPDF/controller/api/strippers/PDFTableStripper.java b/src/main/java/stirling/software/SPDF/controller/api/strippers/PDFTableStripper.java new file mode 100644 index 000000000..5330c3ada --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/strippers/PDFTableStripper.java @@ -0,0 +1,358 @@ +package stirling.software.SPDF.controller.api.strippers; + +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +import org.apache.fontbox.util.BoundingBox; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.font.PDFont; +import org.apache.pdfbox.pdmodel.font.PDType3Font; +import org.apache.pdfbox.text.PDFTextStripper; +import org.apache.pdfbox.text.PDFTextStripperByArea; +import org.apache.pdfbox.text.TextPosition; + +/** + * + * Class to extract tabular data from a PDF. + * Works by making a first pass of the page to group all nearby text items + * together, and then inferring a 2D grid from these regions. Each table cell + * is then extracted using a PDFTextStripperByArea object. + * + * Works best when + * headers are included in the detected region, to ensure representative text + * in every column. + * + * Based upon DrawPrintTextLocations PDFBox example + * (https://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/DrawPrintTextLocations.java) + * + * @author Beldaz + */ +public class PDFTableStripper extends PDFTextStripper +{ + + /** + * This will print the documents data, for each table cell. + * + * @param args The command line arguments. + * + * @throws IOException If there is an error parsing the document. + */ + /* + * Used in methods derived from DrawPrintTextLocations + */ + private AffineTransform flipAT; + private AffineTransform rotateAT; + + /** + * Regions updated by calls to writeString + */ + private Set boxes; + + // Border to allow when finding intersections + private double dx = 1.0; // This value works for me, feel free to tweak (or add setter) + private double dy = 0.000; // Rows of text tend to overlap, so need to extend + + /** + * Region in which to find table (otherwise whole page) + */ + private Rectangle2D regionArea; + + /** + * Number of rows in inferred table + */ + private int nRows=0; + + /** + * Number of columns in inferred table + */ + private int nCols=0; + + /** + * This is the object that does the text extraction + */ + private PDFTextStripperByArea regionStripper; + + /** + * 1D intervals - used for calculateTableRegions() + * @author Beldaz + * + */ + public static class Interval { + double start; + double end; + public Interval(double start, double end) { + this.start=start; this.end = end; + } + public void add(Interval col) { + if(col.startend) + end = col.end; + } + public static void addTo(Interval x, LinkedList columns) { + int p = 0; + Iterator it = columns.iterator(); + // Find where x should go + while(it.hasNext()) { + Interval col = it.next(); + if(x.end>=col.start) { + if(x.start<=col.end) { // overlaps + x.add(col); + it.remove(); + } + break; + } + ++p; + } + while(it.hasNext()) { + Interval col = it.next(); + if(x.start>col.end) + break; + x.add(col); + it.remove(); + } + columns.add(p, x); + } + + } + + + /** + * Instantiate a new PDFTableStripper object. + * + * @param document + * @throws IOException If there is an error loading the properties. + */ + public PDFTableStripper() throws IOException + { + super.setShouldSeparateByBeads(false); + regionStripper = new PDFTextStripperByArea(); + regionStripper.setSortByPosition( true ); + } + + /** + * Define the region to group text by. + * + * @param rect The rectangle area to retrieve the text from. + */ + public void setRegion(Rectangle2D rect ) + { + regionArea = rect; + } + + public int getRows() + { + return nRows; + } + + public int getColumns() + { + return nCols; + } + + /** + * Get the text for the region, this should be called after extractTable(). + * + * @return The text that was identified in that region. + */ + public String getText(int row, int col) + { + return regionStripper.getTextForRegion("el"+col+"x"+row); + } + + public void extractTable(PDPage pdPage) throws IOException + { + setStartPage(getCurrentPageNo()); + setEndPage(getCurrentPageNo()); + + boxes = new HashSet(); + // flip y-axis + flipAT = new AffineTransform(); + flipAT.translate(0, pdPage.getBBox().getHeight()); + flipAT.scale(1, -1); + + // page may be rotated + rotateAT = new AffineTransform(); + int rotation = pdPage.getRotation(); + if (rotation != 0) + { + PDRectangle mediaBox = pdPage.getMediaBox(); + switch (rotation) + { + case 90: + rotateAT.translate(mediaBox.getHeight(), 0); + break; + case 270: + rotateAT.translate(0, mediaBox.getWidth()); + break; + case 180: + rotateAT.translate(mediaBox.getWidth(), mediaBox.getHeight()); + break; + default: + break; + } + rotateAT.rotate(Math.toRadians(rotation)); + } + // Trigger processing of the document so that writeString is called. + try (Writer dummy = new OutputStreamWriter(new ByteArrayOutputStream())) { + super.output = dummy; + super.processPage(pdPage); + } + + Rectangle2D[][] regions = calculateTableRegions(); + +// System.err.println("Drawing " + nCols + "x" + nRows + "="+ nRows*nCols + " regions"); + for(int i=0; i columns = new LinkedList(); + LinkedList rows = new LinkedList(); + + for(Rectangle2D box: boxes) { + Interval x = new Interval(box.getMinX(), box.getMaxX()); + Interval y = new Interval(box.getMinY(), box.getMaxY()); + + Interval.addTo(x, columns); + Interval.addTo(y, rows); + } + + nRows = rows.size(); + nCols = columns.size(); + Rectangle2D[][] regions = new Rectangle2D[nCols][nRows]; + int i=0; + // Label regions from top left, rather than the transformed orientation + for(Interval column: columns) { + int j=0; + for(Interval row: rows) { + regions[nCols-i-1][nRows-j-1] = new Rectangle2D.Double(column.start, row.start, column.end - column.start, row.end - row.start); + ++j; + } + ++i; + } + + return regions; + } + + /** + * Register each character's bounding box, updating boxes field to maintain + * a list of all distinct groups of characters. + * + * Overrides the default functionality of PDFTextStripper. + * Most of this is taken from DrawPrintTextLocations.java, with extra steps + * at end of main loop + */ + @Override + protected void writeString(String string, List textPositions) throws IOException + { + for (TextPosition text : textPositions) + { + // glyph space -> user space + // note: text.getTextMatrix() is *not* the Text Matrix, it's the Text Rendering Matrix + AffineTransform at = text.getTextMatrix().createAffineTransform(); + PDFont font = text.getFont(); + BoundingBox bbox = font.getBoundingBox(); + + // advance width, bbox height (glyph space) + float xadvance = font.getWidth(text.getCharacterCodes()[0]); // todo: should iterate all chars + Rectangle2D.Float rect = new Rectangle2D.Float(0, bbox.getLowerLeftY(), xadvance, bbox.getHeight()); + + if (font instanceof PDType3Font) + { + // bbox and font matrix are unscaled + at.concatenate(font.getFontMatrix().createAffineTransform()); + } + else + { + // bbox and font matrix are already scaled to 1000 + at.scale(1/1000f, 1/1000f); + } + Shape s = at.createTransformedShape(rect); + s = flipAT.createTransformedShape(s); + s = rotateAT.createTransformedShape(s); + + + // + // Merge character's bounding box with boxes field + // + Rectangle2D bounds = s.getBounds2D(); + // Pad sides to detect almost touching boxes + Rectangle2D hitbox = bounds.getBounds2D(); + hitbox.add(bounds.getMinX() - dx , bounds.getMinY() - dy); + hitbox.add(bounds.getMaxX() + dx , bounds.getMaxY() + dy); + + // Find all overlapping boxes + List intersectList = new ArrayList(); + for(Rectangle2D box: boxes) { + if(box.intersects(hitbox)) { + intersectList.add(box); + } + } + + // Combine all touching boxes and update + // (NOTE: Potentially this could leave some overlapping boxes un-merged, + // but it's sufficient for now and get's fixed up in calculateTableRegions) + for(Rectangle2D box: intersectList) { + bounds.add(box); + boxes.remove(box); + } + boxes.add(bounds); + + } + + } + + /** + * This method does nothing in this derived class, because beads and regions are incompatible. Beads are + * ignored when stripping by area. + * + * @param aShouldSeparateByBeads The new grouping of beads. + */ + @Override + public final void setShouldSeparateByBeads(boolean aShouldSeparateByBeads) + { + } + + /** + * Adapted from PDFTextStripperByArea + * {@inheritDoc} + */ + @Override + protected void processTextPosition( TextPosition text ) + { + if(regionArea!=null && !regionArea.contains( text.getX(), text.getY() ) ) { + // skip character + } else { + super.processTextPosition( text ); + } + } +} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java index c4c747aa4..cba7ebb53 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java @@ -1,22 +1,8 @@ package stirling.software.SPDF.controller.web; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.Resource; -import org.springframework.core.io.ResourceLoader; -import org.springframework.core.io.support.ResourcePatternUtils; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.UserDetails; @@ -27,10 +13,8 @@ import org.springframework.web.bind.annotation.GetMapping; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; -import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.User; import stirling.software.SPDF.repository.UserRepository; @Controller @@ -107,6 +91,7 @@ public class AccountWebController { model.addAttribute("username", username); model.addAttribute("role", user.get().getRolesAsString()); model.addAttribute("settings", settingsJson); + model.addAttribute("changeCredsFlag", user.get().isFirstLogin()); } } else { return "redirect:/"; @@ -116,5 +101,35 @@ public class AccountWebController { + @GetMapping("/change-creds") + public String changeCreds(HttpServletRequest request, Model model, Authentication authentication) { + if (authentication == null || !authentication.isAuthenticated()) { + return "redirect:/"; + } + if (authentication != null && authentication.isAuthenticated()) { + Object principal = authentication.getPrincipal(); + + if (principal instanceof UserDetails) { + // Cast the principal object to UserDetails + UserDetails userDetails = (UserDetails) principal; + + // Retrieve username and other attributes + String username = userDetails.getUsername(); + + // Fetch user details from the database + Optional user = userRepository.findByUsername(username); // Assuming findByUsername method exists + if (!user.isPresent()) { + // Handle error appropriately + return "redirect:/error"; // Example redirection in case of error + } + // Add attributes to the model + model.addAttribute("username", username); + } + } else { + return "redirect:/"; + } + return "change-creds"; + } + } diff --git a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java b/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java index 76e7be8f0..3bad71c91 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java @@ -99,6 +99,14 @@ public class ConverterWebController { return modelAndView; } + @GetMapping("/pdf-to-csv") + @Hidden + public ModelAndView pdfToCSV() { + ModelAndView modelAndView = new ModelAndView("convert/pdf-to-csv"); + modelAndView.addObject("currentPage", "pdf-to-csv"); + return modelAndView; + } + @GetMapping("/pdf-to-pdfa") @Hidden diff --git a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java index 166a40d27..77bae9b41 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java @@ -1,4 +1,5 @@ package stirling.software.SPDF.controller.web; + import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -9,6 +10,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -20,6 +22,7 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Hidden; @@ -50,7 +53,8 @@ public class GeneralWebController { } List> pipelineConfigsWithNames = new ArrayList<>(); for (String config : pipelineConfigs) { - Map jsonContent = new ObjectMapper().readValue(config, Map.class); + Map jsonContent = new ObjectMapper().readValue(config, new TypeReference>(){}); + String name = (String) jsonContent.get("name"); Map configWithName = new HashMap<>(); configWithName.put("json", config); @@ -78,6 +82,19 @@ public class GeneralWebController { return "merge-pdfs"; } + @GetMapping("/split-pdf-by-sections") + @Hidden + public String splitPdfBySections(Model model) { + model.addAttribute("currentPage", "split-pdf-by-sections"); + return "split-pdf-by-sections"; + } + + @GetMapping("/view-pdf") + @Hidden + public String ViewPdfForm2(Model model) { + model.addAttribute("currentPage", "view-pdf"); + return "view-pdf"; + } @GetMapping("/multi-tool") @Hidden @@ -145,30 +162,132 @@ public class GeneralWebController { return "add-elements"; } + + @GetMapping("/multi-page-layout") + @Hidden + public String multiPageLayoutForm(Model model) { + model.addAttribute("currentPage", "multi-page-layout"); + return "multi-page-layout"; + } + + + @GetMapping("/scale-pages") + @Hidden + public String scalePagesFrom(Model model) { + model.addAttribute("currentPage", "scale-pages"); + return "scale-pages"; + } + + + @GetMapping("/split-by-size-or-count") + @Hidden + public String splitBySizeOrCount(Model model) { + model.addAttribute("currentPage", "split-by-size-or-count"); + return "split-by-size-or-count"; + } + + @GetMapping("/overlay-pdf") + @Hidden + public String overlayPdf(Model model) { + model.addAttribute("currentPage", "overlay-pdf"); + return "overlay-pdf"; + } + + + @Autowired private ResourceLoader resourceLoader; - private List getFontNames() { + private List getFontNames() { + List fontNames = new ArrayList<>(); + + // Extract font names from classpath + fontNames.addAll(getFontNamesFromLocation("classpath:static/fonts/*.woff2")); + + // Extract font names from external directory + fontNames.addAll(getFontNamesFromLocation("file:customFiles/static/fonts/*")); + + return fontNames; + } + + private List getFontNamesFromLocation(String locationPattern) { try { Resource[] resources = ResourcePatternUtils.getResourcePatternResolver(resourceLoader) - .getResources("classpath:static/fonts/*.woff2"); - + .getResources(locationPattern); return Arrays.stream(resources) .map(resource -> { try { String filename = resource.getFilename(); - return filename.substring(0, filename.length() - 6); // Remove .woff2 extension + if (filename != null) { + int lastDotIndex = filename.lastIndexOf('.'); + if (lastDotIndex != -1) { + String name = filename.substring(0, lastDotIndex); + String extension = filename.substring(lastDotIndex + 1); + return new FontResource(name, extension); + } + } + return null; } catch (Exception e) { throw new RuntimeException("Error processing filename", e); } }) + .filter(Objects::nonNull) .collect(Collectors.toList()); } catch (Exception e) { - throw new RuntimeException("Failed to read font directory", e); + throw new RuntimeException("Failed to read font directory from " + locationPattern, e); + } + } + + + public String getFormatFromExtension(String extension) { + switch (extension) { + case "ttf": return "truetype"; + case "woff": return "woff"; + case "woff2": return "woff2"; + case "eot": return "embedded-opentype"; + case "svg": return "svg"; + default: return ""; // or throw an exception if an unexpected extension is encountered } } + public class FontResource { + private String name; + private String extension; + private String type; + public FontResource(String name, String extension) { + this.name = name; + this.extension = extension; + this.type = getFormatFromExtension(extension); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getExtension() { + return extension; + } + + public void setExtension(String extension) { + this.extension = extension; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + + } + @GetMapping("/crop") @Hidden diff --git a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java b/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java index 157f76e48..ce4ae6496 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java @@ -15,19 +15,19 @@ import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.tags.Tag; @Controller -@Tag(name = "Other", description = "Other APIs") +@Tag(name = "Misc", description = "Miscellaneous APIs") public class OtherWebController { @GetMapping("/compress-pdf") @Hidden public String compressPdfForm(Model model) { model.addAttribute("currentPage", "compress-pdf"); - return "other/compress-pdf"; + return "misc/compress-pdf"; } @GetMapping("/extract-image-scans") @Hidden public ModelAndView extractImageScansForm() { - ModelAndView modelAndView = new ModelAndView("other/extract-image-scans"); + ModelAndView modelAndView = new ModelAndView("misc/extract-image-scans"); modelAndView.addObject("currentPage", "extract-image-scans"); return modelAndView; } @@ -36,7 +36,7 @@ public class OtherWebController { @Hidden public String extractJavascriptForm(Model model) { model.addAttribute("currentPage", "show-javascript"); - return "other/show-javascript"; + return "misc/show-javascript"; } @@ -44,21 +44,21 @@ public class OtherWebController { @Hidden public String addPageNumbersForm(Model model) { model.addAttribute("currentPage", "add-page-numbers"); - return "other/add-page-numbers"; + return "misc/add-page-numbers"; } @GetMapping("/extract-images") @Hidden public String extractImagesForm(Model model) { model.addAttribute("currentPage", "extract-images"); - return "other/extract-images"; + return "misc/extract-images"; } @GetMapping("/flatten") @Hidden public String flattenForm(Model model) { model.addAttribute("currentPage", "flatten"); - return "other/flatten"; + return "misc/flatten"; } @@ -67,18 +67,18 @@ public class OtherWebController { @Hidden public String addWatermarkForm(Model model) { model.addAttribute("currentPage", "change-metadata"); - return "other/change-metadata"; + return "misc/change-metadata"; } @GetMapping("/compare") @Hidden public String compareForm(Model model) { model.addAttribute("currentPage", "compare"); - return "other/compare"; + return "misc/compare"; } public List getAvailableTesseractLanguages() { - String tessdataDir = "/usr/share/tesseract-ocr/4.00/tessdata"; + String tessdataDir = "/usr/share/tesseract-ocr/5/tessdata"; File[] files = new File(tessdataDir).listFiles(); if (files == null) { return Collections.emptyList(); @@ -90,7 +90,7 @@ public class OtherWebController { @GetMapping("/ocr-pdf") @Hidden public ModelAndView ocrPdfPage() { - ModelAndView modelAndView = new ModelAndView("other/ocr-pdf"); + ModelAndView modelAndView = new ModelAndView("misc/ocr-pdf"); List languages = getAvailableTesseractLanguages(); Collections.sort(languages); modelAndView.addObject("languages", languages); @@ -98,61 +98,54 @@ public class OtherWebController { return modelAndView; } - + @GetMapping("/add-image") @Hidden public String overlayImage(Model model) { model.addAttribute("currentPage", "add-image"); - return "other/add-image"; + return "misc/add-image"; } @GetMapping("/adjust-contrast") @Hidden public String contrast(Model model) { model.addAttribute("currentPage", "adjust-contrast"); - return "other/adjust-contrast"; + return "misc/adjust-contrast"; } @GetMapping("/repair") @Hidden public String repairForm(Model model) { model.addAttribute("currentPage", "repair"); - return "other/repair"; + return "misc/repair"; } @GetMapping("/remove-blanks") @Hidden public String removeBlanksForm(Model model) { model.addAttribute("currentPage", "remove-blanks"); - return "other/remove-blanks"; + return "misc/remove-blanks"; } - - @GetMapping("/multi-page-layout") + + @GetMapping("/remove-annotations") @Hidden - public String multiPageLayoutForm(Model model) { - model.addAttribute("currentPage", "multi-page-layout"); - return "other/multi-page-layout"; + public String removeAnnotationsForm(Model model) { + model.addAttribute("currentPage", "remove-annotations"); + return "misc/remove-annotations"; } - - @GetMapping("/scale-pages") - @Hidden - public String scalePagesFrom(Model model) { - model.addAttribute("currentPage", "scale-pages"); - return "other/scale-pages"; - } - + @GetMapping("/auto-crop") @Hidden public String autoCropForm(Model model) { model.addAttribute("currentPage", "auto-crop"); - return "other/auto-crop"; + return "misc/auto-crop"; } @GetMapping("/auto-rename") @Hidden public String autoRenameForm(Model model) { model.addAttribute("currentPage", "auto-rename"); - return "other/auto-rename"; + return "misc/auto-rename"; } diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java index c8cef5a30..dc0687794 100644 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java @@ -104,16 +104,8 @@ public class ApplicationProperties { } public static class Security { private Boolean enableLogin; - private InitialLogin initialLogin; private Boolean csrfDisabled; - - public Boolean getEnableLogin() { - return enableLogin; - } - - public void setEnableLogin(Boolean enableLogin) { - this.enableLogin = enableLogin; - } + private InitialLogin initialLogin; public InitialLogin getInitialLogin() { return initialLogin != null ? initialLogin : new InitialLogin(); @@ -122,6 +114,14 @@ public class ApplicationProperties { public void setInitialLogin(InitialLogin initialLogin) { this.initialLogin = initialLogin; } + + public Boolean getEnableLogin() { + return enableLogin; + } + + public void setEnableLogin(Boolean enableLogin) { + this.enableLogin = enableLogin; + } public Boolean getCsrfDisabled() { return csrfDisabled; @@ -134,16 +134,15 @@ public class ApplicationProperties { @Override public String toString() { - return "Security [enableLogin=" + enableLogin + ", initialLogin=" + initialLogin + ", csrfDisabled=" + return "Security [enableLogin=" + enableLogin + ", initialLogin=" + initialLogin + ", csrfDisabled=" + csrfDisabled + "]"; } - - + public static class InitialLogin { private String username; private String password; - + public String getUsername() { return username; } @@ -166,7 +165,7 @@ public class ApplicationProperties { } - + } } @@ -233,6 +232,8 @@ public class ApplicationProperties { private String appNameNavbar; public String getAppName() { + if(appName != null && appName.trim().length() == 0) + return null; return appName; } @@ -241,6 +242,8 @@ public class ApplicationProperties { } public String getHomeDescription() { + if(homeDescription != null && homeDescription.trim().length() == 0) + return null; return homeDescription; } @@ -249,6 +252,8 @@ public class ApplicationProperties { } public String getAppNameNavbar() { + if(appNameNavbar != null && appNameNavbar.trim().length() == 0) + return null; return appNameNavbar; } diff --git a/src/main/java/stirling/software/SPDF/model/SortTypes.java b/src/main/java/stirling/software/SPDF/model/SortTypes.java new file mode 100644 index 000000000..21181cfa0 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/SortTypes.java @@ -0,0 +1,4 @@ +package stirling.software.SPDF.model; +public enum SortTypes { + REVERSE_ORDER, DUPLEX_SORT, BOOKLET_SORT, SIDE_STITCH_BOOKLET_SORT, ODD_EVEN_SPLIT, REMOVE_FIRST, REMOVE_LAST, REMOVE_FIRST_AND_LAST, +} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/model/User.java b/src/main/java/stirling/software/SPDF/model/User.java index 2881e3082..f771a821b 100644 --- a/src/main/java/stirling/software/SPDF/model/User.java +++ b/src/main/java/stirling/software/SPDF/model/User.java @@ -40,6 +40,9 @@ public class User { @Column(name = "enabled") private boolean enabled; + @Column(name = "isFirstLogin") + private Boolean isFirstLogin = false; + @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "user") private Set authorities = new HashSet<>(); @@ -50,7 +53,14 @@ public class User { private Map settings = new HashMap<>(); // Key-value pairs of settings. - + public boolean isFirstLogin() { + return isFirstLogin != null && isFirstLogin; + } + + public void setFirstLogin(boolean isFirstLogin) { + this.isFirstLogin = isFirstLogin; + } + public Long getId() { return id; } diff --git a/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java b/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java new file mode 100644 index 000000000..441d904a7 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java @@ -0,0 +1,17 @@ +package stirling.software.SPDF.model.api; + +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@EqualsAndHashCode +@NoArgsConstructor +public class GeneralFile { + + @Schema(description = "The input file") + private MultipartFile fileInput; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java b/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java new file mode 100644 index 000000000..1d7a8afe3 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java @@ -0,0 +1,20 @@ +package stirling.software.SPDF.model.api; + +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@EqualsAndHashCode +public class HandleDataRequest { + + @Schema(description = "The input files") + private MultipartFile[] fileInputs; + + @Schema(description = "JSON String") + private String jsonString; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/ImageFile.java b/src/main/java/stirling/software/SPDF/model/api/ImageFile.java new file mode 100644 index 000000000..020798434 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/ImageFile.java @@ -0,0 +1,16 @@ +package stirling.software.SPDF.model.api; + +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@EqualsAndHashCode +public class ImageFile { + @Schema(description = "The input image file") + private MultipartFile fileInput; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java b/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java new file mode 100644 index 000000000..937a42654 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java @@ -0,0 +1,15 @@ +package stirling.software.SPDF.model.api; + +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +@Data +@NoArgsConstructor +@EqualsAndHashCode +public class MultiplePDFFiles { + @Schema(description = "The input PDF files", type = "array", format = "binary") + private MultipartFile[] fileInput; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java b/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java new file mode 100644 index 000000000..1f902d881 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java @@ -0,0 +1,16 @@ +package stirling.software.SPDF.model.api; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper=true) +public class PDFComparison extends PDFFile { + + @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = { + "Greater", "Equal", "Less" }) + private String comparator; + +} diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java b/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java new file mode 100644 index 000000000..14462f0a2 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java @@ -0,0 +1,15 @@ +package stirling.software.SPDF.model.api; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper=true) +public class PDFComparisonAndCount extends PDFComparison { + @Schema(description = "Count") + private String pageCount; + + +} diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFFile.java b/src/main/java/stirling/software/SPDF/model/api/PDFFile.java new file mode 100644 index 000000000..378b3c030 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/PDFFile.java @@ -0,0 +1,13 @@ +package stirling.software.SPDF.model.api; + +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +@Data +@EqualsAndHashCode +public class PDFFile { + @Schema(description = "The input PDF file") + private MultipartFile fileInput; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithImageFormatRequest.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithImageFormatRequest.java new file mode 100644 index 000000000..aa8fe08b4 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/PDFWithImageFormatRequest.java @@ -0,0 +1,14 @@ +package stirling.software.SPDF.model.api; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper=true) +public class PDFWithImageFormatRequest extends PDFFile { + + @Schema(description = "The output image format e.g., 'png', 'jpeg', or 'gif'", + allowableValues = { "png", "jpeg", "gif" }) + private String format; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java new file mode 100644 index 000000000..d53d8d121 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java @@ -0,0 +1,39 @@ +package stirling.software.SPDF.model.api; + +import java.io.IOException; +import java.util.List; + +import org.apache.pdfbox.pdmodel.PDDocument; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import stirling.software.SPDF.utils.GeneralUtils; +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper=true) +public class PDFWithPageNums extends PDFFile { + + @Schema(description = "The pages to select, Supports ranges (e.g., '1,3,5-9'), or 'all' or functions in the format 'an+b' where 'a' is the multiplier of the page number 'n', and 'b' is a constant (e.g., '2n+1', '3n', '6n-5')\"") + private String pageNumbers; + + + public List getPageNumbersList(){ + int pageCount = 0; + try { + pageCount = PDDocument.load(getFileInput().getInputStream()).getNumberOfPages(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return GeneralUtils.parsePageString(pageNumbers, pageCount); + + } + public List getPageNumbersList(PDDocument doc){ + int pageCount = 0; + pageCount = doc.getNumberOfPages(); + return GeneralUtils.parsePageString(pageNumbers, pageCount); + + } +} diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageSize.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageSize.java new file mode 100644 index 000000000..661a4ffe7 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageSize.java @@ -0,0 +1,16 @@ +package stirling.software.SPDF.model.api; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper=true) +public class PDFWithPageSize extends PDFFile { + + @Schema(description = "The scale of pages in the output PDF. Acceptable values are A0-A6, LETTER, LEGAL.", + allowableValues = { + "A0", "A1", "A2", "A3", "A4", "A5", "A6", "LETTER", "LEGAL" + }) + private String pageSize; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/SplitPdfBySectionsRequest.java b/src/main/java/stirling/software/SPDF/model/api/SplitPdfBySectionsRequest.java new file mode 100644 index 000000000..14112152a --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/SplitPdfBySectionsRequest.java @@ -0,0 +1,16 @@ +package stirling.software.SPDF.model.api; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper=true) +public class SplitPdfBySectionsRequest extends PDFFile { + @Schema(description = "Number of horizontal divisions for each PDF page", example = "2") + private int horizontalDivisions; + + @Schema(description = "Number of vertical divisions for each PDF page", example = "2") + private int verticalDivisions; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java new file mode 100644 index 000000000..180266187 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java @@ -0,0 +1,23 @@ +package stirling.software.SPDF.model.api.converters; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class ConvertToImageRequest extends PDFFile { + + @Schema(description = "The output image format", allowableValues = {"png", "jpeg", "jpg", "gif"}) + private String imageFormat; + + @Schema(description = "Choose between a single image containing all pages or separate images for each page", allowableValues = {"single", "multiple"}) + private String singleOrMultiple; + + @Schema(description = "The color type of the output image(s)", allowableValues = {"color", "greyscale", "blackwhite"}) + private String colorType; + + @Schema(description = "The DPI (dots per inch) for the output image(s)") + private String dpi; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToPdfRequest.java new file mode 100644 index 000000000..37df6f9ec --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToPdfRequest.java @@ -0,0 +1,27 @@ +package stirling.software.SPDF.model.api.converters; + +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode +public class ConvertToPdfRequest { + + @Schema(description = "The input images to be converted to a PDF file") + private MultipartFile[] fileInput; + + @Schema(description = "Option to determine how the image will fit onto the page", + allowableValues = { "fillPage", "fitDocumentToImage", "maintainAspectRatio" }) + private String fitOption; + + + + @Schema(description = "The color type of the output image(s)", allowableValues = {"color", "greyscale", "blackwhite"}) + private String colorType; + + @Schema(description = "Whether to automatically rotate the images to better fit the PDF page", example = "true") + private boolean autoRotate; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java new file mode 100644 index 000000000..0e8b79ada --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java @@ -0,0 +1,14 @@ +package stirling.software.SPDF.model.api.converters; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class PdfToPresentationRequest extends PDFFile { + + @Schema(description = "The output Presentation format", allowableValues = {"ppt", "pptx", "odp"}) + private String outputFormat; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java new file mode 100644 index 000000000..687ed6218 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java @@ -0,0 +1,14 @@ +package stirling.software.SPDF.model.api.converters; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class PdfToTextOrRTFRequest extends PDFFile { + + @Schema(description = "The output Text or RTF format", allowableValues = {"rtf", "txt:Text"}) + private String outputFormat; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java new file mode 100644 index 000000000..87150c73b --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java @@ -0,0 +1,14 @@ +package stirling.software.SPDF.model.api.converters; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class PdfToWordRequest extends PDFFile { + + @Schema(description = "The output Word document format", allowableValues = {"doc", "docx", "odt"}) + private String outputFormat; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/UrlToPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/UrlToPdfRequest.java new file mode 100644 index 000000000..4607c153a --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/converters/UrlToPdfRequest.java @@ -0,0 +1,13 @@ +package stirling.software.SPDF.model.api.converters; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode +public class UrlToPdfRequest { + + @Schema(description = "The input URL to be converted to a PDF file", required = true) + private String urlInput; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/extract/PDFFilePage.java b/src/main/java/stirling/software/SPDF/model/api/extract/PDFFilePage.java new file mode 100644 index 000000000..bfe87a160 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/extract/PDFFilePage.java @@ -0,0 +1,18 @@ +package stirling.software.SPDF.model.api.extract; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class PDFFilePage extends PDFFile { + + + @Schema(description = "Number of chosen page", type = "number") + private int pageId; + + +} + diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java new file mode 100644 index 000000000..0b6cb1cbb --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java @@ -0,0 +1,14 @@ +package stirling.software.SPDF.model.api.filter; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFWithPageNums; + +@Data +@EqualsAndHashCode(callSuper=true) +public class ContainsTextRequest extends PDFWithPageNums { + + @Schema(description = "The text to check for", required = true) + private String text; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java new file mode 100644 index 000000000..ce9a92365 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java @@ -0,0 +1,16 @@ +package stirling.software.SPDF.model.api.filter; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFComparison; + +@Data +@EqualsAndHashCode(callSuper=true) +public class FileSizeRequest extends PDFComparison { + + @Schema(description = "File Size", required = true) + private String fileSize; + + +} diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java new file mode 100644 index 000000000..d5fb9739f --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java @@ -0,0 +1,15 @@ +package stirling.software.SPDF.model.api.filter; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFComparison; + +@Data +@EqualsAndHashCode(callSuper=true) +public class PageRotationRequest extends PDFComparison { + + @Schema(description = "Rotation in degrees", required = true) + private int rotation; + +} diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java new file mode 100644 index 000000000..12083636c --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java @@ -0,0 +1,16 @@ +package stirling.software.SPDF.model.api.filter; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFComparison; + +@Data +@EqualsAndHashCode(callSuper=true) +public class PageSizeRequest extends PDFComparison { + + @Schema(description = "Standard Page Size", required = true) + private String standardPageSize; + + +} diff --git a/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java b/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java new file mode 100644 index 000000000..528215152 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java @@ -0,0 +1,24 @@ +package stirling.software.SPDF.model.api.general; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class CropPdfForm extends PDFFile { + + + @Schema(description = "The x-coordinate of the top-left corner of the crop area", type = "number") + private float x; + + @Schema(description = "The y-coordinate of the top-left corner of the crop area", type = "number") + private float y; + + @Schema(description = "The width of the crop area", type = "number") + private float width; + + @Schema(description = "The height of the crop area", type = "number") + private float height; +} + diff --git a/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java new file mode 100644 index 000000000..4642cb75a --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java @@ -0,0 +1,18 @@ +package stirling.software.SPDF.model.api.general; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class MergeMultiplePagesRequest extends PDFFile { + + @Schema(description = "The number of pages to fit onto a single sheet in the output PDF.", + type = "integer", allowableValues = {"2", "3", "4", "9", "16"}) + private int pagesPerSheet; + + @Schema(description = "Boolean for if you wish to add border around the pages") + private boolean addBorder; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java new file mode 100644 index 000000000..b7b3bda74 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java @@ -0,0 +1,22 @@ +package stirling.software.SPDF.model.api.general; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.MultiplePDFFiles; + +@Data +@EqualsAndHashCode(callSuper=true) +public class MergePdfsRequest extends MultiplePDFFiles { + + @Schema(description = "The type of sorting to be applied on the input files before merging.", + allowableValues = { + "orderProvided", + "byFileName", + "byDateModified", + "byDateCreated", + "byPDFTitle" + }, + defaultValue = "orderProvided") + private String sortType = "orderProvided"; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java new file mode 100644 index 000000000..13ca78578 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java @@ -0,0 +1,24 @@ +package stirling.software.SPDF.model.api.general; +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper = true) +public class OverlayPdfsRequest extends PDFFile { + + @Schema(description = "An array of PDF files to be used as overlays on the base PDF. The order in these files is applied based on the selected mode.") + private MultipartFile[] overlayFiles; + + @Schema(description = "The mode of overlaying: 'SequentialOverlay' for sequential application, 'InterleavedOverlay' for round-robin application, 'FixedRepeatOverlay' for fixed repetition based on provided counts", required = true) + private String overlayMode; + + @Schema(description = "An array of integers specifying the number of times each corresponding overlay file should be applied in the 'FixedRepeatOverlay' mode. This should match the length of the overlayFiles array.", required = false) + private int[] counts; + + @Schema(description = "Overlay position 0 is Foregound, 1 is Background") + private int overlayPosition; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java new file mode 100644 index 000000000..3e5b4f235 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java @@ -0,0 +1,23 @@ +package stirling.software.SPDF.model.api.general; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.SortTypes; +import stirling.software.SPDF.model.api.PDFWithPageNums; +@Data +@EqualsAndHashCode(callSuper=true) +public class RearrangePagesRequest extends PDFWithPageNums { + + @Schema(implementation = SortTypes.class, description = "The custom mode for page rearrangement. Valid values are:\n" + + "REVERSE_ORDER: Reverses the order of all pages.\n" + + "DUPLEX_SORT: Sorts pages as if all fronts were scanned then all backs in reverse (1, n, 2, n-1, ...). " + + "BOOKLET_SORT: Arranges pages for booklet printing (last, first, second, second last, ...).\n" + + "ODD_EVEN_SPLIT: Splits and arranges pages into odd and even numbered pages.\n" + + "REMOVE_FIRST: Removes the first page.\n" + "REMOVE_LAST: Removes the last page.\n" + + "REMOVE_FIRST_AND_LAST: Removes both the first and the last pages.\n") + private String customMode; + + + +} diff --git a/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java new file mode 100644 index 000000000..8f48c6052 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java @@ -0,0 +1,14 @@ +package stirling.software.SPDF.model.api.general; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class RotatePDFRequest extends PDFFile { + + @Schema(description = "The angle by which to rotate the PDF file. This should be a multiple of 90.", example = "90") + private Integer angle; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java new file mode 100644 index 000000000..ff44b01d9 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java @@ -0,0 +1,14 @@ +package stirling.software.SPDF.model.api.general; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFWithPageSize; + +@Data +@EqualsAndHashCode(callSuper=true) +public class ScalePagesRequest extends PDFWithPageSize { + + @Schema(description = "The scale of the content on the pages of the output PDF. Acceptable values are floats.") + private float scaleFactor; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/general/SplitPdfBySizeOrCountRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/SplitPdfBySizeOrCountRequest.java new file mode 100644 index 000000000..087ce80c2 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/general/SplitPdfBySizeOrCountRequest.java @@ -0,0 +1,18 @@ +package stirling.software.SPDF.model.api.general; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class SplitPdfBySizeOrCountRequest extends PDFFile { + + @Schema(description = "Determines the type of split: 0 for size, 1 for page count, 2 for document count", required = false, defaultValue = "0") + private int splitType; + + + @Schema(description = "Value for split: size in MB (e.g., '10MB') or number of pages (e.g., '5')", required = false, defaultValue = "10MB") + private String splitValue; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java new file mode 100644 index 000000000..313d42ab8 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java @@ -0,0 +1,26 @@ +package stirling.software.SPDF.model.api.misc; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFWithPageNums; + +@Data +@EqualsAndHashCode(callSuper=true) +public class AddPageNumbersRequest extends PDFWithPageNums { + + @Schema(description = "Custom margin: small/medium/large", allowableValues = {"small", "medium", "large"}) + private String customMargin; + + @Schema(description = "Position: 1 of 9 positions", minimum = "1", maximum = "9") + private int position; + + @Schema(description = "Starting number", minimum = "1") + private int startingNumber; + + @Schema(description = "Which pages to number, default all") + private String pagesToNumber; + + @Schema(description = "Custom text: defaults to just number but can have things like \"Page {n} of {p}\"") + private String customText; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java new file mode 100644 index 000000000..c49237469 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java @@ -0,0 +1,14 @@ +package stirling.software.SPDF.model.api.misc; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class AutoSplitPdfRequest extends PDFFile { + + @Schema(description = "Flag indicating if the duplex mode is active, where the page after the divider also gets removed.", required = false, defaultValue = "false") + private boolean duplexMode; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java new file mode 100644 index 000000000..f30284452 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java @@ -0,0 +1,14 @@ +package stirling.software.SPDF.model.api.misc; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class ExtractHeaderRequest extends PDFFile { + + @Schema(description = "Flag indicating whether to use the first text as a fallback if no suitable title is found. Defaults to false.", required = false, defaultValue = "false") + private boolean useFirstTextAsFallback; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractImageScansRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractImageScansRequest.java new file mode 100644 index 000000000..1a575fe6a --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractImageScansRequest.java @@ -0,0 +1,29 @@ +package stirling.software.SPDF.model.api.misc; + +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode +public class ExtractImageScansRequest { + @Schema(description = "The input file containing image scans", required = true) + private MultipartFile fileInput; + + @Schema(description = "The angle threshold for the image scan extraction", defaultValue = "5", example = "5") + private int angleThreshold = 5; + + @Schema(description = "The tolerance for the image scan extraction", defaultValue = "20", example = "20") + private int tolerance = 20; + + @Schema(description = "The minimum area for the image scan extraction", defaultValue = "8000", example = "8000") + private int minArea = 8000; + + @Schema(description = "The minimum contour area for the image scan extraction", defaultValue = "500", example = "500") + private int minContourArea = 500; + + @Schema(description = "The border size for the image scan extraction", defaultValue = "1", example = "1") + private int borderSize =1; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java new file mode 100644 index 000000000..d62890aa6 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java @@ -0,0 +1,46 @@ +package stirling.software.SPDF.model.api.misc; + +import java.util.Map; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class MetadataRequest extends PDFFile { + + @Schema(description = "Delete all metadata if set to true") + private boolean deleteAll; + + @Schema(description = "The author of the document") + private String author; + + @Schema(description = "The creation date of the document (format: yyyy/MM/dd HH:mm:ss)") + private String creationDate; + + @Schema(description = "The creator of the document") + private String creator; + + @Schema(description = "The keywords for the document") + private String keywords; + + @Schema(description = "The modification date of the document (format: yyyy/MM/dd HH:mm:ss)") + private String modificationDate; + + @Schema(description = "The producer of the document") + private String producer; + + @Schema(description = "The subject of the document") + private String subject; + + @Schema(description = "The title of the document") + private String title; + + @Schema(description = "The trapped status of the document") + private String trapped; + + @Schema(description = "Map list of key and value of custom parameters. Note these must start with customKey and customValue if they are non-standard") + private Map allRequestParams; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java new file mode 100644 index 000000000..bc00cf207 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java @@ -0,0 +1,18 @@ +package stirling.software.SPDF.model.api.misc; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class OptimizePdfRequest extends PDFFile { + + @Schema(description = "The level of optimization to apply to the PDF file. Higher values indicate greater compression but may reduce quality.", + allowableValues = { "1", "2", "3", "4", "5" }) + private Integer optimizeLevel; + + @Schema(description = "The expected output size, e.g. '100MB', '25KB', etc.") + private String expectedOutputSize; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java new file mode 100644 index 000000000..50ec4abbd --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java @@ -0,0 +1,25 @@ +package stirling.software.SPDF.model.api.misc; + +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class OverlayImageRequest extends PDFFile { + + @Schema(description = "The image file to be overlaid onto the PDF.") + private MultipartFile imageFile; + + @Schema(description = "The x-coordinate at which to place the top-left corner of the image.", example = "0") + private float x; + + @Schema(description = "The y-coordinate at which to place the top-left corner of the image.", example = "0") + private float y; + + @Schema(description = "Whether to overlay the image onto every page of the PDF.", example = "false") + private boolean everyPage; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java new file mode 100644 index 000000000..392f8d540 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java @@ -0,0 +1,37 @@ +package stirling.software.SPDF.model.api.misc; + +import java.util.List; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class ProcessPdfWithOcrRequest extends PDFFile { + + @Schema(description = "List of languages to use in OCR processing") + private List languages; + + @Schema(description = "Include OCR text in a sidecar text file if set to true") + private boolean sidecar; + + @Schema(description = "Deskew the input file if set to true") + private boolean deskew; + + @Schema(description = "Clean the input file if set to true") + private boolean clean; + + @Schema(description = "Clean the final output if set to true") + private boolean cleanFinal; + + @Schema(description = "Specify the OCR type, e.g., 'skip-text', 'force-ocr', or 'Normal'", allowableValues = {"skip-text", "force-ocr", "Normal"}) + private String ocrType; + + @Schema(description = "Specify the OCR render type, either 'hocr' or 'sandwich'", allowableValues = {"hocr", "sandwich"}, defaultValue = "hocr") + private String ocrRenderType = "hocr"; + + @Schema(description = "Remove images from the output PDF if set to true") + private boolean removeImagesAfter; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java new file mode 100644 index 000000000..0d2e11c75 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java @@ -0,0 +1,17 @@ +package stirling.software.SPDF.model.api.misc; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class RemoveBlankPagesRequest extends PDFFile { + + @Schema(description = "The threshold value to determine blank pages", example = "10", defaultValue = "10") + private int threshold = 10; + + @Schema(description = "The percentage of white color on a page to consider it as blank", example = "99.9", defaultValue = "99.9") + private float whitePercent = 99.9f; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java new file mode 100644 index 000000000..ea83e470f --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java @@ -0,0 +1,44 @@ +package stirling.software.SPDF.model.api.security; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class AddPasswordRequest extends PDFFile { + + @Schema(description = "The owner password to be added to the PDF file (Restricts what can be done with the document once it is opened)", defaultValue = "") + private String ownerPassword; + + @Schema(description = "The password to be added to the PDF file (Restricts the opening of the document itself.)", defaultValue = "") + private String password; + + @Schema(description = "The length of the encryption key", allowableValues = {"40", "128", "256"}, defaultValue = "256") + private int keyLength = 256; + + @Schema(description = "Whether the document assembly is allowed", example = "false") + private boolean canAssembleDocument; + + @Schema(description = "Whether content extraction for accessibility is allowed", example = "false") + private boolean canExtractContent; + + @Schema(description = "Whether content extraction for accessibility is allowed", example = "false") + private boolean canExtractForAccessibility; + + @Schema(description = "Whether form filling is allowed", example = "false") + private boolean canFillInForm; + + @Schema(description = "Whether the document modification is allowed", example = "false") + private boolean canModify; + + @Schema(description = "Whether modification of annotations is allowed", example = "false") + private boolean canModifyAnnotations; + + @Schema(description = "Whether printing of the document is allowed", example = "false") + private boolean canPrint; + + @Schema(description = "Whether faithful printing is allowed", example = "false") + private boolean canPrintFaithful; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java new file mode 100644 index 000000000..cd8009480 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java @@ -0,0 +1,44 @@ +package stirling.software.SPDF.model.api.security; + +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class AddWatermarkRequest extends PDFFile { + + @Schema(description = "The watermark type (text or image)", + allowableValues = {"text", "image"}, + required = true) + private String watermarkType; + + @Schema(description = "The watermark text") + private String watermarkText; + + @Schema(description = "The watermark image") + private MultipartFile watermarkImage; + + @Schema(description = "The selected alphabet", + allowableValues = {"roman", "arabic", "japanese", "korean", "chinese"}, + defaultValue = "roman") + private String alphabet = "roman"; + + @Schema(description = "The font size of the watermark text", example = "30") + private float fontSize = 30; + + @Schema(description = "The rotation of the watermark in degrees", example = "0") + private float rotation = 0; + + @Schema(description = "The opacity of the watermark (0.0 - 1.0)", example = "0.5") + private float opacity; + + @Schema(description = "The width spacer between watermark elements", example = "50") + private int widthSpacer; + + @Schema(description = "The height spacer between watermark elements", example = "50") + private int heightSpacer; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java new file mode 100644 index 000000000..94d04d1e2 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java @@ -0,0 +1,14 @@ +package stirling.software.SPDF.model.api.security; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class PDFPasswordRequest extends PDFFile { + + @Schema(description = "The password of the PDF file", required = true) + private String password; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java new file mode 100644 index 000000000..1966c53ae --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java @@ -0,0 +1,29 @@ +package stirling.software.SPDF.model.api.security; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class RedactPdfRequest extends PDFFile { + + @Schema(description = "List of text to redact from the PDF", type = "string", required = true) + private String listOfText; + + @Schema(description = "Whether to use regex for the listOfText", defaultValue = "false") + private boolean useRegex; + + @Schema(description = "Whether to use whole word search", defaultValue = "false") + private boolean wholeWordSearch; + + @Schema(description = "The color for redaction", defaultValue = "#000000") + private String redactColor = "#000000"; + + @Schema(description = "Custom padding for redaction", type = "number") + private float customPadding; + + @Schema(description = "Convert the redacted PDF to an image", defaultValue = "false") + private boolean convertPDFToImage; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java new file mode 100644 index 000000000..98c7743f9 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java @@ -0,0 +1,26 @@ +package stirling.software.SPDF.model.api.security; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class SanitizePdfRequest extends PDFFile { + + @Schema(description = "Remove JavaScript actions from the PDF", defaultValue = "false") + private boolean removeJavaScript; + + @Schema(description = "Remove embedded files from the PDF", defaultValue = "false") + private boolean removeEmbeddedFiles; + + @Schema(description = "Remove metadata from the PDF", defaultValue = "false") + private boolean removeMetadata; + + @Schema(description = "Remove links from the PDF", defaultValue = "false") + private boolean removeLinks; + + @Schema(description = "Remove fonts from the PDF", defaultValue = "false") + private boolean removeFonts; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java new file mode 100644 index 000000000..8e537c6a4 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java @@ -0,0 +1,43 @@ +package stirling.software.SPDF.model.api.security; + +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper=true) +public class SignPDFWithCertRequest extends PDFFile { + + @Schema(description = "The type of the digital certificate", allowableValues = { "PKCS12", "PEM" }) + private String certType; + + @Schema(description = "The private key for the digital certificate (required for PEM type certificates)") + private MultipartFile privateKeyFile; + + @Schema(description = "The digital certificate (required for PEM type certificates)") + private MultipartFile certFile; + + @Schema(description = "The PKCS12 keystore file (required for PKCS12 type certificates)") + private MultipartFile p12File; + + @Schema(description = "The password for the keystore or the private key") + private String password; + + @Schema(description = "Whether to visually show the signature in the PDF file") + private boolean showSignature; + + @Schema(description = "The reason for signing the PDF") + private String reason; + + @Schema(description = "The location where the PDF is signed") + private String location; + + @Schema(description = "The name of the signer") + private String name; + + @Schema(description = "The page number where the signature should be visible. This is required if showSignature is set to true") + private Integer pageNumber; +} diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index 28a1e73e4..6de7df149 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -1,6 +1,9 @@ package stirling.software.SPDF.utils; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.nio.file.FileVisitResult; @@ -12,6 +15,7 @@ import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.List; +import org.springframework.web.multipart.MultipartFile; public class GeneralUtils { public static void deleteDirectory(Path path) throws IOException { @@ -48,6 +52,18 @@ public class GeneralUtils { } } + public static File multipartToFile(MultipartFile multipart) throws IOException { + Path tempFile = Files.createTempFile("overlay-", ".pdf"); + try (InputStream in = multipart.getInputStream(); + FileOutputStream out = new FileOutputStream(tempFile.toFile())) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = in.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + } + return tempFile.toFile(); + } public static Long convertSizeToBytes(String sizeStr) { if (sizeStr == null) { @@ -65,7 +81,8 @@ public class GeneralUtils { } else if (sizeStr.endsWith("B")) { return Long.parseLong(sizeStr.substring(0, sizeStr.length() - 1)); } else { - // Input string does not have a valid format, handle this case + // Assume MB if no unit is specified + return (long) (Double.parseDouble(sizeStr) * 1024 * 1024); } } catch (NumberFormatException e) { // The numeric part of the input string cannot be parsed, handle this case @@ -74,6 +91,9 @@ public class GeneralUtils { return null; } + public static List parsePageString(String pageOrder, int totalPages) { + return parsePageList(pageOrder.split(","), totalPages); + } public static List parsePageList(String[] pageOrderArr, int totalPages) { List newPageOrder = new ArrayList<>(); diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java index c5296191b..22e09d6a9 100644 --- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java @@ -16,7 +16,11 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import javax.imageio.ImageIO; +import javax.imageio.IIOImage; import javax.imageio.ImageReader; +import javax.imageio.ImageWriter; +import javax.imageio.ImageWriteParam; +import javax.imageio.stream.ImageOutputStream; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; @@ -206,21 +210,43 @@ public class PdfUtils { images.add(pdfRenderer.renderImageWithDPI(i, DPI, colorType)); } - if (singleImage) { - // Combine all images into a single big image - BufferedImage combined = new BufferedImage(images.get(0).getWidth(), images.get(0).getHeight() * pageCount, BufferedImage.TYPE_INT_RGB); - Graphics g = combined.getGraphics(); - for (int i = 0; i < images.size(); i++) { - g.drawImage(images.get(i), 0, i * images.get(0).getHeight(), null); - } - images = Arrays.asList(combined); - } - // Create a ByteArrayOutputStream to save the image(s) to ByteArrayOutputStream baos = new ByteArrayOutputStream(); + if (singleImage) { - // Write the image to the output stream - ImageIO.write(images.get(0), imageType, baos); + if (imageType.toLowerCase().equals("tiff") || imageType.toLowerCase().equals("tif")) { + // Write the images to the output stream as a TIFF with multiple frames + ImageWriter writer = ImageIO.getImageWritersByFormatName("tiff").next(); + ImageWriteParam param = writer.getDefaultWriteParam(); + param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + param.setCompressionType("ZLib"); + param.setCompressionQuality(1.0f); + + try (ImageOutputStream ios = ImageIO.createImageOutputStream(baos)) { + writer.setOutput(ios); + writer.prepareWriteSequence(null); + + for (int i = 0; i < images.size(); ++i) { + BufferedImage image = images.get(i); + writer.writeToSequence(new IIOImage(image, null, null), param); + } + + writer.endWriteSequence(); + } + + writer.dispose(); + } else { + // Combine all images into a single big image + BufferedImage combined = new BufferedImage(images.get(0).getWidth(), images.get(0).getHeight() * pageCount, BufferedImage.TYPE_INT_RGB); + Graphics g = combined.getGraphics(); + + for (int i = 0; i < images.size(); i++) { + g.drawImage(images.get(i), 0, i * images.get(0).getHeight(), null); + } + + // Write the image to the output stream + ImageIO.write(combined, imageType, baos); + } // Log that the image was successfully written to the byte array logger.info("Image successfully written to byte array"); @@ -248,7 +274,7 @@ public class PdfUtils { throw e; } } - public static byte[] imageToPdf(MultipartFile[] files, boolean stretchToFit, boolean autoRotate, String colorType) throws IOException { + public static byte[] imageToPdf(MultipartFile[] files, String fitOption, boolean autoRotate, String colorType) throws IOException { try (PDDocument doc = new PDDocument()) { for (MultipartFile file : files) { String contentType = file.getContentType(); @@ -261,31 +287,16 @@ public class PdfUtils { BufferedImage pageImage = reader.read(i); BufferedImage convertedImage = ImageProcessingUtils.convertColorType(pageImage, colorType); PDImageXObject pdImage = LosslessFactory.createFromImage(doc, convertedImage); - addImageToDocument(doc, pdImage, stretchToFit, autoRotate); + addImageToDocument(doc, pdImage, fitOption, autoRotate); } } else { - File imageFile = Files.createTempFile("image", ".png").toFile(); - try (FileOutputStream fos = new FileOutputStream(imageFile); InputStream input = file.getInputStream()) { - byte[] buffer = new byte[1024]; - int len; - while ((len = input.read(buffer)) != -1) { - fos.write(buffer, 0, len); - } - BufferedImage image = ImageIO.read(imageFile); - BufferedImage convertedImage = ImageProcessingUtils.convertColorType(image, colorType); - PDImageXObject pdImage; - if (contentType != null && (contentType.equals("image/jpeg"))) { - pdImage = JPEGFactory.createFromImage(doc, convertedImage); - } else { - pdImage = LosslessFactory.createFromImage(doc, convertedImage); - } - addImageToDocument(doc, pdImage, stretchToFit, autoRotate); - } catch (IOException e) { - logger.error("Error writing image to file: {}", imageFile.getAbsolutePath(), e); - throw e; - } finally { - imageFile.delete(); - } + BufferedImage image = ImageIO.read(file.getInputStream()); + BufferedImage convertedImage = ImageProcessingUtils.convertColorType(image, colorType); + // Use JPEGFactory if it's JPEG since JPEG is lossy + PDImageXObject pdImage = (contentType != null && contentType.equals("image/jpeg")) + ? JPEGFactory.createFromImage(doc, convertedImage) + : LosslessFactory.createFromImage(doc, convertedImage); + addImageToDocument(doc, pdImage, fitOption, autoRotate); } } ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); @@ -295,12 +306,20 @@ public class PdfUtils { } } - private static void addImageToDocument(PDDocument doc, PDImageXObject image, boolean stretchToFit, boolean autoRotate) throws IOException { + private static void addImageToDocument(PDDocument doc, PDImageXObject image, String fitOption, boolean autoRotate) throws IOException { boolean imageIsLandscape = image.getWidth() > image.getHeight(); PDRectangle pageSize = PDRectangle.A4; + + System.out.println(fitOption); + if (autoRotate && imageIsLandscape) { pageSize = new PDRectangle(pageSize.getHeight(), pageSize.getWidth()); } + + if ("fitDocumentToImage".equals(fitOption)) { + pageSize = new PDRectangle(image.getWidth(), image.getHeight()); + } + PDPage page = new PDPage(pageSize); doc.addPage(page); @@ -308,9 +327,9 @@ public class PdfUtils { float pageHeight = page.getMediaBox().getHeight(); try (PDPageContentStream contentStream = new PDPageContentStream(doc, page)) { - if (stretchToFit) { + if ("fillPage".equals(fitOption) || "fitDocumentToImage".equals(fitOption)) { contentStream.drawImage(image, 0, 0, pageWidth, pageHeight); - } else { + } else if ("maintainAspectRatio".equals(fitOption)) { float imageAspectRatio = (float) image.getWidth() / (float) image.getHeight(); float pageAspectRatio = pageWidth / pageHeight; @@ -331,6 +350,7 @@ public class PdfUtils { } } + public static byte[] overlayImage(byte[] pdfBytes, byte[] imageBytes, float x, float y, boolean everyPage) throws IOException { PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfBytes)); diff --git a/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java b/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java index 09a395baf..131aaf031 100644 --- a/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java @@ -12,8 +12,6 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.multipart.MultipartFile; -import com.itextpdf.kernel.pdf.PdfDocument; -import com.itextpdf.kernel.pdf.PdfWriter; public class WebResponseUtils { @@ -61,18 +59,6 @@ public class WebResponseUtils { return boasToWebResponse(baos, docName); } - public static ResponseEntity pdfDocToWebResponse(PdfDocument document, String docName) throws IOException { - - // Open Byte Array and save document to it - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PdfWriter writer = new PdfWriter(baos); - PdfDocument newDocument = new PdfDocument(writer); - - document.copyPagesTo(1, document.getNumberOfPages(), newDocument); - newDocument.close(); - - return boasToWebResponse(baos, docName); - } - + } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f5643af8b..2e86a2dad 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -35,5 +35,13 @@ spring.datasource.url=jdbc:h2:file:./configs/stirling-pdf-DB;DB_CLOSE_DELAY=-1;D spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa spring.datasource.password= -spring.h2.console.enabled=true +spring.h2.console.enabled=false spring.jpa.hibernate.ddl-auto=update + +# Change the default URL path for OpenAPI JSON +springdoc.api-docs.path=/v1/api-docs + +# Set the URL of the OpenAPI JSON for the Swagger UI +springdoc.swagger-ui.url=/v1/api-docs + + diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties deleted file mode 100644 index d6a58a9f7..000000000 --- a/src/main/resources/log4j.properties +++ /dev/null @@ -1,8 +0,0 @@ -log4j.rootLogger=ERROR,stdout -log4j.logger.com.endeca=INFO -# Logger for crawl metrics -log4j.logger.com.endeca.itl.web.metrics=INFO - -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%p\t%d{ISO8601}\t%r\t%c\t[%t]\t%m%n \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 000000000..2d13578df --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,51 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + logs/invalid-auths.log + + %d %p %c{1} [%thread] %m%n + + + + + logs/auth-%d{yyyy-MM-dd}.log + 1 + + + + + + logs/info.log + + %d %p %c{1} [%thread] %m%n + + + + + logs/info-%d{yyyy-MM-dd}.log + 1 + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 54e816e6e..90643fad4 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -35,9 +35,6 @@ delete=Delete username=Username password=Password welcome=Welcome -########################## -### TODO: Translate ### -########################## property=Property black=Black white=White @@ -46,7 +43,11 @@ green=Green blue=Blue custom=Custom... - +changedCredsMessage=Credentials changed! +notAuthenticatedMessage=User not authenticated. +userNotFoundMessage=User not found. +incorrectPasswordMessage=Current password is incorrect. +usernameExistsMessage=New Username already exists. @@ -74,6 +75,19 @@ settings.zipThreshold=\u0645\u0644\u0641\u0627\u062A \u0645\u0636\u063A\u0648\u0 settings.signOut=Sign Out settings.accountSettings=Account Settings + + +changeCreds.title=Change Credentials +changeCreds.header=Update Your Account Details +changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) +changeCreds.newUsername=New Username +changeCreds.oldPassword=Current Password +changeCreds.newPassword=New Password +changeCreds.confirmNewPassword=Confirm New Password +changeCreds.submit=Submit Changes + + + account.title=Account Settings account.accountSettings=Account Settings account.adminSettings=Admin Settings - View and Add Users @@ -105,14 +119,20 @@ adminUserSettings.role=Role adminUserSettings.actions=Actions adminUserSettings.apiUser=Limited API User adminUserSettings.webOnlyUser=Web Only User +adminUserSettings.forceChange=Force user to change username/password on login adminUserSettings.submit=Save User ############# # HOME-PAGE # ############# home.desc=متجرك الشامل المستضاف محليًا لجميع احتياجات PDF الخاصة بك. +home.searchBar=Search for features... +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=أداة متعددة PDF home.multiTool.desc=دمج الصفحات وتدويرها وإعادة ترتيبها وإزالتها multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side @@ -316,6 +336,24 @@ home.autoRedact.title=Auto Redact home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text showJS.tags=JS +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to 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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + ########################### # # # WEB PAGES # @@ -333,9 +371,6 @@ login.signinTitle=Please sign in #auto-redact autoRedact.title=Auto Redact autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## autoRedact.colorLabel=Colour autoRedact.textsToRedactLabel=Text to Redact (line-separated) autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret @@ -466,6 +501,7 @@ pipeline.title=Pipeline pageLayout.title=Multi Page Layout pageLayout.header=Multi Page Layout pageLayout.pagesPerSheet=Pages per sheet: +pageLayout.addBorder=Add Borders pageLayout.submit=Submit @@ -619,6 +655,9 @@ pdfOrganiser.submit=إعادة ترتيب الصفحات multiTool.title=أداة متعددة PDF multiTool.header=أداة متعددة PDF +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=مزيل الصفحة @@ -653,7 +692,10 @@ split.submit=Split imageToPDF.title=صورة إلى PDF imageToPDF.header=صورة إلى PDF imageToPDF.submit=تحول -imageToPDF.selectText.1=\u062A\u0645\u062F\u062F \u0644\u0644\u0645\u0644\u0627\u0621\u0645\u0629 +imageToPDF.selectLabel=Image Fit Options +imageToPDF.fillPage=Fill Page +imageToPDF.fitDocumentToImage=Fit Page to Image +imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.selectText.2=\u062F\u0648\u0631\u0627\u0646 PDF \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627 imageToPDF.selectText.3=\u0627\u0644\u0645\u0646\u0637\u0642 \u0627\u0644\u0645\u062A\u0639\u062F\u062F \u0644\u0644\u0645\u0644\u0641\u0627\u062A (\u0645\u0641\u0639\u0651\u0644 \u0641\u0642\u0637 \u0625\u0630\u0627 \u0643\u0646\u062A \u062A\u0639\u0645\u0644 \u0645\u0639 \u0635\u0648\u0631 \u0645\u062A\u0639\u062F\u062F\u0629) imageToPDF.selectText.4=\u062F\u0645\u062C \u0641\u064A \u0645\u0644\u0641 PDF \u0648\u0627\u062D\u062F @@ -756,13 +798,6 @@ changeMetadata.selectText.5=\u0625\u0636\u0627\u0641\u0629 \u0625\u062F\u062E\u0 changeMetadata.submit=\u062A\u063A\u064A\u064A\u0631 -#xlsToPdf -xlsToPdf.title=\u062A\u062D\u0648\u064A\u0644 Excel \u0625\u0644\u0649 PDF -xlsToPdf.header=\u062A\u062D\u0648\u064A\u0644 Excel \u0625\u0644\u0649 PDF -xlsToPdf.selectText.1=\u062D\u062F\u062F \u0648\u0631\u0642\u0629 \u0625\u0643\u0633\u0644 XLS \u0623\u0648 XLSX \u0644\u0644\u062A\u062D\u0648\u064A\u0644 -xlsToPdf.convert=\u062A\u062D\u0648\u064A\u0644 - - #pdfToPDFA pdfToPDFA.title=PDF \u0625\u0644\u0649 PDF / A pdfToPDFA.header=PDF \u0625\u0644\u0649 PDF / A @@ -806,3 +841,45 @@ PDFToXML.title=تحويل PDF إلى XML PDFToXML.header=تحويل PDF إلى XML PDFToXML.credit=تستخدم هذه الخدمة LibreOffice لتحويل الملفات. PDFToXML.submit=تحويل + +#PDFToCSV +PDFToCSV.title=PDF ??? CSV +PDFToCSV.header=PDF ??? CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=?????? + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties new file mode 100644 index 000000000..f41dfe46e --- /dev/null +++ b/src/main/resources/messages_bg_BG.properties @@ -0,0 +1,885 @@ +########### +# Generic # +########### +# the direction that the language is written (ltr=left to right, rtl = right to left) +language.direction=ltr + +pdfPrompt=Изберете PDF(и) +multiPdfPrompt=Изберете PDF (2+) +multiPdfDropPrompt=Изберете (или плъзнете и пуснете) всички PDF файлове, от които се нуждаете +imgPrompt=Изберете изображение(я) +genericSubmit=Подайте +processTimeWarning=Предупреждение: Този процес може да отнеме до минута в зависимост от размера на файла +pageOrderPrompt=Персонализиран ред на страниците (Въведете разделен със запетаи списък с номера на страници или функции като 2n+1): +goToPage=Давай +true=Вярно +false=Невярно +unknown=Непознат +save=Съхранете +close=Затворете +filesSelected=избрани файлове +noFavourites=Няма добавени любими +bored=Отекчени сте да чакате? +alphabet=Азбука +downloadPdf=Изтеглете PDF +text=Текст +font=Шрифт +selectFillter=-- Изберете -- +pageNum=Брой страница +sizes.small=Малък +sizes.medium=Среден +sizes.large=Голям +sizes.x-large=X-Голям +error.pdfPassword=PDF документът е с парола и или паролата не е предоставена, или е неправилна +delete=Изтрий +username=Потребителско име +password=Парола +welcome=Добре дошли +property=Свойство +black=Черно +white=Бяло +red=Червено +green=Зелено +blue=Синьо +custom=Персонализиране... + +changedCredsMessage=Идентификационните данни са променени! +notAuthenticatedMessage=Потребителят не е автентикиран. +userNotFoundMessage=Потребителят не е намерен +incorrectPasswordMessage=Текущата парола е неправилна. +usernameExistsMessage=Новият потребител вече съществува. + + + +############# +# NAVBAR # +############# +navbar.convert=Преобразуване +navbar.security=Сигурност +navbar.other=Разни +navbar.darkmode=Тъмна тема +navbar.pageOps=Операции със страници +navbar.settings=Настройки + +############# +# SETTINGS # +############# +settings.title=Настройки +settings.update=Налична актуализация +settings.appVersion=Версия на приложението: +settings.downloadOption.title=Изберете опция за изтегляне (за изтегляния на един файл без да е архивиран): +settings.downloadOption.1=Отваряне в същия прозорец +settings.downloadOption.2=Отваряне в нов прозорец +settings.downloadOption.3=Изтегли файл +settings.zipThreshold=Архивирайте файловете, когато броят на изтеглените файлове надвишава +settings.signOut=Изход +settings.accountSettings=Настройки на акаунта + + + +changeCreds.title=Промяна на идентификационните данни +changeCreds.header=Актуализирайте данните за акаунта си +changeCreds.changeUserAndPassword=Използвате идентификационни данни за вход по подразбиране. Моля, въведете нова парола (и потребителско име, ако искате) +changeCreds.newUsername=Ново потребителско име +changeCreds.oldPassword=Текуща парола +changeCreds.newPassword=Нова парола +changeCreds.confirmNewPassword=Подтвърдете новата парола +changeCreds.submit=Изпращане на промените + + + +account.title=Настройки на акаунта +account.accountSettings=Настройки на акаунта +account.adminSettings=Настройки на администратора - Преглед и добавяне на потребители +account.userControlSettings=Настройки за потребителски контрол +account.changeUsername=Промени потребител +account.changeUsername=Промени потребител +account.password=Парола за потвърждение +account.oldPassword=Стара парола +account.newPassword=Нова парола +account.changePassword=Промени паролата +account.confirmNewPassword=Потвърдете новата парола +account.signOut=Изход +account.yourApiKey=Вашият API ключ +account.syncTitle=Синхронизиране на настройките на браузъра с акаунта +account.settingsCompare=Сравняване на настройките: +account.property=Свойство +account.webBrowserSettings=Уеб-браузър настройки +account.syncToBrowser=Синхронизиране на акаунт -> Бразър +account.syncToAccount=Синхронизиране на акаунт <- Бразър + + +adminUserSettings.title=Настройки за потребителски контрол +adminUserSettings.header=Настройки за администраторски потребителски контрол +adminUserSettings.admin=Администратор +adminUserSettings.user=Потребител +adminUserSettings.addUser=Добавяне на нов потребител +adminUserSettings.roles=Роли +adminUserSettings.role=Роля +adminUserSettings.actions=Действия +adminUserSettings.apiUser=Ограничен API потребител +adminUserSettings.webOnlyUser=Само за уеб-потребител +adminUserSettings.forceChange=Принудете потребителя да промени потребителското име/парола при влизане +adminUserSettings.submit=Съхранете потребителя + +############# +# HOME-PAGE # +############# +home.desc=Вашето локално хоствано обслужване на едно място за всички ваши PDF нужди. +home.searchBar=Search for features... + + +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + +home.multiTool.title=PDF Мулти инструмент +home.multiTool.desc=Обединяване, завъртане, пренареждане и премахване на страници +multiTool.tags=Мултиинструмент,Мулти операции,UI,плъзгане с щракване,потребителска част,страна на клиента,интерактивен,неразрешим,преместване + +home.merge.title=Обединяване +home.merge.desc=Лесно обединете множество PDF файлове в един. +merge.tags=сливане,операции на страници,администраторска зона,от страна на сървъра + +home.split.title=Разделяне +home.split.desc=Разделяне на PDF файлове на множество документи +split.tags=Операции на страницата,разделяне,Множество страници,изрязване,сървърна страна + +home.rotate.title=Завъртане +home.rotate.desc=Лесно завъртете вашите PDF файлове. +rotate.tags=от страната на сървъра + + +home.imageToPdf.title=Изображение към PDF +home.imageToPdf.desc=Преобразуване на изображение (PNG, JPEG, GIF) към PDF. +imageToPdf.tags=преобразуване,img,jpg,изображение,снимка + +home.pdfToImage.title=PDF към изображение +home.pdfToImage.desc=Преобразуване на PDF към изображение. (PNG, JPEG, GIF) +pdfToImage.tags=преобразуване,img,jpg,изображение,снимка + +home.pdfOrganiser.title=Организиране +home.pdfOrganiser.desc=Премахване/пренареждане на страници към произволен ред +pdfOrganiser.tags=дуплекс,четно,нечетно,сортиране,преместване + + +home.addImage.title=Добавяне на изображение +home.addImage.desc=Добавя изображение към зададено място към PDF файла +addImage.tags=img,jpg,изображение,снимка + +home.watermark.title=Добавяне на воден знак +home.watermark.desc=Добавете персонализиран воден знак към вашия PDF документ. +watermark.tags=Текст,повтарящ се,етикет,собствено,авторско право,търговска марка,img,jpg,изображение,снимка + +home.permissions.title=Промяна на правата +home.permissions.desc=Променете правата на вашия PDF документ +permissions.tags=четене,писане,редактиране,печат + + +home.removePages.title=Премахване +home.removePages.desc=Изтрийте нежеланите страници от вашия PDF документ. +removePages.tags=Премахване на страници,изтриване на страници + +home.addPassword.title=Добавете парола +home.addPassword.desc=Шифровайте вашия PDF документ с парола. +addPassword.tags=сигурен,сигурност + +home.removePassword.title=Премахване на парола +home.removePassword.desc=Премахнете защитата с парола от вашия PDF документ. +removePassword.tags=сигурно,декриптиране,сигурност,отмяна на парола,изтриване на парола + +home.compressPdfs.title=Компресиране +home.compressPdfs.desc=Компресирайте PDF файлове, за да намалите размера на файла. +compressPdfs.tags=мачкам,малък,мъничък + + +home.changeMetadata.title=Промяна на метаданни +home.changeMetadata.desc=Промяна/Премахване/Добавяне на метаданни от PDF документ +changeMetadata.tags=Заглавие,автор,дата,създаване,час,издател,продуцент,статистика + +home.fileToPDF.title=Преобразуване на файл към PDF +home.fileToPDF.desc=Преобразуване почти всеки файл към PDF (DOCX, PNG, XLS, PPT, TXT и други) +fileToPDF.tags=трансформация,формат,документ,изображение,слайд,текст,преобразуване,офис,документи,word,excel,powerpoint + +home.ocr.title=OCR / Почистващи сканирания +home.ocr.desc=Cleanup сканира и открива текст от изображения към PDF и го добавя отново като текст. +ocr.tags=разпознаване,текст,изображение,сканиране,четене,идентифициране,откриване,редактиране + + +home.extractImages.title=Извличане на изображения +home.extractImages.desc=Извлича всички изображения от PDF и ги записва към архив +extractImages.tags=изображение,снимка,запазване,архивиране,архив,заснемане,грабване + +home.pdfToPDFA.title=PDF към PDF/A +home.pdfToPDFA.desc=Конвертирайте PDF към PDF/A за дългосрочно съхранение +pdfToPDFA.tags=архив,дълготраен,стандартен,преобразуване,съхранение,консервиране + +home.PDFToWord.title=PDF към Word +home.PDFToWord.desc=Преобразуване на PDF към Word формати (DOC, DOCX и ODT) +PDFToWord.tags=doc,docx,odt,word,трансформация,формат,преобразуване,офис,microsoft,docfile + +home.PDFToPresentation.title=PDF към презентация +home.PDFToPresentation.desc=Преобразуване на PDF във формати за презентация (PPT, PPTX и ODP) +PDFToPresentation.tags=слайдове,покажи,офис,microsoft + +home.PDFToText.title=PDF към RTF (Текст) +home.PDFToText.desc=Преобразуване PDF към Text или RTF формат +PDFToText.tags=richformat,richtextformat,богат текстов формат + +home.PDFToHTML.title=PDF към HTML +home.PDFToHTML.desc=Преобразуване PDF към HTML формат +PDFToHTML.tags=уеб-съдържание,удобен за браузър + + +home.PDFToXML.title=PDF към XML +home.PDFToXML.desc=Преобразуване на PDF към XML формат +PDFToXML.tags=извличане на данни,структурирано съдържание,взаимодействие,трансформация,преобразуване + +home.ScannerImageSplit.title=Откриване/Разделяне на сканирани снимки +home.ScannerImageSplit.desc=Разделя множество снимки от една снимка/PDF +ScannerImageSplit.tags=разделяне,автоматично откриване,сканиране,много снимки,организиране + +home.sign.title=Подпишете +home.sign.desc=Добавя подпис към PDF чрез рисунка, текст или изображение +sign.tags=упълномощаване,инициали,нарисуван-подпис,текстов-знак,изображение-подпис + +home.flatten.title=Изравняване +home.flatten.desc=Премахнете всички интерактивни елементи и формуляри от PDF +flatten.tags=статичен,деактивиран,неинтерактивен,рационализиран + +home.repair.title=Поправи +home.repair.desc=Опитва се да поправи повреден/счупен PDF +repair.tags=поправка,възстановяване,корекция,възстановяване + +home.removeBlanks.title=Премахване на празни страници +home.removeBlanks.desc=Открива и премахва празни страници от документ +removeBlanks.tags=почистване,рационализиране,без съдържание,организиране + +home.compare.title=Сравнете +home.compare.desc=Сравнява и показва разликите между 2 PDF документа +compare.tags=разграничаване,контраст,промени,анализ + +home.certSign.title=Подпишете със сертификат +home.certSign.desc=Подписва PDF със сертификат/ключ (PEM/P12) +certSign.tags=удостоверяване,PEM,P12,официален,шифроване + +home.pageLayout.title=Оформление с няколко страници +home.pageLayout.desc=Слейте няколко страници от PDF документ в една страница +pageLayout.tags=сливане,комбиниран,единичен изглед,организиране + +home.scalePages.title=Коригирайте размера/мащаба на страницата +home.scalePages.desc=Промяна на размера/мащаба на страница и/или нейното съдържание. +scalePages.tags=преоразмеряване,промяна,размер,адаптиране + +home.pipeline.title=Pipeline (Разширено) +home.pipeline.desc=Изпълнявайте множество действия върху PDF файлове чрез дефиниране на конвейерни скриптове +pipeline.tags=автоматизиране,последователност,чрез скриптове,пакетен процес + +home.add-page-numbers.title=Добавяне на номера на страници +home.add-page-numbers.desc=Добавете номера на страници в документ на определено място +add-page-numbers.tags=страничен, етикетиране, организиране, индексиране + +home.auto-rename.title=Автоматично преименуване на PDF файл +home.auto-rename.desc=Автоматично преименува PDF файл въз основа на откритата му заглавка +auto-rename.tags=автоматично откриване,базирано на заглавка,организиране,преетикетиране + +home.adjust-contrast.title=Коригиране на цветове/контраст +home.adjust-contrast.desc=Коригиране на контраста, наситеността и яркостта на PDF +adjust-contrast.tags=корекция на цвета,настройте,модифицирайте,подобрете + +home.crop.title=Изрязване на PDF +home.crop.desc=Изрежете PDF, за да намалите размера му (поддържа текст!) +crop.tags=изрязване,свиване,редактиране,оформяне + +home.autoSplitPDF.title=Автоматично разделяне на страници +home.autoSplitPDF.desc=Автоматично разделяне на сканиран PDF файл с QR код за разделяне на физически сканирани страници +autoSplitPDF.tags=QR-базиран,отделен,сканиране-сегмент,организиране + +home.sanitizePdf.title=Дезинфекцирай +home.sanitizePdf.desc=Премахване на скриптове и други елементи от PDF файлове +sanitizePdf.tags=чисти,сигурни,безопасни,премахване-заплахи + +home.URLToPDF.title=URL/уеб-сайт към PDF +home.URLToPDF.desc=Преобразува всеки http(s) URL към PDF +URLToPDF.tags=уеб-заснемане,запазване на страница,уеб към документ,архив + +home.HTMLToPDF.title=HTML към PDF +home.HTMLToPDF.desc=Преобразува всеки HTML файл или архив към PDF +HTMLToPDF.tags=маркиране,уеб-съдържание,трансформация,преобразуване + + +home.MarkdownToPDF.title=Markdown към PDF +home.MarkdownToPDF.desc=Преобразува всеки Markdown файл към PDF +MarkdownToPDF.tags=маркиране,уеб-съдържание,трансформация,преобразуване + + +home.getPdfInfo.title=Вземете ЦЯЛАТА информация към PDF +home.getPdfInfo.desc=Взема всяка възможна информация от PDF файлове +getPdfInfo.tags=информация,данни,статистики,статистика + + +home.extractPage.title=Извличане на страница(и) +home.extractPage.desc=Извлича избрани страници от PDF +extractPage.tags=извличане + + +home.PdfToSinglePage.title=PDF към една голяма страница +home.PdfToSinglePage.desc=Обединява всички PDF страници в една голяма страница +PdfToSinglePage.tags=единична страница + + +home.showJS.title=Показване на Javascript +home.showJS.desc=Търси и показва всеки JS, инжектиран в PDF +showJS.tags=Редактиране,Скриване,затъмняване,черен,маркер,скрит + +home.autoRedact.title=Автоматично редактиране +home.autoRedact.desc=Автоматично редактира (зачернява) текст в PDF въз основа на въведен текст +showJS.tags=Редактиране,Скриване,затъмняване,черен,маркер,скрит + +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to 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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + +########################### +# # +# WEB PAGES # +# # +########################### +#login +login.title=Вход +login.signin=Впишете се +login.rememberme=Запомни ме +login.invalid=Невалидно потребителско име или парола. +login.locked=Вашият акаунт е заключен. +login.signinTitle=Моля впишете се + + +#auto-redact +autoRedact.title=Автоматично редактиране +autoRedact.header=Автоматично редактиране +autoRedact.colorLabel=Цвят +autoRedact.textsToRedactLabel=Текст за редактиране (разделен с редове) +autoRedact.textsToRedactPlaceholder=например: \nПоверително \nСтрого секретно +autoRedact.useRegexLabel=Използване на Regex +autoRedact.wholeWordSearchLabel=Търсене на цялата дума +autoRedact.customPaddingLabel=Персонализирана допълнителна подложка +autoRedact.convertPDFToImageLabel=Преобразуване на PDF към PDF-изображение (използва се за премахване на текст зад полето) +autoRedact.submitButton=Изпращане + + +#showJS +showJS.title=Покажи Javascript +showJS.header=Покажи Javascript +showJS.downloadJS=Изтегли Javascript +showJS.submit=Покажи + + +#pdfToSinglePage +pdfToSinglePage.title=PDF към единична страница +pdfToSinglePage.header=PDF към единична страница +pdfToSinglePage.submit=Преобразуване към единична страница + + +#pageExtracter +pageExtracter.title=Extract Pages +pageExtracter.header=Extract Pages +pageExtracter.submit=Extract + + +#getPdfInfo +getPdfInfo.title=Вземете информация за PDF +getPdfInfo.header=Вземете информация за PDF +getPdfInfo.submit=Вземете информация +getPdfInfo.downloadJson=Изтеглете JSON + + +#markdown-to-pdf +MarkdownToPDF.title=Markdown към PDF +MarkdownToPDF.header=Markdown към PDF +MarkdownToPDF.submit=Преобразуване +MarkdownToPDF.help=Работата е в ход +MarkdownToPDF.credit=Използва WeasyPrint + + + +#url-to-pdf +URLToPDF.title=URL към PDF +URLToPDF.header=URL към PDF +URLToPDF.submit=Преобразуване +URLToPDF.credit=Използва WeasyPrint + + +#html-to-pdf +HTMLToPDF.title=HTML към PDF +HTMLToPDF.header=HTML към PDF +HTMLToPDF.help=Приема HTML файлове и ZIP файлове, съдържащи html/css/изображения и т.н +HTMLToPDF.submit=Преобразуване +HTMLToPDF.credit=Използва WeasyPrint + + +#sanitizePDF +sanitizePDF.title=Дезинфектирай PDF +sanitizePDF.header=Дезинфектира PDF файл +sanitizePDF.selectText.1=Премахва JavaScript действия +sanitizePDF.selectText.2=Премахва вградени файлове +sanitizePDF.selectText.3=Премахва метаданни +sanitizePDF.selectText.4=Премахва линкове +sanitizePDF.selectText.5=Премахва шрифтове +sanitizePDF.submit=Дезинфектирай PDF + + +#addPageNumbers +addPageNumbers.title=Добавяне на номера на страници +addPageNumbers.header=Добавяне на номера на страници +addPageNumbers.selectText.1=Изберете PDF файл: +addPageNumbers.selectText.2=Размер на полето +addPageNumbers.selectText.3=Позиция +addPageNumbers.selectText.4=Начален номер +addPageNumbers.selectText.5=Страници към номер +addPageNumbers.selectText.6=Персонализиран текст +addPageNumbers.customTextDesc=Персонализиран текст +addPageNumbers.numberPagesDesc=Кои страници да номерирате, по подразбиране 'всички', също приема 1-5 или 2,5,9 и т.н. +addPageNumbers.customNumberDesc=По подразбиране е {n}, също приема 'Страница {n} от {total}', 'Текст-{n}', '{filename}-{n} +addPageNumbers.submit=Добавяне на номера на страници + + +#auto-rename +auto-rename.title=Автоматично преименуване +auto-rename.header=Автоматично преименуване на PDF +auto-rename.submit=Автоматично преименуване + + +#adjustContrast +adjustContrast.title=Настройка на контраста +adjustContrast.header=Коригиране на контраста +adjustContrast.contrast=Контраст: +adjustContrast.brightness=Яркост: +adjustContrast.saturation=Наситеност: +adjustContrast.download=Изтегли + + +#crop +crop.title=Изрязване +crop.header=Изрязване на изображение +crop.submit=Подайте + + +#autoSplitPDF +autoSplitPDF.title=Автоматично разделяне на PDF +autoSplitPDF.header=Автоматично разделяне на PDF +autoSplitPDF.description=Печатайте, вмъквайте, сканирайте, качвайте и ни позволете да разделим автоматично вашите документи. Не е необходимо ръчно сортиране. +autoSplitPDF.selectText.1=Отпечатайте някои разделителни листове отдолу (Черно-бялото е добре). +autoSplitPDF.selectText.2=Сканирайте всичките си документи наведнъж, като поставите разделителния лист между тях. +autoSplitPDF.selectText.3=Качете единствения голям сканиран PDF файл и оставете Stirling PDF да се справи с останалото. +autoSplitPDF.selectText.4=Разделителните страници се откриват и премахват автоматично, което гарантира чист краен документ. +autoSplitPDF.formPrompt=Изпратете PDF, съдържащ разделители на страници на Stirling-PDF: +autoSplitPDF.duplexMode=Дуплексен режим (сканиране отпред и отзад) +autoSplitPDF.dividerDownload1=Изтеглете 'Автоматичен сплитер разделител (минимален).pdf' +autoSplitPDF.dividerDownload2=Изтеглете 'Автоматичен сплитер разделител (с инструкции).pdf' +autoSplitPDF.submit=Подайте + + +#pipeline +pipeline.title=Pipeline + + +#pageLayout +pageLayout.title=Многостранично оформление +pageLayout.header=Оформление на няколко страници +pageLayout.pagesPerSheet=Страници на лист: +pageLayout.addBorder=Добавяне на граници +pageLayout.submit=Подайте + + +#scalePages +scalePages.title=Коригиране на мащаба на страницата +scalePages.header=Коригиране на мащаба на страницата +scalePages.pageSize=Размер на страница от документа. +scalePages.scaleFactor=Ниво на мащабиране (изрязване) на страница. +scalePages.submit=Подайте + + +#certSign +certSign.title=Подписване на сертификат +certSign.header=Подпишете PDF с вашия сертификат (В процес на работа) +certSign.selectPDF=Изберете PDF файл за подписване: +certSign.selectKey=Изберете вашия файл с личен ключ (формат PKCS#8, може да бъде .pem или .der): +certSign.selectCert=Изберете вашия файл със сертификат (формат X.509, може да бъде .pem или .der): +certSign.selectP12=Изберете вашия PKCS#12 Keystore файл (.p12 или .pfx) (По избор, ако е предоставен, трябва да съдържа вашия личен ключ и сертификат): +certSign.certType=Тип сертификат +certSign.password=Въведете вашата парола за Keystore за ключове или частен ключ (ако има): +certSign.showSig=Показване на подпис +certSign.reason=Причина +certSign.location=Местоположение +certSign.name=Име +certSign.submit=Подпишете PDF + + +#removeBlanks +removeBlanks.title=Премахване на празни места +removeBlanks.header=Премахване на празни страници +removeBlanks.threshold=Праг на белота на пикселите: +removeBlanks.thresholdDesc=Праг за определяне колко бял трябва да бъде един бял пиксел, за да бъде класифициран като 'бял'. 0 = черно, 255 чисто бяло. +removeBlanks.whitePercent=Процент бяло (%): +removeBlanks.whitePercentDesc=Процент от страницата, която трябва да бъде в 'бели' пиксели, които да бъдат премахнати +removeBlanks.submit=Премахване на празни места + + +#compare +compare.title=Сравнявай +compare.header=Сравнявай PDF-и +compare.document.1=Документ 1 +compare.document.2=Документ 2 +compare.submit=Сравнявай + + +#sign +sign.title=Подпишете +sign.header=Подпишете PDF-и +sign.upload=Качи изображение +sign.draw=Начертайте подпис +sign.text=Въвеждане на текст +sign.clear=Изчисти +sign.add=Добави + + +#repair +repair.title=Поправи +repair.header=Поправи PDF-и +repair.submit=Поправи + + +#flatten +flatten.title=Изравнете +flatten.header=Изравнете PDF-и +flatten.submit=Изравнете + + +#ScannerImageSplit +ScannerImageSplit.selectText.1=Праг на ъгъла: +ScannerImageSplit.selectText.2=Задава минималния абсолютен ъгъл, необходим за завъртане на изображението (по подразбиране: 10). +ScannerImageSplit.selectText.3=Толеранс: +ScannerImageSplit.selectText.4=Определя обхвата на цветовата вариация около предполагаемия фонов цвят (по подразбиране: 30). +ScannerImageSplit.selectText.5=Минимална площ: +ScannerImageSplit.selectText.6=Задава минималния праг на площ за изображение (по подразбиране: 10000). +ScannerImageSplit.selectText.7=Минимална контурна площ: +ScannerImageSplit.selectText.8=Задава минималния праг на контурната площ за изображение +ScannerImageSplit.selectText.9=Размер на рамката: +ScannerImageSplit.selectText.10=Задава размера на добавената и премахната граница, за да предотврати бели граници към изхода (по подразбиране: 1). + + +#OCR +ocr.title=OCR / Почистване на сканиране +ocr.header=Почистващи сканирания / OCR (оптично разпознаване на знаци) +ocr.selectText.1=Изберете езици, които да бъдат открити в рамките на PDF (изброените са откритите към момента): +ocr.selectText.2=Създаване на текстов файл, съдържащ OCR текст заедно с OCR PDF +ocr.selectText.3=Правилните страници бяха сканирани под изкривен ъгъл чрез завъртането им обратно на мястото им +ocr.selectText.4=Чиста страница, така че е по-малко вероятно OCR да намери текст във фонов шум. (Без промяна на изхода) +ocr.selectText.5=Чиста страница, така че е по-малко вероятно OCR да намери текст във фонов шум, поддържа почистване към изхода. +ocr.selectText.6=Игнорира страници, които имат интерактивен текст, само OCR страници, които са изображения +ocr.selectText.7=Принудително OCR, ще премахва чрез OCR на всяка страница всички оригинални текстови елементи +ocr.selectText.8=Нормално (Ще има грешка, ако PDF съдържа текст) +ocr.selectText.9=Допълнителни настройки +ocr.selectText.10=OCR режим +ocr.selectText.11=Премахване на изображения след OCR (Премахва ВСИЧКИ изображения, полезно само ако е част от стъпката на преобразуване) +ocr.selectText.12=Тип изобразяване (Разширен) +ocr.help=Моля, прочетете тази документация за това как да използвате това за други езици и/или да не използвате в docker +ocr.credit=Тази услуга използва OCRmyPDF и Tesseract за OCR. +ocr.submit=Обработка на PDF чрез OCR + + +#extractImages +extractImages.title=Извличане на изображения +extractImages.header=Извличане на изображения +extractImages.selectText=Изберете формат на изображението, в който да преобразувате извлечените изображения +extractImages.submit=Извличане + + +#File to PDF +fileToPDF.title=Файл към PDF +fileToPDF.header=Конвертирайте всеки файл към PDF +fileToPDF.credit=Тази услуга използва LibreOffice и Unoconv за преобразуване на файлове. +fileToPDF.supportedFileTypes=Поддържаните типове файлове трябва да включват по-долу, но за пълен актуализиран списък на поддържаните формати, моля, вижте документацията на LibreOffice +fileToPDF.submit=Преобразуване към PDF + + +#compress +compress.title=Компресиране +compress.header=Компресиране на PDF +compress.credit=Тази услуга използва Ghostscript за PDF компресиране/оптимизиране. +compress.selectText.1=Ръчен режим - От 1 до 4 +compress.selectText.2=Ниво на оптимизация: +compress.selectText.3=4 (Ужасно за текстови изображения) +compress.selectText.4=Автоматичен режим - Автоматично настройва качеството, за да получи PDF точен размер +compress.selectText.5=Очакван PDF размер (напр. 25MB, 10.8MB, 25KB) +compress.submit=Компресиране + + +#Add image +addImage.title=Добавяне на изображение +addImage.header=Добавяне на изображение към PDF +addImage.everyPage=Всяка страница? +addImage.upload=Добавяне на изображение +addImage.submit=Добавяне на изображение + + +#merge +merge.title=Обединяване +merge.header=Обединяване на множество PDF файлове (2+) +merge.sortByName=Сортиране по име +merge.sortByDate=Сортиране по дата +merge.submit=Обединяване + + +#pdfOrganiser +pdfOrganiser.title=Организатор на страници +pdfOrganiser.header=Организатор на PDF страници +pdfOrganiser.submit=Пренареждане на страниците + + +#multiTool +multiTool.title=PDF Мулти инструмент +multiTool.header=PDF Мулти инструмент + +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF + +#pageRemover +pageRemover.title=Премахване на страници +pageRemover.header=Премахване на PDF страници +pageRemover.pagesToDelete=Страници за изтриване (Въведете списък с номера на страници, разделени със запетая) : +pageRemover.submit=Изтриване на страници + + +#rotate +rotate.title=Завъртане на PDF +rotate.header=Завъртане на PDF +rotate.selectAngle=Изберете ъгъл на въртене (кратно на 90 градуса): +rotate.submit=Завъртане + + +#merge +split.title=Разделяне на PDF +split.header=Разделяне на PDF +split.desc.1=Числата, които избирате, са номера на страницата, на която искате да направите разделяне +split.desc.2=Така че избирането на 1,3,7-8 ще раздели документ от 10 страници на 6 отделни PDF файла с: +split.desc.3=Документ #1: Страница 1 +split.desc.4=Документ #2: Страница 2 и 3 +split.desc.5=Документ #3: Страница 4, 5 и 6 +split.desc.6=Документ #4: Страница 7 +split.desc.7=Документ #5: Страница 8 +split.desc.8=Документ #6: Страница 9 и 10 +split.splitPages=Въведете страници за разделяне: +split.submit=Разделяне + + +#merge +imageToPDF.title=Изображение към PDF +imageToPDF.header=Изображение към PDF +imageToPDF.submit=Преобразуване +imageToPDF.selectLabel=Опции за прилягане на изображението +imageToPDF.fillPage=Попълване на страница +imageToPDF.fitDocumentToImage=Побиране на страницата в изображението +imageToPDF.maintainAspectRatio=Поддържане на пропорции +imageToPDF.selectText.2=Автоматично завъртане на PDF +imageToPDF.selectText.3=Файлова логика с много (Активирано само ако работите с множество изображения) +imageToPDF.selectText.4=Сливане към един PDF +imageToPDF.selectText.5=Преобразуване към отделни PDF файлове + + +#pdfToImage +pdfToImage.title=PDF към Изображение +pdfToImage.header=PDF към Изображение +pdfToImage.selectText=Формат на изображението +pdfToImage.singleOrMultiple=Тип резултат от страница към изображение +pdfToImage.single=Единично голямо изображение комбиниране на всички страници +pdfToImage.multi=Множество изображения, по едно изображение на страница +pdfToImage.colorType=Тип цвят +pdfToImage.color=Цвят +pdfToImage.grey=Скала на сивото +pdfToImage.blackwhite=Черно и бяло (може да загубите данни!) +pdfToImage.submit=Преобразуване + + +#addPassword +addPassword.title=Добавяне на парола +addPassword.header=Добавяне на парола (Шифроване) +addPassword.selectText.1=Изберете PDF, който да шифровате +addPassword.selectText.2=Потребителска парола +addPassword.selectText.3=Предотвратяване на сглобяването на документ +addPassword.selectText.4=По-високите стойности са по-силни, но по-ниските стойности имат по-добра съвместимост. +addPassword.selectText.5=Разрешения за задаване (препоръчва се да се използва заедно с паролата на собственика) +addPassword.selectText.6=Предотвратяване на сглобяването на документ +addPassword.selectText.7=Предотвратете извличането на съдържание +addPassword.selectText.8=Предотвратете извличането за достъпност +addPassword.selectText.9=Предотвратяване на попълване на формуляр +addPassword.selectText.10=Предотвратяване на промени +addPassword.selectText.11=Предотвратяване на промени на анотация +addPassword.selectText.12=Предотвратяване на печат +addPassword.selectText.13=Предотвратете отпечатването в различни формати +addPassword.selectText.14=Парола на собственика +addPassword.selectText.15=Ограничава какво може да се прави с документа, след като бъде отворен (не се поддържа от всички четци) +addPassword.selectText.16=Ограничава отварянето на самия документ +addPassword.submit=Шифроване + + +#watermark +watermark.title=Добавяне на воден знак +watermark.header=Добавяне на воден знак +watermark.selectText.1=Изберете PDF, към който да добавите воден знак: +watermark.selectText.2=Текст на воден знак: +watermark.selectText.3=Размер на шрифта: +watermark.selectText.4=Завъртане (0-360): +watermark.selectText.5=ширинаSpacer (Разстояние между всеки воден знак хоризонтално): +watermark.selectText.6=дължинаSpacer (Разстояние между всеки воден знак вертикално): +watermark.selectText.7=Непрозрачност (0% - 100%): +watermark.selectText.8=Тип воден знак: +watermark.selectText.9=Изображение за воден знак: +watermark.submit=Добавяне на воден знак + + +#Change permissions +permissions.title=Промяна на правата +permissions.header=Промени правата +permissions.warning=Предупреждение, че тези разрешения са непроменими, препоръчва се да ги зададете с парола чрез страницата за добавяне на парола +permissions.selectText.1=Изберете PDF, за да промените правата +permissions.selectText.2=Разрешения за задаване +permissions.selectText.3=Предотвратяване на сглобяването на документ +permissions.selectText.4=Предотвратете извличането на съдържание +permissions.selectText.5=Предотвратете извличането за достъпност +permissions.selectText.6=Предотвратяване на попълване на формуляр +permissions.selectText.7=Предотвратяване на модификация +permissions.selectText.8=Предотвратяване на модификация на анотация +permissions.selectText.9=Предотвратявам на отпечатването +permissions.selectText.10=Предотвратете отпечатването на различни формати +permissions.submit=Промени + + +#remove password +removePassword.title=Премахване на паролата +removePassword.header=Премахване на паролата (Декриптиране) +removePassword.selectText.1=Изберете PDF за Декриптиране +removePassword.selectText.2=Парола +removePassword.submit=Премахване + + +#changeMetadata +changeMetadata.title=Заглавие: +changeMetadata.header=Промени метаданните +changeMetadata.selectText.1=Моля, редактирайте променливите, които искате да промените +changeMetadata.selectText.2=Изтрий всички метаданни +changeMetadata.selectText.3=Покажи персонализирани метаданни: +changeMetadata.author=Автор: +changeMetadata.creationDate=Дата на създаване (гггг/ММ/дд ЧЧ:мм:сс): +changeMetadata.creator=Създател: +changeMetadata.keywords=Ключови думи: +changeMetadata.modDate=Дата на промяна (гггг/ММ/дд ЧЧ:мм:сс): +changeMetadata.producer=Продуцент: +changeMetadata.subject=Тема: +changeMetadata.title=Заглавие: +changeMetadata.trapped=В капан: +changeMetadata.selectText.4=Други метаданни: +changeMetadata.selectText.5=Добавяне на персонализиране метаданни +changeMetadata.submit=Промени + + +#pdfToPDFA +pdfToPDFA.title=PDF към PDF/A +pdfToPDFA.header=PDF към PDF/A +pdfToPDFA.credit=Тази услуга използва OCRmyPDF за PDF/A преобразуване. +pdfToPDFA.submit=Преобразуване + + +#PDFToWord +PDFToWord.title=PDF към Word +PDFToWord.header=PDF към Word +PDFToWord.selectText.1=Изходен файлов формат +PDFToWord.credit=Тази услуга използва LibreOffice за преобразуване на файлове. +PDFToWord.submit=Преобразуване + + +#PDFToPresentation +PDFToPresentation.title=PDF към Презентация +PDFToPresentation.header=PDF към Презентация +PDFToPresentation.selectText.1=Изходен файлов формат +PDFToPresentation.credit=Тази услуга използва LibreOffice за преобразуване на файлове. +PDFToPresentation.submit=Преобразуване + + +#PDFToText +PDFToText.title=PDF към RTF (Текст) +PDFToText.header=PDF към RTF (Текст) +PDFToText.selectText.1=Изходен файлов формат +PDFToText.credit=Тази услуга използва LibreOffice за преобразуване на файлове. +PDFToText.submit=Преобразуване + + +#PDFToHTML +PDFToHTML.title=PDF към HTML +PDFToHTML.header=PDF към HTML +PDFToHTML.credit=Тази услуга използва LibreOffice за преобразуване на файлове. +PDFToHTML.submit=Преобразуване + + +#PDFToXML +PDFToXML.title=PDF към XML +PDFToXML.header=PDF към XML +PDFToXML.credit=Тази услуга използва LibreOffice за преобразуване на файлове. +PDFToXML.submit=Преобразуване + +#PDFToCSV +PDFToCSV.title=PDF ??? CSV +PDFToCSV.header=PDF ??? CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=???????? + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 2c25a1158..02ec4c845 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -26,27 +26,28 @@ text=Text font=Tipus de lletra selectFillter=-- Selecciona -- pageNum=Número de pàgina -sizes.small=Small -sizes.medium=Medium -sizes.large=Large +sizes.small=Petit +sizes.medium=Mitjà +sizes.large=Llarg sizes.x-large=X-Large -error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect -delete=Delete -username=Username -password=Password -welcome=Welcome -########################## -### TODO: Translate ### -########################## -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - +error.pdfPassword=El PDF està protegit o bé el password és incorrecte +delete=Esborra +username=Usuari +password=Contrasenya +welcome=Benvingut +property=Propietat +black=Negre +white=Blanc +red=Vermell +green=Verd +blue=Blau +custom=Personalitzat... +changedCredsMessage=Credentials changed! +notAuthenticatedMessage=User not authenticated. +userNotFoundMessage=User not found. +incorrectPasswordMessage=Current password is incorrect. +usernameExistsMessage=New Username already exists. @@ -56,7 +57,7 @@ custom=Custom... navbar.convert=Converteix navbar.security=Seguretat navbar.other=Altres -navbar.darkmode=Mode Fost +navbar.darkmode=Mode Fosc navbar.pageOps=Operacions de Pàgina navbar.settings=Opcions @@ -71,48 +72,67 @@ settings.downloadOption.1=Obre mateixa finestra settings.downloadOption.2=Obre mateixa finestra settings.downloadOption.3=Descarrega Arxiu settings.zipThreshold=Comprimiu els fitxers quan el nombre de fitxers baixats superi -settings.signOut=Sign Out +settings.signOut=Sortir settings.accountSettings=Account Settings -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings +changeCreds.title=Change Credentials +changeCreds.header=Update Your Account Details +changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) +changeCreds.newUsername=New Username +changeCreds.oldPassword=Current Password +changeCreds.newPassword=New Password +changeCreds.confirmNewPassword=Confirm New Password +changeCreds.submit=Submit Changes + + + +account.title=Opcions del compte +account.accountSettings=Opcions del compte +account.adminSettings=Opcions d'Admin - Veure i afegir usuaris +account.userControlSettings=Opcions de Control d'Usuari +account.changeUsername=Canvia nom usuari +account.changeUsername=Canvia nom usuari +account.password=Confirma contrasenya +account.oldPassword=Password Antic +account.newPassword=Password Nou +account.changePassword=Canvia contrasenya +account.confirmNewPassword=Confirma Nova contrasenya +account.signOut=Sortir +account.yourApiKey=Clau API +account.syncTitle=Sincronitza opcions navegador amb compte +account.settingsCompare=Comparador Opcions: +account.property=Propietat: +account.webBrowserSettings=Opcins Navegador +account.syncToBrowser=Sincronitza Compte -> Navegador +account.syncToAccount=Sincronitza Compte <- Navegador + + +adminUserSettings.title=Opcions Control Usuari +adminUserSettings.header=Usuari Admin Opcions Control adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.submit=Save User +adminUserSettings.user=Usuari +adminUserSettings.addUser=Afegir Usuari +adminUserSettings.roles=Rols +adminUserSettings.role=Rol +adminUserSettings.actions=Accions +adminUserSettings.apiUser=Usuari amb API limitada +adminUserSettings.webOnlyUser=Usuari només WEB +adminUserSettings.forceChange=Force user to change username/password on login +adminUserSettings.submit=Desar Usuari ############# # HOME-PAGE # ############# home.desc=L'eina allotjada localment per a necessitats PDF. +home.searchBar=Search for features... +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=PDF Multi Tool home.multiTool.desc=Fusiona, Rota, Reorganitza, i Esborra pàgines multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side @@ -160,12 +180,12 @@ home.removePages.title=Elimina home.removePages.desc=Elimina pàgines del document PDF. removePages.tags=Remove pages,delete pages -home.addPassword.title=Afegir Password -home.addPassword.desc=Xifra document PDF amb password. +home.addPassword.title=Afegir Contrasenya +home.addPassword.desc=Xifra document PDF amb contrasenya. addPassword.tags=secure,security -home.removePassword.title=Elimina Password -home.removePassword.desc=Elimia Password de document PDF. +home.removePassword.title=Elimina Contrasenya +home.removePassword.desc=Elimia contrasenya de document PDF. removePassword.tags=secure,Decrypt,security,unpassword,delete password home.compressPdfs.title=Comprimeix @@ -219,7 +239,7 @@ home.ScannerImageSplit.title=Detecta/Divideix fotos escanejades home.ScannerImageSplit.desc=Divideix múltiples fotos dins del PDF/foto ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize -home.sign.title=Sign +home.sign.title=Signa home.sign.desc=Afegeix signatura al PDF mitjançant dibuix, text o imatge sign.tags=authorize,initials,drawn-signature,text-sign,image-signature @@ -239,9 +259,9 @@ home.compare.title=Compara home.compare.desc=Compara i mostra les diferències entre 2 documents PDF compare.tags=differentiate,contrast,changes,analysis -home.certSign.title=Sign with Certificate -home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt +home.certSign.title=Signa amb Certificat +home.certSign.desc=Sign PDF amb Certificate/Clau (PEM/P12) +certSign.tags=authentica,PEM,P12,official,encripta home.pageLayout.title=Multi-Page Layout home.pageLayout.desc=Merge multiple pages of a PDF document into a single page @@ -255,20 +275,20 @@ home.pipeline.title=Pipeline (Advanced) home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts pipeline.tags=automate,sequence,scripted,batch-process -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location -add-page-numbers.tags=paginate,label,organize,index +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 auto-rename.tags=auto-detect,header-based,organize,relabel -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF +home.adjust-contrast.title=Ajusta Colors/Contrast +home.adjust-contrast.desc=Ajusta Colors/Contrast, Saturació i Brillantor adjust-contrast.tags=color-correction,tune,modify,enhance -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) +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 @@ -316,26 +336,41 @@ home.autoRedact.title=Auto Redact home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text showJS.tags=JS +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to 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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + ########################### # # # WEB PAGES # # # ########################### #login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in +login.title=Accedir +login.signin=Accedir +login.rememberme=Recordar +login.invalid=Nom usuari / password no vàlid +login.locked=Compte bloquejat +login.signinTitle=Autenticat #auto-redact autoRedact.title=Auto Redact autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## autoRedact.colorLabel=Colour autoRedact.textsToRedactLabel=Text to Redact (line-separated) autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret @@ -408,18 +443,18 @@ sanitizePDF.submit=Sanitize PDF #addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers +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.3=Posició +addPageNumbers.selectText.4=Número Inicial +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.submit=Afegir Números de Pàgina #auto-rename @@ -438,8 +473,8 @@ adjustContrast.download=Download #crop -crop.title=Crop -crop.header=Crop Image +crop.title=Talla +crop.header=Talla Imatge crop.submit=Submit @@ -466,6 +501,7 @@ pipeline.title=Pipeline pageLayout.title=Multi Page Layout pageLayout.header=Multi Page Layout pageLayout.pagesPerSheet=Pages per sheet: +pageLayout.addBorder=Add Borders pageLayout.submit=Submit @@ -619,6 +655,9 @@ pdfOrganiser.submit=Reorganitza Pàgines multiTool.title=PDF Multi Tool multiTool.header=PDF Multi Tool +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=Eliminació Pàgines @@ -653,7 +692,10 @@ split.submit=Divideix imageToPDF.title=Imatge a PDF imageToPDF.header=Imatge a PDF imageToPDF.submit=Converteix -imageToPDF.selectText.1=Estirar per adaptar +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.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 @@ -756,13 +798,6 @@ changeMetadata.selectText.5=Afegir entrada personalizada changeMetadata.submit=Canvia -#xlsToPdf -xlsToPdf.title=Excel a PDF -xlsToPdf.header=Excel a PDF -xlsToPdf.selectText.1=Selecciona arxiu XLS o XLSX a convertir -xlsToPdf.convert=Converteix - - #pdfToPDFA pdfToPDFA.title=PDF a PDF/A pdfToPDFA.header=PDF a PDF/A @@ -806,3 +841,45 @@ PDFToXML.title=PDF a XML PDFToXML.header=PDF a XML PDFToXML.credit=Utilitza LibreOffice per a la conversió d'Arxius. PDFToXML.submit=Converteix + +#PDFToCSV +PDFToCSV.title=PDF a CSV +PDFToCSV.header=PDF a CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=Extracte + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index ccaaad847..30e8abf32 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -19,34 +19,35 @@ save=Speichern close=Schließen filesSelected=Dateien ausgewählt noFavourites=Keine Favoriten hinzugefügt -bored=Gelangweiltes Warten? +bored=Langeweile beim Warten? alphabet=Alphabet downloadPdf=PDF herunterladen text=Text font=Schriftart selectFillter=-- Auswählen -- pageNum=Seitenzahl -sizes.small=Small -sizes.medium=Medium -sizes.large=Large -sizes.x-large=X-Large -error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect -delete=Delete -username=Username -password=Password -welcome=Welcome -########################## -### TODO: Translate ### -########################## -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - +sizes.small=Klein +sizes.medium=Mittel +sizes.large=Groß +sizes.x-large=Extra Groß +error.pdfPassword=Das PDF-Dokument ist passwortgeschützt und das Passwort wurde entweder nicht angegeben oder war falsch +delete=Löschen +username=Benutzername +password=Passwort +welcome=Willkommen +property=Eigenschaft +black=Schwarz +white=Weiß +red=Rot +green=Grün +blue=Blau +custom=benutzerdefiniert... +changedCredsMessage=Anmeldedaten geändert! +notAuthenticatedMessage=Benutzer nicht authentifiziert. +userNotFoundMessage=Benutzer nicht gefunden. +incorrectPasswordMessage=Das Passwort ist falsch. +usernameExistsMessage=Neuer Benutzername existiert bereits. @@ -71,48 +72,67 @@ settings.downloadOption.1=Im selben Fenster öffnen settings.downloadOption.2=In neuem Fenster öffnen settings.downloadOption.3=Datei herunterladen settings.zipThreshold=Dateien komprimieren, wenn die Anzahl der heruntergeladenen Dateien überschritten wird -settings.signOut=Sign Out -settings.accountSettings=Account Settings - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser +settings.signOut=Abmelden +settings.accountSettings=Kontoeinstellungen -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings + +changeCreds.title=Anmeldeinformationen ändern +changeCreds.header=Aktualisieren Sie Ihre Kontodaten +changeCreds.changeUserAndPassword=Sie verwenden Standard-Anmeldeinformationen. Bitte geben Sie ein neues Passwort (und ggf. einen Benutzernamen) ein. +changeCreds.newUsername=Neuer Benutzername +changeCreds.oldPassword=Aktuelles Passwort +changeCreds.newPassword=Neues Passwort +changeCreds.confirmNewPassword=Neues Passwort bestätigen +changeCreds.submit=Änderung speichern + + + +account.title=Kontoeinstellungen +account.accountSettings=Kontoeinstellungen +account.adminSettings=Admin Einstellungen - Benutzer anzeigen und hinzufügen +account.userControlSettings=Benutzerkontrolle +account.changeUsername=Benutzername ändern +account.changeUsername=Benutzername ändern +account.password=Bestätigungspasswort +account.oldPassword=Altes Passwort +account.newPassword=Neues Passwort +account.changePassword=Password ändern +account.confirmNewPassword=Neues Passwort bestätigen +account.signOut=Abmelden +account.yourApiKey=Dein API Schlüssel +account.syncTitle=Browsereinstellungen mit Konto synchronisieren +account.settingsCompare=Einstellungen vergleichen: +account.property=Eigenschaft +account.webBrowserSettings=Webbrowser-Einstellung +account.syncToBrowser=Synchronisiere Konto -> Browser +account.syncToAccount=Synchronisiere Konto <- Browser + + +adminUserSettings.title=Benutzerkontrolle +adminUserSettings.header=Administrator-Benutzerkontrolle adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.submit=Save User +adminUserSettings.user=Benutzer +adminUserSettings.addUser=Neuen Benutzer hinzufügen +adminUserSettings.roles=Rollen +adminUserSettings.role=Rolle +adminUserSettings.actions=Aktion +adminUserSettings.apiUser=Eingeschränkter API-Benutzer +adminUserSettings.webOnlyUser=Nur Web-Benutzer +adminUserSettings.forceChange=Benutzer dazu zwingen, Benutzernamen/Passwort bei der Anmeldung zu ändern +adminUserSettings.submit=Benutzer speichern ############# # HOME-PAGE # ############# home.desc=Ihr lokal gehosteter One-Stop-Shop für alle Ihre PDF-Anforderungen. +home.searchBar=Suche nach Funktionen... +home.viewPdf.title=PDF anzeigen +home.viewPdf.desc=Anzeigen, Kommentieren, Text oder Bilder hinzufügen +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=PDF-Multitool home.multiTool.desc=Seiten zusammenführen, drehen, neu anordnen und entfernen multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side @@ -144,7 +164,7 @@ pdfOrganiser.tags=duplex,even,odd,sort,move home.addImage.title=Bild einfügen -home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (Work in progress). +home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit). addImage.tags=img,jpg,picture,photo home.watermark.title=Wasserzeichen hinzufügen @@ -181,13 +201,13 @@ home.fileToPDF.title=Datei in PDF konvertieren home.fileToPDF.desc=Konvertieren Sie nahezu jede Datei in PDF (DOCX, PNG, XLS, PPT, TXT und mehr) fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint -home.ocr.title=Führe OCR auf PDF- und/oder Cleanup-Scans aus +home.ocr.title=Führe OCR/Cleanup-Scans aus home.ocr.desc=Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu. ocr.tags=recognition,text,image,scan,read,identify,detection,editable home.extractImages.title=Bilder extrahieren -home.extractImages.desc=Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Datei +home.extractImages.desc=Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Archiv extractImages.tags=picture,photo,save,archive,zip,capture,grab home.pdfToPDFA.title=PDF zu PDF/A konvertieren @@ -239,223 +259,238 @@ home.compare.title=Vergleichen home.compare.desc=Vergleicht und zeigt die Unterschiede zwischen zwei PDF-Dokumenten an compare.tags=differentiate,contrast,changes,analysis -home.certSign.title=Sign with Certificate -home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) +home.certSign.title=Mit Zertifikat signieren +home.certSign.desc=Ein PDF mit einem Zertifikat/Schlüssel (PEM/P12) signieren certSign.tags=authenticate,PEM,P12,official,encrypt -home.pageLayout.title=Multi-Page Layout -home.pageLayout.desc=Merge multiple pages of a PDF document into a single page +home.pageLayout.title=Mehrseitiges Layout +home.pageLayout.desc=Mehrere Seiten eines PDF zu einer Seite zusammenführen 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=Seitengröße/Skalierung anpassen +home.scalePages.desc=Größe/Skalierung der Seite und/oder des Inhalts ändern scalePages.tags=resize,modify,dimension,adapt -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts +home.pipeline.title=Pipeline (Fortgeschritten) +home.pipeline.desc=Mehrere Aktionen auf ein PDF anwenden, definiert durch einen Pipeline Skript pipeline.tags=automate,sequence,scripted,batch-process -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location +home.add-page-numbers.title=Seitenzahlen hinzufügen +home.add-page-numbers.desc=Hinzufügen von Seitenzahlen an einer bestimmten Stelle add-page-numbers.tags=paginate,label,organize,index -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=PDF automatisch umbenennen +home.auto-rename.desc=PDF-Datei anhand von erkannten Kopfzeilen umbenennen auto-rename.tags=auto-detect,header-based,organize,relabel -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF +home.adjust-contrast.title=Farben/Kontrast anpassen +home.adjust-contrast.desc=Kontrast, Sättigung und Helligkeit einer PDF anpassen adjust-contrast.tags=color-correction,tune,modify,enhance -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) +home.crop.title=PDF zuschneiden +home.crop.desc=PDF zuschneiden um die Größe zu verändern (Text bleibt erhalten!) 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=PDF automatisch teilen +home.autoSplitPDF.desc=Physisch gescannte PDF anhand von Splitter-Seiten und QR-Codes aufteilen 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=PDF Bereinigen +home.sanitizePdf.desc=Entfernen von Skripten und anderen Elementen aus PDF-Dateien 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/Website zu PDF +home.URLToPDF.desc=Konvertiert jede http(s)URL zu 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 zu PDF +home.HTMLToPDF.desc=Konvertiert jede HTML-Datei oder Zip-Archiv zu 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 zu PDF +home.MarkdownToPDF.desc=Konvertiert jede Markdown-Datei zu 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=Alle Informationen anzeigen +home.getPdfInfo.desc=Erfasst alle möglichen Informationen in einer PDF getPdfInfo.tags=infomation,data,stats,statistics -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF +home.extractPage.title=Seite(n) extrahieren +home.extractPage.desc=Extrahiert ausgewählte Seiten aus einer 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 zu einer Seite zusammenfassen +home.PdfToSinglePage.desc=Fügt alle PDF-Seiten zu einer einzigen großen Seite zusammen PdfToSinglePage.tags=single page -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF +home.showJS.title=Javascript anzeigen +home.showJS.desc=Alle Javascript Funktionen in einer PDF anzeigen 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=Automatisch zensieren/schwärzen +home.autoRedact.desc=Automatisches zensierten (Schwärzen) von Text in einer PDF-Datei basierend auf dem eingegebenen Text showJS.tags=JS +home.tableExtraxt.title=Tabelle extrahieren +home.tableExtraxt.desc=Tabelle aus PDF in CSV extrahieren +tableExtraxt.tags=CSV + + +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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + ########################### # # # WEB PAGES # # # ########################### #login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in +login.title=Anmelden +login.signin=Anmelden +login.rememberme=Angemeldet bleiben +login.invalid=Ungültiger Benutzername oder Passwort. +login.locked=Ihr Konto wurde gesperrt. +login.signinTitle=Bitte melden Sie sich an #auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## -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=Automatisch zensieren/schwärzen +autoRedact.header=Automatisch zensieren/schwärzen +autoRedact.colorLabel=Farbe +autoRedact.textsToRedactLabel=Zu zensierender Text (einer pro Zeile) +autoRedact.textsToRedactPlaceholder=z.B. \nVertraulich \nStreng geheim +autoRedact.useRegexLabel=Regex verwenden +autoRedact.wholeWordSearchLabel=Ganzes Wort suchen +autoRedact.customPaddingLabel=Benutzerdefinierte Extra-Padding +autoRedact.convertPDFToImageLabel=PDF in PDF-Bild konvertieren (zum Entfernen von Text hinter dem Kasten) +autoRedact.submitButton=zensieren #showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show +showJS.title=Javascript anzeigen +showJS.header=Javascript anzeigen +showJS.downloadJS=Javascript herunterladen +showJS.submit=Anzeigen #pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page +pdfToSinglePage.title=PDF zu einer Seite zusammenfassen +pdfToSinglePage.header=PDF zu einer Seite zusammenfassen +pdfToSinglePage.submit=Zusammenfassen #pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract +pageExtracter.title=Seiten extrahieren +pageExtracter.header=Seiten extrahieren +pageExtracter.submit=Extrahieren #getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON +getPdfInfo.title=Alle Informationen anzeigen +getPdfInfo.header=Alle Informationen anzeigen +getPdfInfo.submit=Informationen anzeigen +getPdfInfo.downloadJson=Als JSON herunterladen #markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint +MarkdownToPDF.title=Markdown zu PDF +MarkdownToPDF.header=Markdown zu PDF +MarkdownToPDF.submit=Konvertieren +MarkdownToPDF.help=In Arbeit +MarkdownToPDF.credit=Verwendet WeasyPrint #url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint +URLToPDF.title=URL zu PDF +URLToPDF.header=URL zu PDF +URLToPDF.submit=Konvertieren +URLToPDF.credit=Verwendet 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.title=HTML zu PDF +HTMLToPDF.header=HTML zu PDF +HTMLToPDF.help=Akzeptiert HTML-Dateien und ZIPs mit html/css/images etc. +HTMLToPDF.submit=Konvertieren +HTMLToPDF.credit=Verwendet WeasyPrint #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=PDF Bereinigen +sanitizePDF.header=PDF Bereinigen +sanitizePDF.selectText.1=Javascript-Aktionen entfernen +sanitizePDF.selectText.2=Eingebettete Dateien entfernen +sanitizePDF.selectText.3=Metadaten entfernen +sanitizePDF.selectText.4=Links entfernen +sanitizePDF.selectText.5=Schriftarten entfernen +sanitizePDF.submit=Bereinigen #addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size +addPageNumbers.title=Seitenzahlen hinzufügen +addPageNumbers.header=Seitenzahlen hinzufügen +addPageNumbers.selectText.1=PDF-Datei auswählen: +addPageNumbers.selectText.2=Margin Größe addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers +addPageNumbers.selectText.4=Startnummer +addPageNumbers.selectText.5=Seiten zu nummerieren +addPageNumbers.selectText.6=Benutzerdefinierter Text +addPageNumbers.customTextDesc=Benutzerdefinierter Text +addPageNumbers.numberPagesDesc=Welche Seiten nummeriert werden sollen, Standardeinstellung 'alle' ('all'), akzeptiert auch 1-5 oder 2,5,9 usw. +addPageNumbers.customNumberDesc=Standardmäßig {n}, akzeptiert auch 'Seite {n} von {total}', 'Text-{n}', '{filename}-{n}' +addPageNumbers.submit=Seitenzahlen hinzufügen #auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename +auto-rename.title=PDF automatisch umbenennen +auto-rename.header=PDF automatisch umbenennen +auto-rename.submit=Automatisch umbenennen #adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download +adjustContrast.title=Kontrast anpassen +adjustContrast.header=Farben/Kontrast anpassen +adjustContrast.contrast=Kontrast: +adjustContrast.brightness=Helligkeit: +adjustContrast.saturation=Sättigung: +adjustContrast.download=Herunterladen #crop -crop.title=Crop -crop.header=Crop Image -crop.submit=Submit +crop.title=Zuschneiden +crop.header=Bild zuschneiden +crop.submit=Abschicken #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=PDF automatisch teilen +autoSplitPDF.header=PDF automatisch teilen +autoSplitPDF.description=Drucken Sie, fügen Sie ein, scannen Sie, laden Sie hoch, und lassen Sie uns Ihre Dokumente automatisch trennen. Kein manuelles Sortieren erforderlich. +autoSplitPDF.selectText.1=Drucken Sie einige Trennblätter aus (schwarz/weiß ist ausreichend). +autoSplitPDF.selectText.2=Scannen Sie alle Dokumente auf einmal, indem Sie das Trennblatt zwischen die Dokumente einlegen. +autoSplitPDF.selectText.3=Laden Sie die einzelne große gescannte PDF-Datei hoch und überlassen Sie Stirling PDF den Rest. +autoSplitPDF.selectText.4=Trennseiten werden automatisch erkannt und entfernt, so dass ein sauberes Enddokument garantiert ist. +autoSplitPDF.formPrompt=PDF mit Stirling-PDF Seitentrennern hochladen: +autoSplitPDF.duplexMode=Duplex-Modus (Scannen von Vorder- und Rückseite) +autoSplitPDF.dividerDownload1=Herunterladen 'Auto Splitter Divider (minimal).pdf' +autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (mit Anleitung).pdf' +autoSplitPDF.submit=Aufteilen #pipeline @@ -463,18 +498,19 @@ pipeline.title=Pipeline #pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -pageLayout.submit=Submit +pageLayout.title=Mehrseitiges Layout +pageLayout.header=Mehrseitiges Layout +pageLayout.pagesPerSheet=Seiten pro Blatt: +pageLayout.addBorder=Add Borders +pageLayout.submit=Abschicken #scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit +scalePages.title=Seitengröße anpassen +scalePages.header=Seitengröße anpassen +scalePages.pageSize=Format der Seiten des Dokuments. +scalePages.scaleFactor=Zoomstufe (Ausschnitt) einer Seite. +scalePages.submit=Abschicken #certSign @@ -494,13 +530,13 @@ certSign.submit=PDF signieren #removeBlanks -removeBlanks.title=Leerzeichen entfernen +removeBlanks.title=Leere Seiten entfernen removeBlanks.header=Leere Seiten entfernen removeBlanks.threshold=Schwellenwert: removeBlanks.thresholdDesc=Schwellenwert zur Bestimmung, wie weiß ein weißer Pixel sein muss removeBlanks.whitePercent=Weißprozentsatz (%): removeBlanks.whitePercentDesc=Prozentsatz der Seite, die weiß sein muss, um entfernt zu werden -removeBlanks.submit=Leerzeichen entfernen +removeBlanks.submit=Leere Seiten entfernen #compare @@ -518,12 +554,12 @@ sign.upload=Bild hochladen sign.draw=Signatur zeichnen sign.text=Texteingabe sign.clear=Klar -sign.add=Hinzufügen +sign.add=Signieren #repair repair.title=Reparieren -repair.header=Repair PDFs +repair.header=PDFs reparieren repair.submit=Reparieren @@ -604,8 +640,8 @@ addImage.submit=Bild hinzufügen #merge merge.title=Zusammenführen merge.header=Mehrere PDFs zusammenführen (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date +merge.sortByName=Nach Namen sortieren +merge.sortByDate=Nach Datum sortieren merge.submit=Zusammenführen @@ -619,6 +655,9 @@ pdfOrganiser.submit=Seiten anordnen multiTool.title=PDF-Multitool multiTool.header=PDF-Multitool +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=Seiten entfernen @@ -653,7 +692,10 @@ split.submit=Aufteilen imageToPDF.title=Bild zu PDF imageToPDF.header=Bild zu PDF imageToPDF.submit=Umwandeln -imageToPDF.selectText.1=Auf Seite strecken +imageToPDF.selectLabel=Image Fit Options +imageToPDF.fillPage=Fill Page +imageToPDF.fitDocumentToImage=Fit Page to Image +imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.selectText.2=PDF automatisch drehen imageToPDF.selectText.3=Mehrere Dateien verarbeiten (nur aktiv, wenn Sie mit mehreren Bildern arbeiten) imageToPDF.selectText.4=In ein einziges PDF zusammenführen @@ -690,9 +732,9 @@ addPassword.selectText.10=Modifizierung verhindern addPassword.selectText.11=Ändern von Kommentaren verhindern addPassword.selectText.12=Drucken verhindern addPassword.selectText.13=Drucken verschiedener Formate verhindern -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.14=Passwort des Besitzers +addPassword.selectText.15=Schränkt ein, was mit dem Dokument gemacht werden kann, sobald es geöffnet ist (wird nicht von allen Leseprogrammen unterstützt) +addPassword.selectText.16=Schränkt das Öffnen des Dokuments selbst ein addPassword.submit=Verschlüsseln @@ -706,8 +748,8 @@ watermark.selectText.4=Drehung (0-360): watermark.selectText.5=breiteSpacer (horizontaler Abstand zwischen den einzelnen Wasserzeichen): watermark.selectText.6=höheSpacer (vertikaler Abstand zwischen den einzelnen Wasserzeichen): watermark.selectText.7=Deckkraft (0% - 100 %): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: +watermark.selectText.8=Wasserzeichen Typ: +watermark.selectText.9=Wasserzeichen-Bild: watermark.submit=Wasserzeichen hinzufügen @@ -756,13 +798,6 @@ changeMetadata.selectText.5=Benutzerdefinierten Metadateneintrag hinzufügen changeMetadata.submit=Ändern -#xlsToPdf -xlsToPdf.title=Excel in PDF -xlsToPdf.header=Excel in PDF -xlsToPdf.selectText.1=XLS- oder XLSX-Excel-Tabelle zum Konvertieren auswählen -xlsToPdf.convert=konvertieren - - #pdfToPDFA pdfToPDFA.title=PDF zu PDF/A pdfToPDFA.header=PDF zu PDF/A @@ -806,3 +841,45 @@ PDFToXML.title=PDF in XML PDFToXML.header=PDF in XML PDFToXML.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung. PDFToXML.submit=Konvertieren + +#PDFToCSV +PDFToCSV.title=PDF zu CSV +PDFToCSV.header=PDF zu CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=Extrakt + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties new file mode 100644 index 000000000..a90e48f3a --- /dev/null +++ b/src/main/resources/messages_el_GR.properties @@ -0,0 +1,885 @@ +########### +# Generic # +########### +# the direction that the language is written (ltr=left to right, rtl = right to left) +language.direction=ltr + +pdfPrompt=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE PDF(s) +multiPdfPrompt=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE PDFs (2+) +multiPdfDropPrompt=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE (\u03AE \u03C4\u03C1\u03AC\u03B2\u03B7\u03B3\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03BA\u03B1\u03B9 \u03B1\u03C0\u03CC\u03B8\u03B5\u03C3\u03B7) \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD PDF \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B5\u03B9\u03AC\u03B6\u03B5\u03C3\u03C4\u03B5 +imgPrompt=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2(\u0395\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD) +genericSubmit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE +processTimeWarning=\u03A0\u03C1\u03BF\u03C3\u03BF\u03C7\u03AE: \u0391\u03C5\u03C4\u03AE \u03B7 \u03B4\u03B9\u03B1\u03B4\u03B9\u03BA\u03B1\u03C3\u03AF\u03B1 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B4\u03B9\u03B1\u03C1\u03BA\u03AD\u03C3\u03B5\u03B9 \u03AD\u03C9\u03C2 \u03BA\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03BB\u03B5\u03C0\u03C4\u03CC \u03B1\u03BD\u03AC\u03BB\u03BF\u03B3\u03B1 \u03BC\u03B5 \u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 +pageOrderPrompt=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03B7 \u03A3\u03B5\u03B9\u03C1\u03AC \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 (\u03A0\u03C1\u03BF\u03C3\u03B8\u03AD\u03C3\u03C4\u03B5 \u03BC\u03AF\u03B1 \u03BB\u03AF\u03C3\u03C4\u03B5 \u03B1\u03C0\u03BF \u03B1\u03C1\u03B9\u03B8\u03BC\u03BF\u03CD\u03C2 \u03C3\u03B5\u03BB\u03B9\u03B4\u03CE\u03BD, \u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B5\u03C2 \u03BC\u03B5 \u03BA\u03CC\u03BC\u03BC\u03B1 \u03AE \u03C3\u03C5\u03BD\u03B1\u03C1\u03C4\u03AE\u03C3\u03B5\u03B9\u03C2 \u03CC\u03C0\u03C9\u03C2 2n+1) : +goToPage=Go +true=\u0391\u03BB\u03B7\u03B8\u03AD\u03C2 +false=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF +unknown=\u0386\u03B3\u03BD\u03C9\u03C3\u03C4\u03BF +save=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 +close=\u039A\u03BB\u03B5\u03AF\u03C3\u03B9\u03BC\u03BF +filesSelected=\u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03C0\u03BF\u03C5 \u03B5\u03C0\u03B9\u03BB\u03AD\u03C7\u03B8\u03B7\u03BA\u03B1\u03BD +noFavourites=\u039A\u03B1\u03BD\u03AD\u03BD\u03B1 \u03B1\u03B3\u03B1\u03C0\u03AE\u03BC\u03B5\u03BD\u03BF \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03B9 \u03C0\u03C1\u03BF\u03C3\u03C4\u03B5\u03B8\u03B5\u03AF +bored=\u0392\u03B1\u03C1\u03B9\u03AD\u03C3\u03C4\u03B5 \u03BD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03BC\u03AD\u03BD\u03B5\u03C4\u03B5; +alphabet=\u0391\u03BB\u03C6\u03AC\u03B2\u03B7\u03C4\u03BF +downloadPdf=\u039A\u03B1\u03C4\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 \u03C4\u03BF\u03C5 PDF +text=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF +font=\u0393\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC +selectFillter=-- \u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE -- +pageNum=\u0391\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 +sizes.small=\u039C\u03B9\u03BA\u03C1\u03CC +sizes.medium=\u039C\u03B5\u03C3\u03B1\u03AF\u03BF +sizes.large=\u039C\u03B5\u03B3\u03AC\u03BB\u03BF +sizes.x-large=\u03A0\u03BF\u03BB\u03CD \u039C\u03B5\u03B3\u03AC\u03BB\u03BF +error.pdfPassword=\u03A4\u03BF PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BA\u03BB\u03B5\u03B9\u03B4\u03C9\u03BC\u03AD\u03BD\u03BF \u03BC\u03B5 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03BA\u03B1\u03B9 \u03B5\u03AF\u03C4\u03B5 \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03C4\u03B5 \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03B9 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC, \u03B5\u03AF\u03C4\u03B5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BB\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF\u03C2 +delete=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE +username=\u038C\u03BD\u03BF\u03BC\u03B1 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 +password=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 +welcome=\u039A\u03B1\u03BB\u03C9\u03C2 \u0389\u03BB\u03B8\u03B1\u03C4\u03B5 +property=Property +black=\u039C\u03B1\u03CD\u03C1\u03BF +white=\u0386\u03C3\u03C0\u03C1\u03BF +red=\u039A\u03CC\u03BA\u03BA\u03B9\u03BD\u03BF +green=\u03A0\u03C1\u03AC\u03C3\u03B9\u03BD\u03BF +blue=\u039C\u03C0\u03BB\u03AD +custom=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE... + +changedCredsMessage=\u03A4\u03B1 \u03B4\u03B9\u03B1\u03C0\u03B9\u03C3\u03C4\u03B5\u03C5\u03C4\u03AE\u03C1\u03B9\u03B1 \u03AD\u03C7\u03BF\u03C5\u03BD \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03B9! +notAuthenticatedMessage=\u039F \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03B9 \u03B1\u03C5\u03B8\u03B5\u03BD\u03C4\u03B9\u03BA\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03B5\u03AF. +userNotFoundMessage=\u039F \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03B4\u03B5\u03BD \u03B2\u03C1\u03AD\u03B8\u03B7\u03BA\u03B5. +incorrectPasswordMessage=\u039F \u03C4\u03C1\u03AD\u03C7\u03C9\u03BD \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BB\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF\u03C2. +usernameExistsMessage=\u03A4\u03BF \u03BD\u03AD\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03C5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03AE\u03B4\u03B7. + + + +############# +# NAVBAR # +############# +navbar.convert=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE +navbar.security=\u0391\u03C3\u03C6\u03AC\u03BB\u03B5\u03B9\u03B1 +navbar.other=\u0394\u03B9\u03AC\u03C6\u03BF\u03C1\u03B1 +navbar.darkmode=\u039C\u03B1\u03CD\u03C1\u03BF \u0398\u03AD\u03BC\u03B1 +navbar.pageOps=\u039B\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B5\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 +navbar.settings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 + +############# +# SETTINGS # +############# +settings.title=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 +settings.update=\u03A5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03B7 \u03B5\u03BD\u03B7\u03BC\u03AD\u03C1\u03C9\u03C3\u03B7 +settings.appVersion=\u0388\u03BA\u03B4\u03BF\u03C3\u03B7 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE\u03C2: App Version: +settings.downloadOption.title=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03B5\u03C4\u03B5 \u03C4\u03B7\u03BD \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03BB\u03AE\u03C8\u03B7\u03C2 (\u0393\u03B9\u03B1 \u03BB\u03AE\u03C8\u03B5\u03B9\u03C2 \u03BC\u03B5\u03BC\u03BF\u03BD\u03C9\u03BC\u03AD\u03BD\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03C7\u03C9\u03C1\u03AF\u03C2 zip): +settings.downloadOption.1=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03C3\u03C4\u03BF \u03AF\u03B4\u03B9\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF +settings.downloadOption.2=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03C3\u03B5 \u03BD\u03AD\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF +settings.downloadOption.3=\u039B\u03AE\u03C8\u03B7 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 +settings.zipThreshold=Zip \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03CC\u03C4\u03B1\u03BD \u03BF \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03C4\u03C9\u03BD \u03BB\u03B7\u03C6\u03B8\u03AD\u03BD\u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03BC\u03B5\u03B3\u03AC\u03BB\u03BF\u03C2 +settings.signOut=\u0391\u03C0\u03BF\u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 +settings.accountSettings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u039B\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03BF\u03CD + + + +changeCreds.title=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u0394\u03B9\u03B1\u03C0\u03B9\u03C3\u03C4\u03B5\u03C5\u03C4\u03B7\u03C1\u03AF\u03C9\u03BD +changeCreds.header=\u0395\u03BD\u03B7\u03BC\u03AD\u03C1\u03C9\u03C3\u03B7 \u03C4\u03C9\u03BD \u03BB\u03B5\u03C0\u03C4\u03BF\u03BC\u03B5\u03C1\u03B5\u03B9\u03CE\u03BD \u03C4\u03BF\u03C5 \u039B\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03BF\u03CD \u03C3\u03B1\u03C2 +changeCreds.changeUserAndPassword=\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B5 \u03C4\u03B1 \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B1 \u03B4\u03B9\u03B1\u03C0\u03B9\u03C3\u03C4\u03B5\u03C5\u03C4\u03AE\u03C1\u03B9\u03B1 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7\u03C2. \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03BD\u03AD\u03BF \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 (\u03BA\u03B1\u03B9 \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03B1\u03BD \u03C4\u03BF \u03B5\u03C0\u03B9\u03B8\u03C5\u03BC\u03B5\u03AF\u03C4\u03B5) +changeCreds.newUsername=\u039D\u03AD\u03BF \u038C\u03BD\u03BF\u03BC\u03B1 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 +changeCreds.oldPassword=\u03A4\u03C1\u03AD\u03C7\u03C9\u03BD \u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 +changeCreds.newPassword=\u039D\u03AD\u03BF\u03C2 \u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 +changeCreds.confirmNewPassword=\u0395\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03AF\u03C9\u03C3\u03B7 \u039D\u03AD\u03BF\u03C5 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 +changeCreds.submit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE \u0391\u03BB\u03BB\u03B1\u03B3\u03CE\u03BD + + + +account.title=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u039B\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03BF\u03CD +account.accountSettings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u039B\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03BF\u03CD +account.adminSettings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE - \u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03BA\u03B1\u03B9 \u03C0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD +account.userControlSettings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u03A7\u03B5\u03B9\u03C1\u03B9\u03C3\u03BC\u03BF\u03CD \u03A7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD +account.changeUsername=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u039F\u03BD\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 +account.changeUsername=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u039F\u03BD\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 +account.password=\u0395\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03AF\u03C9\u03C3\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 +account.oldPassword=\u03A0\u03B1\u03BB\u03B9\u03CC\u03C2 \u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 +account.newPassword=\u039D\u03AD\u03BF\u03C2 \u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 +account.changePassword=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 +account.confirmNewPassword=\u0395\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03AF\u03C9\u03C3\u03B7 \u039D\u03AD\u03BF\u03C5 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD +account.signOut=\u0391\u03C0\u03BF\u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 +account.yourApiKey=\u03A4\u03BF \u03BA\u03BB\u03B5\u03B9\u03B4\u03AF \u03C3\u03B1\u03C2 \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03B4\u03B9\u03B5\u03C0\u03B1\u03C6\u03AE \u03C0\u03C1\u03BF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03B9\u03C3\u03BC\u03BF\u03CD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03CE\u03BD (API key) +account.syncTitle=\u03A3\u03C5\u03B3\u03C7\u03C1\u03BF\u03BD\u03B9\u03C3\u03BC\u03CC\u03C2 \u03C4\u03C9\u03BD \u03C1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03C9\u03BD \u03C4\u03BF\u03C5 \u03C6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE (Web Browser) \u03BC\u03B5 \u03C4\u03BF\u03BD \u03BB\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03CC +account.settingsCompare=\u03A3\u03CD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 \u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03C9\u03BD: +account.property=Property +account.webBrowserSettings=\u03A1\u03CD\u03B8\u03BC\u03B9\u03C3\u03B7 \u03C6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE (Web Browser) +account.syncToBrowser=\u03A3\u03C5\u03B3\u03C7\u03C1\u03BF\u03BD\u03B9\u03C3\u03BC\u03CC\u03C2 \u039B\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03BF\u03CD -> \u03A6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE (Web Browser) +account.syncToAccount=\u03A3\u03C5\u03B3\u03C7\u03C1\u03BF\u03BD\u03B9\u03C3\u03BC\u03CC\u03C2 \u039B\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03BF\u03CD <- \u03A6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE (Web Browser) + + +adminUserSettings.title=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u03B5\u03BB\u03AD\u03B3\u03C7\u03BF\u03C5 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 +adminUserSettings.header=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u03B5\u03BB\u03AD\u03B3\u03C7\u03BF\u03C5 \u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE +adminUserSettings.admin=\u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE\u03C2 +adminUserSettings.user=\u03A7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 +adminUserSettings.addUser=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BD\u03AD\u03BF\u03C5 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 +adminUserSettings.roles=\u03A1\u03CC\u03BB\u03BF\u03B9 +adminUserSettings.role=\u03A1\u03CC\u03BB\u03BF\u03C2 +adminUserSettings.actions=\u0395\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B5\u03C2 +adminUserSettings.apiUser=\u03A0\u03B5\u03C1\u03B9\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF\u03C2 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03B3\u03B9\u03B1 \u03B4\u03B9\u03B5\u03C0\u03B1\u03C6\u03AE \u03C0\u03C1\u03BF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03B9\u03C3\u03BC\u03BF\u03CD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03CE\u03BD (API User) +adminUserSettings.webOnlyUser=\u03A7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03BC\u03CC\u03BD\u03BF \u0399\u03C3\u03C4\u03BF\u03CD +adminUserSettings.forceChange=\u0391\u03BD\u03B1\u03B3\u03BA\u03AC\u03C3\u03C4\u03B5 \u03C4\u03BF\u03BD \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03BD\u03B1 \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03B9 \u03C4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7/\u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 +adminUserSettings.submit=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 + +############# +# HOME-PAGE # +############# +home.desc=\u0397 \u03C4\u03BF\u03C0\u03B9\u03BA\u03AC \u03C6\u03B9\u03BB\u03BF\u03BE\u03B5\u03BD\u03BF\u03CD\u03BC\u03B5\u03BD\u03B7 one-stop-shop \u03C3\u03B1\u03C2 \u03B3\u03B9\u03B1 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03B1\u03BD\u03AC\u03B3\u03BA\u03B5\u03C2 \u03C3\u03B1\u03C2 \u03C3\u03B5 PDF. +home.searchBar=Search for features... + + +home.viewPdf.title=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 PDF +home.viewPdf.desc=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7, \u03C0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C3\u03C7\u03B5\u03B4\u03AF\u03BF\u03C5, \u03C0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03AE \u03B5\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD +viewPdf.tags=view,read,annotate,text,image + +home.multiTool.title=PDF \u03A0\u03BF\u03BB\u03C5\u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03BF +home.multiTool.desc=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7, \u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE, \u0391\u03BD\u03B1\u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03BA\u03B1\u03B9 \u039A\u03B1\u03C4\u03AC\u03C1\u03B3\u03B7\u03C3\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD +multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move + +home.merge.title=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 +home.merge.desc=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 \u03C0\u03BF\u03BB\u03BB\u03CE\u03BD PDF \u03C3\u03B5 \u03AD\u03BD\u03B1 \u03BC\u03B5 \u03B5\u03CD\u03BA\u03BF\u03BB\u03BF \u03C4\u03C1\u03CC\u03C0\u03BF. +merge.tags=merge,Page operations,Back end,server side + +home.split.title=\u0394\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 +home.split.desc=\u0394\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03C4\u03C9\u03BD PDF \u03C3\u03B5 \u03C0\u03BF\u03BB\u03BB\u03AC \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03B1. +split.tags=Page operations,divide,Multi Page,cut,server side + +home.rotate.title=\u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE +home.rotate.desc=\u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE \u03C4\u03C9\u03BD PDF \u03C3\u03B1\u03C2 \u03BC\u03B5 \u03B5\u03CD\u03BA\u03BF\u03BB\u03BF \u03C4\u03C1\u03CC\u03C0\u03BF. +rotate.tags=server side + + +home.imageToPdf.title=\u0395\u03B9\u03BA\u03CC\u03BD\u03B1 \u03C3\u03B5 PDF +home.imageToPdf.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 (PNG, JPEG, GIF) \u03C3\u03B5 PDF. +imageToPdf.tags=conversion,img,jpg,picture,photo + +home.pdfToImage.title=PDF \u03C3\u03B5 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 +home.pdfToImage.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BD\u03CC\u03C2 PDF \u03C3\u03B5 \u03BC\u03AF\u03B1 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1. (PNG, JPEG, GIF) +pdfToImage.tags=conversion,img,jpg,picture,photo + +home.pdfOrganiser.title=\u039F\u03C1\u03B3\u03AC\u03BD\u03C9\u03C3\u03B7 +home.pdfOrganiser.desc=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7/\u0391\u03BD\u03B1\u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03BC\u03B5 \u03BF\u03C0\u03BF\u03B9\u03B1\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03C3\u03B5\u03B9\u03C1\u03AC +pdfOrganiser.tags=duplex,even,odd,sort,move + + +home.addImage.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 +home.addImage.desc=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BC\u03B9\u03B1\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03C3\u03B5 \u03BC\u03B9\u03B1 \u03BA\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B7 \u03B8\u03AD\u03C3\u03B7 \u03C3\u03C4\u03BF PDF +addImage.tags=img,jpg,picture,photo + +home.watermark.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 +home.watermark.desc=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B5\u03BD\u03CC\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C3\u03C4\u03BF \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03CC PDF. +watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo + +home.permissions.title=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u0394\u03B9\u03BA\u03B1\u03B9\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD +home.permissions.desc=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03C4\u03C9\u03BD \u0394\u03B9\u03BA\u03B1\u03B9\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD \u03C3\u03C4\u03BF \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF PDF +permissions.tags=read,write,edit,print + + +home.removePages.title=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 +home.removePages.desc=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03BC\u03AE \u03B5\u03C0\u03B9\u03B8\u03C5\u03BC\u03B7\u03C4\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03B1\u03C0\u03BF \u03C4\u03BF \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF PDF. +removePages.tags=Remove pages,delete pages + +home.addPassword.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD +home.addPassword.desc=\u039A\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7 - \u03BA\u03BB\u03B5\u03AF\u03B4\u03C9\u03BC\u03B1 \u03C4\u03BF\u03C5 PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03BC\u03B5 \u03AD\u03BD\u03B1\u03BD \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC. +addPassword.tags=secure,security + +home.removePassword.title=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD +home.removePassword.desc=\u039A\u03B1\u03C4\u03AC\u03C1\u03B3\u03AE\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03C0\u03C1\u03BF\u03C3\u03C4\u03B1\u03C3\u03AF\u03B1\u03C2 \u03BC\u03B5 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03B1\u03C0\u03CC \u03C4\u03BF \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF PDF. +removePassword.tags=secure,Decrypt,security,unpassword,delete password + +home.compressPdfs.title=\u03A3\u03C5\u03BC\u03C0\u03AF\u03B5\u03C3\u03B7 +home.compressPdfs.desc=\u03A3\u03C5\u03BC\u03C0\u03AF\u03B5\u03C3\u03B7 \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD PDF \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03BC\u03B5\u03AF\u03C9\u03C3\u03B7 \u03C4\u03BF\u03C5 \u03BC\u03B5\u03B3\u03AD\u03B8\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5\u03C2. +compressPdfs.tags=squish,small,tiny + + +home.changeMetadata.title=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u039C\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD +home.changeMetadata.desc=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE/\u039A\u03B1\u03C4\u03AC\u03C1\u03B3\u03B7\u03C3\u03B7/\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03B1\u03C0\u03CC \u03AD\u03BD\u03B1 \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF PDF. +changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats + +home.fileToPDF.title=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BD\u03CC\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C3\u03B5 PDF +home.fileToPDF.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03C7\u03B5\u03B4\u03CC\u03BD \u03BF\u03C0\u03BF\u03B9\u03BF\u03C5\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C3\u03B5 PDF (DOCX, PNG, XLS, PPT, TXT and more) +fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint + +home.ocr.title=\u03BF\u03C0\u03C4\u03B9\u03BA\u03AE \u03B1\u03BD\u03B1\u03B3\u03BD\u03CE\u03C1\u03B9\u03C3\u03B7 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03C9\u03BD (OCR) / \u03A3\u03B1\u03C1\u03CE\u03C3\u03B5\u03B9\u03C2 Cleanup +home.ocr.desc=\u03A4\u03BF Cleanup \u03C3\u03B1\u03C1\u03CE\u03BD\u03B5\u03B9 \u03BA\u03B1\u03B9 \u03B1\u03BD\u03B9\u03C7\u03BD\u03B5\u03CD\u03B5\u03B9 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B1\u03C0\u03CC \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 \u03BC\u03AD\u03C3\u03B1 \u03C3\u03B5 \u03AD\u03BD\u03B1 PDF \u03BA\u03B1\u03B9 \u03C4\u03BF \u03C0\u03C1\u03BF\u03C3\u03B8\u03AD\u03C4\u03B5\u03B9 \u03BE\u03B1\u03BD\u03AC \u03C9\u03C2 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF +ocr.tags=recognition,text,image,scan,read,identify,detection,editable + + +home.extractImages.title=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03B5\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD +home.extractImages.desc=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03B5\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD \u03B1\u03C0\u03BF \u03AD\u03BD\u03B1 PDF \u03BA\u03B1\u03B9 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03B1\u03C5\u03C4\u03CE\u03BD \u03C3\u03B5 zip +extractImages.tags=picture,photo,save,archive,zip,capture,grab + +home.pdfToPDFA.title=PDF \u03C3\u03B5 PDF/A +home.pdfToPDFA.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE PDF \u03C3\u03B5 PDF/A \u03B3\u03B9\u03B1 \u03BC\u03B1\u03BA\u03C1\u03BF\u03C7\u03C1\u03CC\u03BD\u03B9\u03B1 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 +pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation + +home.PDFToWord.title=PDF \u03C3\u03B5 Word +home.PDFToWord.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03BF\u03C5 PDF \u03C3\u03B5 Word \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF (DOC, DOCX and ODT) +PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile + +home.PDFToPresentation.title=PDF \u03C3\u03B5 Powerpoint +home.PDFToPresentation.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03BF\u03C5 PDF \u03C3\u03B5 Powerpoint \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF (PPT, PPTX and ODP) +PDFToPresentation.tags=slides,show,office,microsoft + +home.PDFToText.title=PDF \u03C3\u03B5 RTF (\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF) +home.PDFToText.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03BF\u03C5 PDF \u03C3\u03B5 \u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03AE \u03C3\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE RTF +PDFToText.tags=richformat,richtextformat,rich text format + +home.PDFToHTML.title=PDF \u03C3\u03B5 HTML +home.PDFToHTML.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03BF\u03C5 PDF \u03C3\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE HTML +PDFToHTML.tags=web content,browser friendly + + +home.PDFToXML.title=PDF \u03C3\u03B5 XML +home.PDFToXML.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03BF\u03C5 PDF \u03C3\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE XML +PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert + +home.ScannerImageSplit.title=\u0391\u03BD\u03AF\u03C7\u03BD\u03B5\u03C5\u03C3\u03B7/\u0394\u03B9\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C3\u03B1\u03C1\u03C9\u03BC\u03AD\u03BD\u03C9\u03BD \u03C6\u03C9\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03B9\u03CE\u03BD +home.ScannerImageSplit.desc=\u0394\u03B9\u03B1\u03C7\u03C9\u03C1\u03AF\u03C3\u03BC\u03CC\u03C2 \u03C0\u03BF\u03BB\u03BB\u03CE\u03BD \u03C6\u03C9\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AF\u03CE\u03BD \u03BC\u03AD\u03C3\u03B1 \u03B1\u03C0\u03CC \u03BC\u03B9\u03B1 \u03C6\u03C9\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AF\u03B1/PDF +ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize + +home.sign.title=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE +home.sign.desc=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 \u03C3\u03C4\u03BF PDF \u03BC\u03B5 \u03C3\u03C7\u03AD\u03B4\u03B9\u03BF, \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03AE \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1. +sign.tags=authorize,initials,drawn-signature,text-sign,image-signature + +home.flatten.title=Flatten +home.flatten.desc=\u039A\u03B1\u03C4\u03AC\u03C1\u03B3\u03B7\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03B4\u03B9\u03B1\u03B4\u03C1\u03B1\u03C3\u03C4\u03B9\u03BA\u03CE\u03BD \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD \u03BA\u03B1\u03B9 \u03C6\u03BF\u03C1\u03BC\u03CE\u03BD \u03B1\u03C0\u03CC \u03AD\u03BD\u03B1 PDF +flatten.tags=static,deactivate,non-interactive,streamline + +home.repair.title=\u0395\u03C0\u03B9\u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7 +home.repair.desc=\u03A0\u03C1\u03BF\u03C3\u03C0\u03AC\u03B8\u03B5\u03B9\u03B1 \u03B5\u03C0\u03B9\u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7\u03C2 \u03B5\u03BD\u03CC\u03C2 \u03BA\u03B1\u03C4\u03B5\u03C3\u03C4\u03C1\u03B1\u03BC\u03BC\u03AD\u03BD\u03BF\u03C5 PDF +repair.tags=fix,restore,correction,recover + +home.removeBlanks.title=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03BA\u03B5\u03BD\u03CE\u03BD \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD +home.removeBlanks.desc=\u0391\u03BD\u03AF\u03C7\u03B5\u03C5\u03C3\u03B7 \u03BA\u03B1\u03B9 \u03B1\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03BA\u03B5\u03BD\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03B1\u03C0\u03CC \u03AD\u03BD\u03B1 \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF +removeBlanks.tags=cleanup,streamline,non-content,organize + +home.compare.title=\u03A3\u03CD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 +home.compare.desc=\u03A3\u03CD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 \u03BA\u03B1\u03B9 \u03B5\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03C4\u03C9\u03BD \u03B4\u03B9\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03B4\u03CD\u03BF PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD +compare.tags=differentiate,contrast,changes,analysis + +home.certSign.title=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE \u03BC\u03B5 \u03A0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03CC +home.certSign.desc=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE \u03B5\u03BD\u03CC\u03C2 PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03BC\u03B5 \u03AD\u03BD\u03B1 \u03A0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03CC/\u039A\u03BB\u03B5\u03B9\u03B4\u03AF (PEM/P12) +certSign.tags=authenticate,PEM,P12,official,encrypt + +home.pageLayout.title=\u0394\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03C0\u03BF\u03BB\u03BB\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD +home.pageLayout.desc=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 \u03C0\u03BF\u03BB\u03BB\u03B1\u03C0\u03BB\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03B5\u03BD\u03CC\u03C2 \u03B5\u03B3\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5 PDF \u03C3\u03B5 \u03BC\u03AF\u03B1 \u03BC\u03CC\u03BD\u03BF \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 +pageLayout.tags=merge,composite,single-view,organize + +home.scalePages.title=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C4\u03BF\u03C5 \u03BC\u03B5\u03B3\u03AD\u03B8\u03BF\u03C5\u03C2/\u03BA\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 +home.scalePages.desc=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03C4\u03BF\u03C5 \u03BC\u03B5\u03B3\u03AD\u03B8\u03BF\u03C5\u03C2/\u03BA\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1\u03C2 \u03BC\u03AF\u03B1\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03BA\u03B1\u03B9/\u03B7 \u03C4\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C4\u03B7\u03C2. +scalePages.tags=resize,modify,dimension,adapt + +home.pipeline.title=Pipeline (\u0393\u03B9\u03B1 \u03C0\u03C1\u03BF\u03C7\u03C9\u03C1\u03B7\u03BC\u03AD\u03BD\u03BF\u03C5\u03C2) +home.pipeline.desc=\u0395\u03BA\u03C4\u03AD\u03BB\u03B5\u03C3\u03B7 \u03C0\u03BF\u03BB\u03BB\u03B1\u03C0\u03BB\u03CE\u03BD \u03B5\u03BD\u03B5\u03C1\u03B3\u03B5\u03B9\u03CE\u03BD \u03C3\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 PDF \u03BF\u03C1\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03C2 pipeline scripts +pipeline.tags=automate,sequence,scripted,batch-process + +home.add-page-numbers.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CE\u03BD \u03C3\u03B5 \u03A3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 +home.add-page-numbers.desc=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03C3\u03B5 \u03AD\u03BD\u03B1 \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF \u03C3\u03B5 \u03BC\u03B9\u03B1 \u03BA\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B7 \u03B8\u03AD\u03C3\u03B7 +add-page-numbers.tags=paginate,label,organize,index + +home.auto-rename.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03BF\u03BD\u03BF\u03BC\u03B1\u03C3\u03AF\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 PDF +home.auto-rename.desc=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03BF\u03BD\u03BF\u03BC\u03B1\u03C3\u03AF\u03B1 \u03B5\u03BD\u03CC\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 PDF \u03BC\u03B5 \u03B2\u03AC\u03C3\u03B7 \u03C4\u03B7\u03BD \u03BA\u03B5\u03C6\u03B1\u03BB\u03AF\u03B4\u03B1 \u03C0\u03BF\u03C5 \u03AD\u03C7\u03B5\u03B9 \u03B5\u03BD\u03C4\u03BF\u03C0\u03B9\u03C3\u03C4\u03B5\u03AF +auto-rename.tags=auto-detect,header-based,organize,relabel + +home.adjust-contrast.title=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C7\u03C1\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD/\u0391\u03BD\u03C4\u03AF\u03B8\u03B5\u03C3\u03B7 +home.adjust-contrast.desc=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C4\u03B7\u03C2 \u03B1\u03BD\u03C4\u03AF\u03B8\u03B5\u03C3\u03B7\u03C2, \u03C4\u03BF\u03C5 \u03BA\u03BF\u03C1\u03B5\u03C3\u03BC\u03BF\u03CD \u03BA\u03B1\u03B9 \u03C4\u03B7\u03C2 \u03C6\u03C9\u03C4\u03B5\u03B9\u03BD\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 \u03B5\u03BD\u03CC\u03C2 PDF +adjust-contrast.tags=color-correction,tune,modify,enhance + +home.crop.title=\u03A0\u03B5\u03C1\u03B9\u03BA\u03BF\u03C0\u03AE PDF +home.crop.desc=\u03A0\u03B5\u03C1\u03B9\u03BA\u03BF\u03C0\u03AE \u03B5\u03BD\u03CC\u03C2 PDF \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BC\u03B5\u03B9\u03C9\u03B8\u03B5\u03AF \u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03CC\u03C2 \u03C4\u03BF\u03C5 (\u03B4\u03B9\u03B1\u03C4\u03B7\u03C1\u03B5\u03AF \u03C4\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF!) +crop.tags=trim,shrink,edit,shape + +home.autoSplitPDF.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD +home.autoSplitPDF.desc=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03C3\u03B1\u03C1\u03C9\u03BC\u03AD\u03BD\u03BF\u03C5 PDF \u03BC\u03B5 \u03C6\u03C5\u03C3\u03B9\u03BA\u03CC \u03C3\u03B1\u03C1\u03C9\u03BC\u03AD\u03BD\u03BF \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03C4\u03AE \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD QR Code +autoSplitPDF.tags=QR-based,separate,scan-segment,organize + +home.sanitizePdf.title=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 +home.sanitizePdf.desc=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C3\u03B5\u03BD\u03B1\u03C1\u03AF\u03C9\u03BD \u03BA\u03B1\u03B9 \u03AC\u03BB\u03BB\u03C9\u03BD \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD \u03B1\u03C0\u03CC \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 PDF +sanitizePdf.tags=clean,secure,safe,remove-threats + +home.URLToPDF.title=URL/\u0399\u03C3\u03C4\u03CC\u03C4\u03BF\u03C0\u03BF\u03C2 \u03C3\u03B5 PDF +home.URLToPDF.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03BF\u03C0\u03BF\u03B9\u03B1\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7\u03C2 URL http(s) \u03C3\u03B5 PDF +URLToPDF.tags=web-capture,save-page,web-to-doc,archive + +home.HTMLToPDF.title=HTML \u03C3\u03B5 PDF +home.HTMLToPDF.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03BF\u03C0\u03BF\u03B9\u03BF\u03C5\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 HTML \u03AE zip \u03C3\u03B5 PDF +HTMLToPDF.tags=markup,web-content,transformation,convert + + +home.MarkdownToPDF.title=Markdown \u03C3\u03B5 PDF +home.MarkdownToPDF.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03BF\u03C0\u03BF\u03B9\u03BF\u03C5\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 Markdown \u03C3\u03B5 PDF +MarkdownToPDF.tags=markup,web-content,transformation,convert + + +home.getPdfInfo.title=\u039B\u03AE\u03C8\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD \u03B1\u03C0\u03CC \u03C4\u03BF PDF +home.getPdfInfo.desc=\u039B\u03AE\u03C8\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03C0\u03B9\u03B8\u03B1\u03BD\u03CE\u03BD \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD \u03B1\u03C0\u03CC \u03C4\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 PDF +getPdfInfo.tags=infomation,data,stats,statistics + + +home.extractPage.title=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD +home.extractPage.desc=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03C4\u03C9\u03BD \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03C9\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03B1\u03C0\u03CC \u03AD\u03BD\u03B1 PDF +extractPage.tags=extract + + +home.PdfToSinglePage.title=PDF \u03C3\u03B5 \u03BC\u03AF\u03B1 \u03BC\u03B5\u03B3\u03AC\u03BB\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 +home.PdfToSinglePage.desc=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD PDF \u03C3\u03B5 \u03BC\u03B9\u03B1 \u03BC\u03B5\u03B3\u03AC\u03BB\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 +PdfToSinglePage.tags=single page + + +home.showJS.title=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 Javascript +home.showJS.desc=\u0391\u03BD\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03BA\u03B1\u03B9 \u03B5\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03BA\u03CE\u03B4\u03B9\u03BA\u03B1 Javascript \u03C0\u03BF\u03C5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B5\u03BD\u03C3\u03C9\u03BC\u03B1\u03C4\u03C9\u03BC\u03AD\u03BD\u03BF \u03BC\u03AD\u03C3\u03B1 \u03C3\u03B5 \u03AD\u03BD\u03B1 PDF +showJS.tags=Redact,Hide,black out,black,marker,hidden + +home.autoRedact.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF \u039C\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1 \u039A\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 +home.autoRedact.desc=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 (\u039C\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1) \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF\u03C5 \u03C3\u03B5 PDF \u03BC\u03B5 \u03B2\u03AC\u03C3\u03B7 \u03C4\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B5\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 +showJS.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 +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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + +########################### +# # +# WEB PAGES # +# # +########################### +#login +login.title=\u0395\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2 +login.signin=\u0395\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2 +login.rememberme=\u039D\u03B1 \u039C\u03B5 \u0398\u03C5\u03BC\u03AC\u03C3\u03B1\u03B9 +login.invalid=\u039B\u03AC\u03B8\u03BF\u03C2 \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03AE \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2. +login.locked=\u039F \u03BB\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03CC\u03C2 \u03C3\u03B1\u03C2 \u03AD\u03C7\u03B5\u03B9 \u03BA\u03BB\u03B5\u03B9\u03B4\u03C9\u03B8\u03B5\u03AF. +login.signinTitle=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE, \u03C3\u03C5\u03BD\u03B4\u03B5\u03B8\u03B5\u03AF\u03C4\u03B5 + + +#auto-redact +autoRedact.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF \u039C\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1 \u039A\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 +autoRedact.header=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF \u039C\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1 \u039A\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 +autoRedact.colorLabel=\u03A7\u03C1\u03CE\u03BC\u03B1 +autoRedact.textsToRedactLabel=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B3\u03B9\u03B1 \u03BC\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1 (\u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF \u03C3\u03B5 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AD\u03C2) +autoRedact.textsToRedactPlaceholder=\u03C0.\u03C7. \n\u0395\u03BC\u03C0\u03B9\u03C3\u03C4\u03B5\u03C5\u03C4\u03B9\u03BA\u03CC \n\u0391\u03BA\u03C1\u03CE\u03C2 \u03B1\u03C0\u03CC\u03C1\u03C1\u03B7\u03C4\u03BF +autoRedact.useRegexLabel=\u03A7\u03C1\u03AE\u03C3\u03B7 Regex +autoRedact.wholeWordSearchLabel=\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03BF\u03BB\u03CC\u03BA\u03BB\u03B7\u03C1\u03B7\u03C2 \u03C4\u03B7\u03C2 \u03BB\u03AD\u03BE\u03B7\u03C2 +autoRedact.customPaddingLabel=Custom Extra Padding +autoRedact.convertPDFToImageLabel=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE PDF \u03C3\u03B5 PDF-\u0395\u03B9\u03BA\u03CC\u03BD\u03B1 (\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03B1\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03AF\u03C3\u03C9 \u03B1\u03C0\u03CC \u03C4\u03BF \u03C0\u03BB\u03B1\u03AF\u03C3\u03B9\u03BF) +autoRedact.submitButton=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE + + +#showJS +showJS.title=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 Javascript +showJS.header=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 Javascript +showJS.downloadJS=\u039B\u03AE\u03C8\u03B7 Javascript +showJS.submit=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 + + +#pdfToSinglePage +pdfToSinglePage.title=PDF \u03C3\u03B5 \u039C\u03BF\u03BD\u03AE \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 +pdfToSinglePage.header=PDF \u03C3\u03B5 \u039C\u03BF\u03BD\u03AE \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 +pdfToSinglePage.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03B5 \u039C\u03BF\u03BD\u03AE \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 + + +#pageExtracter +pageExtracter.title=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD +pageExtracter.header=E\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD +pageExtracter.submit=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE + + +#getPdfInfo +getPdfInfo.title=\u0391\u03BD\u03AC\u03BA\u03C4\u03B7\u03C3\u03B7 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD \u03B1\u03C0\u03CC \u03C4\u03BF PDF +getPdfInfo.header=\u0391\u03BD\u03AC\u03BA\u03C4\u03B7\u03C3\u03B7 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD \u03B1\u03C0\u03CC \u03C4\u03BF PDF +getPdfInfo.submit=\u0391\u03BD\u03AC\u03BA\u03C4\u03B7\u03C3\u03B7 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD +getPdfInfo.downloadJson=\u039B\u03AE\u03C8\u03B7 JSON + + +#markdown-to-pdf +MarkdownToPDF.title=Markdown \u03C3\u03B5 PDF +MarkdownToPDF.header=Markdown \u03C3\u03B5 PDF +MarkdownToPDF.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE +MarkdownToPDF.help=\u0395\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C3\u03B5 \u03B5\u03BE\u03AD\u03BB\u03B9\u03BE\u03B7 +MarkdownToPDF.credit=\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF WeasyPrint + + + +#url-to-pdf +URLToPDF.title=URL \u03C3\u03B5 PDF +URLToPDF.header=URL \u03C3\u03B5 PDF +URLToPDF.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE +URLToPDF.credit=\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF WeasyPrint + + +#html-to-pdf +HTMLToPDF.title=HTML \u03C3\u03B5 PDF +HTMLToPDF.header=HTML \u03C3\u03B5 PDF +HTMLToPDF.help=\u0394\u03AD\u03C7\u03B5\u03C4\u03B1\u03B9 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03C4\u03CD\u03C0\u03BF\u03C5 HTML \u03BA\u03B1\u03B9 \u03C4\u03CD\u03C0\u03BF\u03C5 ZIP \u03C0\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03BF\u03C5\u03BD html/css/\u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 \u03BA.\u03BB\u03C0. \u03C0\u03BF\u03C5 \u03B1\u03C0\u03B1\u03B9\u03C4\u03BF\u03CD\u03BD\u03C4\u03B1\u03B9 +HTMLToPDF.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE +HTMLToPDF.credit=\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF WeasyPrint + + +#sanitizePDF +sanitizePDF.title=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 PDF +sanitizePDF.header=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 \u03B5\u03BD\u03CC\u03C2 PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 +sanitizePDF.selectText.1=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 JavaScript +sanitizePDF.selectText.2=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03B5\u03BC\u03C3\u03C9\u03BC\u03B1\u03C4\u03C9\u03BC\u03AD\u03BD\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD +sanitizePDF.selectText.3=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD +sanitizePDF.selectText.4=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C3\u03C5\u03BD\u03B4\u03AD\u03C3\u03BC\u03C9\u03BD (links) +sanitizePDF.selectText.5=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03CE\u03BD +sanitizePDF.submit=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 PDF + + +#addPageNumbers +addPageNumbers.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CE\u03BD \u03C3\u03B5 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 +addPageNumbers.header=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CE\u03BD \u03C3\u03B5 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 +addPageNumbers.selectText.1=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5: +addPageNumbers.selectText.2=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B8\u03C9\u03C1\u03AF\u03BF\u03C5 +addPageNumbers.selectText.3=\u0398\u03AD\u03C3\u03B7 +addPageNumbers.selectText.4=\u0391\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03C0\u03BF\u03C5 \u03BE\u03B5\u03BA\u03B9\u03BD\u03AC \u03B7 \u03B1\u03C1\u03AF\u03B8\u03BC\u03B7\u03C3\u03B7 +addPageNumbers.selectText.5=\u03A3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03C3\u03B5 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC +addPageNumbers.selectText.6=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03BF \u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF +addPageNumbers.customTextDesc=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03BF \u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF +addPageNumbers.numberPagesDesc=\u03A0\u03BF\u03B9\u03AD\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03BD\u03B1 \u03B1\u03C1\u03B9\u03B8\u03BC\u03B7\u03B8\u03BF\u03CD\u03BD, \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE 'all' (\u03CC\u03BB\u03B5\u03C2), \u03B5\u03C0\u03AF\u03C3\u03B7\u03C2 \u03B4\u03AD\u03C7\u03B5\u03C4\u03B1\u03B9 1-5 \u03AE 2,5,9 \u03BA.\u03BB.\u03C0 +addPageNumbers.customNumberDesc=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03C3\u03B5 {n}, \u03B4\u03AD\u03C7\u03B5\u03C4\u03B1\u03B9 \u03B5\u03C0\u03AF\u03C3\u03B7\u03C2 "\u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 {n} \u03B1\u03C0\u03CC {total}", "Text-{n}", "{filename}-{n} +addPageNumbers.submit=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CE\u03BD \u03C3\u03B5 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 + + +#auto-rename +auto-rename.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03BF\u03BD\u03BF\u03BC\u03B1\u03C3\u03AF\u03B1 +auto-rename.header=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03BF\u03BD\u03BF\u03BC\u03B1\u03C3\u03AF\u03B1 PDF +auto-rename.submit=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03BF\u03BD\u03BF\u03BC\u03B1\u03C3\u03AF\u03B1 + + +#adjustContrast +adjustContrast.title=\u03A0\u03C1\u03BF\u03C3\u03C0\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C4\u03B7\u03C2 \u0391\u03BD\u03C4\u03AF\u03B8\u03B5\u03C3\u03B7\u03C2 +adjustContrast.header=\u03A0\u03C1\u03BF\u03C3\u03C0\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C4\u03B7\u03C2 \u0391\u03BD\u03C4\u03AF\u03B8\u03B5\u03C3\u03B7\u03C2 +adjustContrast.contrast=\u0391\u03BD\u03C4\u03AF\u03B8\u03B5\u03C3\u03B7: +adjustContrast.brightness=\u03A6\u03C9\u03C4\u03B5\u03B9\u03BD\u03CC\u03C4\u03B7\u03C4\u03B1: +adjustContrast.saturation=\u039A\u03BF\u03C1\u03B5\u03C3\u03BC\u03CC\u03C2: +adjustContrast.download=\u039B\u03AE\u03C8\u03B7 + + +#crop +crop.title=\u039A\u03BF\u03C0\u03AE +crop.header=\u039A\u03BF\u03C0\u03AE \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 +crop.submit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE + + +#autoSplitPDF +autoSplitPDF.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B4\u03B9\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 PDF +autoSplitPDF.header=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B4\u03B9\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 PDF +autoSplitPDF.description=\u0395\u03BA\u03C4\u03C5\u03C0\u03CE\u03C3\u03C4\u03B5, \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03C4\u03B5, \u03C3\u03B1\u03C1\u03CE\u03C3\u03C4\u03B5, \u03B1\u03BD\u03B5\u03B2\u03AC\u03C3\u03C4\u03B5 \u03BA\u03B1\u03B9 \u03B1\u03C6\u03AE\u03C3\u03C4\u03B5 \u03BC\u03B1\u03C2 \u03BD\u03B1 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03AF\u03C3\u03BF\u03C5\u03BC\u03B5 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1 \u03C4\u03B1 \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03AC \u03C3\u03B1\u03C2. \u0394\u03B5\u03BD \u03B1\u03C0\u03B1\u03B9\u03C4\u03B5\u03AF\u03C4\u03B1\u03B9 \u03C7\u03B5\u03B9\u03C1\u03BF\u03BA\u03AF\u03BD\u03B7\u03C4\u03B7 \u03C4\u03B1\u03BE\u03B9\u03BD\u03CC\u03BC\u03B7\u03C3\u03B7. +autoSplitPDF.selectText.1=\u0395\u03BA\u03C4\u03C5\u03C0\u03CE\u03C3\u03C4\u03B5 \u03BC\u03B5\u03C1\u03B9\u03BA\u03AC \u03C6\u03CD\u03BB\u03BB\u03B1 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03BF\u03CD \u03B1\u03C0\u03CC \u03BA\u03AC\u03C4\u03C9 (\u03C4\u03BF \u03B1\u03C3\u03C0\u03C1\u03CC\u03BC\u03B1\u03C5\u03C1\u03BF \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BC\u03B9\u03B1 \u03C7\u03B1\u03C1\u03AC). +autoSplitPDF.selectText.2=\u03A3\u03B1\u03C1\u03CE\u03C3\u03C4\u03B5 \u03CC\u03BB\u03B1 \u03C4\u03B1 \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03AC \u03C3\u03B1\u03C2 \u03C4\u03B1\u03C5\u03C4\u03CC\u03C7\u03C1\u03BF\u03BD\u03B1, \u03BC\u03B5 \u03C4\u03BF \u03BD\u03B1 \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03C4\u03BF \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC \u03C6\u03CD\u03BB\u03BB\u03BF \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03C4\u03BF\u03C5\u03C2. +autoSplitPDF.selectText.3=\u0391\u03BD\u03B5\u03B2\u03AC\u03C3\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03BC\u03B5\u03B3\u03AC\u03BB\u03BF \u03C3\u03B1\u03C1\u03C9\u03BC\u03AD\u03BD\u03BF PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03BA\u03B1\u03B9 \u03B1\u03C6\u03AE\u03C3\u03C4\u03B5 \u03C4\u03BF Stirling PDF \u03BD\u03B1 \u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03B5\u03AF \u03C4\u03B1 \u03C5\u03C0\u03CC\u03BB\u03BF\u03B9\u03C0\u03B1 +autoSplitPDF.selectText.4=\u039F\u03B9 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03BF\u03CD \u03B5\u03BD\u03C4\u03BF\u03C0\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03BA\u03B1\u03B9 \u03B1\u03C6\u03B1\u03B9\u03C1\u03BF\u03CD\u03BD\u03C4\u03B1\u03B9 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1, \u03B4\u03B9\u03B1\u03C3\u03C6\u03B1\u03BB\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03C2 \u03AD\u03BD\u03B1 \u03C0\u03C1\u03BF\u03C3\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF \u03C4\u03B5\u03BB\u03B9\u03BA\u03CC \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF. +autoSplitPDF.formPrompt=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE PDF \u03C0\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03B4\u03B9\u03B1\u03B9\u03C1\u03AD\u03C4\u03B5\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD Stirling-PDF: +autoSplitPDF.duplexMode=\u039B\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B4\u03B9\u03C0\u03BB\u03AE\u03C2 \u03CC\u03C8\u03B7\u03C2 (\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03BC\u03C0\u03C1\u03BF\u03C3\u03C4\u03AC \u03BA\u03B1\u03B9 \u03C0\u03AF\u03C3\u03C9) +autoSplitPDF.dividerDownload1=\u039B\u03AE\u03C8\u03B7 'Auto Splitter Divider (minimal).pdf' +autoSplitPDF.dividerDownload2=\u039B\u03AE\u03C8\u03B7 'Auto Splitter Divider (with instructions).pdf' +autoSplitPDF.submit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE + + +#pipeline +pipeline.title=Pipeline + + +#pageLayout +pageLayout.title=\u0394\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03C0\u03BF\u03BB\u03BB\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD +pageLayout.header=\u0394\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03C0\u03BF\u03BB\u03BB\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD +pageLayout.pagesPerSheet=\u03A3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03B1\u03BD\u03AC \u03C6\u03CD\u03BB\u03BB\u03BF: +pageLayout.addBorder=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03BC\u03BC\u03AC\u03C4\u03C9\u03BD +pageLayout.submit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE + + +#scalePages +scalePages.title=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03BA\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 +scalePages.header=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03BA\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 +scalePages.pageSize=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03BC\u03B9\u03B1\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03C4\u03BF\u03C5 \u03B5\u03B3\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5. +scalePages.scaleFactor=\u0395\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF \u03B6\u03BF\u03C5\u03BC (\u03C0\u03B5\u03C1\u03B9\u03BA\u03BF\u03C0\u03AE) \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2. +scalePages.submit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE + + +#certSign +certSign.title=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE \u03A0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03BF\u03CD +certSign.header=\u03A5\u03C0\u03BF\u03B3\u03C1\u03AC\u03C8\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF PDF \u03BC\u03B5 \u03C4\u03BF \u03C0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03CC \u03C3\u03B1\u03C2 (\u0395\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C3\u03B5 \u03B5\u03BE\u03AD\u03BB\u03B9\u03BE\u03B7) +certSign.selectPDF=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 PDF \u03B3\u03B9\u03B1 \u03C5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE: +certSign.selectKey=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03C4\u03BF\u03C5 \u03B9\u03B4\u03B9\u03C9\u03C4\u03B9\u03BA\u03BF\u03CD \u03BA\u03BB\u03B5\u03B9\u03B4\u03B9\u03BF\u03CD \u03C3\u03B1\u03C2 (\u03BC\u03BF\u03C1\u03C6\u03AE PKCS#8, \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 .pem \u03AE .der): +certSign.selectCert=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03C0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03BF\u03CD \u03C3\u03B1\u03C2 (\u03BC\u03BF\u03C1\u03C6\u03AE X.509, \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 .pem \u03AE .der): +certSign.selectP12=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF PKCS#12 Keystore (.p12 \u03AE .pfx) (\u03A0\u03C1\u03BF\u03B1\u03B9\u03C1\u03B5\u03C4\u03B9\u03BA\u03CC, \u03B5\u03AC\u03BD \u03C0\u03B1\u03C1\u03AD\u03C7\u03B5\u03C4\u03B1\u03B9, \u03B8\u03B1 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03C4\u03BF \u03B9\u03B4\u03B9\u03C9\u03C4\u03B9\u03BA\u03CC \u03BA\u03BB\u03B5\u03B9\u03B4\u03AF \u03BA\u03B1\u03B9 \u03C4\u03BF \u03C0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03CC \u03C3\u03B1\u03C2): +certSign.certType=\u03A4\u03CD\u03C0\u03BF\u03C2 \u03A0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03BF\u03CD +certSign.password=\u0395\u03B9\u03C3\u03B1\u03B3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03C4\u03BF\u03BD \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C4\u03BF\u03C5 Keystore \u03AE \u03C4\u03BF\u03C5 \u0399\u03B4\u03B9\u03C9\u03C4\u03B9\u03BA\u03BF\u03CD \u039A\u03BB\u03B5\u03B9\u03B4\u03B9\u03BF\u03CD (\u03B5\u03AC\u03BD \u03C5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9): +certSign.showSig=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 +certSign.reason=\u0391\u03B9\u03C4\u03AF\u03B1 +certSign.location=\u03A4\u03BF\u03C0\u03BF\u03B8\u03B5\u03C3\u03AF\u03B1 +certSign.name=\u038C\u03BD\u03BF\u03BC\u03B1 +certSign.submit=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE PDF + + +#removeBlanks +removeBlanks.title=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u039A\u03B5\u03BD\u03CE\u03BD +removeBlanks.header=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u039A\u03B5\u03BD\u03CE\u03BD \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD +removeBlanks.threshold=\u038C\u03C1\u03B9\u03BF \u03BB\u03B5\u03C5\u03BA\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 pixel: +removeBlanks.thresholdDesc=\u038C\u03C1\u03B9\u03BF \u03B3\u03B9\u03B1 \u03C4\u03BF\u03BD \u03C0\u03C1\u03BF\u03C3\u03B4\u03B9\u03BF\u03C1\u03B9\u03C3\u03BC\u03CC \u03C4\u03BF\u03C5 \u03C0\u03CC\u03C3\u03BF \u03BB\u03B5\u03C5\u03BA\u03CC \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03BB\u03B5\u03C5\u03BA\u03CC \u03B5\u03B9\u03BA\u03BF\u03BD\u03BF\u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF (pixel) \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03C4\u03B1\u03BE\u03B9\u03BD\u03BF\u03BC\u03B7\u03B8\u03B5\u03AF \u03C9\u03C2 "\u039B\u03B5\u03C5\u03BA\u03CC". 0 = \u039C\u03B1\u03CD\u03C1\u03BF, 255 \u03BA\u03B1\u03B8\u03B1\u03C1\u03CC \u03BB\u03B5\u03C5\u03BA\u03CC. +removeBlanks.whitePercent=\u03A0\u03BF\u03C3\u03BF\u03C3\u03C4\u03CC \u039B\u03B5\u03C5\u03BA\u03BF\u03CD (%): +removeBlanks.whitePercentDesc=\u03A4\u03BF \u03C0\u03BF\u03C3\u03BF\u03C3\u03C4\u03CC \u03C4\u03B7\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03C0\u03BF\u03C5 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 "\u03BB\u03B5\u03C5\u03BA\u03AC" pixel \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03C6\u03B1\u03B9\u03C1\u03B5\u03B8\u03B5\u03AF +removeBlanks.submit=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u039A\u03B5\u03BD\u03CE\u03BD + + +#compare +compare.title=\u03A3\u03CD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 +compare.header=\u03A3\u03CD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 PDFs +compare.document.1=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF 1 +compare.document.2=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF 2 +compare.submit=\u03A3\u03CD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 + + +#sign +sign.title=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE +sign.header=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE PDFs +sign.upload=\u0391\u03BD\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 +sign.draw=\u03A3\u03C7\u03B5\u03B4\u03AF\u03B1\u03C3\u03B7 \u03C5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 +sign.text=\u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 +sign.clear=\u039A\u03B1\u03B8\u03AC\u03C1\u03B9\u03C3\u03BC\u03B1 +sign.add=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 + + +#repair +repair.title=\u0395\u03C0\u03B9\u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7 +repair.header=\u0395\u03C0\u03B9\u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7 PDFs +repair.submit=\u0395\u03C0\u03B9\u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7 + + +#flatten +flatten.title=Flatten +flatten.header=Flatten PDFs +flatten.submit=Flatten + + +#ScannerImageSplit +ScannerImageSplit.selectText.1=\u038C\u03C1\u03B9\u03BF \u03B3\u03C9\u03BD\u03AF\u03B1\u03C2: +ScannerImageSplit.selectText.2=\u039F\u03C1\u03AF\u03B6\u03B5\u03B9 \u03C4\u03B7\u03BD \u03B5\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03B7 \u03B1\u03C0\u03CC\u03BB\u03C5\u03C4\u03B7 \u03B3\u03C9\u03BD\u03AF\u03B1 \u03C0\u03BF\u03C5 \u03B1\u03C0\u03B1\u03B9\u03C4\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03C0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE \u03C4\u03B7\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 (\u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE: 10). +ScannerImageSplit.selectText.3=\u0391\u03BD\u03B5\u03BA\u03C4\u03B9\u03BA\u03CC\u03C4\u03B7\u03C4\u03B1 (Tolerance): +ScannerImageSplit.selectText.4=\u039A\u03B1\u03B8\u03BF\u03C1\u03AF\u03B6\u03B5\u03B9 \u03C4\u03BF \u03B5\u03CD\u03C1\u03BF\u03C2 \u03C4\u03B7\u03C2 \u03C7\u03C1\u03C9\u03BC\u03B1\u03C4\u03B9\u03BA\u03AE\u03C2 \u03B4\u03B9\u03B1\u03BA\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7\u03C2 \u03B3\u03CD\u03C1\u03C9 \u03B1\u03C0\u03CC \u03C4\u03BF \u03B5\u03BA\u03C4\u03B9\u03BC\u03CE\u03BC\u03B5\u03BD\u03BF \u03C7\u03C1\u03CE\u03BC\u03B1 \u03C6\u03CC\u03BD\u03C4\u03BF\u03C5 (\u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE: 30). +ScannerImageSplit.selectText.5=\u0395\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03B7 \u03A0\u03B5\u03C1\u03B9\u03BF\u03C7\u03AE: +ScannerImageSplit.selectText.6=\u039F\u03C1\u03AF\u03B6\u03B5\u03B9 \u03C4\u03BF \u03B5\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03BF \u03CC\u03C1\u03B9\u03BF \u03B5\u03C0\u03B9\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1\u03C2 \u03B3\u03B9\u03B1 \u03BC\u03B9\u03B1 \u03C6\u03C9\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AF\u03B1 (\u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE: 10000). +ScannerImageSplit.selectText.7=\u0395\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03B7 \u03B5\u03C0\u03B9\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2: +ScannerImageSplit.selectText.8=\u03A1\u03C5\u03B8\u03BC\u03AF\u03B6\u03B5\u03B9 \u03C4\u03BF \u03B5\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03BF \u03CC\u03C1\u03B9\u03BF \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B3\u03B9\u03B1 \u03BC\u03B9\u03B1 \u03C6\u03C9\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AF\u03B1 +ScannerImageSplit.selectText.9=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2: +ScannerImageSplit.selectText.10=\u039F\u03C1\u03AF\u03B6\u03B5\u03B9 \u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C0\u03BF\u03C5 \u03C0\u03C1\u03BF\u03C3\u03C4\u03AF\u03B8\u03B5\u03C4\u03B1\u03B9 \u03BA\u03B1\u03B9 \u03B1\u03C6\u03B1\u03B9\u03C1\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03C4\u03C1\u03AD\u03C0\u03BF\u03BD\u03C4\u03B1\u03B9 \u03BB\u03B5\u03C5\u03BA\u03AC \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1 \u03C3\u03C4\u03B7\u03BD \u03AD\u03BE\u03BF\u03B4\u03BF (\u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE: 1). + + +#OCR +ocr.title=\u039F\u03C0\u03C4\u03B9\u03BA\u03AE \u03B1\u03BD\u03B1\u03B3\u03BD\u03CE\u03C1\u03B9\u03C3\u03B7 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03C9\u03BD (OCR) / \u03A3\u03B1\u03C1\u03CE\u03C3\u03B5\u03B9\u03C2 Cleanup +ocr.header=\u03A3\u03B1\u03C1\u03CE\u03C3\u03B5\u03B9\u03C2 Cleanup / OCR (Optical Character Recognition - \u039F\u03C0\u03C4\u03B9\u03BA\u03AE \u03B1\u03BD\u03B1\u03B3\u03BD\u03CE\u03C1\u03B9\u03C3\u03B7 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03C9\u03BD) +ocr.selectText.1=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B5\u03C2 \u03C0\u03BF\u03C5 \u03C0\u03C1\u03CC\u03BA\u03B5\u03B9\u03C4\u03B1\u03B9 \u03BD\u03B1 \u03B5\u03BD\u03C4\u03BF\u03C0\u03B9\u03C3\u03C4\u03BF\u03CD\u03BD \u03C3\u03C4\u03BF PDF (\u039F\u03B9 \u03C0\u03BF\u03C5 \u03B1\u03BD\u03B1\u03C6\u03AD\u03C1\u03BF\u03BD\u03C4\u03B1\u03B9 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B1\u03C5\u03C4\u03AD\u03C2 \u03C0\u03BF\u03C5 \u03B1\u03BD\u03B9\u03C7\u03BD\u03B5\u03CD\u03BF\u03BD\u03C4\u03B1\u03B9 \u03B1\u03C5\u03C4\u03AE\u03BD \u03C4\u03B7 \u03C3\u03C4\u03B9\u03B3\u03BC\u03AE): +ocr.selectText.2=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03C3\u03C4\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF OCR \u03BC\u03B1\u03B6\u03AF \u03BC\u03B5 \u03C4\u03BF PDF \u03C0\u03BF\u03C5 \u03AD\u03C7\u03B5\u03B9 \u03C5\u03C0\u03BF\u03B2\u03BB\u03B7\u03B8\u03B5\u03AF \u03C3\u03B5 OCR +ocr.selectText.3=\u039F\u03B9 \u03C3\u03C9\u03C3\u03C4\u03AD\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03C3\u03B1\u03C1\u03CE\u03B8\u03B7\u03BA\u03B1\u03BD \u03BC\u03B5 \u03BB\u03BF\u03BE\u03AE \u03B3\u03C9\u03BD\u03AF\u03B1 \u03C0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03AD\u03C6\u03BF\u03BD\u03C4\u03AC\u03C2 \u03C4\u03B5\u03C2 \u03C3\u03C4\u03B7 \u03B8\u03AD\u03C3\u03B7 \u03C4\u03BF\u03C5\u03C2 +ocr.selectText.4=C\u039A\u03B1\u03B8\u03B1\u03C1\u03AF\u03C3\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1, \u03CE\u03C3\u03C4\u03B5 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BB\u03B9\u03B3\u03CC\u03C4\u03B5\u03C1\u03BF \u03C0\u03B9\u03B8\u03B1\u03BD\u03CC \u03C4\u03BF OCR \u03BD\u03B1 \u03B2\u03C1\u03B5\u03B9 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03C3\u03C4\u03BF \u03B8\u03CC\u03C1\u03C5\u03B2\u03BF \u03C6\u03CC\u03BD\u03C4\u03BF\u03C5 (background noise). (\u039A\u03B1\u03BC\u03AF\u03B1 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03C3\u03C4\u03BF \u03B5\u03BE\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03BF) +ocr.selectText.5=\u039A\u03B1\u03B8\u03B1\u03C1\u03AF\u03C3\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1, \u03CE\u03C3\u03C4\u03B5 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BB\u03B9\u03B3\u03CC\u03C4\u03B5\u03C1\u03BF \u03C0\u03B9\u03B8\u03B1\u03BD\u03CC \u03C4\u03BF OCR \u03BD\u03B1 \u03B2\u03C1\u03B5\u03B9 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03C3\u03C4\u03BF \u03B8\u03CC\u03C1\u03C5\u03B2\u03BF \u03C6\u03CC\u03BD\u03C4\u03BF\u03C5, \u03B4\u03B9\u03B1\u03C4\u03B7\u03C1\u03B5\u03AF \u03C4\u03B7\u03BD \u03B5\u03BA\u03BA\u03B1\u03B8\u03AC\u03C1\u03B9\u03C3\u03B7 \u03C3\u03C4\u03BF \u03C0\u03B1\u03C1\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03BF. +ocr.selectText.6=\u0391\u03B3\u03BD\u03BF\u03B5\u03AF \u03C4\u03B9\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03C0\u03BF\u03C5 \u03AD\u03C7\u03BF\u03C5\u03BD \u03B4\u03B9\u03B1\u03B4\u03C1\u03B1\u03C3\u03C4\u03B9\u03BA\u03CC \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF, \u03BC\u03CC\u03BD\u03BF \u03C4\u03B9\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 OCR \u03C0\u03BF\u03C5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 +ocr.selectText.7=\u0395\u03C0\u03B9\u03B2\u03BF\u03BB\u03AE OCR, \u03B8\u03B1 \u03C0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03B5\u03B9 \u039F\u03C0\u03C4\u03B9\u03BA\u03AE \u03B1\u03BD\u03B1\u03B3\u03BD\u03CE\u03C1\u03B9\u03C3\u03B7 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03C9\u03BD \u03C3\u03B5 \u03BA\u03AC\u03B8\u03B5 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 \u03B1\u03C6\u03B1\u03B9\u03C1\u03CE\u03BD\u03C4\u03B1\u03C2 \u03CC\u03BB\u03BF \u03C4\u03B1 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 \u03C4\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B9\u03BA\u03BF\u03CD \u03BA\u03B5\u03AF\u03BC\u03AD\u03BD\u03BF\u03C5 +ocr.selectText.8=\u039A\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03CC (\u0398\u03B1 \u03C0\u03B1\u03C1\u03AC\u03BE\u03B5\u03B9 \u03C3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03B1\u03BD \u03C4\u03BF PDF \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF) +ocr.selectText.9=\u0395\u03C0\u03B9\u03C0\u03C1\u03CC\u03C3\u03B8\u03B5\u03C4\u03B5\u03C2 \u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 +ocr.selectText.10=\u039B\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 OCR +ocr.selectText.11=\u039A\u03B1\u03C4\u03AC\u03C1\u03B3\u03B7\u03C3\u03B7 \u03B5\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD \u03BC\u03B5\u03C4\u03AC \u03C4\u03BF OCR (\u039A\u03B1\u03C4\u03B1\u03C1\u03B3\u03B5\u03AF \u039F\u039B\u0395\u03A3 \u03C4\u03B9\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2, \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C7\u03C1\u03AE\u03C3\u03B9\u03BC\u03BF \u03BC\u03CC\u03BD\u03BF \u03B1\u03BD \u03B1\u03C0\u03BF\u03C4\u03B5\u03BB\u03B5\u03AF \u03BC\u03AD\u03C1\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03B2\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE\u03C2) +ocr.selectText.12=\u03A4\u03CD\u03C0\u03BF\u03C2 \u03B1\u03C0\u03CC\u03B4\u03BF\u03C3\u03B7\u03C2 (\u0393\u03B9\u03B1 \u03C0\u03C1\u03BF\u03C7\u03C9\u03C1\u03B7\u03BC\u03AD\u03BD\u03BF\u03C5\u03C2) +ocr.help=\u0394\u03B9\u03B1\u03B2\u03AC\u03C3\u03C4\u03B5 \u03B1\u03C5\u03C4\u03AE\u03BD \u03C4\u03B7\u03BD \u03C4\u03B5\u03BA\u03BC\u03B7\u03C1\u03AF\u03C9\u03C3\u03B7 \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC \u03BC\u03B5 \u03C4\u03BF\u03BD \u03C4\u03C1\u03CC\u03C0\u03BF \u03C7\u03C1\u03AE\u03C3\u03B7\u03C2 \u03B1\u03C5\u03C4\u03AE\u03C2 \u03B3\u03B9\u03B1 \u03AC\u03BB\u03BB\u03B5\u03C2 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B5\u03C2 \u03AE/\u03BA\u03B1\u03B9 \u03BC\u03B7 \u03C7\u03C1\u03AE\u03C3\u03B7\u03C2 \u03C3\u03B5 docker +ocr.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF OCRmyPDF \u03BA\u03B1\u03B9 Tesseract \u03B3\u03B9\u03B1 OCR. +ocr.submit=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 PDF \u03BC\u03B5 OCR + + +#extractImages +extractImages.title=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u0395\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD +extractImages.header=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u0395\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD +extractImages.selectText=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03AD\u03C8\u03B5\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03B5\u03BE\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03B5\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 +extractImages.submit=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE + + +#File to PDF +fileToPDF.title=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF \u03C3\u03B5 PDF +fileToPDF.header=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03BF\u03C0\u03BF\u03B9\u03BF\u03C5\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C3\u03B5 PDF +fileToPDF.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF LibreOffice \u03BA\u03B1\u03B9 Unoconv \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD. +fileToPDF.supportedFileTypes=\u039F\u03B9 \u03C5\u03C0\u03BF\u03C3\u03C4\u03B7\u03C1\u03B9\u03B6\u03CC\u03BC\u03B5\u03BD\u03BF\u03B9 \u03C4\u03CD\u03C0\u03BF\u03B9 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03B8\u03B1 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03BB\u03B1\u03BC\u03B2\u03AC\u03BD\u03BF\u03C5\u03BD \u03C4\u03B1 \u03C0\u03B1\u03C1\u03B1\u03BA\u03AC\u03C4\u03C9, \u03C9\u03C3\u03C4\u03CC\u03C3\u03BF, \u03B3\u03B9\u03B1 \u03BC\u03B9\u03B1 \u03C0\u03BB\u03AE\u03C1\u03B7 \u03B5\u03BD\u03B7\u03BC\u03B5\u03C1\u03C9\u03BC\u03AD\u03BD\u03B7 \u03BB\u03AF\u03C3\u03C4\u03B1 \u03BC\u03B5 \u03C4\u03B9\u03C2 \u03C5\u03C0\u03BF\u03C3\u03C4\u03B7\u03C1\u03B9\u03B6\u03CC\u03BC\u03B5\u03BD\u03B5\u03C2 \u03BC\u03BF\u03C1\u03C6\u03AD\u03C2, \u03B1\u03BD\u03B1\u03C4\u03C1\u03AD\u03BE\u03C4\u03B5 \u03C3\u03C4\u03B7\u03BD \u03C4\u03B5\u03BA\u03BC\u03B7\u03C1\u03AF\u03C9\u03C3\u03B7 \u03C4\u03BF\u03C5 LibreOffice +fileToPDF.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03B5 PDF + + +#compress +compress.title=\u03A3\u03C5\u03BC\u03C0\u03AF\u03B5\u03C3\u03B7 +compress.header=\u03A3\u03C5\u03BC\u03C0\u03AF\u03B5\u03C3\u03B7 PDF +compress.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF Ghostscript \u03B3\u03B9\u03B1 PDF \u03A3\u03C5\u03BC\u03C0\u03AF\u03B5\u03C3\u03B7/\u0392\u03B5\u03BB\u03C4\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7. +compress.selectText.1=\u03A7\u03B5\u03B9\u03C1\u03BF\u03BA\u03AF\u03BD\u03B7\u03C4\u03B7 \u039B\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 - \u0391\u03C0\u03CC 1 \u03AD\u03C9\u03C2 4 +compress.selectText.2=\u0395\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF \u0392\u03B5\u03BB\u03C4\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2: +compress.selectText.3=4 (\u03A0\u03BF\u03BB\u03CD \u03BA\u03B1\u03BA\u03CC \u03B3\u03B9\u03B1 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5) +compress.selectText.4=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u039B\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 - Auto mode - \u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03CC\u03B6\u03B5\u03B9 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1 \u03C4\u03B7\u03BD \u03C0\u03BF\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03B3\u03B9\u03B1 \u03BB\u03AE\u03C8\u03B7 PDF \u03C3\u03C4\u03BF \u03B1\u03BA\u03C1\u03B9\u03B2\u03AD\u03C2 \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 +compress.selectText.5=\u0391\u03BD\u03B1\u03BC\u03B5\u03BD\u03CC\u03BC\u03B5\u03BD\u03BF \u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 PDF (\u03C0.\u03C7 25MB, 10.8MB, 25KB) +compress.submit=\u03A3\u03C5\u03BC\u03C0\u03AF\u03B5\u03C3\u03B7 + + +#Add image +addImage.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 +addImage.header=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03C3\u03B5 PDF +addImage.everyPage=\u039A\u03AC\u03B8\u03B5 \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1? +addImage.upload=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 +addImage.submit=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 + + +#merge +merge.title=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 +merge.header=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 \u03C0\u03BF\u03BB\u03BB\u03B1\u03C0\u03BB\u03CE\u03BD PDFs (2+) +merge.sortByName=\u03A4\u03B1\u03BE\u03B9\u03BD\u03CC\u03BC\u03B7\u03C3\u03B7 \u03BC\u03B5 \u03B2\u03AC\u03C3\u03B7 \u03C4\u03BF \u038C\u03BD\u03BF\u03BC\u03B1 +merge.sortByDate=\u03A4\u03B1\u03BE\u03B9\u03BD\u03CC\u03BC\u03B7\u03C3\u03B7 \u03BC\u03B5 \u03B2\u03AC\u03C3\u03B7 \u03C4\u03B7\u03BD \u0397\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 +merge.submit=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 + + +#pdfOrganiser +pdfOrganiser.title=\u0394\u03B9\u03BF\u03C1\u03B3\u03B1\u03BD\u03C9\u03C4\u03AE\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 +pdfOrganiser.header=\u0394\u03B9\u03BF\u03C1\u03B3\u03B1\u03BD\u03C9\u03C4\u03AE\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 PDF +pdfOrganiser.submit=\u0391\u03BD\u03B1\u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD + + +#multiTool +multiTool.title=PDF \u03A0\u03BF\u03BB\u03C5\u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03BF +multiTool.header=PDF \u03A0\u03BF\u03BB\u03C5\u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03BF + +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF + +#pageRemover +pageRemover.title=\u0391\u03C6\u03B1\u03B9\u03C1\u03B5\u03C4\u03AE\u03C2 \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD +pageRemover.header=\u0391\u03C6\u03B1\u03B9\u03C1\u03B5\u03C4\u03AE\u03C2 \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD PDF +pageRemover.pagesToDelete=\u03A3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03C0\u03C1\u03BF\u03C2 \u03B4\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE (\u0395\u03B9\u03C3\u03B1\u03B3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03BC\u03B9\u03B1 \u03BB\u03AF\u03C3\u03C4\u03B1 \u03BC\u03B5 \u03B1\u03C1\u03B9\u03B8\u03BC\u03BF\u03CD\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03C9\u03BD \u03BC\u03B5 \u03BA\u03CC\u03BC\u03BC\u03B1\u03C4\u03B1): +pageRemover.submit=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD + + +#rotate +rotate.title=\u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE PDF +rotate.header=\u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE PDF +rotate.selectAngle=Select rotation angle (in multiples of 90 degrees): +rotate.submit=Rotate + + +#merge +split.title=\u0394\u03B9\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 PDF +split.header=\u0394\u03B9\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 PDF +split.desc.1=\u039F\u03B9 \u03B1\u03C1\u03B9\u03B8\u03BC\u03BF\u03AF \u03C0\u03BF\u03C5 \u03B5\u03C0\u03B9\u03BB\u03AD\u03B3\u03B5\u03C4\u03B5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BF \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03C3\u03C4\u03BF\u03BD \u03BF\u03C0\u03BF\u03AF\u03BF \u03B8\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03BA\u03AC\u03BD\u03B5\u03C4\u03B5 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC +split.desc.2=\u03A9\u03C2 \u03B5\u03BA \u03C4\u03BF\u03CD\u03C4\u03BF\u03C5, \u03B7 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE 1,3,7-8 \u03B8\u03B1 \u03C7\u03C9\u03C1\u03AF\u03C3\u03B5\u03B9 \u03AD\u03BD\u03B1 \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF 10 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03C3\u03B5 6 \u03BE\u03B5\u03C7\u03C9\u03C1\u03B9\u03C3\u03C4\u03AC \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 PDF \u03BC\u03B5: +split.desc.3=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF #1: \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 1 +split.desc.4=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF #2: \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 2 \u03BA\u03B1\u03B9 3 +split.desc.5=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF #3: \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 4, 5 \u03BA\u03C3\u03B9 6 +split.desc.6=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF #4: \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 7 +split.desc.7=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF #5: \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 8 +split.desc.8=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF #6: \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 9 \u03BA\u03B1\u03B9 10 +split.splitPages=\u0395\u03B9\u03C3\u03B1\u03B3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03B3\u03B9\u03B1 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC: +split.submit=\u0394\u03B9\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 + + +#merge +imageToPDF.title=\u0395\u03B9\u03BA\u03CC\u03BD\u03B1 \u03C3\u03B5 PDF +imageToPDF.header=\u0395\u03B9\u03BA\u03CC\u03BD\u03B1 \u03C3\u03B5 PDF +imageToPDF.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE +imageToPDF.selectLabel=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AD\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 +imageToPDF.fillPage=\u0393\u03AD\u03BC\u03B9\u03C3\u03BC\u03B1 \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 +imageToPDF.fitDocumentToImage=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03C3\u03B5 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 +imageToPDF.maintainAspectRatio=\u0394\u03B9\u03B1\u03C4\u03AE\u03C1\u03B7\u03C3\u03B7 \u03B1\u03BD\u03B1\u03BB\u03BF\u03B3\u03B9\u03CE\u03BD \u03B4\u03B9\u03B1\u03C3\u03C4\u03AC\u03C3\u03B5\u03C9\u03BD +imageToPDF.selectText.2=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03C0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE PDF +imageToPDF.selectText.3=\u039B\u03BF\u03B3\u03B9\u03BA\u03AE \u03C0\u03BF\u03BB\u03BB\u03CE\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD (\u0395\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03BC\u03CC\u03BD\u03BF \u03B5\u03AC\u03BD \u03B5\u03C1\u03B3\u03AC\u03B6\u03B5\u03C3\u03C4\u03B5 \u03BC\u03B5 \u03C0\u03BF\u03BB\u03BB\u03AD\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2) +imageToPDF.selectText.4=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 \u03C3\u03B5 \u03AD\u03BD\u03B1 PDF +imageToPDF.selectText.5=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03B5 \u03BE\u03B5\u03C7\u03C9\u03C1\u03B9\u03C3\u03C4\u03AC \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 PDF + + +#pdfToImage +pdfToImage.title=PDF \u03C3\u03B5 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1 +pdfToImage.header=PDF \u03C3\u03B5 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1 +pdfToImage.selectText=\u039C\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 +pdfToImage.singleOrMultiple=\u03A4\u03CD\u03C0\u03BF\u03C2 \u03B1\u03C0\u03BF\u03C4\u03B5\u03BB\u03AD\u03C3\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B1\u03C0\u03CC \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 \u03C3\u03B5 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 +pdfToImage.single=\u0395\u03BD\u03B9\u03B1\u03AF\u03B1 \u03BC\u03B5\u03B3\u03AC\u03BB\u03B7 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 \u03C0\u03BF\u03C5 \u03C3\u03C5\u03BD\u03B4\u03C5\u03AC\u03B6\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 +pdfToImage.multi=\u03A0\u03BF\u03BB\u03BB\u03B1\u03C0\u03BB\u03AD\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2, \u03BC\u03AF\u03B1 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 \u03B1\u03BD\u03AC \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 +pdfToImage.colorType=\u03A4\u03CD\u03C0\u03BF\u03C2 \u03A7\u03C1\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 +pdfToImage.color=\u03A7\u03C1\u03CE\u03BC\u03B1 +pdfToImage.grey=\u039A\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1 \u03C4\u03BF\u03C5 \u03B3\u03BA\u03C1\u03B9 +pdfToImage.blackwhite=\u0391\u03C3\u03C0\u03C1\u03CC\u03BC\u03B1\u03C5\u03C1\u03BF (\u039C\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03C7\u03B1\u03B8\u03BF\u03CD\u03BD \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1!) +pdfToImage.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE + + +#addPassword +addPassword.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD +addPassword.header=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD (\u039A\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7) +addPassword.selectText.1=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 PDF \u03B3\u03B9\u03B1 \u03BA\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7 +addPassword.selectText.2=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 +addPassword.selectText.3=\u039C\u03AE\u03BA\u03BF\u03C2 \u039A\u03BB\u03B5\u03B9\u03B4\u03B9\u03BF\u03CD \u039A\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7\u03C2 +addPassword.selectText.4=\u039F\u03B9 \u03C5\u03C8\u03B7\u03BB\u03CC\u03C4\u03B5\u03C1\u03B5\u03C2 \u03C4\u03B9\u03BC\u03AD\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B9\u03C3\u03C7\u03C5\u03C1\u03CC\u03C4\u03B5\u03C1\u03B5\u03C2, \u03B1\u03BB\u03BB\u03AC \u03BF\u03B9 \u03C7\u03B1\u03BC\u03B7\u03BB\u03CC\u03C4\u03B5\u03C1\u03B5\u03C2 \u03C4\u03B9\u03BC\u03AD\u03C2 \u03AD\u03C7\u03BF\u03C5\u03BD \u03BA\u03B1\u03BB\u03CD\u03C4\u03B5\u03C1\u03B7 \u03C3\u03C5\u03BC\u03B2\u03B1\u03C4\u03CC\u03C4\u03B7\u03C4\u03B1. +addPassword.selectText.5=\u0394\u03B9\u03BA\u03B1\u03B9\u03CE\u03BC\u03B1\u03C4\u03B1 \u03B3\u03B9\u03B1 \u03C1\u03CD\u03B8\u03BC\u03B9\u03C3\u03B7 (\u03A3\u03C5\u03BD\u03B9\u03C3\u03C4\u03AC\u03C4\u03B1\u03B9 \u03BD\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03BC\u03B1\u03B6\u03AF \u03BC\u03B5 \u03C4\u03BF\u03BD \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03BA\u03B1\u03C4\u03CC\u03C7\u03BF\u03C5 (Owner password) +addPassword.selectText.6=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03C5\u03BD\u03B1\u03C1\u03BC\u03BF\u03BB\u03CC\u03B3\u03B7\u03C3\u03B7\u03C2 \u03B5\u03B3\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5 +addPassword.selectText.7=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 +addPassword.selectText.8=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 \u03B3\u03B9\u03B1 \u03C0\u03C1\u03BF\u03C3\u03B2\u03B1\u03C3\u03B9\u03BC\u03CC\u03C4\u03B7\u03C4\u03B1 +addPassword.selectText.9=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03C5\u03BC\u03C0\u03BB\u03AE\u03C1\u03C9\u03C3\u03B7\u03C2 \u03C6\u03CC\u03C1\u03BC\u03B1\u03C2 +addPassword.selectText.10=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 +addPassword.selectText.11=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 annotation +addPassword.selectText.12=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7\u03C2 +addPassword.selectText.13=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7\u03C2 \u03C3\u03B5 \u03B4\u03B9\u03B1\u03C6\u03BF\u03C1\u03B5\u03C4\u03B9\u03BA\u03BF\u03CD\u03C2 \u03C4\u03CD\u03C0\u03BF\u03C5\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD +addPassword.selectText.14=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03BA\u03B1\u03C4\u03CC\u03C7\u03BF\u03C5 +addPassword.selectText.15=\u03A0\u03B5\u03C1\u03B9\u03BF\u03C1\u03AF\u03B6\u03B5\u03B9 \u03CC,\u03C4\u03B9 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B3\u03AF\u03BD\u03B5\u03B9 \u03BC\u03B5 \u03C4\u03BF \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF \u03BC\u03B5\u03C4\u03AC \u03C4\u03BF \u03AC\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 (\u0394\u03B5\u03BD \u03C5\u03C0\u03BF\u03C3\u03C4\u03B7\u03C1\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03B1\u03C0\u03CC \u03CC\u03BB\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5\u03C2 \u03B1\u03BD\u03B1\u03B3\u03BD\u03CE\u03C3\u03C4\u03B5\u03C2 PDF) +addPassword.selectText.16=\u03A0\u03B5\u03C1\u03B9\u03BF\u03C1\u03AF\u03B6\u03B5\u03B9 \u03C4\u03BF \u03AC\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03AF\u03B4\u03B9\u03BF\u03C5 \u03C4\u03BF\u03C5 \u03B5\u03B3\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5 +addPassword.submit=\u039A\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7 + + +#watermark +watermark.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 +watermark.header=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 +watermark.selectText.1=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 PDF \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03C0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C4\u03BF\u03C5 \u03C5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2: +watermark.selectText.2=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2: +watermark.selectText.3=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u039A\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5: +watermark.selectText.4=\u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE (0-360): +watermark.selectText.5=widthSpacer (\u039A\u03B5\u03BD\u03CC \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03BA\u03AC\u03B8\u03B5 \u03C5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03BF\u03C1\u03B9\u03B6\u03CC\u03BD\u03C4\u03B9\u03B1): +watermark.selectText.6=heightSpacer (\u039A\u03B5\u03BD\u03CC \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03BA\u03AC\u03B8\u03B5 \u03C5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03BA\u03AC\u03B8\u03B5\u03C4\u03B1): +watermark.selectText.7=\u0391\u03B4\u03B9\u03B1\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1 (Opacity) (0% - 100%): +watermark.selectText.8=\u03A4\u03CD\u03C0\u03BF\u03C2 \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2: +watermark.selectText.9=\u0395\u03B9\u03BA\u03CC\u03BD\u03B1 \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2: +watermark.submit=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 + + +#Change permissions +permissions.title=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u0394\u03B9\u03BA\u03B1\u03B9\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD +permissions.header=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u0394\u03B9\u03BA\u03B1\u03B9\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD +permissions.warning=\u03A0\u03C1\u03BF\u03B5\u03B9\u03B4\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03CC\u03C4\u03B9 \u03B1\u03C5\u03C4\u03AC \u03C4\u03B1 \u03B4\u03B9\u03BA\u03B1\u03B9\u03CE\u03BC\u03B1\u03C4\u03B1 \u03B4\u03B5\u03BD \u03B1\u03BB\u03BB\u03AC\u03B6\u03BF\u03C5\u03BD, \u03C3\u03C5\u03BD\u03B9\u03C3\u03C4\u03AC\u03C4\u03B1\u03B9 \u03BD\u03B1 \u03C4\u03B1 \u03BF\u03C1\u03AF\u03C3\u03B5\u03C4\u03B5 \u03BC\u03B5 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03BC\u03AD\u03C3\u03C9 \u03C4\u03B7\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7\u03C2 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 +permissions.selectText.1=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 PDF \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03C4\u03B5 \u03C4\u03B1 \u03B4\u03B9\u03BA\u03B1\u03B9\u03CE\u03BC\u03B1\u03C4\u03B1 +permissions.selectText.2=\u0394\u03B9\u03BA\u03B1\u03B9\u03CE\u03BC\u03B1\u03C4\u03B1 \u03B3\u03B9\u03B1 \u03C1\u03CD\u03B8\u03BC\u03B9\u03C3\u03B7 +permissions.selectText.3=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03C5\u03BD\u03B1\u03C1\u03BC\u03BF\u03BB\u03CC\u03B3\u03B7\u03C3\u03B7\u03C2 \u03B5\u03B3\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5 +permissions.selectText.4=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 +permissions.selectText.5=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 \u03B3\u03B9\u03B1 \u03C0\u03C1\u03BF\u03C3\u03B2\u03B1\u03C3\u03B9\u03BC\u03CC\u03C4\u03B7\u03C4\u03B1 +permissions.selectText.6=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03C5\u03BC\u03C0\u03BB\u03AE\u03C1\u03C9\u03C3\u03B7\u03C2 \u03C6\u03CC\u03C1\u03BC\u03B1\u03C2 +permissions.selectText.7=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 +permissions.selectText.8=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 annotation +permissions.selectText.9=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7\u03C2 +permissions.selectText.10=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7\u03C2 \u03C3\u03B5 \u03B4\u03B9\u03B1\u03C6\u03BF\u03C1\u03B5\u03C4\u03B9\u03BA\u03BF\u03CD\u03C2 \u03C4\u03CD\u03C0\u03BF\u03C5\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD +permissions.submit=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE + + +#remove password +removePassword.title=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD +removePassword.header=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD (\u0391\u03C0\u03BF\u03BA\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7) +removePassword.selectText.1=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 PDF \u03B3\u03B9\u03B1 \u03B1\u03C0\u03BF\u03BA\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7 +removePassword.selectText.2=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 +removePassword.submit=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 + + +#changeMetadata +changeMetadata.title=\u03A4\u03AF\u03C4\u03BB\u03BF\u03C2: +changeMetadata.header=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u039C\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD +changeMetadata.selectText.1=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03BF\u03CD\u03BC\u03B5 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03C4\u03B5\u03AF\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03BC\u03B5\u03C4\u03B1\u03B2\u03BB\u03B7\u03C4\u03AD\u03C2 \u03C0\u03BF\u03C5 \u03B8\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03C4\u03B5 +changeMetadata.selectText.2=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD +changeMetadata.selectText.3=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03C9\u03BD \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD: +changeMetadata.author=\u03A3\u03C5\u03BD\u03C4\u03AC\u03BA\u03C4\u03B7\u03C2: +changeMetadata.creationDate=\u0397\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 \u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1\u03C2 (yyyy/MM/dd HH:mm:ss): +changeMetadata.creator=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03CC\u03C2: +changeMetadata.keywords=\u039B\u03AD\u03BE\u03B5\u03B9\u03C2-\u03BA\u03BB\u03B5\u03B9\u03B4\u03B9\u03AC: +changeMetadata.modDate=\u0397\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 \u03A4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 (yyyy/MM/dd HH:mm:ss): +changeMetadata.producer=\u03A0\u03B1\u03C1\u03B1\u03B3\u03C9\u03B3\u03CC\u03C2: +changeMetadata.subject=\u0398\u03AD\u03BC\u03B1: +changeMetadata.title=\u03A4\u03AF\u03C4\u03BB\u03BF\u03C2: +changeMetadata.trapped=Trapped: +changeMetadata.selectText.4=\u0386\u03BB\u03BB\u03B1 \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1: +changeMetadata.selectText.5=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03C9\u03BD \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD +changeMetadata.submit=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE + + +#pdfToPDFA +pdfToPDFA.title=PDF \u03C3\u03B5 PDF/A +pdfToPDFA.header=PDF \u03C3\u03B5 PDF/A +pdfToPDFA.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF OCRmyPDF \u03B3\u03B9\u03B1 PDF/A \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE +pdfToPDFA.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE + + +#PDFToWord +PDFToWord.title=PDF \u03C3\u03B5 Word +PDFToWord.header=PDF \u03C3\u03B5 Word +PDFToWord.selectText.1=\u03A4\u03CD\u03C0\u03BF\u03C2 \u0391\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u0395\u03BE\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03BF\u03C5 +PDFToWord.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF LibreOffice \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD. +PDFToWord.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE + + +#PDFToPresentation +PDFToPresentation.title=PDF \u03C3\u03B5 Powerpoint +PDFToPresentation.header=PDF \u03C3\u03B5 Powerpoint +PDFToPresentation.selectText.1=\u03A4\u03CD\u03C0\u03BF\u03C2 \u0391\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u0395\u03BE\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03BF\u03C5 +PDFToPresentation.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF LibreOffice \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD. +PDFToPresentation.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE + + +#PDFToText +PDFToText.title=PDF \u03C3\u03B5 RTF (\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF) +PDFToText.header=PDF \u03C3\u03B5 RTF (\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF) +PDFToText.selectText.1=\u03A4\u03CD\u03C0\u03BF\u03C2 \u0391\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u0395\u03BE\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03BF\u03C5 +PDFToText.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF LibreOffice \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD. +PDFToText.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE + + +#PDFToHTML +PDFToHTML.title=PDF \u03C3\u03B5 HTML +PDFToHTML.header=PDF \u03C3\u03B5 HTML +PDFToHTML.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF LibreOffice \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD. +PDFToHTML.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE + + +#PDFToXML +PDFToXML.title=PDF \u03C3\u03B5 XML +PDFToXML.header=PDF \u03C3\u03B5 XML +PDFToXML.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF LibreOffice \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD. +PDFToXML.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE + +#PDFToCSV +PDFToCSV.title=PDF ?? CSV +PDFToCSV.header=PDF ?? CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=????????? + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index 07ab8a87f..3d06ab06b 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -47,7 +47,11 @@ green=Green blue=Blue custom=Custom... - +changedCredsMessage=Credentials changed! +notAuthenticatedMessage=User not authenticated. +userNotFoundMessage=User not found. +incorrectPasswordMessage=Current password is incorrect. +usernameExistsMessage=New Username already exists. @@ -56,7 +60,7 @@ custom=Custom... ############# navbar.convert=Convert navbar.security=Security -navbar.other=Other +navbar.other=Miscellaneous navbar.darkmode=Dark Mode navbar.pageOps=Page Operations navbar.settings=Settings @@ -75,6 +79,19 @@ settings.zipThreshold=Zip files when the number of downloaded files exceeds settings.signOut=Sign Out settings.accountSettings=Account Settings + + +changeCreds.title=Change Credentials +changeCreds.header=Update Your Account Details +changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) +changeCreds.newUsername=New Username +changeCreds.oldPassword=Current Password +changeCreds.newPassword=New Password +changeCreds.confirmNewPassword=Confirm New Password +changeCreds.submit=Submit Changes + + + account.title=Account Settings account.accountSettings=Account Settings account.adminSettings=Admin Settings - View and Add Users @@ -106,14 +123,20 @@ adminUserSettings.role=Role adminUserSettings.actions=Actions adminUserSettings.apiUser=Limited API User adminUserSettings.webOnlyUser=Web Only User +adminUserSettings.forceChange = Force user to change username/password on login adminUserSettings.submit=Save User ############# # HOME-PAGE # ############# home.desc=Your locally hosted one-stop-shop for all your PDF needs. +home.searchBar=Search for features... +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=PDF Multi Tool home.multiTool.desc=Merge, Rotate, Rearrange, and Remove pages multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move @@ -236,6 +259,10 @@ home.removeBlanks.title=Remove Blank pages home.removeBlanks.desc=Detects and removes blank pages from a document removeBlanks.tags=cleanup,streamline,non-content,organize +home.removeAnnotations.title=Remove Annotations +home.removeAnnotations.desc=Removes all comments/annotations from a PDF +removeAnnotations.tags=comments,highlight,notes,markup,remove + home.compare.title=Compare home.compare.desc=Compares and shows the differences between 2 PDF Documents compare.tags=differentiate,contrast,changes,analysis @@ -317,6 +344,24 @@ home.autoRedact.title=Auto Redact home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text showJS.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 +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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + ########################### # # # WEB PAGES # @@ -464,6 +509,7 @@ pipeline.title=Pipeline pageLayout.title=Multi Page Layout pageLayout.header=Multi Page Layout pageLayout.pagesPerSheet=Pages per sheet: +pageLayout.addBorder=Add Borders pageLayout.submit=Submit @@ -501,6 +547,12 @@ removeBlanks.whitePercentDesc=Percent of page that must be 'white' pixels to be removeBlanks.submit=Remove Blanks +#removeAnnotations +removeAnnotations.title=Remove Annotations +removeAnnotations.header=Remove Annotations +removeAnnotations.submit=Remove + + #compare compare.title=Compare compare.header=Compare PDFs @@ -631,6 +683,9 @@ pdfOrganiser.submit=Rearrange Pages multiTool.title=PDF Multi Tool multiTool.header=PDF Multi Tool +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=Page Remover @@ -665,7 +720,10 @@ split.submit=Split imageToPDF.title=Image to PDF imageToPDF.header=Image to PDF imageToPDF.submit=Convert -imageToPDF.selectText.1=Stretch to fit +imageToPDF.selectLabel=Image Fit Options +imageToPDF.fillPage=Fill Page +imageToPDF.fitDocumentToImage=Fit Page to Image +imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.selectText.2=Auto rotate PDF imageToPDF.selectText.3=Multi file logic (Only enabled if working with multiple images) imageToPDF.selectText.4=Merge into single PDF @@ -768,13 +826,6 @@ changeMetadata.selectText.5=Add Custom Metadata Entry changeMetadata.submit=Change -#xlsToPdf -xlsToPdf.title=Excel to PDF -xlsToPdf.header=Excel to PDF -xlsToPdf.selectText.1=Select XLS or XLSX Excel sheet to convert -xlsToPdf.convert=convert - - #pdfToPDFA pdfToPDFA.title=PDF To PDF/A pdfToPDFA.header=PDF To PDF/A @@ -817,4 +868,46 @@ PDFToHTML.submit=Convert PDFToXML.title=PDF to XML PDFToXML.header=PDF to XML PDFToXML.credit=This service uses LibreOffice for file conversion. -PDFToXML.submit=Convert \ No newline at end of file +PDFToXML.submit=Convert + +#PDFToCSV +PDFToCSV.title=PDF to CSV +PDFToCSV.header=PDF to CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=Extract + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 38807e3d0..1a73c4d4c 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -35,9 +35,6 @@ delete=Delete username=Username password=Password welcome=Welcome -########################## -### TODO: Translate ### -########################## property=Property black=Black white=White @@ -46,7 +43,11 @@ green=Green blue=Blue custom=Custom... - +changedCredsMessage=Credentials changed! +notAuthenticatedMessage=User not authenticated. +userNotFoundMessage=User not found. +incorrectPasswordMessage=Current password is incorrect. +usernameExistsMessage=New Username already exists. @@ -55,7 +56,7 @@ custom=Custom... ############# navbar.convert=Convert navbar.security=Security -navbar.other=Other +navbar.other=Miscellaneous navbar.darkmode=Dark Mode navbar.pageOps=Page Operations navbar.settings=Settings @@ -74,6 +75,19 @@ settings.zipThreshold=Zip files when the number of downloaded files exceeds settings.signOut=Sign Out settings.accountSettings=Account Settings + + +changeCreds.title=Change Credentials +changeCreds.header=Update Your Account Details +changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) +changeCreds.newUsername=New Username +changeCreds.oldPassword=Current Password +changeCreds.newPassword=New Password +changeCreds.confirmNewPassword=Confirm New Password +changeCreds.submit=Submit Changes + + + account.title=Account Settings account.accountSettings=Account Settings account.adminSettings=Admin Settings - View and Add Users @@ -105,14 +119,20 @@ adminUserSettings.role=Role adminUserSettings.actions=Actions adminUserSettings.apiUser=Limited API User adminUserSettings.webOnlyUser=Web Only User +adminUserSettings.forceChange=Force user to change username/password on login adminUserSettings.submit=Save User ############# # HOME-PAGE # ############# home.desc=Your locally hosted one-stop-shop for all your PDF needs. +home.searchBar=Search for features... +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=PDF Multi Tool home.multiTool.desc=Merge, Rotate, Rearrange, and Remove pages multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move @@ -235,6 +255,10 @@ home.removeBlanks.title=Remove Blank pages home.removeBlanks.desc=Detects and removes blank pages from a document removeBlanks.tags=cleanup,streamline,non-content,organize +home.removeAnnotations.title=Remove Annotations +home.removeAnnotations.desc=Removes all comments/annotations from a PDF +removeAnnotations.tags=comments,highlight,notes,markup,remove + home.compare.title=Compare home.compare.desc=Compares and shows the differences between 2 PDF Documents compare.tags=differentiate,contrast,changes,analysis @@ -316,6 +340,24 @@ home.autoRedact.title=Auto Redact home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text showJS.tags=JS +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to 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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + ########################### # # # WEB PAGES # @@ -333,9 +375,6 @@ login.signinTitle=Please sign in #auto-redact autoRedact.title=Auto Redact autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## autoRedact.colorLabel=Color autoRedact.textsToRedactLabel=Text to Redact (line-separated) autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret @@ -466,6 +505,7 @@ pipeline.title=Pipeline pageLayout.title=Multi Page Layout pageLayout.header=Multi Page Layout pageLayout.pagesPerSheet=Pages per sheet: +pageLayout.addBorder=Add Borders pageLayout.submit=Submit @@ -503,6 +543,12 @@ removeBlanks.whitePercentDesc=Percent of page that must be 'white' pixels to be removeBlanks.submit=Remove Blanks +#removeAnnotations +removeAnnotations.title=Remove Annotations +removeAnnotations.header=Remove Annotations +removeAnnotations.submit=Remove + + #compare compare.title=Compare compare.header=Compare PDFs @@ -619,6 +665,9 @@ pdfOrganiser.submit=Rearrange Pages multiTool.title=PDF Multi Tool multiTool.header=PDF Multi Tool +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=Page Remover @@ -653,7 +702,10 @@ split.submit=Split imageToPDF.title=Image to PDF imageToPDF.header=Image to PDF imageToPDF.submit=Convert -imageToPDF.selectText.1=Stretch to fit +imageToPDF.selectLabel=Image Fit Options +imageToPDF.fillPage=Fill Page +imageToPDF.fitDocumentToImage=Fit Page to Image +imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.selectText.2=Auto rotate PDF imageToPDF.selectText.3=Multi file logic (Only enabled if working with multiple images) imageToPDF.selectText.4=Merge into single PDF @@ -756,13 +808,6 @@ changeMetadata.selectText.5=Add Custom Metadata Entry changeMetadata.submit=Change -#xlsToPdf -xlsToPdf.title=Excel to PDF -xlsToPdf.header=Excel to PDF -xlsToPdf.selectText.1=Select XLS or XLSX Excel sheet to convert -xlsToPdf.convert=convert - - #pdfToPDFA pdfToPDFA.title=PDF To PDF/A pdfToPDFA.header=PDF To PDF/A @@ -806,3 +851,45 @@ PDFToXML.title=PDF to XML PDFToXML.header=PDF to XML PDFToXML.credit=This service uses LibreOffice for file conversion. PDFToXML.submit=Convert + +#PDFToCSV +PDFToCSV.title=PDF to CSV +PDFToCSV.header=PDF to CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=Extract + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 37edd2cfc..fa4765862 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -26,27 +26,28 @@ text=Texto font=Fuente selectFillter=-- Seleccionar -- pageNum=Número de página -sizes.small=Paqueño +sizes.small=Pequeño sizes.medium=Mediano sizes.large=Grande sizes.x-large=Extra grande error.pdfPassword=El documento PDF está protegido con contraseña y no se ha proporcionado o es incorrecta -delete=Delete -username=Username -password=Password -welcome=Welcome -########################## -### TODO: Translate ### -########################## -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - +delete=Borrar +username=Nombre de usuario +password=Contraseña +welcome=Bienvenido +property=Propietario +black=Negro +white=Blanco +red=Rojo +green=Verde +blue=Azul +custom=Personalizado... +changedCredsMessage=Se cambiaron las credenciales! +notAuthenticatedMessage=Usuario no autentificado. +userNotFoundMessage=Usuario no encontrado. +incorrectPasswordMessage=La contraseña actual no es correcta. +usernameExistsMessage=El nuevo nombre de usuario está en uso. @@ -58,64 +59,83 @@ navbar.security=Seguridad navbar.other=Otro navbar.darkmode=Modo oscuro navbar.pageOps=Operaciones de página -navbar.settings=Ajustes +navbar.settings=Configuración ############# # SETTINGS # ############# -settings.title=Ajustes +settings.title=Configuración settings.update=Actualización disponible settings.appVersion=Versión de la aplicación: settings.downloadOption.title=Elegir la opción de descarga (para descargas de un solo archivo sin ZIP): settings.downloadOption.1=Abrir en la misma ventana settings.downloadOption.2=Abrir en una nueva ventana -settings.downloadOption.3=Descargar el fichero -settings.zipThreshold=Ficheros ZIP cuando excede el número de ficheros descargados -settings.signOut=Sign Out -settings.accountSettings=Account Settings - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser +settings.downloadOption.3=Descargar el archivo +settings.zipThreshold=Archivos ZIP cuando excede el número de archivos descargados +settings.signOut=Desconectar +settings.accountSettings=Configuración de la cuenta -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User + +changeCreds.title=Cambiar Credenciales +changeCreds.header=Actualice los detalles de su cuenta +changeCreds.changeUserAndPassword=Está usando las credenciales por defecto. Por favor, introduzca una nueva contraseña (y usuario si lo desea) +changeCreds.newUsername=Nuevo usuario +changeCreds.oldPassword=Contraseña actual +changeCreds.newPassword=Nueva contraseña +changeCreds.confirmNewPassword=Confirme la nueva contraseña +changeCreds.submit=Enviar cambios + + + +account.title=Configuración de la cuenta +account.accountSettings=Configuración de la cuenta +account.adminSettings=Configuración de Administrador - Ver y Añadir Usuarios +account.userControlSettings=Configuración de control de usuario +account.changeUsername=Cambiar nombre de usuario +account.changeUsername=Cambiar nombre de usuario +account.password=Confirmar contraseña +account.oldPassword=Contraseña anterior +account.newPassword=Nueva Contraseña +account.changePassword=Cambiar Contraseña +account.confirmNewPassword=Confirmar Nueva Contraseña +account.signOut=Cerrar sesión +account.yourApiKey=Su clave API +account.syncTitle=Sincronizar la configuración del navegador con la cuenta +account.settingsCompare=Comparación de configuraciones: +account.property=Propiedad +account.webBrowserSettings=Configuración del navegador +account.syncToBrowser=Sincronizar cuenta -> Navegador +account.syncToAccount=Sincronizar cuenta <- Navegador + + +adminUserSettings.title=Configuración de control de usuario +adminUserSettings.header=Configuración de control de usuario administrador +adminUserSettings.admin=Administrador +adminUserSettings.user=Usuario +adminUserSettings.addUser=Añadir Nuevo Usuario adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.submit=Save User +adminUserSettings.role=Rol +adminUserSettings.actions=Acciones +adminUserSettings.apiUser=Usuario limitado de API +adminUserSettings.webOnlyUser=Usuario solo web +adminUserSettings.forceChange=Forzar usuario a cambiar usuario/contraseña en el acceso +adminUserSettings.submit=Guardar Usuario ############# # HOME-PAGE # ############# -home.desc=Su ventanilla única autohospedada para todas tus necesidades PDF +home.desc=Su ventanilla única autohospedada para todas sus necesidades PDF +home.searchBar=Buscar características... +home.viewPdf.title=Ver PDF +home.viewPdf.desc=Ver, anotar, añadir texto o imágenes +viewPdf.tags=ver,leer,anotar,texto,imagen + home.multiTool.title=Multi-herramienta PDF home.multiTool.desc=Combinar, rotar, reorganizar y eliminar páginas -multiTool.tags=Multi-herramienta,Multi-operación,Interfaz de usuario,Arrastrar con un click,front end,lado del client +multiTool.tags=Multi-herramienta,Multi-operación,Interfaz de usuario,Arrastrar con un click,front end,lado del cliente home.merge.title=Unir home.merge.desc=Unir fácilmente múltiples PDFs en uno @@ -144,12 +164,12 @@ pdfOrganiser.tags=doble cara,pares,impares,ordenar,mover home.addImage.title=Agregar imagen al PDF -home.addImage.desc=Agregar una imagen en una ubicación establecida en el PDF (en desarrollo) +home.addImage.desc=Agregar una imagen en el PDF en una ubicación establecida (en desarrollo) addImage.tags=img,jpg,imagen,fotografía home.watermark.title=Añadir marca de agua home.watermark.desc=Añadir una marca de agua predefinida al documento PDF -watermark.tags=Texto,repetir,etiquetar,propietario,copyight,marca comercial,img,jpg,imagen,fotografía +watermark.tags=Texto,repetir,etiquetar,propietario,copyright,marca comercial,img,jpg,imagen,fotografía home.permissions.title=Cambiar permisos home.permissions.desc=Cambiar los permisos del documento PDF @@ -169,7 +189,7 @@ home.removePassword.desc=Eliminar la contraseña del documento PDF removePassword.tags=seguro,Desencriptar,seguridad,quitar contraseña,eliminar contraseña home.compressPdfs.title=Comprimir -home.compressPdfs.desc=Comprimir PDFs para reducir el tamaño del fichero +home.compressPdfs.desc=Comprimir PDFs para reducir el tamaño del archivo compressPdfs.tags=aplastar,pequeño,diminuto @@ -177,7 +197,7 @@ home.changeMetadata.title=Cambiar metadatos home.changeMetadata.desc=Cambiar/Eliminar/Añadir metadatos al documento PDF changeMetadata.tags==Título,autor,fecha,creación,hora,editorial,productor,estadísticas -home.fileToPDF.title=Convertir fichero a PDF +home.fileToPDF.title=Convertir archivo a PDF home.fileToPDF.desc=Convertir casi cualquier archivo a PDF (DOCX, PNG, XLS, PPT, TXT y más) fileToPDF.tags=transformación,formato,documento,imagen,diapositiva,texto,conversión,office,docs,word,excel,powerpoint @@ -192,7 +212,7 @@ extractImages.tags=imagen,fotografía,guardar,archivo,zip,capturar,coger home.pdfToPDFA.title=Convertir PDF a PDF/A home.pdfToPDFA.desc=Convertir PDF a PDF/A para almacenamiento a largo plazo -pdfToPDFA.tags=archivo,largo plazo,estándar,conversión,almacewnamiento,conservación +pdfToPDFA.tags=archivo,largo plazo,estándar,conversión,almacenamiento,conservación home.PDFToWord.title=PDF a Word home.PDFToWord.desc=Convertir formatos PDF a Word (DOC, DOCX y ODT) @@ -255,12 +275,12 @@ home.pipeline.title=Secuencia (Avanzado) home.pipeline.desc=Ejecutar varias tareas a PDFs definiendo una secuencia de comandos pipeline.tags=automatizar,secuencia,con script,proceso por lotes -home.add-page-numbers.title=Aádir números de página -home.add-page-numbers.desc=Aádir números de página en un documento en una ubicación concreta +home.add-page-numbers.title=Añadir números de página +home.add-page-numbers.desc=Añadir números de página en un documento en una ubicación concreta add-page-numbers.tags=paginar,etiquetar,organizar,indexar -home.auto-rename.title=Auto renombrar archivo PDF -home.auto-rename.desc=Auto renormbrar un archivo PDF según su encabezamiento detecetado +home.auto-rename.title=Renombrar archivo PDF automáticamente +home.auto-rename.desc=Renombrar automáticamente un archivo PDF según el encabezamiento detectado auto-rename.tags=auto-detectar,basado en el encabezamiento,organizar,re-etiquetar home.adjust-contrast.title=Ajustar Color/Contraste @@ -281,103 +301,118 @@ sanitizePdf.tags=limpiar,asegurar,seguro,quitar amenazas home.URLToPDF.title=URL/Página web a PDF home.URLToPDF.desc=Convierte cualquier dirección http(s) a PDF -URLToPDF.tags=captura web,guardar página,web-a-doc,archivo +URLToPDF.tags=captura web,guardar página,web a documento,archivo home.HTMLToPDF.title=HTML a PDF home.HTMLToPDF.desc=Convierte cualquier archivo HTML o ZIP a PDF HTMLToPDF.tags=margen,contenido web,transformación,convertir -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert +home.MarkdownToPDF.title=Markdown a PDF +home.MarkdownToPDF.desc=Convierte cualquier archivo Markdown a PDF +MarkdownToPDF.tags=margen,contenido web,transformación,convertir -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs -getPdfInfo.tags=infomation,data,stats,statistics +home.getPdfInfo.title=Obtener toda la información en PDF +home.getPdfInfo.desc=Obtiene toda la información posible de archivos PDF +getPdfInfo.tags=información,datos,estadísticas,estadísticas -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF -extractPage.tags=extract +home.extractPage.title=Extraer página(s) +home.extractPage.desc=Extraer las páginas seleccionadas del PDF +extractPage.tags=extraer -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page -PdfToSinglePage.tags=single page +home.PdfToSinglePage.title=PDF a una sola página +home.PdfToSinglePage.desc=Unir todas las páginas del PDF en una sola página +PdfToSinglePage.tags=página única -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF +home.showJS.title=Mostrar Javascript +home.showJS.desc=Busca y muestra cualquier JS contenido 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=Auto Redactar +home.autoRedact.desc=Redactar automáticamente (ocultar) texto en un PDF según el texto introducido showJS.tags=JS +home.tableExtraxt.title=PDF a CSV +home.tableExtraxt.desc=Extraer Tablas de un PDF convirtiéndolas a CSV +tableExtraxt.tags=CSV,Extraer tabla,extraer,convertir + + +home.autoSizeSplitPDF.title=Auto dividir por tamaño/conteo +home.autoSizeSplitPDF.desc=Divide un solo PDF en múltiples documentos según su tamaño, número de páginas, o número de documento +autoSizeSplitPDF.tags=pdf,dividir,documento,organización + + +home.overlay-pdfs.title=Superponer PDFs +home.overlay-pdfs.desc=Superponer PDFs encima de otro PDF +overlay-pdfs.tags=Superponer + +home.split-by-sections.title=Dividir PDF por Seccioned +home.split-by-sections.desc=Dividir cada página de un PDF en secciones verticales y horizontales más pequeñas +split-by-sections.tags=Dividir sección, Dividir, Personalizar + ########################### # # # WEB PAGES # # # ########################### #login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in +login.title=Iniciar sesión +login.signin=Iniciar sesión +login.rememberme=Recordarme +login.invalid=Nombre de usuario o contraseña erróneos. +login.locked=Su cuenta se ha bloqueado. +login.signinTitle=Por favor, inicie sesión #auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## -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=Auto Redactar +autoRedact.header=Auto Redactar +autoRedact.colorLabel=Color +autoRedact.textsToRedactLabel=Texto para Redactar (separado por líneas) +autoRedact.textsToRedactPlaceholder=por ej. \nConfidencial \nAlto-Secreto +autoRedact.useRegexLabel=Usar Regex +autoRedact.wholeWordSearchLabel=Búsqueda por palabra completa +autoRedact.customPaddingLabel=Extra Padding personalizado +autoRedact.convertPDFToImageLabel=Convertir PDF a imagen PDF (Utilizado para quitar el texto detrás del cajetín) +autoRedact.submitButton=Enviar #showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show +showJS.title=Mostrar Javascript +showJS.header=Mostrar Javascript +showJS.downloadJS=Descargar Javascript +showJS.submit=Mostrar #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=Convertir a página única #pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract +pageExtracter.title=Extraer Páginas +pageExtracter.header=Extraer Páginas +pageExtracter.submit=Extraer #getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON +getPdfInfo.title=Obtener Información del PDF +getPdfInfo.header=Obtener Información del PDF +getPdfInfo.submit=Obtener Información +getPdfInfo.downloadJson=Descargar JSON #markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint +MarkdownToPDF.title=Markdown a PDF +MarkdownToPDF.header=Markdown a PDF +MarkdownToPDF.submit=Convertir +MarkdownToPDF.help=Tarea en proceso +MarkdownToPDF.credit=Usa WeasyPrint @@ -391,7 +426,7 @@ URLToPDF.credit=Utiliza WeasyPrint #html-to-pdf HTMLToPDF.title=HTML a PDF HTMLToPDF.header=HTML a PDF -HTMLToPDF.help=Acepta archivos HTML y ZIPs conteniendo los html/css/imágenes etc requeridas +HTMLToPDF.help=Acepta archivos HTML y ZIPs conteniendo los html/css/imágenes, etc, requeridas HTMLToPDF.submit=Convertir HTMLToPDF.credit=Utiliza WeasyPrint @@ -416,16 +451,16 @@ addPageNumbers.selectText.3=Posición addPageNumbers.selectText.4=Número de inicio addPageNumbers.selectText.5=Páginas a numerar addPageNumbers.selectText.6=Texto personalizado -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} +addPageNumbers.customTextDesc=Texto personalizado +addPageNumbers.numberPagesDesc=Qué páginas numerar, por defecto 'todas', también acepta 1-5 o 2,5,9 etc +addPageNumbers.customNumberDesc=Por defecto a {n}, también acepta 'Página {n} de {total}', 'Texto-{n}', '{filename}-{n} addPageNumbers.submit=Añadir Números de Página #auto-rename -auto-rename.title=Auto Renombrar -auto-rename.header=Auto Renombrar PDF -auto-rename.submit=Auto Renombrar +auto-rename.title=Renombrar automáticamente +auto-rename.header=Renombrar PDF automáticamente +auto-rename.submit=Renombrar automáticamente #adjustContrast @@ -444,8 +479,8 @@ crop.submit=Entregar #autoSplitPDF -autoSplitPDF.title=Auto Dividir PDF -autoSplitPDF.header=Auto Dividir PDF +autoSplitPDF.title=Dividir PDF automáticamente +autoSplitPDF.header=Dividir PDF automáticamente autoSplitPDF.description=Imprimir, Insertar, Escanear, cargar, y déjenos sepsrar automáticamente sus documentos. No se necesita clasificación manual. autoSplitPDF.selectText.1=Imprimir algunas hojas divisorias desde la parte inferior (Blanco y negro está bien). autoSplitPDF.selectText.2=Escanee todos sus documentos a la vez insertando la hoja divisoria entre ellos. @@ -453,8 +488,8 @@ autoSplitPDF.selectText.3=Cargue un único archivo PDF escaneado de gran tamaño autoSplitPDF.selectText.4=Las páginas divisorias son automáticamente detectadas y eliminadas, garantizando un buen documento final. autoSplitPDF.formPrompt=Entregar PDF conteniendo divisores de página de Stirling-PDF: autoSplitPDF.duplexMode=Modo Dúplex (Escaneado de ambas caras) -autoSplitPDF.dividerDownload1=Descargar 'Auto Splitter Divider (mínima).pdf' -autoSplitPDF.dividerDownload2=Descargar 'Auto Splitter Divider (con instrucciones).pdf' +autoSplitPDF.dividerDownload1=Descargar 'Divisor automático (mínima).pdf' +autoSplitPDF.dividerDownload2=Descargar 'Divisor automático (con instrucciones).pdf' autoSplitPDF.submit=Entregar @@ -466,6 +501,7 @@ pipeline.title=Pipeline pageLayout.title=Diseño de varias páginas pageLayout.header=Diseño de varias páginas pageLayout.pagesPerSheet=Páginas por hoja: +pageLayout.addBorder=Añadir bordes pageLayout.submit=Entregar @@ -478,7 +514,7 @@ scalePages.submit=Entregar #certSign -certSign.title=Firma de certificado +certSign.title=Firma con certificado certSign.header=Firmar un PDF con su certificado (en desarrollo) certSign.selectPDF=Seleccione un archivo PDF para firmar: certSign.selectKey=Seleccione su archivo de clave privada (formato PKCS#8, podría ser .pem o .der): @@ -540,7 +576,7 @@ ScannerImageSplit.selectText.3=Tolerancia: ScannerImageSplit.selectText.4=Determinar el rango de variación de color alrededor del color de fondo estimado (predeterminado: 30). ScannerImageSplit.selectText.5=Área mínima: ScannerImageSplit.selectText.6=Establecer el umbral mínimo de área para una foto (predeterminado: 10000). -ScannerImageSplit.selectText.7=Área de contorno mínima: +ScannerImageSplit.selectText.7=Área mínima de contorno: ScannerImageSplit.selectText.8=Establecer el umbral mínimo del área de contorno para una foto ScannerImageSplit.selectText.9=Tamaño del borde: ScannerImageSplit.selectText.10=Establece el tamaño del borde agregado y eliminado para evitar bordes blancos en la salida (predeterminado: 1). @@ -576,8 +612,8 @@ extractImages.submit=Extraer #File to PDF fileToPDF.title=Archivo a PDF fileToPDF.header=Convertir cualquier archivo a PDF -fileToPDF.credit=Este servicio usa LibreOffice y Unoconv para la conversión de ficheros -fileToPDF.supportedFileTypes=Los tipos de ficheros soportados deben incluir los de abajo; sin embargo, para una completa y acutualizada lista de formatos soportados, por favor consulte la documentación de LibreOffice +fileToPDF.credit=Este servicio usa LibreOffice y Unoconv para la conversión de archivos +fileToPDF.supportedFileTypes=Los tipos de archivo soportados deben incluir los indicados a continuación; sin embargo, para una completa y acutualizada lista de formatos soportados, por favor consulte la documentación de LibreOffice fileToPDF.submit=Convertir a PDF @@ -604,8 +640,8 @@ addImage.submit=Añadir imagen #merge merge.title=Unir merge.header=Unir múltiples PDFs (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date +merge.sortByName=Ordenar por nombre +merge.sortByDate=Ordenar por fecha merge.submit=Unir @@ -619,6 +655,9 @@ pdfOrganiser.submit=Organizar páginas multiTool.title=Multi-herramienta PDF multiTool.header=Multi-herramienta PDF +#view pdf +viewPdf.title=Ver PDF +viewPdf.header=Ver PDF #pageRemover pageRemover.title=Eliminador de páginas @@ -630,7 +669,7 @@ pageRemover.submit=Eliminar Páginas #rotate rotate.title=Rotar PDF rotate.header=Rotar PDF -rotate.selectAngle=Select rotation angle (in multiples of 90 degrees): +rotate.selectAngle=Seleccionar ángulo de rotación (en múltiplos de 90 grados): rotate.submit=Rotar @@ -653,7 +692,10 @@ split.submit=Dividir imageToPDF.title=Imagen a PDF imageToPDF.header=Imagen a PDF imageToPDF.submit=Convertir -imageToPDF.selectText.1=Estirar para ajustar +imageToPDF.selectLabel=Opciones de ajuste de imagen +imageToPDF.fillPage=Ocupar toda la página +imageToPDF.fitDocumentToImage=Ajustar página a imagen +imageToPDF.maintainAspectRatio=Mantener relación de aspecto imageToPDF.selectText.2=Rotación automática del PDF imageToPDF.selectText.3=Lógica de archivos múltiples (únicamente activado si funciona con multiples imágenes) imageToPDF.selectText.4=Unir en un único archivo PDF @@ -691,8 +733,8 @@ addPassword.selectText.11=Impedir modificación de anotaciones addPassword.selectText.12=Impedir imprimir addPassword.selectText.13=Impedir imprimir diferentes formatos addPassword.selectText.14=Contraseña -addPassword.selectText.15=Restringe qué se puede hacer con el documento una vez abierto (no soportado por todos los lectores) -addPassword.selectText.16=Restringe la apertura del propio documento +addPassword.selectText.15=Restringir qué se puede hacer con el documento una vez abierto (no soportado por todos los lectores) +addPassword.selectText.16=Restringir la apertura del propio documento addPassword.submit=Encriptar @@ -706,8 +748,8 @@ watermark.selectText.4=Rotación (0-360): watermark.selectText.5=Ancho (Espacio entre cada marca de agua horizontalmente): watermark.selectText.6=Alto (Espacio entre cada marca de agua verticalmente): watermark.selectText.7=Opacidad (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: +watermark.selectText.8=Tipo de marca de agua: +watermark.selectText.9=Imagen de marca de agua: watermark.submit=Añadir marca de agua @@ -750,19 +792,12 @@ changeMetadata.modDate=Fecha de modificación (aaaa/MM/dd HH:mm:ss): changeMetadata.producer=Productor: changeMetadata.subject=Asunto: changeMetadata.title=Título: -changeMetadata.trapped=Trapped: +changeMetadata.trapped=Capturado: changeMetadata.selectText.4=Otros Metadatos: changeMetadata.selectText.5=Agregar entrada de metadatos personalizados changeMetadata.submit=Cambiar -#xlsToPdf -xlsToPdf.title=Excel a PDF -xlsToPdf.header=Excel a PDF -xlsToPdf.selectText.1=Seleccionar hoja de cálculo de Excel XLS o XLSX para convertir -xlsToPdf.convert=Convertir - - #pdfToPDFA pdfToPDFA.title=PDF a PDF/A pdfToPDFA.header=PDF a PDF/A @@ -806,3 +841,45 @@ PDFToXML.title=PDF a XML PDFToXML.header=PDF a XML PDFToXML.credit=Este servicio utiliza LibreOffice para la conversión de archivos PDFToXML.submit=Convertir + +#PDFToCSV +PDFToCSV.title=PDF a CSV +PDFToCSV.header=PDF a CSV +PDFToCSV.prompt=Elija una página para extraer la tabla +PDFToCSV.submit=Extraer + +#split-by-size-or-count +split-by-size-or-count.header=Dividir PDF por tamaño o número +split-by-size-or-count.type.label=Seleccionar tipo de división +split-by-size-or-count.type.size=Por tamaño +split-by-size-or-count.type.pageCount=Por número de páginas +split-by-size-or-count.type.docCount=por recuento de documentos +split-by-size-or-count.value.label=Introduzca valor +split-by-size-or-count.value.placeholder=Introduzca tamaño (p.ej., 2MB o 3KB) or recuento (p.ej., 5) +split-by-size-or-count.submit=Enviar + + +#overlay-pdfs +overlay-pdfs.header=Superponer archivos PDF +overlay-pdfs.baseFile.label=Selleccione archivo PDF de base +overlay-pdfs.overlayFiles.label=Seleccione archivos PDF a superponer +overlay-pdfs.mode.label=Seleccione modo de superposición +overlay-pdfs.mode.sequential=Superposición Sequencial +overlay-pdfs.mode.interleaved=Superposición Intercalada +overlay-pdfs.mode.fixedRepeat=Superposición de repetición fija +overlay-pdfs.counts.label=Recuento de superposición (para Modo de Repetición Fija) +overlay-pdfs.counts.placeholder=Introduzca recuento separado por comas (p.ej., 2,3,1) +overlay-pdfs.position.label=Seleccione Posición de Superposición +overlay-pdfs.position.foreground=Arriba +overlay-pdfs.position.background=Fondo +overlay-pdfs.submit=Enviar + + +#split-by-sections +split-by-sections.title=Dividir PDF por Secciones +split-by-sections.header=Dividir PDF por Secciones +split-by-sections.horizontal.label=Divisiones Horizontales +split-by-sections.vertical.label=Divisiones Verticales +split-by-sections.horizontal.placeholder=Introduzca el número de divisiones horizontales +split-by-sections.vertical.placeholder=Introduzca el número de divisiones verticales +split-by-sections.submit=Dividir PDF diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index f7dab20bf..69121553e 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -35,9 +35,6 @@ delete=ezabatu username=Erabiltzaile izena password=Pasahitza welcome=Ongi etorria -########################## -### TODO: Translate ### -########################## property=Propietate black=Beltza white=Txuria @@ -46,7 +43,11 @@ green=Berdea blue=Urdina custom=Pertsonalizatu... - +changedCredsMessage=Credentials changed! +notAuthenticatedMessage=User not authenticated. +userNotFoundMessage=User not found. +incorrectPasswordMessage=Current password is incorrect. +usernameExistsMessage=New Username already exists. @@ -74,6 +75,19 @@ settings.zipThreshold=ZIP fitxategiak deskargatutako fitxategi kopurua gainditze settings.signOut=Saioa itxi settings.accountSettings=Kontuaren ezarpenak + + +changeCreds.title=Change Credentials +changeCreds.header=Update Your Account Details +changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) +changeCreds.newUsername=New Username +changeCreds.oldPassword=Current Password +changeCreds.newPassword=New Password +changeCreds.confirmNewPassword=Confirm New Password +changeCreds.submit=Submit Changes + + + account.title=Kontuaren ezarpenak account.accountSettings=Kontuaren ezarpenak account.adminSettings=Admin ezarpenak - Ikusi eta gehitu Erabiltzaileak @@ -105,14 +119,20 @@ adminUserSettings.role=Rol adminUserSettings.actions=Ekintzak adminUserSettings.apiUser=APIren erabiltzaile mugatua adminUserSettings.webOnlyUser=Web-erabiltzailea bakarrik +adminUserSettings.forceChange=Force user to change username/password on login adminUserSettings.submit=Gorde Erabiltzailea ############# # HOME-PAGE # ############# home.desc=Zure leihatila bakarra autoostatatua zure PDF behar guztietarako +home.searchBar=Search for features... +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=Erabilera anitzeko tresna PDF home.multiTool.desc=Orriak konbinatu, biratu, berrantolatu eta ezabatu multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side @@ -316,6 +336,24 @@ home.autoRedact.title=Auto Idatzi home.autoRedact.desc=Auto Idatzi testua pdf fitxategian sarrerako testuan oinarritua showJS.tags=JS +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to 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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + ########################### # # # WEB PAGES # @@ -333,9 +371,6 @@ login.signinTitle=Mesedez, hasi saioa #auto-redact autoRedact.title=Auto Idatzi autoRedact.header=Auto Idatzi -########################## -### TODO: Translate ### -########################## autoRedact.colorLabel=Kolorea autoRedact.textsToRedactLabel=Idazteko testua (lerro bidez bereizia) autoRedact.textsToRedactPlaceholder=adib. \nKonfidentziala \nTop-Secret @@ -418,7 +453,7 @@ addPageNumbers.selectText.5=Orrialde kopurua addPageNumbers.selectText.6=Testu pertsonalizatua addPageNumbers.customTextDesc=Testu pertsonalizatua addPageNumbers.numberPagesDesc=Zein orri numeratu, lehenetsita 'denak', 1-5 edo 2,5,9 etab onartzen ditu -addPageNumbers.customNumberDesc=Lehenetsoa {n}-ra, '{n} orria {total}-tik', 'Text-{n}', '{filename}-{n}' ere onartzen du +addPageNumbers.customNumberDesc=Lehenetsoa {n}-ra, '{n} orria {total}-tik', 'Text-{n}', '{filename}-{n}' ere onartzen du addPageNumbers.submit=Gehitu orrialde-zenbakiak @@ -466,6 +501,7 @@ pipeline.title=Hodia pageLayout.title=Hainbat orrialderen diseinua pageLayout.header=Hainbat orrialderen diseinua pageLayout.pagesPerSheet=Orrialdeak orriko: +pageLayout.addBorder=Add Borders pageLayout.submit=Entregatu @@ -619,6 +655,9 @@ pdfOrganiser.submit=Antolatu orrialdeak multiTool.title=PDF erabilera anitzeko tresna multiTool.header=PDF erabilera anitzeko tresna +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=Orrialdeen ezabatzailea @@ -653,7 +692,10 @@ split.submit=Zatitu imageToPDF.title=Irudia PDF bihurtu imageToPDF.header=Irudia PDF bihurtu imageToPDF.submit=Bihurtu -imageToPDF.selectText.1=Zabaldu doitzeko +imageToPDF.selectLabel=Image Fit Options +imageToPDF.fillPage=Fill Page +imageToPDF.fitDocumentToImage=Fit Page to Image +imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.selectText.2=PDFaren errotazio automatikoa imageToPDF.selectText.3=Fitxategi askoren logika (gaituta bakarrik zenbait irudirekin ari denean) imageToPDF.selectText.4=Elkartu PDF bakar batean @@ -756,13 +798,6 @@ changeMetadata.selectText.5=Gehitu metadatu pertsonalizatuen sarrera changeMetadata.submit=Aldatu -#xlsToPdf -xlsToPdf.title=Excela PDF bihurtu -xlsToPdf.header=Excela PDF bihurtu -xlsToPdf.selectText.1=Hautatu Excel XLSren edo XLSXren kalkulu-orria bihurtzeko -xlsToPdf.convert=Bikurtu - - #pdfToPDFA pdfToPDFA.title=PDFa PDF/A bihurtu pdfToPDFA.header=PDFa PDF/A bihurtu @@ -806,3 +841,45 @@ PDFToXML.title=PDFa XML bihurtu PDFToXML.header=PDFa XML bihurtu PDFToXML.credit=Zerbitzu honek LibreOffice erabiltzen du fitxategiak bihurtzeko PDFToXML.submit=Bihurtu + +#PDFToCSV +PDFToCSV.title=PDF a CSV +PDFToCSV.header=PDF a CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=Extracto + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index fd302f2ea..b36ca85c0 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -1,7 +1,7 @@ ########### # Generic # ########### -# the direction that the language is written (ltr = left to right, rtl = right to left) +# the direction that the language is written (ltr=left to right, rtl = right to left) language.direction=ltr pdfPrompt=Sélectionnez le(s) PDF @@ -43,7 +43,11 @@ green=Vert blue=Bleu custom=Personnalisé\u2026 - +changedCredsMessage=Les identifiants ont été mis à jour\u00a0! +notAuthenticatedMessage=Utilisateur non authentifié. +userNotFoundMessage=Utilisateur non trouvé. +incorrectPasswordMessage=Le mot de passe actuel est incorrect. +usernameExistsMessage=Le nouveau nom d\u2019utilisateur existe déjà. @@ -71,11 +75,25 @@ settings.zipThreshold=Compresser les fichiers en ZIP lorsque le nombre de fichie settings.signOut=Déconnexion settings.accountSettings=Paramètres du compte + + +changeCreds.title=Modifiez vos identifiants +changeCreds.header=Mettez à jour vos identifiants de connexion +changeCreds.changeUserAndPassword=Vous utilisez les identifiants de connexion par défaut. Veuillez entrer un nouveau mot de passe (et nom d\u2019utilisateur si vous le souhaitez) +changeCreds.newUsername=Nouveau nom d\u2019utilisateur +changeCreds.oldPassword=Mot de passe actuel +changeCreds.newPassword=Nouveau mot de passe +changeCreds.confirmNewPassword=Confirmer le nouveau mot de passe +changeCreds.submit=Soumettre les modifications + + + account.title=Paramètres du compte account.accountSettings=Paramètres du compte account.adminSettings=Paramètres d\u2019administration \u2013 Voir et ajouter des utilisateurs account.userControlSettings=Contrôle des paramètres des utilisateurs account.changeUsername=Modifier le nom d\u2019utilisateur +account.changeUsername=Modifier le nom d\u2019utilisateur account.password=Mot de passe de confirmation account.oldPassword=Ancien mot de passe account.newPassword=Nouveau mot de passe @@ -101,14 +119,20 @@ adminUserSettings.role=Rôle adminUserSettings.actions=Actions adminUserSettings.apiUser=Utilisateur API limité adminUserSettings.webOnlyUser=Utilisateur Web uniquement +adminUserSettings.forceChange=Forcer l\u2019utilisateur à changer son nom d\u2019utilisateur/mot de passe lors de la connexion adminUserSettings.submit=Ajouter ############# # HOME-PAGE # ############# home.desc=Votre application Web hébergée localement pour répondre à tous vos besoins PDF. +home.searchBar=Rechercher des fonctionnalités... +home.viewPdf.title=Visionner le PDF +home.viewPdf.desc=Visionner, annoter, ajouter du texte ou des images +viewPdf.tags=visualiser,lire,annoter,texte,image + home.multiTool.title=Outil multifonction PDF home.multiTool.desc=Fusionnez, faites pivoter, réorganisez et supprimez des pages. multiTool.tags=outil multifonction,opération multifonction,interface utilisateur,glisser déposer,front-end,client side,interactif,intransigeant,déplacer,multi tool @@ -306,12 +330,30 @@ PdfToSinglePage.tags=fusionner,merge,une seule page,single page home.showJS.title=Afficher le JavaScript home.showJS.desc=Recherche et affiche tout JavaScript injecté dans un PDF. -showJS.tags=afficher,javascript,js +showJS.tags=caviarder,redact,auto home.autoRedact.title=Caviarder automatiquement home.autoRedact.desc=Caviardez automatiquement les informations sensibles d\u2019un PDF. showJS.tags=caviarder,redact,auto +home.tableExtraxt.title=PDF en CSV +home.tableExtraxt.desc=Extrait les tableaux d\u2019un PDF et les transforme en CSV +tableExtraxt.tags=CSV,Table Extraction,extract,convert + + +home.autoSizeSplitPDF.title=Séparer automatiquement par taille/nombre +home.autoSizeSplitPDF.desc=Séparer un PDF unique en plusieurs documents en fonction de la taille, du nombre de pages ou du nombre de documents. +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Incrustation de PDF +home.overlay-pdfs.desc=Incrustation d\u2019un PDF sur un autre 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 +split-by-sections.tags=Section Split, Divide, Customize + ########################### # # # WEB PAGES # @@ -411,7 +453,7 @@ addPageNumbers.selectText.5=Pages à numéroter addPageNumbers.selectText.6=Texte personnalisé addPageNumbers.customTextDesc=Texte personnalisé addPageNumbers.numberPagesDesc=Quelles pages numéroter, par défaut 'all' (toutes les pages), accepte également 1-5 ou 2,5,9, etc. -addPageNumbers.customNumberDesc=La valeur par défaut est '{n}', accepte également 'Page {n} sur {total}', 'Texte-{n}', '{filename}-{n} +addPageNumbers.customNumberDesc=La valeur par défaut est '{n}', accepte également 'Page {n} sur {total}', 'Texte-{n}', '{filename}-{n}' addPageNumbers.submit=Ajouter les numéros de page @@ -459,6 +501,7 @@ pipeline.title=Pipeline pageLayout.title=Fusionner des pages pageLayout.header=Fusionner des pages pageLayout.pagesPerSheet=Pages par feuille +pageLayout.addBorder=Ajouter des bordures pageLayout.submit=Fusionner @@ -538,7 +581,7 @@ ScannerImageSplit.selectText.8=Définit la surface de contour minimale pour une ScannerImageSplit.selectText.9=Taille de la bordure ScannerImageSplit.selectText.10=Définit la taille de la bordure ajoutée et supprimée pour éviter les bordures blanches dans la sortie (par défaut\u00a0: 1). - + #OCR ocr.title=OCR / Nettoyage des numérisations ocr.header=OCR (Reconnaissance optique de caractères) / Nettoyage des numérisations @@ -612,6 +655,9 @@ pdfOrganiser.submit=Organiser multiTool.title=Outil multifonction PDF multiTool.header=Outil multifonction PDF +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=Supprimer des pages @@ -627,7 +673,7 @@ rotate.selectAngle=Angle de rotation (par multiples de 90\u202fdegrés) rotate.submit=Pivoter -#split +#merge split.title=Diviser split.header=Diviser split.desc.1=Les numéros que vous sélectionnez sont le numéro de page sur lequel vous souhaitez faire une division @@ -642,17 +688,20 @@ split.splitPages=Pages sur lesquelles diviser split.submit=Diviser -#imageToPDF +#merge imageToPDF.title=Image en PDF imageToPDF.header=Image en PDF -imageToPDF.selectText.1=Étirer pour adapter +imageToPDF.submit=Convertir +imageToPDF.selectLabel=Options d\u2019ajustement de l\u2019image +imageToPDF.fillPage=Remplir la page +imageToPDF.fitDocumentToImage=Ajuster la page à l\u2019image +imageToPDF.maintainAspectRatio=Maintenir les proportions imageToPDF.selectText.2=Rotation automatique du PDF imageToPDF.selectText.3=Logique multi-fichiers (uniquement activée si vous travaillez avec plusieurs images) imageToPDF.selectText.4=Fusionner en un seul PDF imageToPDF.selectText.5=Convertir en PDF séparés -imageToPDF.submit=Convertir - - + + #pdfToImage pdfToImage.title=Image en PDF pdfToImage.header=Image en PDF @@ -730,7 +779,7 @@ removePassword.submit=Supprimer #changeMetadata -changeMetadata.title=Modifier les métadonnées +changeMetadata.title=Titre changeMetadata.header=Modifier les métadonnées changeMetadata.selectText.1=Veuillez modifier les variables que vous souhaitez modifier. changeMetadata.selectText.2=Supprimer toutes les métadonnées @@ -792,3 +841,45 @@ PDFToXML.title=PDF en XML PDFToXML.header=PDF en XML PDFToXML.credit=Ce service utilise LibreOffice pour la conversion de fichiers. PDFToXML.submit=Convertir + +#PDFToCSV +PDFToCSV.title=PDF en CSV +PDFToCSV.header=PDF en CSV +PDFToCSV.prompt=Choisir la page pour en extraire le tableau +PDFToCSV.submit=Extrait + +#split-by-size-or-count +split-by-size-or-count.header=Séparer le PDF par taille ou par nombre +split-by-size-or-count.type.label=Sélectionner le type de division +split-by-size-or-count.type.size=Par taille +split-by-size-or-count.type.pageCount=Par nombre de pages +split-by-size-or-count.type.docCount=Par nombre de documents +split-by-size-or-count.value.label=Entrer la valeur +split-by-size-or-count.value.placeholder=Saisir la taille (par exemple, 2MB ou 3KB) ou le nombre (par exemple, 5) +split-by-size-or-count.submit=Séparer + + +#overlay-pdfs +overlay-pdfs.header=Overlay PDF Files +overlay-pdfs.baseFile.label=Sélectionner le fichier PDF de base +overlay-pdfs.overlayFiles.label=Sélectionner les fichiers PDF à superposer +overlay-pdfs.mode.label=Select Overlay Mode +overlay-pdfs.mode.sequential=Sequential Overlay +overlay-pdfs.mode.interleaved=Interleaved Overlay +overlay-pdfs.mode.fixedRepeat=Superposition à répétition fixe +overlay-pdfs.counts.label=Nombre de superpositions (pour le mode de répétition fixe) +overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1) +overlay-pdfs.position.label=Select Overlay Position +overlay-pdfs.position.foreground=Premier plan +overlay-pdfs.position.background=Arrière-plan +overlay-pdfs.submit=Submit + + +#split-by-sections +split-by-sections.title=Diviser le PDF en sections +split-by-sections.header=Diviser le PDF en sections +split-by-sections.horizontal.label=Divisions horizontales +split-by-sections.vertical.label=Divisions verticales +split-by-sections.horizontal.placeholder=Saisir le nombre de divisions horizontales +split-by-sections.vertical.placeholder=Entrer le nombre de divisions verticales +split-by-sections.submit=Diviser le PDF diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties new file mode 100644 index 000000000..0ae1324ea --- /dev/null +++ b/src/main/resources/messages_hu_HU.properties @@ -0,0 +1,874 @@ +########### +# Generic # +########### +# the direction that the language is written (ltr = left to right, rtl = right to left) +language.direction=ltr + +pdfPrompt=Válasszon PDF-fájlokat +multiPdfPrompt=Válasszon PDF-fájlokat (2+) +multiPdfDropPrompt=Válassza ki (vagy húzza ide) az összes szükséges PDF-fájlt +imgPrompt=Válasszon képeket +genericSubmit=Beküldés +processTimeWarning=Figyelmeztetés: Ez a folyamat akár egy percig is eltarthat a fájlmérettől függően +pageOrderPrompt=Egyedi oldalsorrend (Adjon meg vesszővel elválasztott oldalszámokat vagy függvényeket, például 2n+1): +goToPage=Ugrás +true=Igaz +false=Hamis +unknown=Ismeretlen +save=Mentés +close=Bezárás +filesSelected=kiválasztott fájlok +noFavourites=Nincs hozzáadva kedvenc +bored=Unatkozol? +alphabet=Ábécé +downloadPdf=PDF letöltése +text=Szöveg +font=Betűtípus +selectFillter=-- Válasszon -- +pageNum=Oldalszám +sizes.small=Kicsi +sizes.medium=Közepes +sizes.large=Nagy +sizes.x-large=X-Nagy +error.pdfPassword=A PDF-dokumentum jelszóval védett, és vagy nem adták meg a jelszót, vagy helytelen volt +delete=Törlés +username=Felhasználónév +password=Jelszó +welcome=Üdvözöljük +property=Tulajdonság +black=Fekete +white=Fehér +red=Piros +green=Zöld +blue=Kék +custom=Egyedi... + +changedCredsMessage=A hitelek megváltoztak! +notAuthenticatedMessage=Felhasználó nincs hitelesítve. +userNotFoundMessage=A felhasználó nem található. +incorrectPasswordMessage=A jelenlegi jelszó helytelen. +usernameExistsMessage=Az új felhasználónév már létezik. + + +############# +# NAVBAR # +############# +navbar.convert=Átalakítás +navbar.security=Biztonság +navbar.other=Egyéb +navbar.darkmode=Sötét mód +navbar.pageOps=Lap műveletek +navbar.settings=Beállítások + + +############# +# SETTINGS # +############# +settings.title=Beállítások +settings.update=Frisítés elérhető +settings.appVersion=App Verzió: +settings.downloadOption.title=Válassza ki a letöltési lehetőséget (Egyetlen fájl esetén a nem tömörített letöltésekhez): +settings.downloadOption.1=Nyissa meg ugyanabban az ablakban +settings.downloadOption.2=Nyissa meg új ablakban +settings.downloadOption.3=Töltse le a fájlt +settings.zipThreshold=Fájlok tömörítése, ha a letöltött fájlok száma meghaladja +settings.signOut=Kijelentkezés +settings.accountSettings=Fiókbeállítások + + +changeCreds.title=Hitelesítés megváltoztatása +changeCreds.header=Frissítse fiókadatait +changeCreds.changeUserAndPassword=Alapértelmezett bejelentkezési adatokat használ. Adjon meg egy új jelszót (és felhasználónevet, ha szeretné) +changeCreds.newUsername=Új felhasználónév +changeCreds.oldPassword=Jelenlegi jelszó +changeCreds.newPassword=Új jelszó +changeCreds.confirmNewPassword=Új jelszó megerősítése +changeCreds.submit=Változtatások elküldése + + +account.title=Fiókbeállítások +account.accountSettings=Fiókbeállítások +account.adminSettings=Admin Beállítások - Felhasználók megtekintése és hozzáadása +account.userControlSettings=Felhasználói vezérlési beállítások +account.changeUsername=Új felhasználónév +account.password=Megerősítő jelszó +account.oldPassword=Régi jelszó +account.newPassword=Új jelszó +account.changePassword=Jelszó módosítása +account.confirmNewPassword=Új jelszó megerősítése +account.signOut=Kijelentkezés +account.yourApiKey=Az Ön API-kulcsa +account.syncTitle=Böngészőbeállítások szinkronizálása a fiókkal +account.settingsCompare=Beállítások összehasonlítása: +account.property=Ingatlan +account.webBrowserSettings=Web Böngésző beállítása +account.syncToBrowser=Szinkronizálás Fiók -> Böngésző +account.syncToAccount=Szinkronizálás Fiók <- Böngésző + + +adminUserSettings.title=Felhasználói Vezérlési Beállítások +adminUserSettings.header=Adminisztrátori Felhasználói Vezérlési Beállítások +adminUserSettings.admin=Adminisztrátor +adminUserSettings.user=Felhasználó +adminUserSettings.addUser=Új felhasználó hozzáadása +adminUserSettings.roles=Szerepek +adminUserSettings.role=Szerep +adminUserSettings.actions=Műveletek +adminUserSettings.apiUser=Korlátozott API-felhasználó +adminUserSettings.webOnlyUser=Csak webes felhasználó +adminUserSettings.forceChange=Kényszerítse a felhasználót a felhasználónév/jelszó megváltoztatására bejelentkezéskor +adminUserSettings.submit=Felhasználó mentése + + +############# +# HOME-PAGE # +############# +home.desc=Lokálisan hostolt egyszerű megoldás minden PDF igényéhez. +home.searchBar=Keresés funkciókra... + +home.viewPdf.title=PDF Megtekintése +home.viewPdf.desc=Megtekintés, annotálás, szöveg vagy képek hozzáadása +viewPdf.tags=megtekintés,olvasás,annotálás,szöveg,kép + +home.multiTool.title=PDF Multi Eszköz +home.multiTool.desc=Egyesítés, forgatás, átrendezés és lapok eltávolítása +multiTool.tags=Multi Eszköz,Multi művelet,UI,kattintás húzás,előtér,ügyfél oldal,interaktív,megfogható,mozgás + +home.merge.title=Egyesítés +home.merge.desc=Több PDF egyszerű egyesítése. +merge.tags=egyesítés,Lapműveletek,Háttér,server oldal + +home.split.title=Osztás +home.split.desc=PDF-ek felosztása több dokumentumra +split.tags=Lapműveletek,osztás,Több oldal,vágás,server oldal + +home.rotate.title=Forgatás +home.rotate.desc=PDF-ek egyszerű forgatása. +rotate.tags=server oldal + +home.imageToPdf.title=Kép PDF-be +home.imageToPdf.desc=Kép (PNG, JPEG, GIF) konvertálása PDF-fé. +imageToPdf.tags=konverzió,img,jpg,kép,fotó + +home.pdfToImage.title=PDF képpé +home.pdfToImage.desc=PDF konvertálása képpé. (PNG, JPEG, GIF) +pdfToImage.tags=konverzió,img,jpg,kép,fotó + +home.pdfOrganiser.title=Szervezés +home.pdfOrganiser.desc=Lapok eltávolítása/átszervezése bármilyen sorrendben +pdfOrganiser.tags=duplex,páros,páratlan,rendezés,mozgatás + +home.addImage.title=Kép hozzáadása +home.addImage.desc=Kép hozzáadása a PDF megadott helyére +addImage.tags=img,jpg,kép,fotó + +home.watermark.title=Vízjel hozzáadása +home.watermark.desc=Egyéni vízjel hozzáadása a PDF dokumentumhoz. +watermark.tags=Szöveg,ismétlődő,címke,saját,szerzői jog,védjegy,img,jpg,kép,fotó + +home.permissions.title=Engedélyek módosítása +home.permissions.desc=Változtassa meg a PDF dokumentum engedélyeit +permissions.tags=olvasás,írás,szerkesztés,nyomtatás + +home.removePages.title=Eltávolítás +home.removePages.desc=Szükségtelen lapok törlése a PDF dokumentumból. +removePages.tags=Lapok eltávolítása,lapok törlése + +home.addPassword.title=Jelszó hozzáadása +home.addPassword.desc=Titkosítsa a PDF dokumentumát jelszóval. +addPassword.tags=biztonság,biztonságos + +home.removePassword.title=Jelszó eltávolítása +home.removePassword.desc=Vegye le a jelszóvédelmet a PDF dokumentumáról. +removePassword.tags=biztonság,Lezárat, biztonság,jelszó törlése + +home.compressPdfs.title=Tömörítés +home.compressPdfs.desc=PDF-ek tömörítése a fájlméret csökkentése érdekében. +compressPdfs.tags=szorít,kicsi,miniatűr + +home.changeMetadata.title=Metaadatok Módosítása +home.changeMetadata.desc=Metaadatok Módosítása/Eltávolítása/Hozzáadása egy PDF dokumentumból +changeMetadata.tags=Cím,szerző,dátum,alkotás,idő,közzétevő,gyártó,statisztika + +home.fileToPDF.title=Fájl konvertálása PDF-be +home.fileToPDF.desc=Közel minden fájl konvertálása PDF-be (DOCX, PNG, XLS, PPT, TXT és más) +fileToPDF.tags=transzformáció,formátum,dokumentum,kép,dia,szöveg,konverzió,iroda,dokumentumok,word,excel,powerpoint + +home.ocr.title=OCR / Tisztítás szkennelésekből +home.ocr.desc=Tisztítás szkennelésekből és szöveg észlelése képeken belül egy PDF-ben, majd visszahozza szövegként. +ocr.tags=felismerés,szöveg,kép,szken,gép,felismert,azonosítás,szerkeszthető + +home.extractImages.title=Képek kinyerése +home.extractImages.desc=Az összes kép kinyerése egy PDF-ből és mentése zip-be +extractImages.tags=kép,fotó,mentés,archívum,zip,rögzítés,gyűjtés + +home.pdfToPDFA.title=PDF >> PDF/A +home.pdfToPDFA.desc=PDF konvertálása PDF/A formátumra hosszú távú tárolás céljából +pdfToPDFA.tags=archívum,hosszú távú,standard,konverzió,tárolás,megőrzés + +home.PDFToWord.title=PDF >> Word +home.PDFToWord.desc=PDF konvertálása Word formátumokra (DOC, DOCX és ODT) +PDFToWord.tags=doc,docx,odt,word,transzformáció,formátum,konverzió,iroda,microsoft,docfile + +home.PDFToPresentation.title=PDF >> Presentation +home.PDFToPresentation.desc=PDF konvertálása prezentációs formátumokra (PPT, PPTX és ODP) +PDFToPresentation.tags=dia,bemutatás,iroda,microsoft + +home.PDFToText.title=PDF >> RTF (szöveg) +home.PDFToText.desc=PDF konvertálása Szöveg vagy RTF formátumra +PDFToText.tags=richformat,rich text format + +home.PDFToHTML.title=PDF >> HTML +home.PDFToHTML.desc=PDF konvertálása HTML formátumra +PDFToHTML.tags=web tartalom,böngészőbarát + +home.PDFToXML.title=PDF >> XML +home.PDFToXML.desc=PDF konvertálása XML formátumra +PDFToXML.tags=adat-kinyerés,strukturált tartalom,interop,konverzió + +home.ScannerImageSplit.title=Szkennelt fotók észlelése/Osztás +home.ScannerImageSplit.desc=Több fénykép szétválasztása egy fénykép/PDF-ben belül +ScannerImageSplit.tags=külön,kép észlelés,szkennelés,többfénykép,szervez + +home.sign.title=Aláírás +home.sign.desc=Aláírás hozzáadása PDF-hez rajzzal, szöveggel vagy képpel +sign.tags=jogosítvány,jegyzék,rajzolt-aláírás,szöveg-aláírás,kép-aláírás + +home.flatten.title=Lapok laposítása +home.flatten.desc=Minden interaktív elem és űrlap eltávolítása egy PDF-ből +flatten.tags=statikus,dezaktiválás,nem-interaktív,egyszerűsít + +home.repair.title=Javítás +home.repair.desc=Megpróbálja helyreállítani a sérült/hiba PDF-t +repair.tags=javítás,visszaállítás,korrektúra,visszaszerzés + +home.removeBlanks.title=Üres lapok eltávolítása +home.removeBlanks.desc=Felismeri és eltávolítja az üres lapokat a dokumentumból +removeBlanks.tags=takarítás,egyszerűsítés,nem-tartalom,szervez + +home.compare.title=Összehasonlítás +home.compare.desc=Összehasonlítja és megmutatja a különbségeket két PDF dokumentum között +compare.tags=kiemel,ellentét,változások,elemzés + +home.certSign.title=Aláírás Tanúsítvánnyal +home.certSign.desc=PDF aláírása tanúsítvánnyal/kulccsal (PEM/P12) +certSign.tags=hitelesítés,PEM,P12,hivatalos,segitít,álca + +home.pageLayout.title=Több oldal elrendezése +home.pageLayout.desc=Több oldal egyesítése egy PDF dokumentumban egyetlen oldallá +pageLayout.tags=egyesítés,kompozit,egy oldal,megszervez + +home.scalePages.title=Oldalméret/skála beállítása +home.scalePages.desc=Oldal méretének/skálájának megváltoztatása és/vagy tartalmának +scalePages.tags=átalakítás,módosítás,méret,alkalmazkodik + +home.pipeline.title=Csővezeték (Haladó) +home.pipeline.desc=Több művelet futtatása PDF-eken csővezeték scriptek definiálásával +pipeline.tags=automatizálás,sorrend,szkriptelt,csomag-feldolgozás + +home.add-page-numbers.title=Lapok számának hozzáadása +home.add-page-numbers.desc=Lapszám hozzáadása a dokumentumhoz egy meghatározott helyen +add-page-numbers.tags=lapszámozás,címke,szervez,index + +home.auto-rename.title=Automatikus átnevezés PDF fájl +home.auto-rename.desc=Automatikusan átnevezi a PDF fájlt a felderített fejléc alapján +auto-rename.tags=auto-felismerés,fejléc-alapú,szervezés,címkézés + +home.adjust-contrast.title=Színek/Kontraszt beállítása +home.adjust-contrast.desc=PDF kontrasztjának, telítettségének és világosságának beállítása +adjust-contrast.tags=szín-korrekció,beállítás,módosítás,fokoz + +home.crop.title=Crop PDF +home.crop.desc=PDF vágása a méret csökkentése érdekében (a szöveg megőrzése mellett!) +crop.tags=vágás,csökkentés,szerkesztés,forma + +home.autoSplitPDF.title=Automatikus oldalak szétválasztása +home.autoSplitPDF.desc=Automatikus szétválasztás a beolvasott oldalas PDF alapján fizikai szkennelt oldal szétválasztó QR kóddal +autoSplitPDF.tags=QR-alapú,külön,szkennel-oldal,szervez + +home.sanitizePdf.title=Szankcionálás +home.sanitizePdf.desc=Szankcionálja a szkripteket és egyéb elemeket a PDF fájlokból +sanitizePdf.tags=tisztítás,biztonságos,biztonság,töröl-veszélyek + +home.URLToPDF.title=URL/Weboldal PDF-be +home.URLToPDF.desc=Bármely http(s) URL átalakítása PDF-be +URLToPDF.tags=web-rögzítés,oldal-mentés,web-dokumentum,archívum + +home.HTMLToPDF.title=HTML PDF-be +home.HTMLToPDF.desc=Bármely HTML fájl vagy tömörített fájl átalakítása PDF-be +HTMLToPDF.tags=markup,web-tartalom,transzformáció,konverzió + +home.MarkdownToPDF.title=Markdown PDF-be +home.MarkdownToPDF.desc=Bármely Markdown fájl átalakítása PDF-be +MarkdownToPDF.tags=markup,web-tartalom,transzformáció,konverzió + +home.getPdfInfo.title=Összes információ a PDF-ről +home.getPdfInfo.desc=Az összes lehetséges információ beszerzése a PDF-ekről +getPdfInfo.tags=információ,adat,statisztika,statisztika + +home.extractPage.title=Lapok kinyerése +home.extractPage.desc=Válassza ki a lapokat a PDF-ből +extractPage.tags=kinyer + +home.PdfToSinglePage.title=PDF egyetlen nagy lapba +home.PdfToSinglePage.desc=Az összes PDF lap egyesítése egyetlen nagy lapba +PdfToSinglePage.tags=egyetlen lap + +home.showJS.title=JavaScript megjelenítése +home.showJS.desc=Keres és megjelenít bármilyen JS-t, amit beinjektáltak a PDF-be +showJS.tags=JS + +home.autoRedact.title=Automatikus Elrejtés +home.autoRedact.desc=Automatikusan kitakar (elrejt) szöveget egy PDF-ben az input szöveg alapján +showJS.tags=Elrejt,Elrejtés,kitakarás,fekete,fekete,marker,elrejtett + +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Táblázatok kinyerése a PDF-ből CSV formátumra konvertálva +tableExtraxt.tags=CSV,Táblázat kinyerése,kinyer,konvertál + +home.autoSizeSplitPDF.title=Automatikus szétválasztás méret/számláló alapján +home.autoSizeSplitPDF.desc=Egyetlen PDF szétválasztása több dokumentummá méret, oldalszám vagy dokumentum szám alapján +autoSizeSplitPDF.tags=pdf,szétválasztás,dokumentum,szervezet + +home.overlay-pdfs.title=PDF fájlok átlapolása +home.overlay-pdfs.desc=PDF fájlok átlapolása egyik dokumentum a másik fölé helyezésével +overlay-pdfs.tags=Átlapolás + +home.split-by-sections.title=PDF Szakaszokra osztása +home.split-by-sections.desc=Minden oldal felosztása kisebb vízszintes és függőleges szakaszokra +split-by-sections.tags=Szakasz elosztás, felosztás, testreszabás + + +########################### +# # +# WEB PAGES # +# # +########################### +#login +login.title=Bejelentkezés +login.signin=Bejelentkezés +login.rememberme=Emlékezz rám +login.invalid=Érvénytelen felhasználónév vagy jelszó! +login.locked=A fiókja zárolva lett! +login.signinTitle=Kérjük, jelentkezzen be! + + +#auto-redact +autoRedact.title=Érzékeny tartalom eltávolítása +autoRedact.header=Érzékeny tartalom eltávolítása +autoRedact.colorLabel=Szín +autoRedact.textsToRedactLabel=Kivonand szövegek (sorokra bontva) +autoRedact.textsToRedactPlaceholder=például \nBizalmas \nLegfelsőbb Titok +autoRedact.useRegexLabel=Reguláris kifejezés használata +autoRedact.wholeWordSearchLabel=Teljes szó keresése +autoRedact.customPaddingLabel=Egyedi extra kitöltés +autoRedact.convertPDFToImageLabel=PDF átalakítása PDF-képé (a doboz mögötti szöveg eltávolításához) +autoRedact.submitButton=Elküld + + +#showJS +showJS.title=JavaScript megjelenítése +showJS.header=JavaScript megjelenítése +showJS.downloadJS=JavaScript letöltése +showJS.submit=Megjelenítés + + +#pdfToSinglePage +pdfToSinglePage.title=PDF egyetlen oldalra +pdfToSinglePage.header=PDF egyetlen oldalra +pdfToSinglePage.submit=Átalakítás egyetlen oldallá + + +#pageExtracter +pageExtracter.title=Oldalak kinyerése +pageExtracter.header=Oldalak kinyerése +pageExtracter.submit=Kinyerés + + +#getPdfInfo +getPdfInfo.title=Információk kinyerése a PDF-ről +getPdfInfo.header=Információk kinyerése a PDF-ről +getPdfInfo.submit=Információk kinyerése +getPdfInfo.downloadJson=JSON letöltése + + +#markdown-to-pdf +MarkdownToPDF.title=Markdown >> PDF +MarkdownToPDF.header=Markdown >> PDF +MarkdownToPDF.submit=Átalakítás +MarkdownToPDF.help=Az átalakítás folyamatban +MarkdownToPDF.credit=WeasyPrint alkalmazása + + +#url-to-pdf +URLToPDF.title=URL >> PDF +URLToPDF.header=URL >> PDF +URLToPDF.submit=Átalakítás +URLToPDF.credit=WeasyPrint alkalmazása + + +#html-to-pdf +HTMLToPDF.title=HTML >> PDF +HTMLToPDF.header=HTML >> PDF +HTMLToPDF.help=Elfogad HTML fájlokat és ZIP-fájlokat, amelyek tartalmaznak html/css/képeket stb. +HTMLToPDF.submit=Átalakítás +HTMLToPDF.credit=WeasyPrint alkalmazása + + +#sanitizePDF +sanitizePDF.title=PDF tisztítása +sanitizePDF.header=PDF fájl megtisztítása +sanitizePDF.selectText.1=JavaScript műveletek eltávolítása +sanitizePDF.selectText.2=Beágyazott fájlok eltávolítása +sanitizePDF.selectText.3=Metaadatok eltávolítása +sanitizePDF.selectText.4=Hivatkozások eltávolítása +sanitizePDF.selectText.5=Betűtípusok eltávolítása +sanitizePDF.submit=PDF tisztítása + + +#addPageNumbers +addPageNumbers.title=Oldalszámok hozzáadása +addPageNumbers.header=Oldalszámok hozzáadása +addPageNumbers.selectText.1=Válassza ki a PDF fájlt: +addPageNumbers.selectText.2=Margó mérete +addPageNumbers.selectText.3=Pozíció +addPageNumbers.selectText.4=Kezdő szám +addPageNumbers.selectText.5=Oldalak számozása +addPageNumbers.selectText.6=Egyedi szöveg +addPageNumbers.customTextDesc=Egyedi szöveg +addPageNumbers.numberPagesDesc=Melyik oldalakat számozzuk? Alapértelmezés szerint 'mind', vagy megadhatja még így: 1-5, esetleg 2,5,9. +addPageNumbers.customNumberDesc=Alapértelmezés szerint {n}, megadhatja még 'Oldal {n} a {teljes}', 'Szöveg-{n}', '{fájlnév}-{n}' formában. +addPageNumbers.submit=Oldalszámok hozzáadása + + +#auto-rename +auto-rename.title=Automatikus átnevezés +auto-rename.header=Automatikus átnevezés PDF +auto-rename.submit=Automatikus átnevezés + + +#adjustContrast +adjustContrast.title=Kontraszt beállítása +adjustContrast.header=Kontraszt beállítása +adjustContrast.contrast=Kontraszt: +adjustContrast.brightness=Fényerő: +adjustContrast.saturation=Színtelítettség: +adjustContrast.download=Letöltés + + +#crop +crop.title=Körülvágás +crop.header=Kép körülvégésa +crop.submit=Elküldés + + +#autoSplitPDF +autoSplitPDF.title=Automatikus PDF szétválasztás +autoSplitPDF.header=Automatikus PDF szétválasztás +autoSplitPDF.description=Nyomtasson, helyezzen be, szkenneljen, töltse fel, és hagyja, hogy az automatikus szétválasztás elvégezze a dokumentumok rendezését. A rendezéshez nincs szükség manuális beavatkozásra. +autoSplitPDF.selectText.1=Nyomtasson ki néhány elválasztó lapot lentebb (Fekete-fehér is megfelel). +autoSplitPDF.selectText.2=Helyezze be az összes dokumentumot egyszerre az elválasztó lapok közé történő beillesztéssel. +autoSplitPDF.selectText.3=Töltse fel a készített egyetlen nagy szkennelt PDF fájlt, és hagyja, hogy a Stirling PDF megoldja a többit. +autoSplitPDF.selectText.4=Az elválasztó lapok automatikusan észlelhetők és eltávolíthatók, így garantáltan tiszta lesz a végső dokumentum. +autoSplitPDF.formPrompt=Küldje el a Stirling-PDF oldal-elválasztót tartalmazó PDF-t: +autoSplitPDF.duplexMode=Duplex mód (Elő- és hátlapi szkennelés) +autoSplitPDF.dividerDownload1='Automatikus Szétválasztó Elválasztólap letöltése (minimális).pdf' +autoSplitPDF.dividerDownload2='Automatikus Szétválasztó Elválasztólap letöltése (utasításokkal).pdf' +autoSplitPDF.submit=Elküldés + + +#pipeline +pipeline.title=Folyamat + + +#pageLayout +pageLayout.title=Többoldalas elrendezés +pageLayout.header=Többoldalas elrendezés +pageLayout.pagesPerSheet=Oldalak laponként: +pageLayout.addBorder=Keret hozzáadása +pageLayout.submit=Elküldés + + +#scalePages +scalePages.title=Oldalméret beállítása +scalePages.header=Oldalméret beállítása +scalePages.pageSize=A dokumentum egy oldalának mérete. +scalePages.scaleFactor=Az oldal nagyításának szintje (vágás). +scalePages.submit=Küldés + + +#certSign +certSign.title=Tanúsítvánnyal történő aláírás +certSign.header=Aláírás PDF tanúsítvánnyal (fejlesztés alatt) +certSign.selectPDF=Válasszon PDF fájlt az aláíráshoz: +certSign.selectKey=Válassza ki a saját kulcsfájlját (PKCS#8 formátum, lehet .pem vagy .der kiterjesztésű): +certSign.selectCert=Válassza ki a tanúsítványfájlját (X.509 formátum, lehet .pem vagy .der kiterjesztésű): +certSign.selectP12=Válassza ki a PKCS#12 kulcstár fájlját (.p12 vagy .pfx) (Opcionális, ha rendelkezésre áll, tartalmaznia kell a privát kulcsot és a tanúsítványt.): +certSign.certType=Tanúsítvány típusa +certSign.password=Adja meg a kulcstár vagy a privát kulcs jelszavát (ha van): +certSign.showSig=Aláírás megjelenítése +certSign.reason=Ok +certSign.location=Hely +certSign.name=Név +certSign.submit=PDF aláírása + + +#removeBlanks +removeBlanks.title=Üres oldalak eltávolítása +removeBlanks.header=Üres oldalak eltávolítása +removeBlanks.threshold=Pixel fehérség küszöbértéke: +removeBlanks.thresholdDesc=A "fehér" pixel meghatározásához szükséges küszöbérték. 0 = fekete, 255 = tiszta fehér. +removeBlanks.whitePercent=Fehér százalék (%): +removeBlanks.whitePercentDesc=Az oldalakon található 'fehér' pixelek százaléka, amelyek eltávolításra kerülnek. +removeBlanks.submit=Üres oldalak eltávolítása + + +#compare +compare.title=Összehasonlítás +compare.header=PDF-ek összehasonlítása +compare.document.1=Dokumentum 1 +compare.document.2=Dokumentum 2 +compare.submit=Összehasonlítás + + +#sign +sign.title=Aláírás +sign.header=PDF-ek aláírása +sign.upload=Kép feltöltése +sign.draw=Aláírás rajzolása +sign.text=Szöveg beírása +sign.clear=Törlés +sign.add=Hozzáadás + + +#repair +repair.title=Javítás +repair.header=PDF-ek javítása +repair.submit=Javítás + + +#flatten +flatten.title=Kiegyenlítés +flatten.header=PDF-ek kiegyenlítése +flatten.submit=Kiegyenlítés + + +#ScannerImageSplit +ScannerImageSplit.selectText.1=Szög küszöbértéke: +ScannerImageSplit.selectText.2=Minimális forgatás abszolút szögének meghatározása (alapértelmezett: 10). +ScannerImageSplit.selectText.3=Tolerancia: +ScannerImageSplit.selectText.4=A háttér szín körülbelüli változási tartományának meghatározása (alapértelmezett: 30). +ScannerImageSplit.selectText.5=Minimális terület: +ScannerImageSplit.selectText.6=A fotók minimális területének beállítása (alapértelmezett: 10000). +ScannerImageSplit.selectText.7=Minimális kontúr terület: +ScannerImageSplit.selectText.8=A fotók minimális kontúrterületének beállítása +ScannerImageSplit.selectText.9=Keret mérete: +ScannerImageSplit.selectText.10=A hozzáadott és eltávolított keret méretének beállítása a fehér keretek elkerülése érdekében a kimeneten (alapértelmezett: 1). + + +#OCR +ocr.title=OCR / szkennelés tisztázása +ocr.header=Szkennelés tisztázása / OCR (Optikai karakterfelismerés) +ocr.selectText.1=Válassza ki azokat a nyelveket, amelyeket fel kell ismerni a PDF-ben (az alább felsoroltak azok, amelyeket jelenleg képesek vagyunk azonosítani): +ocr.selectText.2=Hozzon létre szövegfájlt az OCR szöveg mellett az OCR-es PDF-ben +ocr.selectText.3=Korrigálja azokat az oldalakat, amelyek ferdén lettek beolvasva, és fogassa vissza őket a helyes szögbe +ocr.selectText.4=Tisztítsa meg az oldalt, hogy az OCR pontosabban dolgozzon, ne érzékeljen szöveget a háttérzajban. (Nincs kimeneti változás) +ocr.selectText.5=Tisztítsa meg az oldalt, hogy az OCR pontosabban dolgozzon, ne érzékeljen szöveget a háttérzajban, és a tisztítást a kimeneten is őrizze meg. +ocr.selectText.6=Hagyja figyelmen kívül azokat az oldalakat, amelyeken interaktív szöveg található, csak azon oldalakat dolgozza el OCR-rel, amelyek képek +ocr.selectText.7=OCR kényszerítése, minden oldalt OCR-el, eltávolítva az összes eredeti szövegelemet +ocr.selectText.8=Normál (Hiba esetén, ha a PDF szöveget tartalmaz) +ocr.selectText.9=További beállítások +ocr.selectText.10=OCR mód +ocr.selectText.11=Képek eltávolítása OCR után (Az ÖSSZES kép eltávolítása, csak akkor hasznos, ha a konverzió része) +ocr.selectText.12=Render típusa (Speciális) +ocr.help=Kérjük, olvassa el ezt a dokumentációt az egyéb nyelvek használatához és/vagy a nem Docker-es használathoz. +ocr.credit=Ez a szolgáltatás az OCRmyPDF és a Tesseract OCR használatával működik. +ocr.submit=PDF feldolgozása OCR-rel + + +#extractImages +extractImages.title=Képek kinyerése +extractImages.header=Képek kinyerése +extractImages.selectText=Válassza ki a képformátumot a kinyert képek konvertálásához +extractImages.submit=Kinyerés + + +#File to PDF +fileToPDF.title=Fájl PDF dokumentummá alakítása +fileToPDF.header=Konvertáljon bármilyen fájlt PDF dokumentummá +fileToPDF.credit=Ez a szolgáltatás a LibreOffice-t és az Unoconv-ot használja a fájlkonverzióhoz. +fileToPDF.supportedFileTypes=A funkció az alábbi fájltípusokat támogatja, azonban a teljesen friss támogatott formátumok listájáért kérjük, tekintse meg a LibreOffice dokumentációját +fileToPDF.submit=Konvertálás PDF dokumentummá + + +#compress +compress.title=Tömörítés +compress.header=PDF tömörítése +compress.credit=Ez a szolgáltatás a Ghostscript-et használja a PDF tömörítéséhez/optimalizálásához. +compress.selectText.1=Kézi mód - 1-től 4-ig +compress.selectText.2=Optimalizálási szint: +compress.selectText.3=4 (nem ajánlott a szöveges képekhez) +compress.selectText.4=Automatikus mód - Az automata állítja a minőséget úgy, hogy a beállított méretű PDF-et generálja. +compress.selectText.5=Várt PDF méret (pl. 25MB, 10,8MB, 25KB) +compress.submit=Tömörítés + + +#Add image +addImage.title=Kép hozzáadása +addImage.header=Kép hozzáadása a PDF-hez +addImage.everyPage=Minden oldal? +addImage.upload=Kép hozzáadása +addImage.submit=Kép hozzáadása + + +#merge +merge.title=Összevonás +merge.header=Több PDF összevonása (2+) +merge.sortByName=Név szerinti rendezés +merge.sortByDate=Dátum szerinti rendezés +merge.submit=Összevonás + + +#pdfOrganiser +pdfOrganiser.title=Oldalszervező +pdfOrganiser.header=PDF Oldalszervező +pdfOrganiser.submit=Oldalak átrendezése + + +#multiTool +multiTool.title=PDF többfunkciós eszköz +multiTool.header=PDF többfunkciós eszköz + + +#view pdf +viewPdf.title=PDF megtekintése +viewPdf.header=PDF megtekintése + + +#pageRemover +pageRemover.title=Oldaltörlő +pageRemover.header=PDF oldaltörlő +pageRemover.pagesToDelete=Törlendő oldalak (adja meg az oldalszámok vesszővel elválasztott listáját): +pageRemover.submit=Oldalak törlése + + +#rotate +rotate.title=PDF forgatás +rotate.header=PDF forgatás +rotate.selectAngle=Válassza ki a forgatási szöget (90 fok egész számú többszörösei): +rotate.submit=Forgatás + + +#merge +split.title=PDF szétválasztás +split.header=PDF szétválasztás +split.desc.1=A kiválasztott számok a szétválasztani kívánt oldalszámok +split.desc.2=Például az 1,3,7-8 kiválasztása egy 10 oldalas dokumentumot 6 különálló PDF-fé szétválaszt +split.desc.3=Dokumentum #1: Oldal 1 +split.desc.4=Dokumentum #2: Oldal 2 és 3 +split.desc.5=Dokumentum #3: Oldal 4, 5 és 6 +split.desc.6=Dokumentum #4: Oldal 7 +split.desc.7=Dokumentum #5: Oldal 8 +split.desc.8=Dokumentum #6: Oldal 9 és 10 +split.splitPages=Adja meg az oldalakat, amelyekre szét akarja választani: +split.submit=Szétválasztás + + +#merge +imageToPDF.title=Kép PDF-be +imageToPDF.header=Kép PDF-be +imageToPDF.submit=Átalakítás +imageToPDF.selectLabel=Kép illesztési beállítások +imageToPDF.fillPage=Teljes oldal kitöltése +imageToPDF.fitDocumentToImage=Oldal illesztése a képhez +imageToPDF.maintainAspectRatio=Arányok megtartása +imageToPDF.selectText.2=Automatikus forgatás PDF +imageToPDF.selectText.3=Több fájl logika (csak akkor engedélyezett, ha több képpel dolgozik) +imageToPDF.selectText.4=Egyesítse egyetlen PDF-fé +imageToPDF.selectText.5=Átalakítás különálló PDF-fé + + +#pdfToImage +pdfToImage.title=PDF képpé alakítása +pdfToImage.header=PDF képpé alakítása +pdfToImage.selectText=Képformátum +pdfToImage.singleOrMultiple=Oldal kép típusa +pdfToImage.single=Egyetlen nagy kép az összes oldallal +pdfToImage.multi=Több kép, egy kép oldalanként +pdfToImage.colorType=Szín típusa +pdfToImage.color=színes +pdfToImage.grey=szürkeárnyalatos +pdfToImage.blackwhite=fekete-fehér (adatvesztéssel járhat!) +pdfToImage.submit=Átalakítás + + +#addPassword +addPassword.title=Jelszó hozzáadása +addPassword.header=Jelszó hozzáadása (Titkosítás) +addPassword.selectText.1=Válassza ki a titkosítandó PDF-t +addPassword.selectText.2=Felhasználói jelszó +addPassword.selectText.3=Titkosítási kulcs hossza +addPassword.selectText.4=A magasabb értékek erősebbek, de az alacsonyabb értékek jobb kompatibilitást biztosítanak. +addPassword.selectText.5=Beállítandó engedélyek (Ajánlott a Tulajdonos jelszóval együtt használni) +addPassword.selectText.6=Más dokumentummal történő egyesítés megakadályozása +addPassword.selectText.7=Tartalomkivonás megakadályozása +addPassword.selectText.8=Elérhetőség kivonásának megakadályozása +addPassword.selectText.9=Űrlap kitöltésének megakadályozása +addPassword.selectText.10=Módosítás megakadályozása +addPassword.selectText.11=Jegyzet módosításának megakadályozása +addPassword.selectText.12=Nyomtatás megakadályozása +addPassword.selectText.13=Többféle formátumú nyomtatás megakadályozása +addPassword.selectText.14=Tulajdonos jelszó +addPassword.selectText.15=Korlátozza, hogy mi végezhető el a dokumentum megnyitása után (Nem minden olvasó támogatja) +addPassword.selectText.16=Korlátozza a dokumentum megnyithatságát +addPassword.submit=Titkosítás + + +#watermark +watermark.title=Vízjel hozzáadása +watermark.header=Vízjel hozzáadása +watermark.selectText.1=Válassza ki a PDF-t, amelyhez vízjelet kíván hozzáadni: +watermark.selectText.2=Vízjel szövege: +watermark.selectText.3=Betűméret: +watermark.selectText.4=Forgatás (0-360): +watermark.selectText.5=widthSpacer (Hely a vízjelek között vízszintesen): +watermark.selectText.6=heightSpacer (Hely a vízjelek között függőlegesen): +watermark.selectText.7=Átlátszóság (0% - 100%): +watermark.selectText.8=Vízjel típusa: +watermark.selectText.9=Vízjel képe: +watermark.submit=Vízjel hozzáadása + + +#Change permissions +permissions.title=Jogosultságok módosítása +permissions.header=Jogosultságok módosítása +permissions.warning=Figyelem: Ahhoz, hogy ezek a jogosultságok ne legyenek később módosíthatók, javasolt a dokumentumhoz jelszót beállítani a Jelszó hozzáadása funkcióval. +permissions.selectText.1=Válassza ki a PDF-fájlt a jogosultságok módosításához +permissions.selectText.2=Beállítandó jogosultságok +permissions.selectText.3=Más dokumentummal történő egyesítés megakadályozása +permissions.selectText.4=Tartalom kivonásának megakadályozása +permissions.selectText.5=Elérhetőség kivonásának megakadályozása +permissions.selectText.6=Űrlap kitöltésének megakadályozása +permissions.selectText.7=Módosítás megakadályozása +permissions.selectText.8=Jegyzet módosításának megakadályozása +permissions.selectText.9=Nyomtatás megakadályozása +permissions.selectText.10=Többféle formátumú nyomtatás megakadályozása +permissions.submit=Módosítás + + +#remove password +removePassword.title=Jelszó eltávolítása +removePassword.header=Jelszó eltávolítása (dekódolás) +removePassword.selectText.1=Válassza ki a PDF-fájlt a dekódoláshoz +removePassword.selectText.2=Jelszó +removePassword.submit=Eltávolítás + + +#changeMetadata +changeMetadata.title=Metaadatok módosítása +changeMetadata.header=Metaadatok módosítása +changeMetadata.selectText.1=Kérjük, szerkessze azokat a változókat, amelyeket módosítani szeretne +changeMetadata.selectText.2=Minden metaadat törlése +changeMetadata.selectText.3=Egyedi metaadatok megjelenítése: +changeMetadata.author=Szerző: +changeMetadata.creationDate=Létrehozás dátuma (éééé/hh/nn ÓÓ:PP:MM): +changeMetadata.creator=Létrehozó: +changeMetadata.keywords=Kulcsszavak: +changeMetadata.modDate=Módosítás dátuma (éééé/hh/nn ÓÓ:PP:MM): +changeMetadata.producer=Készítő: +changeMetadata.subject=Tárgy: +changeMetadata.title=Cím: +changeMetadata.trapped=Trapped: +changeMetadata.selectText.4=Egyéb metaadatok: +changeMetadata.selectText.5=Egyedi metaadatbejegyzés hozzáadása +changeMetadata.submit=Módosítás + + +#pdfToPDFA +pdfToPDFA.title=PDF >> PDF/A +pdfToPDFA.header=PDF >> PDF/A +pdfToPDFA.credit=Ez a szolgáltatás az OCRmyPDF-t használja a PDF/A konverzióhoz +pdfToPDFA.submit=Konvertálás + + +#PDFToWord +PDFToWord.title=PDF >> Word +PDFToWord.header=PDF >> Word +PDFToWord.selectText.1=Kimeneti fájlformátum +PDFToWord.credit=Ez a szolgáltatás a LibreOffice-t használja a fájlkonverzióhoz. +PDFToWord.submit=Konvertálás + + +#PDFToPresentation +PDFToPresentation.title=PDF >> prezentáció +PDFToPresentation.header=PDF >> prezentáció +PDFToPresentation.selectText.1=Kimeneti fájlformátum +PDFToPresentation.credit=Ez a szolgáltatás a LibreOffice-t használja a fájlkonverzióhoz. +PDFToPresentation.submit=Konvertálás + + +#PDFToText +PDFToText.title=PDF >> RTF (szöveg) +PDFToText.header=PDF >> RTF (szöveg) +PDFToText.selectText.1=Kimeneti fájlformátum +PDFToText.credit=Ez a szolgáltatás a LibreOffice-t használja a fájlkonverzióhoz. +PDFToText.submit=Konvertálás + + +#PDFToHTML +PDFToHTML.title=PDF >> HTML +PDFToHTML.header=PDF >> HTML +PDFToHTML.credit=Ez a szolgáltatás a LibreOffice-t használja a fájlkonverzióhoz. +PDFToHTML.submit=Konvertálás + + +#PDFToXML +PDFToXML.title=PDF >> XML +PDFToXML.header=PDF >> XML +PDFToXML.credit=Ez a szolgáltatás a LibreOffice-t használja a fájlkonverzióhoz. +PDFToXML.submit=Konvertálás + + +#PDFToCSV +PDFToCSV.title=PDF >> CSV +PDFToCSV.header=PDF >> CSV +PDFToCSV.prompt=Válassza ki az oldalt a táblázat kinyeréséhez +PDFToCSV.submit=Kinyerés + + +#split-by-size-or-count +split-by-size-or-count.header=PDF felosztása méret vagy oldalszám alapján +split-by-size-or-count.type.label=Válassza ki a felosztás típusát +split-by-size-or-count.type.size=Méret alapján +split-by-size-or-count.type.pageCount=Oldalszám alapján +split-by-size-or-count.type.docCount=Dokumentumok száma alapján +split-by-size-or-count.value.label=Adja meg az értéket +split-by-size-or-count.value.placeholder=Adja meg a méretet (pl. 2 MB vagy 3 KB) vagy az oldalszámot (pl. 5) +split-by-size-or-count.submit=Elküld + + +#overlay-pdfs +overlay-pdfs.header=PDF fájlok átfedése +overlay-pdfs.baseFile.label=Válassza ki az alap PDF fájlt +overlay-pdfs.overlayFiles.label=Válassza ki az átfedő PDF fájlokat +overlay-pdfs.mode.label=Válassza ki az átfedés módját +overlay-pdfs.mode.sequential=Soros átfedés +overlay-pdfs.mode.interleaved=Váltott átfedés +overlay-pdfs.mode.fixedRepeat=Rögzített ismétlődő átfedés +overlay-pdfs.counts.label=Átfedések száma (rögzített ismétlődő mód esetén) +overlay-pdfs.counts.placeholder=Adja meg a vesszővel elválasztott számokat (pl. 2,3,1) +overlay-pdfs.position.label=Válassza ki az átfedés pozícióját +overlay-pdfs.position.foreground=Előtér +overlay-pdfs.position.background=Háttér +overlay-pdfs.submit=Elküld + + +#split-by-sections +split-by-sections.title=PDF szakaszokra osztása +split-by-sections.header=PDF szakaszokra osztása +split-by-sections.horizontal.label=Függőleges szakaszok +split-by-sections.vertical.label=Vízszintes szakaszok +split-by-sections.horizontal.placeholder=Adja meg a vízszintes szakaszok számát +split-by-sections.vertical.placeholder=Adja meg a függőleges szakaszok számát +split-by-sections.submit=Felosztás + diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index b302b1718..b301ff304 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -26,27 +26,28 @@ text=Testo font=Font selectFillter=-- Seleziona -- pageNum=Numero pagina -sizes.small=Small -sizes.medium=Medium -sizes.large=Large -sizes.x-large=X-Large -error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect -delete=Delete +sizes.small=Piccolo +sizes.medium=Medio +sizes.large=Largo +sizes.x-large=Extra-Large +error.pdfPassword=Il documento PDF è protetto da password e la password non è stata fornita oppure non era corretta +delete=Elimina username=Username password=Password -welcome=Welcome -########################## -### TODO: Translate ### -########################## -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - +welcome=Benvenuto +property=Proprietà +black=Nero +white=Bianco +red=Rosso +green=Verde +blue=Blu +custom=Personalizzato +changedCredsMessage=Credenziali cambiate! +notAuthenticatedMessage=Utente non autenticato. +userNotFoundMessage=Utente non trovato. +incorrectPasswordMessage=La password attuale non è corretta. +usernameExistsMessage=Il nuovo nome utente esiste già. @@ -71,76 +72,95 @@ settings.downloadOption.1=Apri in questa finestra settings.downloadOption.2=Apri in una nuova finestra settings.downloadOption.3=Scarica file settings.zipThreshold=Comprimi file in .zip quando il numero di download supera -settings.signOut=Sign Out -settings.accountSettings=Account Settings - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser +settings.signOut=Logout +settings.accountSettings=Impostazioni Account -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.submit=Save User + +changeCreds.title=Cambia credenziali +changeCreds.header=Aggiorna i dettagli del tuo account +changeCreds.changeUserAndPassword=Stai utilizzando le credenziali di accesso predefinite. Inserisci una nuova password (e un nome utente se lo desideri) +changeCreds.newUsername=Nuovo nome utente +changeCreds.oldPassword=Password attuale +changeCreds.newPassword=Nuova Password +changeCreds.confirmNewPassword=Conferma Nuova Password +changeCreds.submit=Invia modifiche + + + +account.title=Impostazioni Account +account.accountSettings=Impostazioni Account +account.adminSettings=Impostazioni Admin - Aggiungi e Vedi Utenti +account.userControlSettings=Impostazioni Utente +account.changeUsername=Cambia Username +account.changeUsername=Cambia Username +account.password=Conferma Password +account.oldPassword=Vecchia Password +account.newPassword=Nuova Password +account.changePassword=Cambia Password +account.confirmNewPassword=Conferma Nuova Password +account.signOut=Logout +account.yourApiKey=La tua API Key +account.syncTitle=Sincronizza le impostazioni del browser con l'account +account.settingsCompare=Confronto delle impostazioni: +account.property=Proprietà +account.webBrowserSettings=Impostazione del browser web +account.syncToBrowser=Sincronizza account -> Browser +account.syncToAccount=Sincronizza account <- Browser + + +adminUserSettings.title=Impostazioni di controllo utente +adminUserSettings.header=Impostazioni di controllo utente amministratore +adminUserSettings.admin=Amministratore +adminUserSettings.user=Utente +adminUserSettings.addUser=Aggiungi un nuovo Utente +adminUserSettings.roles=Ruoli +adminUserSettings.role=Ruolo +adminUserSettings.actions=Azioni +adminUserSettings.apiUser=Utente API limitato +adminUserSettings.webOnlyUser=Utente solo Web +adminUserSettings.forceChange=Forza l'utente a cambiare nome username/password all'accesso +adminUserSettings.submit=Salva utente ############# # HOME-PAGE # ############# home.desc=La tua pagina self-hostata per gestire qualsiasi PDF. +home.searchBar=Cerca funzionalità... +home.viewPdf.title=Visualizza PDF +home.viewPdf.desc=Visualizza, annota, aggiungi testo o immagini +viewPdf.tags=visualizzare,leggere,annotare,testo,immagine + home.multiTool.title=Multifunzione PDF home.multiTool.desc=Unisci, Ruota, Riordina, e Rimuovi pagine -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side +multiTool.tags=Strumento multiplo,operazione multipla,interfaccia utente,trascinamento clic,front-end,lato client home.merge.title=Unisci home.merge.desc=Unisci facilmente più PDF in uno. -merge.tags=merge,Page operations,Back end,server side +merge.tags=unione, operazioni sulla pagina, back end, lato server home.split.title=Dividi home.split.desc=Dividi un singolo PDF in più documenti. -split.tags=Page operations,divide,Multi Page,cut,server side +split.tags=Operazioni sulla pagina,divisione,multi pagina,taglio,lato server home.rotate.title=Ruota home.rotate.desc=Ruota un PDF. -rotate.tags=server side +rotate.tags=lato server home.imageToPdf.title=Da immagine a PDF home.imageToPdf.desc=Converti un'immagine (PNG, JPEG, GIF) in PDF. -imageToPdf.tags=conversion,img,jpg,picture,photo +imageToPdf.tags=conversione,img,jpg,immagine,foto home.pdfToImage.title=Da PDF a immagine home.pdfToImage.desc=Converti un PDF in un'immagine. (PNG, JPEG, GIF) -pdfToImage.tags=conversion,img,jpg,picture,photo +pdfToImage.tags=conversione,img,jpg,immagine,foto home.pdfOrganiser.title=Organizza home.pdfOrganiser.desc=Rimuovi/Riordina le pagine in qualsiasi ordine. -pdfOrganiser.tags=duplex,even,odd,sort,move +pdfOrganiser.tags=duplex,pari,dispari,ordinamento,spostamento home.addImage.title=Aggiungi Immagine @@ -149,41 +169,41 @@ addImage.tags=img,jpg,picture,photo home.watermark.title=Aggiungi Filigrana home.watermark.desc=Aggiungi una filigrana al tuo PDF. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo +watermark.tags=Testo,ripetizione,etichetta,proprio,copyright,marchio,img,jpg,immagine,foto home.permissions.title=Cambia Permessi home.permissions.desc=Cambia i permessi del tuo PDF. -permissions.tags=read,write,edit,print +permissions.tags=leggere,scrivere,modificare,stampare home.removePages.title=Rimuovi home.removePages.desc=Elimina alcune pagine dal PDF. -removePages.tags=Remove pages,delete pages +removePages.tags=Rimuovere pagine,eliminare pagine home.addPassword.title=Aggiungi Password home.addPassword.desc=Crittografa il tuo PDF con una password. -addPassword.tags=secure,security +addPassword.tags=sicuro,sicurezza home.removePassword.title=Rimuovi Password home.removePassword.desc=Rimuovi la password dal tuo PDF. -removePassword.tags=secure,Decrypt,security,unpassword,delete password +removePassword.tags=Decriptare,proteggere,rimuovere la password,eliminare la password home.compressPdfs.title=Comprimi home.compressPdfs.desc=Comprimi PDF per ridurne le dimensioni. -compressPdfs.tags=squish,small,tiny +compressPdfs.tags=comprimere,piccolo,minuscolo home.changeMetadata.title=Modifica Proprietà home.changeMetadata.desc=Modifica/Aggiungi/Rimuovi le proprietà di un documento PDF. -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats +changeMetadata.tags==Titolo,autore,data,creazione,ora,editore,produttore,statistiche home.fileToPDF.title=Converti file in PDF home.fileToPDF.desc=Converti quasi ogni file in PDF (DOCX, PNG, XLS, PPT, TXT e altro) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint +fileToPDF.tags=trasformazione,formato,documento,immagine,diapositiva,testo,conversione,ufficio,documenti,parola,excel,powerpoint home.ocr.title=OCR / Pulisci scansioni home.ocr.desc=Pulisci scansioni ed estrai testo da immagini, convertendo le immagini in testo puro. -ocr.tags=recognition,text,image,scan,read,identify,detection,editable +ocr.tags=riconoscimento,testo,immagine,scansione,lettura,identificazione,rilevamento,modificabile home.extractImages.title=Estrai immagini @@ -192,270 +212,285 @@ extractImages.tags=picture,photo,save,archive,zip,capture,grab home.pdfToPDFA.title=Converti in PDF/A home.pdfToPDFA.desc=Converti un PDF nel formato PDF/A per archiviazione a lungo termine. -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation +pdfToPDFA.tags=archivio,a lungo termine,standard,conversione,archiviazione,conservazione home.PDFToWord.title=Da PDF a Word home.PDFToWord.desc=Converti un PDF nei formati Word (DOC, DOCX e ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile +PDFToWord.tags=doc,docx,odt,word,trasformazione,formato,conversione,office,microsoft,filedoc home.PDFToPresentation.title=Da PDF a presentazioni home.PDFToPresentation.desc=Converti un PDF in presentazioni (PPT, PPTX and ODP) -PDFToPresentation.tags=slides,show,office,microsoft +PDFToPresentation.tags=diapositive,mostra,office,microsoft home.PDFToText.title=Da PDF a testo/RTF home.PDFToText.desc=Converti un PDF in testo o RTF. -PDFToText.tags=richformat,richtextformat,rich text format +PDFToText.tags=Microsoft Rich Format,formato Rich Text,formato Rich Text home.PDFToHTML.title=Da PDF ad HTML home.PDFToHTML.desc=Converti un PDF in HTML. -PDFToHTML.tags=web content,browser friendly +PDFToHTML.tags=contenuto web,facile da usare per il browser home.PDFToXML.title=Da PDF a XML home.PDFToXML.desc=Converti un PDF in XML. -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert +PDFToXML.tags=estrazione dati,contenuto strutturato,interoperabilità,trasformazione,conversione home.ScannerImageSplit.title=Trova/Dividi foto scansionate home.ScannerImageSplit.desc=Estrai più foto da una singola foto o PDF. -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize +ScannerImageSplit.tags=separa,rileva automaticamente,scansiona,multi-foto,organizza home.sign.title=Firma home.sign.desc=Aggiungi una firma al PDF da disegno, testo o immagine. -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature +sign.tags=autorizza,iniziali,firma-tracciata,segno-testo,firma-immagine home.flatten.title=Appiattisci home.flatten.desc=Rimuovi tutti gli elementi interattivi e moduli da un PDF. -flatten.tags=static,deactivate,non-interactive,streamline +flatten.tags=statico,disattivato,non interattivo,ottimizzato home.repair.title=Ripara home.repair.desc=Prova a riparare un PDF corrotto. -repair.tags=fix,restore,correction,recover +repair.tags=aggiustare,ripristinare,correggere,recuperare home.removeBlanks.title=Rimuovi pagine vuote home.removeBlanks.desc=Trova e rimuovi pagine vuote da un PDF. -removeBlanks.tags=cleanup,streamline,non-content,organize +removeBlanks.tags=pulire,semplificare,non contenere contenuti,organizzare home.compare.title=Compara home.compare.desc=Vedi e compara le differenze tra due PDF. -compare.tags=differentiate,contrast,changes,analysis +compare.tags=differenziare,contrastare,cambiare,analisi -home.certSign.title=Sign with Certificate -home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt +home.certSign.title=Firma con certificato +home.certSign.desc=Firma un PDF con un certificato/chiave (PEM/P12) +certSign.tags=autenticare,PEM,P12,ufficiale,crittografare -home.pageLayout.title=Multi-Page Layout -home.pageLayout.desc=Merge multiple pages of a PDF document into a single page -pageLayout.tags=merge,composite,single-view,organize +home.pageLayout.title=Layout multipagina +home.pageLayout.desc=Unisci più pagine di un documento PDF in un'unica pagina +pageLayout.tags=unire,comporre,visualizzazione singola,organizzare -home.scalePages.title=Adjust page size/scale -home.scalePages.desc=Change the size/scale of page and/or its contents. -scalePages.tags=resize,modify,dimension,adapt +home.scalePages.title=Regola le dimensioni/scala della pagina +home.scalePages.desc=Modificare le dimensioni/scala della pagina e/o dei suoi contenuti. +scalePages.tags=ridimensionare,modificare,dimensionare,adattare -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts -pipeline.tags=automate,sequence,scripted,batch-process +home.pipeline.title=Pipeline (avanzato) +home.pipeline.desc=Esegui più azioni sui PDF definendo script di pipeline +pipeline.tags=automatizzare,sequenziare,scriptare,elaborare in batch -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location -add-page-numbers.tags=paginate,label,organize,index +home.add-page-numbers.title=Aggiungi numeri di pagina +home.add-page-numbers.desc=Aggiungi numeri di pagina in tutto un documento in una posizione prestabilita +add-page-numbers.tags=impaginare,etichettare,organizzare,indicizzare -home.auto-rename.title=Auto Rename PDF File -home.auto-rename.desc=Auto renames a PDF file based on its detected header -auto-rename.tags=auto-detect,header-based,organize,relabel +home.auto-rename.title=Rinomina automaticamente il file PDF +home.auto-rename.desc=Rinomina automaticamente un file PDF in base all'intestazione rilevata +auto-rename.tags=arilevamento automatico,basato su intestazione,organizzazione,rietichettatura -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF -adjust-contrast.tags=color-correction,tune,modify,enhance +home.adjust-contrast.title=Regola colori/contrasto +home.adjust-contrast.desc=Regola contrasto, saturazione e luminosità di un PDF +adjust-contrast.tags=correzione del colore,messa a punto,modifica,miglioramento -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) -crop.tags=trim,shrink,edit,shape +home.crop.title=Ritaglia PDF +home.crop.desc=Ritaglia un PDF per ridurne le dimensioni (mantiene il testo!) +crop.tags=tagliare,ridurre,modificare,modellare -home.autoSplitPDF.title=Auto Split Pages -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code -autoSplitPDF.tags=QR-based,separate,scan-segment,organize +home.autoSplitPDF.title=Pagine divise automaticamente +home.autoSplitPDF.desc=Dividi automaticamente il PDF scansionato con il codice QR dello divisore di pagina fisico scansionato +autoSplitPDF.tags=Basato su QR,separato,scansiona segmenti,organizza -home.sanitizePdf.title=Sanitize -home.sanitizePdf.desc=Remove scripts and other elements from PDF files -sanitizePdf.tags=clean,secure,safe,remove-threats +home.sanitizePdf.title=Igienizzare +home.sanitizePdf.desc=Rimuovi script e altri elementi dai file PDF +sanitizePdf.tags=pulire,proteggere,rimuovere le minacce -home.URLToPDF.title=URL/Website To PDF -home.URLToPDF.desc=Converts any http(s)URL to PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive +home.URLToPDF.title=URL/sito Web in PDF +home.URLToPDF.desc=Converte qualsiasi URL http(s) in PDF +URLToPDF.tags=acquisizione web,salvataggio pagina,web-to-doc,archivio -home.HTMLToPDF.title=HTML to PDF -home.HTMLToPDF.desc=Converts any HTML file or zip to PDF -HTMLToPDF.tags=markup,web-content,transformation,convert +home.HTMLToPDF.title=Da HTML a PDF +home.HTMLToPDF.desc=Converte qualsiasi file HTML o zip in PDF +HTMLToPDF.tags=markup,contenuto web,trasformazione,conversione -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert +home.MarkdownToPDF.title=Markdown in PDF +home.MarkdownToPDF.desc=Converte qualsiasi file Markdown in PDF +MarkdownToPDF.tags=markup,contenuto web,trasformazione,conversione -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs -getPdfInfo.tags=infomation,data,stats,statistics +home.getPdfInfo.title=Ottieni TUTTE le informazioni in PDF +home.getPdfInfo.desc=Raccogli tutte le informazioni possibili sui PDF +getPdfInfo.tags=informazioni,dati,stati,statistiche -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF -extractPage.tags=extract +home.extractPage.title=Estrai pagina/e +home.extractPage.desc=Estrae le pagine selezionate dal PDF +extractPage.tags=estrarre -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page -PdfToSinglePage.tags=single page +home.PdfToSinglePage.title=PDF in un'unica pagina di grandi dimensioni +home.PdfToSinglePage.desc=Unisce tutte le pagine PDF in un'unica grande pagina +PdfToSinglePage.tags=pagina singola -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 e visualizza qualsiasi JS inserito in 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=Redazione automatica +home.autoRedact.desc=Redige automaticamente (oscura) il testo in un PDF in base al testo immesso showJS.tags=JS +home.tableExtraxt.title=Da PDF a CSV +home.tableExtraxt.desc=Estrae tabelle da un PDF convertendolo in CSV +tableExtraxt.tags=CSV,Estrazione tabella,estrai,converti + + +home.autoSizeSplitPDF.title=Divisione automatica per dimensione/numero +home.autoSizeSplitPDF.desc=Dividi un singolo PDF in più documenti in base alle dimensioni, al numero di pagine o al numero di documenti +autoSizeSplitPDF.tags=pdf,diviso,documento,organizzazione + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF +overlay-pdfs.tags=Overlay + +home.split-by-sections.title=Dividi PDF per sezioni +home.split-by-sections.desc=Dividi ciascuna pagina di un PDF in sezioni orizzontali e verticali più piccole +split-by-sections.tags=Dividi sezione, dividi, personalizza + ########################### # # # WEB PAGES # # # ########################### #login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in +login.title=Accedi +login.signin=Accedi +login.rememberme=Ricordami +login.invalid=Nome utente o password errati. +login.locked=Il tuo account è stato bloccato. +login.signinTitle=Per favore accedi #auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## -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=Redazione automatica +autoRedact.header=Redazione automatica +autoRedact.colorLabel=Colore +autoRedact.textsToRedactLabel=Testo da oscurare (separato da righe) +autoRedact.textsToRedactPlaceholder=per esempio. \nConfidenziale \nTop-Secret +autoRedact.useRegexLabel=Usa Regex +autoRedact.wholeWordSearchLabel=Ricerca di parole intere +autoRedact.customPaddingLabel=Padding extra personalizzato +autoRedact.convertPDFToImageLabel=Converti PDF in immagine PDF (utilizzato per rimuovere il testo dietro la casella) +autoRedact.submitButton=Invia #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=Scarica 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 pagina singola +pdfToSinglePage.header=PDF a pagina singola +pdfToSinglePage.submit=Converti in pagina singola #pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract +pageExtracter.title=Estrai pagine +pageExtracter.header=Estrai pagine +pageExtracter.submit=Estrai #getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON +getPdfInfo.title=Ottieni informazioni in PDF +getPdfInfo.header=Ottieni informazioni in PDF +getPdfInfo.submit=Ottieni informazioni +getPdfInfo.downloadJson=Scarica JSON #markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint +MarkdownToPDF.title=Markdown in PDF +MarkdownToPDF.header=Markdown in PDF +MarkdownToPDF.submit=Converti +MarkdownToPDF.help=Conversione in corso +MarkdownToPDF.credit=Utilizza 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=Converti +URLToPDF.credit=Utilizza 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.title=HTML a PDF +HTMLToPDF.header=HTML a PDF +HTMLToPDF.help=Accetta file HTML e ZIP contenenti html/css/immagini ecc. richiesti +HTMLToPDF.submit=Converti +HTMLToPDF.credit=Utilizza WeasyPrint #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=Disinfetta PDF +sanitizePDF.header=Disinfettare un file PDF +sanitizePDF.selectText.1=Rimuovi le azioni JavaScript +sanitizePDF.selectText.2=Rimuovi i file incorporati +sanitizePDF.selectText.3=Rimuovi i metadati +sanitizePDF.selectText.4=Rimuovi collegamenti +sanitizePDF.selectText.5=Rimuovi i fonts +sanitizePDF.submit=Disinfetta PDF #addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers +addPageNumbers.title=Aggiungi numeri di pagina +addPageNumbers.header=Aggiungi numeri di pagina +addPageNumbers.selectText.1=Seleziona il file PDF: +addPageNumbers.selectText.2=Dimensione margine +addPageNumbers.selectText.3=Posizione +addPageNumbers.selectText.4=Numero di partenza +addPageNumbers.selectText.5=Pagine da numerare +addPageNumbers.selectText.6=Testo personalizzato +addPageNumbers.customTextDesc=Testo personalizzato +addPageNumbers.numberPagesDesc=Quali pagine numerare, impostazione predefinita "all", accetta anche 1-5 o 2,5,9 ecc +addPageNumbers.customNumberDesc=Il valore predefinito è {n}, accetta anche 'Pagina {n} di {total}', 'Testo-{n}', '{filename}-{n} +addPageNumbers.submit=Aggiungi numeri di pagina #auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename +auto-rename.title=Rinomina automatica +auto-rename.header=Rinomina automatica PDF +auto-rename.submit=Rinomina automatica #adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: +adjustContrast.title=Regola il contrasto +adjustContrast.header=Regola il contrasto +adjustContrast.contrast=Contrasto: +adjustContrast.brightness=Luminosità: +adjustContrast.saturation=Saturazione: adjustContrast.download=Download #crop -crop.title=Crop -crop.header=Crop Image -crop.submit=Submit +crop.title=Ritaglia +crop.header=Ritaglia l'immagine +crop.submit=Invia #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=PDF diviso automaticamente +autoSplitPDF.header=PDF diviso automaticamente +autoSplitPDF.description=Stampa, inserisci, scansiona, carica e lasciaci separare automaticamente i tuoi documenti. Non è necessario alcuno smistamento manuale. +autoSplitPDF.selectText.1=Stampa alcuni fogli divisori dal basso (il bianco e nero va bene). +autoSplitPDF.selectText.2=Scansiona tutti i tuoi documenti contemporaneamente inserendo il foglio divisorio tra di loro. +autoSplitPDF.selectText.3=Carica il singolo file PDF scansionato di grandi dimensioni e lascia che Stirling PDF gestisca il resto. +autoSplitPDF.selectText.4=Le pagine divisorie vengono rilevate e rimosse automaticamente, garantendo un documento finale ordinato. +autoSplitPDF.formPrompt=Invia PDF contenente divisori di pagina Stirling-PDF: +autoSplitPDF.duplexMode=Modalità duplex (scansione fronte e retro) +autoSplitPDF.dividerDownload1=Scarica 'Divisore automatico (minimo).pdf' +autoSplitPDF.dividerDownload2=Scarica 'Divisore automatico (con istruzioni).pdf' +autoSplitPDF.submit=Invia #pipeline @@ -463,18 +498,19 @@ pipeline.title=Pipeline #pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -pageLayout.submit=Submit +pageLayout.title=Layout multipagina +pageLayout.header=Layout multipagina +pageLayout.pagesPerSheet=Pagine per foglio: +pageLayout.addBorder=Aggiungi bordi +pageLayout.submit=Invia #scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit +scalePages.title=Regola la scala della pagina +scalePages.header=Regola la scala della pagina +scalePages.pageSize=Dimensione di una pagina del documento. +scalePages.scaleFactor=Livello di zoom (ritaglio) di una pagina. +scalePages.submit=Invia #certSign @@ -604,8 +640,8 @@ addImage.submit=Aggiungi immagine #merge merge.title=Unisci merge.header=Unisci 2 o più PDF -merge.sortByName=Sort by name -merge.sortByDate=Sort by date +merge.sortByName=Ordina per nome +merge.sortByDate=Ordina per data merge.submit=Unisci @@ -619,6 +655,9 @@ pdfOrganiser.submit=Riordina pagine multiTool.title=Multifunzione PDF multiTool.header=Multifunzione PDF +#view pdf +viewPdf.title=Visualizza PDF +viewPdf.header=Visualizza PDF #pageRemover pageRemover.title=Rimuovi pagine @@ -653,7 +692,10 @@ split.submit=Dividi imageToPDF.title=Immagine a PDF imageToPDF.header=Immagine a PDF imageToPDF.submit=Converti -imageToPDF.selectText.1=Allarga per riempire +imageToPDF.selectLabel=Opzioni di adattamento immagine +imageToPDF.fillPage=Riempi la pagina +imageToPDF.fitDocumentToImage=Adatta la pagina all'immagine +imageToPDF.maintainAspectRatio=Mantieni le proporzioni imageToPDF.selectText.2=Ruota automaticamente PDF imageToPDF.selectText.3=Logica multi-file (funziona solo se ci sono più immagini) imageToPDF.selectText.4=Unisci in un unico PDF @@ -690,9 +732,9 @@ addPassword.selectText.10=Previeni modifiche addPassword.selectText.11=Previeni annotazioni addPassword.selectText.12=Previeni stampa addPassword.selectText.13=Previeni stampa in diversi formati -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.14=Password del proprietario +addPassword.selectText.15=Limita le operazioni eseguibili con il documento una volta aperto (non supportato da tutti i lettori) +addPassword.selectText.16=Limita l'apertura del documento stesso addPassword.submit=Crittografa @@ -706,8 +748,8 @@ watermark.selectText.4=Rotazione (0-360): watermark.selectText.5=spazio orizzontale (tra ogni filigrana): watermark.selectText.6=spazio verticale (tra ogni filigrana): watermark.selectText.7=Opacità (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: +watermark.selectText.8=Tipo di filigrana: +watermark.selectText.9=Immagine filigrana: watermark.submit=Aggiungi Filigrana @@ -756,13 +798,6 @@ changeMetadata.selectText.5=Aggiungi proprietà personalizzata: changeMetadata.submit=Cambia Proprietà -#xlsToPdf -xlsToPdf.title=Da Excel a PDF -xlsToPdf.header=Da Excel a PDF -xlsToPdf.selectText.1=Seleziona un foglio XLS o XLSX da convertire -xlsToPdf.convert=Converti - - #pdfToPDFA pdfToPDFA.title=Da PDF a PDF/A pdfToPDFA.header=Da PDF a PDF/A @@ -806,3 +841,45 @@ PDFToXML.title=Da PDF a XML PDFToXML.header=Da PDF a XML PDFToXML.credit=Questo servizio utilizza LibreOffice per la conversione. PDFToXML.submit=Converti + +#PDFToCSV +PDFToCSV.title=Da PDF a CSV +PDFToCSV.header=Da PDF a CSV +PDFToCSV.prompt=Scegli la pagina per estrarre la tabella +PDFToCSV.submit=Estratto + +#split-by-size-or-count +split-by-size-or-count.header=Dividi il PDF per dimensione o numero +split-by-size-or-count.type.label=Seleziona il tipo di divisione +split-by-size-or-count.type.size=Per dimensione +split-by-size-or-count.type.pageCount=Per numero di pagine +split-by-size-or-count.type.docCount=Per numero di documento +split-by-size-or-count.value.label=Inserire il valore +split-by-size-or-count.value.placeholder=Inserisci la dimensione (ad esempio, 2 MB o 3 KB) o il numero (ad esempio, 5) +split-by-size-or-count.submit=Separa + + +#overlay-pdfs +overlay-pdfs.header=Invia file PDF in sovrapposizione +overlay-pdfs.baseFile.label=Seleziona File PDF di base +overlay-pdfs.overlayFiles.label=Seleziona sovrapposizione file PDF +overlay-pdfs.mode.label=Seleziona la modalità di sovrapposizione +overlay-pdfs.mode.sequential=Sovrapposizione sequenziale +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=Inserisci i numeri separati da virgole (ad esempio, 2,3,1) +overlay-pdfs.position.label=Seleziona posizione di sovrapposizione +overlay-pdfs.position.foreground=Primo piano +overlay-pdfs.position.background=Sfondo +overlay-pdfs.submit=Sovrapponi + + +#split-by-sections +split-by-sections.title=Dividi PDF per sezioni +split-by-sections.header=Dividi il PDF in sezioni +split-by-sections.horizontal.label=Divisioni orizzontali +split-by-sections.vertical.label=Divisioni verticali +split-by-sections.horizontal.placeholder=Inserire il numero di divisioni orizzontali +split-by-sections.vertical.placeholder=Inserire il numero di divisioni verticlai +split-by-sections.submit=Dividi PDF diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index fbb282543..04ad2da41 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -26,27 +26,28 @@ text=テキスト font=フォント selectFillter=-- 選択 -- pageNum=ページ番号 -sizes.small=Small -sizes.medium=Medium -sizes.large=Large -sizes.x-large=X-Large +sizes.small=小 +sizes.medium=中 +sizes.large=大 +sizes.x-large=特大 error.pdfPassword=PDFにパスワードが設定されてますが、パスワードが入力されてないか間違ってます。 -delete=Delete -username=Username -password=Password -welcome=Welcome -########################## -### TODO: Translate ### -########################## -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - +delete=削除 +username=ユーザー名 +password=パスワード +welcome=ようこそ +property=プロパティ +black=黒 +white=白 +red=赤 +green=緑 +blue=青 +custom=カスタム... +changedCredsMessage=資格情報が変更されました! +notAuthenticatedMessage=ユーザーが認証されていません。 +userNotFoundMessage=ユーザーが見つかりません。 +incorrectPasswordMessage=現在のパスワードが正しくありません。 +usernameExistsMessage=新しいユーザー名はすでに存在します。 @@ -71,48 +72,67 @@ settings.downloadOption.1=同じウィンドウで開く settings.downloadOption.2=新しいウィンドウで開く settings.downloadOption.3=ファイルをダウンロード settings.zipThreshold=このファイル数を超えたときにファイルを圧縮する -settings.signOut=Sign Out -settings.accountSettings=Account Settings - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser +settings.signOut=サインアウト +settings.accountSettings=アカウント設定 -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.submit=Save User + +changeCreds.title=資格情報の変更 +changeCreds.header=アカウントの詳細を更新する +changeCreds.changeUserAndPassword=デフォルトのログイン認証情報を使用しています。新しいパスワード (必要に応じてユーザー名も) を入力してください +changeCreds.newUsername=新しいユーザー名 +changeCreds.oldPassword=現在のパスワード +changeCreds.newPassword=新しいパスワード +changeCreds.confirmNewPassword=新しいパスワードの確認 +changeCreds.submit=変更を送信 + + + +account.title=アカウント設定 +account.accountSettings=アカウント設定 +account.adminSettings=管理者設定 - ユーザーの表示と追加 +account.userControlSettings=ユーザー制御設定 +account.changeUsername=ユーザー名を変更 +account.changeUsername=ユーザー名を変更 +account.password=確認用パスワード +account.oldPassword=旧パスワード +account.newPassword=新パスワード +account.changePassword=パスワードの変更 +account.confirmNewPassword=新パスワードの確認 +account.signOut=サインアウト +account.yourApiKey=あなたのAPIキー +account.syncTitle=ブラウザ設定をアカウントと同期する +account.settingsCompare=設定比較: +account.property=プロパティ +account.webBrowserSettings=Webブラウザ設定 +account.syncToBrowser=アカウントの同期 -> ブラウザ +account.syncToAccount=アカウントの同期 <- ブラウザ + + +adminUserSettings.title=ユーザー制御設定 +adminUserSettings.header=管理者ユーザー制御設定 +adminUserSettings.admin=管理者 +adminUserSettings.user=ユーザー +adminUserSettings.addUser=新しいユーザを追加 +adminUserSettings.roles=役割 +adminUserSettings.role=役割 +adminUserSettings.actions=アクション +adminUserSettings.apiUser=限定されたAPIユーザー +adminUserSettings.webOnlyUser=ウェブ専用ユーザー +adminUserSettings.forceChange=ログイン時にユーザー名/パスワードを強制的に変更する +adminUserSettings.submit=ユーザーの保存 ############# # HOME-PAGE # ############# home.desc=PDFのあらゆるニーズに対応するローカルホスティングされた総合窓口です。 +home.searchBar=機能検索... +home.viewPdf.title=View PDF +home.viewPdf.desc=表示、注釈、テキストや画像の追加 +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=PDFマルチツール home.multiTool.desc=ページの結合、回転、並べ替え、削除します。 multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move @@ -251,221 +271,237 @@ home.scalePages.title=ページの縮尺の調整 home.scalePages.desc=ページやコンテンツの縮尺を変更します。 scalePages.tags=resize,modify,dimension,adapt -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts +home.pipeline.title=パイプライン (高度) +home.pipeline.desc=パイプラインスクリプトを定義してPDF上で複数のアクションを実行します。 pipeline.tags=automate,sequence,scripted,batch-process -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location +home.add-page-numbers.title=ページ番号の追加 +home.add-page-numbers.desc=ドキュメント全体の設定された場所にページ番号を追加します。 add-page-numbers.tags=paginate,label,organize,index -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=PDFファイル名の自動変更 +home.auto-rename.desc=検出されたヘッダーに基づいてPDFファイルの名前を自動的に変更します。 auto-rename.tags=auto-detect,header-based,organize,relabel -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF +home.adjust-contrast.title=色/コントラストの調整 +home.adjust-contrast.desc=PDFのコントラスト、彩度、明るさを調整します。 adjust-contrast.tags=color-correction,tune,modify,enhance -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) +home.crop.title=PDFのトリミング +home.crop.desc=PDFをトリミングしてサイズを縮小します (テキストは維持します!)。 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=ページの自動分割 +home.autoSplitPDF.desc=ページ分割用QRコードを使用したスキャンしたPDFを自動分割します。 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=サニタイズ +home.sanitizePdf.desc=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/WebサイトをPDFに変換 +home.URLToPDF.desc=あらゆるhttp(s)URLを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をPDFに変換 +home.HTMLToPDF.desc=HTMLファイルまたはzipを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をPDFに変換 +home.MarkdownToPDF.desc=あらゆるMarkdownファイルを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=PDFのすべての情報を入手 +home.getPdfInfo.desc=PDFのあらゆる情報を取得します。 getPdfInfo.tags=infomation,data,stats,statistics -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF +home.extractPage.title=ページの抽出 +home.extractPage.desc=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を単一の大きなページに変換 +home.PdfToSinglePage.desc=PDFのすべてのページを1つの大きな単一ページに結合します PdfToSinglePage.tags=single page -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF +home.showJS.title=JavaScriptを表示 +home.showJS.desc=PDFに挿入されたJavaScriptを検索して表示します。 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=自動塗りつぶし +home.autoRedact.desc=入力したテキストに基づいてPDF内のテキストを自動で塗りつぶし(黒塗り)します。 showJS.tags=JS +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to 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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + ########################### # # # WEB PAGES # # # ########################### #login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in +login.title=サインイン +login.signin=サインイン +login.rememberme=サインイン状態を記憶する +login.invalid=ユーザー名かパスワードが無効です。 +login.locked=あなたのアカウントはロックされています。 +login.signinTitle=サインインしてください #auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## -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=自動塗りつぶし +autoRedact.header=自動塗りつぶし +autoRedact.colorLabel=カラー +autoRedact.textsToRedactLabel=編集するテキスト (line-separated) +autoRedact.textsToRedactPlaceholder=例 \n機密 \n極秘 +autoRedact.useRegexLabel=正規表現を使用する +autoRedact.wholeWordSearchLabel=単語単位の検索 +autoRedact.customPaddingLabel=追加の余白 +autoRedact.convertPDFToImageLabel=PDFをPDF画像に変換 (塗りつぶしの後ろのテキストを削除するために使用) +autoRedact.submitButton=送信 #showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show +showJS.title=JavaScriptを表示 +showJS.header=JavaScriptを表示 +showJS.downloadJS=Javascriptをダウンロード +showJS.submit=表示 #pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page +pdfToSinglePage.title=PDFを単一ページに変換 +pdfToSinglePage.header=PDFを単一ページに変換 +pdfToSinglePage.submit=単一ページに変換 #pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract +pageExtracter.title=ページの抽出 +pageExtracter.header=ページの抽出 +pageExtracter.submit=抽出 #getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON +getPdfInfo.title=PDFの情報を入手 +getPdfInfo.header=PDFの情報を入手 +getPdfInfo.submit=情報を入手 +getPdfInfo.downloadJson=JSONでダウンロード #markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint +MarkdownToPDF.title=MarkdownをPDFに変換 +MarkdownToPDF.header=MarkdownをPDFに変換 +MarkdownToPDF.submit=変換 +MarkdownToPDF.help=処理中 +MarkdownToPDF.credit=WeasyPrintを使用 #url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint +URLToPDF.title=URLをPDFに変換 +URLToPDF.header=URLをPDFに変換 +URLToPDF.submit=変換 +URLToPDF.credit=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.title=HTMLをPDFに変換 +HTMLToPDF.header=HTMLをPDFに変換 +HTMLToPDF.help=HTMLファイルと必要なhtml/css/画像などを含むZIPを受け入れます +HTMLToPDF.submit=変換 +HTMLToPDF.credit=WeasyPrintを使用 #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=PDFをサニタイズ +sanitizePDF.header=PDFファイルをサニタイズ +sanitizePDF.selectText.1=JavaScriptアクションを削除 +sanitizePDF.selectText.2=埋め込みファイルを削除 +sanitizePDF.selectText.3=メタデータを削除 +sanitizePDF.selectText.4=リンクを削除 +sanitizePDF.selectText.5=フォントを削除 +sanitizePDF.submit=PDFをサニタイズする #addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers +addPageNumbers.title=ページ番号の追加 +addPageNumbers.header=ページ番号の追加 +addPageNumbers.selectText.1=PDFファイルを選択: +addPageNumbers.selectText.2=余白サイズ +addPageNumbers.selectText.3=位置 +addPageNumbers.selectText.4=開始番号 +addPageNumbers.selectText.5=番号をつけるページ +addPageNumbers.selectText.6=カスタムテキスト +addPageNumbers.customTextDesc=カスタムテキスト +addPageNumbers.numberPagesDesc=番号をつけるページ、デフォルトは'all'、 1-5 や 2,5,9 など +addPageNumbers.customNumberDesc=デフォルトは{n}、'{n} / {total} ページ'、'テキスト-{n}'、'{filename}-{n}など +addPageNumbers.submit=ページ番号の追加 #auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename +auto-rename.title=ファイル名の自動変更 +auto-rename.header=PDF名の自動変更 +auto-rename.submit=自動リネーム #adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download +adjustContrast.title=コントラストの調整 +adjustContrast.header=コントラストの調整 +adjustContrast.contrast=コントラスト: +adjustContrast.brightness=明度: +adjustContrast.saturation=彩度: +adjustContrast.download=ダウンロード #crop -crop.title=Crop -crop.header=Crop Image -crop.submit=Submit +crop.title=切り抜き +crop.header=画像の切り抜き +crop.submit=送信 #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=PDFの自動分割 +autoSplitPDF.header=PDFの自動分割 +autoSplitPDF.description=印刷、挿入、スキャン、アップロード、およびドキュメントを自動分離します。手動での仕分けの必要ありません。 +autoSplitPDF.selectText.1=下から仕切り用紙を印刷します(白黒で問題ありません)。 +autoSplitPDF.selectText.2=原稿の間に仕切り用紙を挿入し、すべての原稿をまとめてスキャンします。 +autoSplitPDF.selectText.3=スキャンしたPDFファイルをアップロードしStirling PDFに任せます。 +autoSplitPDF.selectText.4=仕切りページは自動的に検出、削除されるので、最終的な文書はきれいに仕上がります。 +autoSplitPDF.formPrompt=Stirling-PDF仕切り用紙を含むPDFを送信: +autoSplitPDF.duplexMode=両面モード (表裏スキャン) +autoSplitPDF.dividerDownload1=ダウンロード '自動仕切り用紙 (最小).pdf' +autoSplitPDF.dividerDownload2=ダウンロード '自動仕切り用紙 (手順書付き).pdf' +autoSplitPDF.submit=送信 #pipeline -pipeline.title=Pipeline +pipeline.title=パイプライン #pageLayout pageLayout.title=マルチページレイアウト pageLayout.header=マルチページレイアウト pageLayout.pagesPerSheet=1枚あたりのページ数: +pageLayout.addBorder=Add Borders pageLayout.submit=送信 @@ -479,7 +515,7 @@ scalePages.submit=送信 #certSign certSign.title=証明書による署名 -certSign.header=証明書を使用してPDFに署名します。 (進行中) +certSign.header=証明書を使用してPDFに署名します。 (制作中) certSign.selectPDF=署名するPDFファイルを選択: certSign.selectKey=秘密キーファイルを選択 (PKCS#8形式、.pemまたは.der) : certSign.selectCert=証明書ファイルを選択 (X.509形式、.pemまたは.der) : @@ -604,8 +640,8 @@ addImage.submit=画像の追加 #merge merge.title=結合 merge.header=複数のPDFを結合 (2ファイル以上) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date +merge.sortByName=名前で並べ替え +merge.sortByDate=日付で並べ替え merge.submit=結合 @@ -619,6 +655,9 @@ pdfOrganiser.submit=ページの整理 multiTool.title=PDFマルチツール multiTool.header=PDFマルチツール +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=ページ削除 @@ -653,7 +692,10 @@ split.submit=分割 imageToPDF.title=画像をPDFに変換 imageToPDF.header=画像をPDFに変換 imageToPDF.submit=変換 -imageToPDF.selectText.1=フィットするように引き伸ばす +imageToPDF.selectLabel=画像フィットオプション +imageToPDF.fillPage=フルページ +imageToPDF.fitDocumentToImage=ページを画像に合わせる +imageToPDF.maintainAspectRatio=アスペクト比を維持する imageToPDF.selectText.2=PDFの自動回転 imageToPDF.selectText.3=マルチファイルの処理 (複数の画像を操作する場合に有効になります) imageToPDF.selectText.4=1つのPDFに結合 @@ -756,13 +798,6 @@ changeMetadata.selectText.5=カスタムメタデータの追加 changeMetadata.submit=変更 -#xlsToPdf -xlsToPdf.title=ExcelをPDFに変換 -xlsToPdf.header=ExcelをPDFに変換 -xlsToPdf.selectText.1=変換するXLSまたはXLSX Execlシートを選択 -xlsToPdf.convert=変換 - - #pdfToPDFA pdfToPDFA.title=PDFをPDF/Aに変換 pdfToPDFA.header=PDFをPDF/Aに変換 @@ -806,3 +841,45 @@ PDFToXML.title=PDFをXMLに変換 PDFToXML.header=PDFをXMLに変換 PDFToXML.credit=本サービスはファイル変換にLibreOfficeを使用しています。 PDFToXML.submit=変換 + +#PDFToCSV +PDFToCSV.title=PDF??CSV? +PDFToCSV.header=PDF??CSV? +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=???? + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 39471e4a3..429575c4b 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -4,11 +4,11 @@ # the direction that the language is written (ltr=left to right, rtl = right to left) language.direction=ltr -pdfPrompt=PDF 선택 -multiPdfPrompt=PDF 선택(2개 이상) -multiPdfDropPrompt=사용할 모든 PDF를 선택(또는 드래그 앤 드롭)하세요 +pdfPrompt=PDF 파일 선택 +multiPdfPrompt=여러 PDF 파일 선택 +multiPdfDropPrompt=사용할 모든 PDF 문서를 선택(또는 드래그 앤 드롭)합니다 imgPrompt=이미지 선택 -genericSubmit=제출 +genericSubmit=확인 processTimeWarning=경고: 파일 크기에 따라 1분 정도 소요될 수 있습니다 pageOrderPrompt=페이지 순서(쉼표로 구분된 페이지 번호 목록 입력): goToPage=이동 @@ -30,14 +30,11 @@ sizes.small=Small sizes.medium=Medium sizes.large=Large sizes.x-large=X-Large -error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect -delete=Delete -username=Username -password=Password -welcome=Welcome -########################## -### TODO: Translate ### -########################## +error.pdfPassword=이 PDF는 비밀번호로 보호되어 있으며, 비밀번호를 입력하지 않았거나, 입력된 비밀번호가 올바르지 않습니다. +delete=삭제 +username=사용자명 +password=비밀번호 +welcome=환영합니다. property=Property black=Black white=White @@ -46,7 +43,11 @@ green=Green blue=Blue custom=Custom... - +changedCredsMessage=계정 정보 변경 성공! +notAuthenticatedMessage=User not authenticated. +userNotFoundMessage=사용자를 찾을 수 없습니다. +incorrectPasswordMessage=현재 비밀번호가 틀립니다. +usernameExistsMessage=새 사용자명이 이미 존재합니다. @@ -57,7 +58,7 @@ navbar.convert=변환 navbar.security=보안 navbar.other=기타 navbar.darkmode=다크 모드 -navbar.pageOps=Page Operations +navbar.pageOps=페이지 편집 navbar.settings=설정 ############# @@ -71,118 +72,137 @@ settings.downloadOption.1=현재 창에서 열기 settings.downloadOption.2=새 창에서 열기 settings.downloadOption.3=다운로드 settings.zipThreshold=다운로드한 파일 수가 초과된 경우 파일 압축하기 -settings.signOut=Sign Out -settings.accountSettings=Account Settings +settings.signOut=로그아웃 +settings.accountSettings=계정 설정 -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users + + +changeCreds.title=계정 정보 변경 +changeCreds.header=계정 정보 업데이트 +changeCreds.changeUserAndPassword=기본 제공된 로그인 정보를 사용하고 있습니다. 새 비밀번호를 입력합니다. (필요하다면 사용자명을 변경할 수 있습니다.) +changeCreds.newUsername=새 사용자명 +changeCreds.oldPassword=현재 비밀번호 +changeCreds.newPassword=새 비밀번호 +changeCreds.confirmNewPassword=새 비밀번호 확인 +changeCreds.submit=변경 + + + +account.title=계정 설정 +account.accountSettings=계정 설정 +account.adminSettings=관리자 설정 - 사용자 추가 및 확인 account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username +account.changeUsername=사용자명 변경 +account.changeUsername=사용자명 변경 account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key +account.oldPassword=이전 비밀번호 +account.newPassword=새 비밀번호 +account.changePassword=비밀번호 변경 +account.confirmNewPassword=새 비밀번호 확인 +account.signOut=로그아웃 +account.yourApiKey=API 키 account.syncTitle=Sync browser settings with Account account.settingsCompare=Settings Comparison: account.property=Property account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser +account.syncToBrowser=계정 -> 브라우저로 동기화 +account.syncToAccount=브라우저 -> 계정으로 동기화 -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.submit=Save User +adminUserSettings.title=사용자 설정 +adminUserSettings.header=사용자 관리 +adminUserSettings.admin=관리자 +adminUserSettings.user=사용자 +adminUserSettings.addUser=새 사용자 추가 +adminUserSettings.roles=역할 +adminUserSettings.role=역할 +adminUserSettings.actions=동작 +adminUserSettings.apiUser=제한된 API 사용 +adminUserSettings.webOnlyUser=웹 사용만 허용 +adminUserSettings.forceChange=다음 로그인 때 사용자명과 비밀번호를 변경하도록 강제 +adminUserSettings.submit=사용자 저장 ############# # HOME-PAGE # ############# -home.desc=당신의 PDF에 필요한 모든 것이 있는 로컬 호스팅된 원스톱 숍입니다. +home.desc=당신의 PDF에 필요한 모든 것이 있는 로컬 호스팅된 원스톱 솔루션입니다. +home.searchBar=기능 검색... +home.viewPdf.title=PDF 뷰어 +home.viewPdf.desc=PDF 문서을 보고 주석을 달거나, 텍스트 또는 이미지를 추가합니다. +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=PDF 멀티 툴 -home.multiTool.desc=페이지를 병합, 회전, 재배열, 제거하세요. +home.multiTool.desc=PDF 문서의 페이지를 병합, 회전, 재배열, 제거합니다. multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side home.merge.title=병합 -home.merge.desc=여러 개의 PDF를 쉽게 하나로 합치세요. +home.merge.desc=여러 개의 PDF 문서을 쉽게 하나로 합칩니다. merge.tags=merge,Page operations,Back end,server side home.split.title=분할 -home.split.desc=PDF를 여러 개의 문서로 분할하세요. +home.split.desc=하나의 PDF 문서을 여러 개의 PDF 문서로 분할합니다. split.tags=Page operations,divide,Multi Page,cut,server side home.rotate.title=회전 -home.rotate.desc=PDF를 쉽게 회전하세요. +home.rotate.desc=PDF 페이지를 회전합니다. rotate.tags=server side home.imageToPdf.title=Image to PDF -home.imageToPdf.desc=이미지(PNG, JPEG, GIF)를 PDF로 변환하세요. +home.imageToPdf.desc=이미지(PNG, JPEG, GIF)를 PDF 문서로 변환합니다. imageToPdf.tags=conversion,img,jpg,picture,photo home.pdfToImage.title=PDF to Image -home.pdfToImage.desc=PDF를 이미지(PNG, JPEG, GIF)로 변환하세요. +home.pdfToImage.desc=PDF 문서을 이미지(PNG, JPEG, GIF)로 변환합니다. pdfToImage.tags=conversion,img,jpg,picture,photo home.pdfOrganiser.title=정렬 -home.pdfOrganiser.desc=페이지를 원하는 순서대로 제거/재배열하세요. +home.pdfOrganiser.desc=PDF 문서의 각 페이지를 원하는 순서대로 재배열하거나 제거합니다. pdfOrganiser.tags=duplex,even,odd,sort,move home.addImage.title=사진 추가 -home.addImage.desc=PDF의 설정된 위치에 이미지를 추가하세요.(개발 중) +home.addImage.desc=PDF 문서의 설정된 위치에 이미지를 추가합니다. (개발 중) addImage.tags=img,jpg,picture,photo home.watermark.title=워터마크 추가 -home.watermark.desc=PDF 문서에 사용자 지정 워터마크를 추가하세요. +home.watermark.desc=PDF 문서에 사용자 지정 워터마크를 추가합니다. watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo home.permissions.title=권한 변경 -home.permissions.desc=PDF 문서의 권한을 변경하세요. +home.permissions.desc=PDF 문서의 권한을 변경합니다. permissions.tags=read,write,edit,print home.removePages.title=제거 -home.removePages.desc=PDF 문서에서 원치 않는 페이지를 제거하세요. +home.removePages.desc=PDF 문서에서 원치 않는 페이지를 제거합니다. removePages.tags=Remove pages,delete pages -home.addPassword.title=비밀번호 추가 -home.addPassword.desc=PDF 문서를 비밀번호로 암호화하세요. +home.addPassword.title=암호 추가 +home.addPassword.desc=PDF 문서를 비밀번호로 암호화합니다. addPassword.tags=secure,security home.removePassword.title=비밀번호 제거 -home.removePassword.desc=PDF 문서에서 비밀번호를 제거하세요. +home.removePassword.desc=PDF 문서에서 비밀번호를 제거합니다. removePassword.tags=secure,Decrypt,security,unpassword,delete password home.compressPdfs.title=압축 -home.compressPdfs.desc=파일 크기를 줄이기 위해 PDF 문서를 압축하세요. +home.compressPdfs.desc=파일 크기를 줄이기 위해 PDF 문서를 압축합니다. compressPdfs.tags=squish,small,tiny home.changeMetadata.title=메타데이터 변경 -home.changeMetadata.desc=PDF 문서의 메타데이터를 수정/제거/추가하세요. +home.changeMetadata.desc=PDF 문서의 메타데이터를 수정/제거/추가합니다. changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats home.fileToPDF.title=파일을 PDF로 변환 -home.fileToPDF.desc=거의 모든 파일을 PDF로 변환하세요(DOCX, PNG, XLS, PPT, TXT 등) +home.fileToPDF.desc=거의 모든 파일을 PDF로 변환합니다(DOCX, PNG, XLS, PPT, TXT 등) fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint home.ocr.title=OCR / 깔끔하게 스캔 -home.ocr.desc=깔끔하게 스캔하고 PDF 내의 이미지에서 텍스트를 감지하여 텍스트로 다시 추가합니다. +home.ocr.desc=깔끔하게 스캔한 뒤, PDF 내의 이미지에서 텍스트를 감지하여 텍스트로 다시 추가합니다. ocr.tags=recognition,text,image,scan,read,identify,detection,editable @@ -191,48 +211,48 @@ home.extractImages.desc=PDF에서 모든 이미지를 추출하여 zip으로 저 extractImages.tags=picture,photo,save,archive,zip,capture,grab home.pdfToPDFA.title=PDF to PDF/A -home.pdfToPDFA.desc=장기 보관을 위해 PDF를 PDF/A 문서로 변환하세요. +home.pdfToPDFA.desc=장기 보관을 위해 PDF 문서를 PDF/A 문서로 변환합니다. pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation home.PDFToWord.title=PDF to Word -home.PDFToWord.desc=PDF를 Word 형식으로 변환하세요. (DOC, DOCX, ODT) +home.PDFToWord.desc=PDF 문서를 Word 형식으로 변환합니다. (DOC, DOCX, ODT) PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile -home.PDFToPresentation.title=PDF to 프리젠테이션 -home.PDFToPresentation.desc=PDF를 프리젠테이션 형식으로 변환하세요. (PPT, PPTX, ODP) +home.PDFToPresentation.title=PDF to Presentation +home.PDFToPresentation.desc=PDF 문서를 프리젠테이션 형식으로 변환합니다. (PPT, PPTX, ODP) PDFToPresentation.tags=slides,show,office,microsoft home.PDFToText.title=PDF to 텍스트/RTF -home.PDFToText.desc=PDF를 텍스트 또는 RTF 형식으로 변환하세요. +home.PDFToText.desc=PDF 문서를 텍스트 또는 RTF 형식으로 변환합니다. PDFToText.tags=richformat,richtextformat,rich text format home.PDFToHTML.title=PDF to HTML -home.PDFToHTML.desc=PDF를 HTML 형식으로 변환하세요. +home.PDFToHTML.desc=PDF 문서를 HTML 형식으로 변환합니다. PDFToHTML.tags=web content,browser friendly home.PDFToXML.title=PDF to XML -home.PDFToXML.desc=PDF를 XML 형식으로 변환하세요. +home.PDFToXML.desc=PDF 문서를 XML 형식으로 변환합니다. PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert home.ScannerImageSplit.title=스캔한 사진 감지/분할 -home.ScannerImageSplit.desc=사진/PDF 내에서 여러 장의 사진을 분할합니다. +home.ScannerImageSplit.desc=스캔된 PDF 문서 내에서 여러 장의 사진을 분할합니다. ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize home.sign.title=서명 -home.sign.desc=PDF에 그림, 텍스트, 이미지로 서명을 추가합니다. +home.sign.desc=PDF 문서에 그림, 텍스트, 이미지로 서명을 추가합니다. sign.tags=authorize,initials,drawn-signature,text-sign,image-signature -home.flatten.title=합치기 -home.flatten.desc=PDF에서 모든 인터랙션 요소와 양식을 제거하세요. +home.flatten.title=평탄화 +home.flatten.desc=PDF 문서에서 모든 상호작용 요소와 양식을 제거합니다. flatten.tags=static,deactivate,non-interactive,streamline home.repair.title=복구 -home.repair.desc=손상된 PDF의 복구를 시도합니다. +home.repair.desc=손상된 PDF 문서의 복구를 시도합니다. repair.tags=fix,restore,correction,recover home.removeBlanks.title=빈 페이지 제거 -home.removeBlanks.desc=문서에서 빈 페이지를 감지하고 제거합니다. +home.removeBlanks.desc=PDF 문서에서 빈 페이지를 감지하고 제거합니다. removeBlanks.tags=cleanup,streamline,non-content,organize home.compare.title=비교 @@ -240,252 +260,268 @@ home.compare.desc=2개의 PDF 문서를 비교하고 차이를 표시합니다. compare.tags=differentiate,contrast,changes,analysis home.certSign.title=인증서로 서명 -home.certSign.desc=PDF에 인증서/키로 서명합니다. (PEM/P12) +home.certSign.desc=PDF 문서에 인증서 또는 키로 서명합니다. (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt -home.pageLayout.title=Multi-Page Layout -home.pageLayout.desc=Merge multiple pages of a PDF document into a single page +home.pageLayout.title=다중 페이지 레이아웃 +home.pageLayout.desc=PDF 문서의 여러 페이지를 한 페이지로 합칩니다. 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=페이지 크기 및 배율 조정 +home.scalePages.desc=페이지 및 그 페이지 내용의 크기와 배율을 조정합니다. scalePages.tags=resize,modify,dimension,adapt -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts +home.pipeline.title=파이프라인 (고급 기능) +home.pipeline.desc=파이프라인 스크립트를 사용해서 PDF 문서에 여러 동작을 수행합니다. pipeline.tags=automate,sequence,scripted,batch-process -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location +home.add-page-numbers.title=페이지 번호 추가 +home.add-page-numbers.desc=PDF 문서의 페이지마다, 설정한 위치에 페이지 번호를 삽입합니다. add-page-numbers.tags=paginate,label,organize,index -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=자동 이름 변경 +home.auto-rename.desc=제목을 감지하여 자동으로 PDF 문서의 파일 이름을 변경합니다. auto-rename.tags=auto-detect,header-based,organize,relabel -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF +home.adjust-contrast.title=색상/대비 조정 +home.adjust-contrast.desc=PDF 문서의 대비, 채도, 밝기를 조정합니다. adjust-contrast.tags=color-correction,tune,modify,enhance -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) +home.crop.title=PDF 잘라내기 +home.crop.desc=PDF 문서를 잘라내서 크기를 줄입니다. (텍스트가 그대로 유지됩니다!) 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=자동 문서 나누기 +home.autoSplitPDF.desc=구분용 QR코드가 들어있는 페이지를 경계로 하여, 스캔된 PDF 문서를 자동으로 나눕니다. 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=정제 +home.sanitizePdf.desc=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.desc=http(s) 웹사이트를 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.desc=HTML 파일, 또는 ZIP 파일을 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.desc=마크다운 파일을 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=PDF 정보 읽기 +home.getPdfInfo.desc=PDF 문서의 가능한 모든 정보를 읽습니다. getPdfInfo.tags=infomation,data,stats,statistics -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF +home.extractPage.title=페이지 추출 +home.extractPage.desc=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=단일 페이지로 통합 +home.PdfToSinglePage.desc=PDF 문서의 모든 페이지를 하나의 큰 단일 페이지로 합칩니다. PdfToSinglePage.tags=single page -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF +home.showJS.title=JavaScript 보기 +home.showJS.desc=PDF 문서에 포함되어 있는 JavaScript를 찾아 보여줍니다. 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=자동 검열 +home.autoRedact.desc=PDF 문서에서 입력된 텍스트들을 자동으로 검열(모자이크)합니다. showJS.tags=JS +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to 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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + ########################### # # # WEB PAGES # # # ########################### #login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in +login.title=로그인 +login.signin=로그인 +login.rememberme=로그인 유지 +login.invalid=사용자 이름이나 비밀번호가 틀립니다. +login.locked=계정이 잠겼습니다. +login.signinTitle=로그인해 주세요. #auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## -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=자동 검열 +autoRedact.header=자동 검열 +autoRedact.colorLabel=색상 +autoRedact.textsToRedactLabel=검열할 텍스트 (줄바꿈으로 구분) +autoRedact.textsToRedactPlaceholder=예: \n비밀 \n일급 기밀 +autoRedact.useRegexLabel=정규표현식 사용 +autoRedact.wholeWordSearchLabel=전체 단어 일치 +autoRedact.customPaddingLabel=추가 윤곽(패딩) +autoRedact.convertPDFToImageLabel=PDF 문서의 내용을 이미지로 변환 (검열 박스 뒤의 텍스트를 제거하는 데 사용됩니다.) +autoRedact.submitButton=적용 #showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show +showJS.title=JavaScript 보기 +showJS.header=JavaScript 보기 +showJS.downloadJS=Javascript 다운로드 +showJS.submit=제출 #pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page +pdfToSinglePage.title=단일 페이지로 통합 +pdfToSinglePage.header=단일 페이지로 합치기 +pdfToSinglePage.submit=단일 페이지로 통합 #pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract +pageExtracter.title=페이지 추출 +pageExtracter.header=페이지 추출 +pageExtracter.submit=추출 #getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON +getPdfInfo.title=PDF 정보 읽기 +getPdfInfo.header=PDF 정보 읽기 +getPdfInfo.submit=정보 읽기 +getPdfInfo.downloadJson=JSON으로 다운로드 #markdown-to-pdf MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint +MarkdownToPDF.header=Markdown 문서를 PDF 문서로 변환 +MarkdownToPDF.submit=변환 +MarkdownToPDF.help=변환중 +MarkdownToPDF.credit=이 기능은 WeasyPrint를 사용합니다. #url-to-pdf URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint +URLToPDF.header=URL을 PDF 문서로 변환 +URLToPDF.submit=변환 +URLToPDF.credit=이 기능은 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.header=HTML 파일을 PDF 문서로 변환 +HTMLToPDF.help=HTML 파일, 또는 html/css/이미지 등을 포함한 ZIP 파일을 받습니다. +HTMLToPDF.submit=변환 +HTMLToPDF.credit=이 기능은 WeasyPrint를 사용합니다. #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=PDF 정제 +sanitizePDF.header=PDF 문서 정제 +sanitizePDF.selectText.1=JavaScript 동작 제거 +sanitizePDF.selectText.2=임베딩된 파일 제거 +sanitizePDF.selectText.3=메타데이터 제거 +sanitizePDF.selectText.4=링크 제거 +sanitizePDF.selectText.5=폰트 제거 +sanitizePDF.submit=정제 #addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers +addPageNumbers.title=페이지 번호 추가 +addPageNumbers.header=페이지 번호 추가 +addPageNumbers.selectText.1=PDF 파일 선택 +addPageNumbers.selectText.2=여백 크기 +addPageNumbers.selectText.3=위치 +addPageNumbers.selectText.4=시작 번호 +addPageNumbers.selectText.5=번호를 넣을 페이지 +addPageNumbers.selectText.6=사용자 지정 형식 +addPageNumbers.customTextDesc=사용자 지정 형식 +addPageNumbers.numberPagesDesc=번호를 넣을 페이지. 기본값 'all'. 1-5, 2,5,9등도 유효합니다. +addPageNumbers.customNumberDesc=기본값 {n}, 다음도 유효합니다: 'Page {n} of {total}', 'Text-{n}', '{filename}-{n}' +addPageNumbers.submit=페이지 번호 추가 #auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename +auto-rename.title=자동 이름 변경 +auto-rename.header=PDF 문서 자동 이름 변경 +auto-rename.submit=이름 변경 #adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download +adjustContrast.title=대비 조절 +adjustContrast.header=대비 조절 +adjustContrast.contrast=대비: +adjustContrast.brightness=밝기: +adjustContrast.saturation=채도: +adjustContrast.download=다운로드 #crop -crop.title=Crop -crop.header=Crop Image -crop.submit=Submit +crop.title=잘라내기 +crop.header=잘라내기 +crop.submit=확인 #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=자동 문서 나누기 +autoSplitPDF.header=자동 문서 나누기 +autoSplitPDF.description=인쇄된 문서에 구분 페이지를 넣고 스캔하여 업로드하세요. 자동으로 문서를 나누어 드립니다. 수동으로 일일이 작업할 필요가 없습니다. +autoSplitPDF.selectText.1=아래에서 구분 페이지를 인쇄하세요. (흑백이어도 상관 없습니다.) +autoSplitPDF.selectText.2=문서를 나눌 곳에 구분 페이지를 넣고, 모든 문서를 한꺼번에 스캔하세요. +autoSplitPDF.selectText.3=스캔된 문서를 Stirling PDF에 업로드하면, Stirling PDF가 알아서 문서를 나눕니다. +autoSplitPDF.selectText.4=구분 페이지는 자동으로 감지 및 제거되므로, 깔끔한 결과물을 얻을 수 있습니다. +autoSplitPDF.formPrompt=Stirling-PDF 구분 페이지가 있는 PDF 파일 업로드: +autoSplitPDF.duplexMode=양면 모드 (앞뒷면 스캐닝) +autoSplitPDF.dividerDownload1=PDF 구분 페이지 다운로드 +autoSplitPDF.dividerDownload2=설명을 포함한 PDF 구분 페이지 다운로드 +autoSplitPDF.submit=나누기 #pipeline -pipeline.title=Pipeline +pipeline.title=파이프라인 #pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -pageLayout.submit=Submit +pageLayout.title=다중 페이지 레이아웃 +pageLayout.header=다중 페이지 레이아웃 +pageLayout.pagesPerSheet=1장에 들어갈 페이지 수: +pageLayout.addBorder=외곽선 추가 +pageLayout.submit=확인 #scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit +scalePages.title=페이지 배율 조절 +scalePages.header=페이지 배율 조절 +scalePages.pageSize=페이지의 크기를 조절합니다. +scalePages.scaleFactor=페이지 배율 조절 (잘라내기) +scalePages.submit=제출 #certSign certSign.title=인증서로 서명 -certSign.header=PDF에 당신의 인증서로 서명하세요 (개발 중) -certSign.selectPDF=서명할 PDF를 선택하세요: -certSign.selectKey=개인 키 파일을 선택하세요 (PKCS#8 형식, .pem 또는 .der): -certSign.selectCert=인증서 파일을 선택하세요 (X.509 형식, .pem 또는 .der): -certSign.selectP12=PKCS#12 키 저장소 파일을 선택하세요 (.p12 or .pfx) (선택 사항, 선택할 경우, 개인 키와 인증서를 포함하고 있어야 합니다): +certSign.header=인증서로 PDF 문서에 서명 (개발 중) +certSign.selectPDF=서명할 PDF 문서를 선택합니다: +certSign.selectKey=개인 키 파일을 선택합니다 (PKCS#8 형식, .pem 또는 .der): +certSign.selectCert=인증서 파일을 선택합니다 (X.509 형식, .pem 또는 .der): +certSign.selectP12=PKCS#12 키 저장소 파일을 선택합니다 (.p12 or .pfx) (선택 사항, 선택할 경우, 개인 키와 인증서를 포함하고 있어야 합니다): certSign.certType=인증서 유형 -certSign.password=키 저장소 또는 개인 키 비밀번호를 입력하세요 (있는 경우): +certSign.password=키 저장소 또는 개인 키 비밀번호를 입력합니다 (있는 경우): certSign.showSig=서명 보기 certSign.reason=이유 certSign.location=위치 @@ -505,7 +541,7 @@ removeBlanks.submit=빈 페이지 제거 #compare compare.title=비교 -compare.header=PDF 비교 +compare.header=PDF 문서 비교 compare.document.1=문서 1 compare.document.2=문서 2 compare.submit=비교 @@ -528,9 +564,9 @@ repair.submit=복구 #flatten -flatten.title=합치기 -flatten.header=PDF 합치기 -flatten.submit=합치기 +flatten.title=평탄화 +flatten.header=PDF 문서의 레이어 평탄화 +flatten.submit=평탄화 #ScannerImageSplit @@ -548,7 +584,7 @@ ScannerImageSplit.selectText.10=출력에서 흰색 테두리를 방지하기 #OCR ocr.title=OCR / 깔끔하게 스캔 -ocr.header=깔끔하게 스캔 / OCR (광학 문자 인식) +ocr.header=OCR (광학 문자 인식) / 깔끔하게 스캔 ocr.selectText.1=PDF에서 감지할 언어를 선택하십시오 (현재 감지된 언어 목록): ocr.selectText.2=OCR 텍스트가 포함된 텍스트 파일을 OCR 처리된 PDF와 함께 생성 ocr.selectText.3=비뚤어진 각도로 스캔한 페이지를 다시 제자리로 돌려 올바른 페이지로 스캔 @@ -561,34 +597,34 @@ ocr.selectText.9=추가 설정 ocr.selectText.10=OCR 모드 ocr.selectText.11=OCR 후 이미지 제거(모든 이미지 제거, 변환 단계의 일부인 경우에만 유용) ocr.selectText.12=렌더 유형(고급) -ocr.help=다른 언어 또는 Docker에 포함되지 않은 언어에 대해 사용하는 방법에 대해서는 이 문서를 참조하세요. +ocr.help=다른 언어 또는 Docker에 포함되지 않은 언어에 대해 사용하는 방법에 대해서는 이 문서를 참조합니다. ocr.credit=이 서비스는 OCR에 OCRmyPDF와 Tesseract를 사용합니다. -ocr.submit=OCR로 PDF 처리 +ocr.submit=인식 #extractImages extractImages.title=이미지 추출 extractImages.header=이미지 추출 -extractImages.selectText=추출된 이미지를 변환할 이미지 형식을 선택하세요. +extractImages.selectText=추출된 이미지를 변환할 이미지 형식을 선택합니다. extractImages.submit=추출 #File to PDF fileToPDF.title=File to PDF -fileToPDF.header=모든 파일을 PDF로 변환 +fileToPDF.header=다양한 파일을 PDF로 변환 fileToPDF.credit=이 서비스는 파일 변환에 LibreOffice와 Unoconv를 사용합니다. -fileToPDF.supportedFileTypes=지원되는 파일 형식은 아래와 같지만, 지원되는 형식의 전체 업데이트 목록은 LibreOffice 설명서를 참조하세요. +fileToPDF.supportedFileTypes=지원되는 파일 형식은 아래와 같습니다. 지원되는 형식의 전체 업데이트 목록은 LibreOffice 설명서를 참조합니다. fileToPDF.submit=PDF로 변환 #compress compress.title=압축 compress.header=PDF 압축 -compress.credit=이 서비스는 PDF 압축/최적화를 위해 Ghostscript를 사용합니다. +compress.credit=이 서비스는 PDF 압축 및 최적화를 위해 Ghostscript를 사용합니다. compress.selectText.1=수동 모드 - 1에서 4 compress.selectText.2=최적화 수준: compress.selectText.3=4 (텍스트 이미지에 적합하지 않음) -compress.selectText.4=자동 - 정확한 크기의 PDF를 얻기 위해 품질 자동 조정 +compress.selectText.4=자동 - 정확한 크기의 PDF 문서를 얻기 위해 품질 자동 조정 compress.selectText.5=예상 PDF 크기 (예: 25MB, 10.8MB, 25KB) compress.submit=압축 @@ -610,19 +646,22 @@ merge.submit=병합 #pdfOrganiser -pdfOrganiser.title=페이지 정렬 도구 +pdfOrganiser.title=페이지 정렬 pdfOrganiser.header=PDF 페이지 정렬 pdfOrganiser.submit=페이지 재정렬 #multiTool -multiTool.title=PDF 멀티 툴 -multiTool.header=PDF 멀티 툴 +multiTool.title=PDF 멀티툴 +multiTool.header=PDF 멀티툴 +#view pdf +viewPdf.title=PDF 뷰어 +viewPdf.header=PDF 뷰어 #pageRemover -pageRemover.title=페이지 제거 도구 -pageRemover.header=PDF 페이지 제거 도구 +pageRemover.title=페이지 제거 +pageRemover.header=PDF 페이지 제거 pageRemover.pagesToDelete=제거할 페이지 (쉼표로 구분된 페이지 번호 입력): pageRemover.submit=페이지 제거 @@ -637,8 +676,8 @@ rotate.submit=회전 #merge split.title=PDF 분할 split.header=PDF 분할 -split.desc.1=선택한 번호는 분할할 페이지 번호입니다. -split.desc.2=예를 들어, 1,3,7-8을 선택하면 10페이지 문서를 아래와 같이 6개의 별도의 PDF로 분할하게 됩니다. +split.desc.1=입력한 번호는 분할할 페이지의 번호입니다. +split.desc.2=예를 들어, 1,3,7-8을 입력하면 10페이지 문서를 아래와 같이 6개의 별도의 PDF 문서로 분할하게 됩니다. split.desc.3=문서 #1: 페이지 1 split.desc.4=문서 #2: 페이지 2, 3 split.desc.5=문서 #3: 페이지 4, 5, 6 @@ -650,19 +689,22 @@ split.submit=분할 #merge -imageToPDF.title=이미지를 PDF로 변환 +imageToPDF.title=Image to PDF imageToPDF.header=이미지를 PDF로 변환 -imageToPDF.submit=변환하기 -imageToPDF.selectText.1=맞춤 크기로 늘리기 +imageToPDF.submit=변환 +imageToPDF.selectLabel=이미지 맞춤 방법 +imageToPDF.fillPage=페이지 채우기 +imageToPDF.fitDocumentToImage=페이지를 이미지 크기에 맞게 +imageToPDF.maintainAspectRatio=가로/세로 비율 유지 imageToPDF.selectText.2=PDF 자동 회전 -imageToPDF.selectText.3=다중 파일 로직 (여러 이미지로 작업하는 경우에만 활성화됨) +imageToPDF.selectText.3=다중 파일 처리 방법 (여러 이미지로 작업하는 경우에만 활성화됨) imageToPDF.selectText.4=단일 PDF로 병합 imageToPDF.selectText.5=별도의 PDF로 변환 #pdfToImage -pdfToImage.title=PDF를 이미지로 변환 -pdfToImage.header=PDF를 이미지로 변환 +pdfToImage.title=PDF to Image +pdfToImage.header=PDF 문서를 이미지로 변환 pdfToImage.selectText=이미지 형식 pdfToImage.singleOrMultiple=이미지 결과 유형 pdfToImage.single=단일 큰 이미지 @@ -671,28 +713,28 @@ pdfToImage.colorType=색상 유형 pdfToImage.color=컬러 pdfToImage.grey=그레이스케일 pdfToImage.blackwhite=흑백 (데이터 손실 가능성 있음!) -pdfToImage.submit=변환하기 +pdfToImage.submit=변환 #addPassword addPassword.title=암호 추가 addPassword.header=암호 추가 (암호화) -addPassword.selectText.1=암호화할 PDF 선택 +addPassword.selectText.1=암호화할 PDF 문서 선택 addPassword.selectText.2=암호 addPassword.selectText.3=암호화 키 길이 addPassword.selectText.4=값이 높을수록 강력하지만, 값이 낮을수록 호환성이 더 좋습니다. addPassword.selectText.5=설정할 권한 -addPassword.selectText.6=문서 조립 방지 -addPassword.selectText.7=콘텐츠 추출 방지 +addPassword.selectText.6=문서 조합 방지 (다른 PDF 문서에 삽입 불가) +addPassword.selectText.7=내용 추출 방지 addPassword.selectText.8=접근성을 위한 추출 방지 addPassword.selectText.9=양식 작성 방지 addPassword.selectText.10=수정 방지 addPassword.selectText.11=주석 수정 방지 addPassword.selectText.12=인쇄 방지 -addPassword.selectText.13=다른 형식으로 인쇄 방� -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=다른 형식으로 인쇄 방지 +addPassword.selectText.14=소유자 암호 +addPassword.selectText.15=문서를 연 다음 수행할 수 있는 동작을 방지합니다. (모든 뷰어에서 지원되지는 않습니다.) +addPassword.selectText.16=문서를 열 수 없도록 방지합니다. addPassword.submit=암호화 @@ -706,8 +748,8 @@ watermark.selectText.4=회전 각도 (0-360): watermark.selectText.5=가로 간격 (각 워터마크 사이의 가로 공간): watermark.selectText.6=세로 간격 (각 워터마크 사이의 세로 공간): watermark.selectText.7=투명도 (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: +watermark.selectText.8=워터마크 유형: +watermark.selectText.9=워터마크 이미지: watermark.submit=워터마크 추가 @@ -756,23 +798,16 @@ changeMetadata.selectText.5=사용자 정의 메타데이터 항목 추가 changeMetadata.submit=변경 -#xlsToPdf -xlsToPdf.title=Excel to PDF -xlsToPdf.header=Excel을 PDF로 변환 -xlsToPdf.selectText.1=변환할 XLS 또는 XLSX Excel 시트 선택 -xlsToPdf.convert=변환하기 - - #pdfToPDFA pdfToPDFA.title=PDF To PDF/A -pdfToPDFA.header=PDF를 PDF/A로 변환 -pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 OCRmyPDF를 사용합니다. +pdfToPDFA.header=PDF 문서를 PDF/A로 변환 +pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 OCRmyPDF 문서를 사용합니다. pdfToPDFA.submit=변환 #PDFToWord PDFToWord.title=PDF to Word -PDFToWord.header=PDF를 Word로 변환 +PDFToWord.header=PDF 문서를 Word 문서로 변환 PDFToWord.selectText.1=출력 파일 형식 PDFToWord.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. PDFToWord.submit=변환 @@ -780,15 +815,15 @@ PDFToWord.submit=변환 #PDFToPresentation PDFToPresentation.title=PDF to Presentation -PDFToPresentation.header=PDF를 프레젠테이션으로 변환 +PDFToPresentation.header=PDF 문서를 프레젠테이션으로 변환 PDFToPresentation.selectText.1=출력 파일 형식 PDFToPresentation.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. PDFToPresentation.submit=변환 #PDFToText -PDFToText.title=PDF to RTF (Text) -PDFToText.header=PDF를 텍스트/RTF로 변환 +PDFToText.title=PDF to RTF +PDFToText.header=PDF 문서를 RTF(서식 있는 텍스트 문서)로 변환 PDFToText.selectText.1=출력 파일 형식 PDFToText.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. PDFToText.submit=변환 @@ -796,13 +831,55 @@ PDFToText.submit=변환 #PDFToHTML PDFToHTML.title=PDF to HTML -PDFToHTML.header=PDF를 HTML로 변환 +PDFToHTML.header=PDF 문서를 HTML로 변환 PDFToHTML.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. PDFToHTML.submit=변환 #PDFToXML PDFToXML.title=PDF to XML -PDFToXML.header=PDF를 XML로 변환 +PDFToXML.header=PDF 문서를 XML로 변환 PDFToXML.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. PDFToXML.submit=변환 + +#PDFToCSV +PDFToCSV.title=PDF? CSV? +PDFToCSV.header=PDF? CSV? +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=?? + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index 1043641aa..262286bd8 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -35,9 +35,6 @@ delete=Verwijderen username=Gebruikersnaam password=Wachtwoord welcome=Welkom -########################## -### TODO: Translate ### -########################## property=Property black=Black white=White @@ -46,7 +43,11 @@ green=Green blue=Blue custom=Custom... - +changedCredsMessage=Credentials changed! +notAuthenticatedMessage=User not authenticated. +userNotFoundMessage=User not found. +incorrectPasswordMessage=Current password is incorrect. +usernameExistsMessage=New Username already exists. @@ -74,6 +75,19 @@ settings.zipThreshold=Zip bestanden wanneer het aantal gedownloade bestanden ove settings.signOut=Uitloggen settings.accountSettings=Account instellingen + + +changeCreds.title=Change Credentials +changeCreds.header=Update Your Account Details +changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) +changeCreds.newUsername=New Username +changeCreds.oldPassword=Current Password +changeCreds.newPassword=New Password +changeCreds.confirmNewPassword=Confirm New Password +changeCreds.submit=Submit Changes + + + account.title=Account instellingen account.accountSettings=Account instellingen account.adminSettings=Beheerdersinstellingen - Gebruikers bekijken en toevoegen @@ -105,14 +119,20 @@ adminUserSettings.role=Rol adminUserSettings.actions=Acties adminUserSettings.apiUser=Beperkte API gebruiker adminUserSettings.webOnlyUser=Alleen web gebruiker +adminUserSettings.forceChange=Force user to change username/password on login adminUserSettings.submit=Sla gebruiker op ############# # HOME-PAGE # ############# home.desc=Jouw lokaal gehoste one-stop-shop voor al je PDF-behoeften. +home.searchBar=Search for features... +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=PDF Multitool home.multiTool.desc=Samenvoegen, draaien, herschikken en pagina''s verwijderen multiTool.tags=Multitool,Multi bewerking,UI,klik sleep,voorkant,clientzijde,interactief,beweegbaar,verplaats @@ -316,6 +336,24 @@ home.autoRedact.title=Auto Redact home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text showJS.tags=JS +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to 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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + ########################### # # # WEB PAGES # @@ -333,9 +371,6 @@ login.signinTitle=Please sign in #auto-redact autoRedact.title=Auto Redact autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## autoRedact.colorLabel=Colour autoRedact.textsToRedactLabel=Text to Redact (line-separated) autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret @@ -466,6 +501,7 @@ pipeline.title=Pijplijn pageLayout.title=Meerdere pagina indeling pageLayout.header=Meerdere pagina indeling pageLayout.pagesPerSheet=Pagina''s per vel: +pageLayout.addBorder=Add Borders pageLayout.submit=Indienen @@ -619,6 +655,9 @@ pdfOrganiser.submit=Pagina''s herschikken multiTool.title=PDF Multitool multiTool.header=PDF Multitool +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=Pagina verwijderaar @@ -653,7 +692,10 @@ split.submit=Splitsen imageToPDF.title=Afbeelding naar PDF imageToPDF.header=Afbeelding naar PDF imageToPDF.submit=Omzetten -imageToPDF.selectText.1=Uitrekken om te passen +imageToPDF.selectLabel=Image Fit Options +imageToPDF.fillPage=Fill Page +imageToPDF.fitDocumentToImage=Fit Page to Image +imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.selectText.2=PDF automatisch draaien imageToPDF.selectText.3=Meervoudige bestandslogica (Alleen ingeschakeld bij werken met meerdere afbeeldingen) imageToPDF.selectText.4=Voeg samen in één PDF @@ -756,13 +798,6 @@ changeMetadata.selectText.5=Voeg aangepaste metadata-invoer toe changeMetadata.submit=Wijzigen -#xlsToPdf -xlsToPdf.title=Excel naar PDF -xlsToPdf.header=Excel naar PDF -xlsToPdf.selectText.1=Selecteer XLS of XLSX Excel-blad om te converteren -xlsToPdf.convert=Converteren - - #pdfToPDFA pdfToPDFA.title=PDF naar PDF/A pdfToPDFA.header=PDF naar PDF/A @@ -806,3 +841,45 @@ PDFToXML.title=PDF naar XML PDFToXML.header=PDF naar XML PDFToXML.credit=Deze service gebruikt LibreOffice voor bestandsconversie. PDFToXML.submit=Converteren + +#PDFToCSV +PDFToCSV.title=PDF naar CSV +PDFToCSV.header=PDF naar CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=Extract + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 3fa81afb7..4ba1c66f0 100644 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -35,9 +35,6 @@ delete=Delete username=Username password=Password welcome=Welcome -########################## -### TODO: Translate ### -########################## property=Property black=Black white=White @@ -46,7 +43,11 @@ green=Green blue=Blue custom=Custom... - +changedCredsMessage=Credentials changed! +notAuthenticatedMessage=User not authenticated. +userNotFoundMessage=User not found. +incorrectPasswordMessage=Current password is incorrect. +usernameExistsMessage=New Username already exists. @@ -74,6 +75,19 @@ settings.zipThreshold=Spakuj pliki, gdy liczba pobranych plików przekroczy settings.signOut=Sign Out settings.accountSettings=Account Settings + + +changeCreds.title=Change Credentials +changeCreds.header=Update Your Account Details +changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) +changeCreds.newUsername=New Username +changeCreds.oldPassword=Current Password +changeCreds.newPassword=New Password +changeCreds.confirmNewPassword=Confirm New Password +changeCreds.submit=Submit Changes + + + account.title=Account Settings account.accountSettings=Account Settings account.adminSettings=Admin Settings - View and Add Users @@ -105,14 +119,20 @@ adminUserSettings.role=Role adminUserSettings.actions=Actions adminUserSettings.apiUser=Limited API User adminUserSettings.webOnlyUser=Web Only User +adminUserSettings.forceChange=Force user to change username/password on login adminUserSettings.submit=Save User ############# # HOME-PAGE # ############# home.desc=Twoja lokalna aplikacja do kompleksowej obsługi Twoich potrzeb związanych z dokumentami PDF. +home.searchBar=Search for features... +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=Multi narzędzie PDF home.multiTool.desc=Łącz, dziel, obracaj, zmieniaj kolejność i usuwaj strony multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side @@ -316,6 +336,24 @@ home.autoRedact.title=Auto Redact home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text showJS.tags=JS +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to 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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + ########################### # # # WEB PAGES # @@ -333,9 +371,6 @@ login.signinTitle=Please sign in #auto-redact autoRedact.title=Auto Redact autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## autoRedact.colorLabel=Colour autoRedact.textsToRedactLabel=Text to Redact (line-separated) autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret @@ -466,6 +501,7 @@ pipeline.title=Pipeline pageLayout.title=Układ wielu stron pageLayout.header=Układ wielu stron pageLayout.pagesPerSheet=Stron na jednym arkuszu: +pageLayout.addBorder=Add Borders pageLayout.submit=Wykonaj @@ -619,6 +655,9 @@ pdfOrganiser.submit=Zmień kolejność stron multiTool.title=Multi narzędzie PDF multiTool.header=Multi narzędzie PDF +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=Narzędzie do usuwania stron @@ -653,7 +692,10 @@ split.submit=Podziel imageToPDF.title=Obraz na PDF imageToPDF.header=Obraz na PDF imageToPDF.submit=Konwertuj -imageToPDF.selectText.1=Rozciągnij, aby dopasować +imageToPDF.selectLabel=Image Fit Options +imageToPDF.fillPage=Fill Page +imageToPDF.fitDocumentToImage=Fit Page to Image +imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.selectText.2=Automatyczne obracanie PDF imageToPDF.selectText.3=Logika wielu plików (dostępna tylko w przypadku pracy z wieloma obrazami) imageToPDF.selectText.4=Połącz w jeden dokument PDF @@ -756,13 +798,6 @@ changeMetadata.selectText.5=Dodaj niestandardowy wpis w metadanych changeMetadata.submit=Zmień -#xlsToPdf -xlsToPdf.title=Excel na PDF -xlsToPdf.header=Excel na PDF -xlsToPdf.selectText.1=Wybierz arkusz Microsoft Excel XLS lub XLSX do konwersji -xlsToPdf.convert=Konwertuj - - #pdfToPDFA pdfToPDFA.title=PDF na PDF/A pdfToPDFA.header=PDF na PDF/A @@ -806,3 +841,45 @@ PDFToXML.title=PDF na XML PDFToXML.header=PDF na XML PDFToXML.credit=Ta usługa używa LibreOffice do konwersji plików. PDFToXML.submit=Konwertuj + +#PDFToCSV +PDFToCSV.title=PDF na CSV +PDFToCSV.header=PDF na CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=Wyci?g + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index d1645d3e6..03c076ee4 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -35,9 +35,6 @@ delete=Delete username=Username password=Password welcome=Welcome -########################## -### TODO: Translate ### -########################## property=Property black=Black white=White @@ -46,7 +43,11 @@ green=Green blue=Blue custom=Custom... - +changedCredsMessage=Credentials changed! +notAuthenticatedMessage=User not authenticated. +userNotFoundMessage=User not found. +incorrectPasswordMessage=Current password is incorrect. +usernameExistsMessage=New Username already exists. @@ -74,6 +75,19 @@ settings.zipThreshold=Compactar arquivos quando o número de arquivos baixados e settings.signOut=Sign Out settings.accountSettings=Account Settings + + +changeCreds.title=Change Credentials +changeCreds.header=Update Your Account Details +changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) +changeCreds.newUsername=New Username +changeCreds.oldPassword=Current Password +changeCreds.newPassword=New Password +changeCreds.confirmNewPassword=Confirm New Password +changeCreds.submit=Submit Changes + + + account.title=Account Settings account.accountSettings=Account Settings account.adminSettings=Admin Settings - View and Add Users @@ -105,14 +119,20 @@ adminUserSettings.role=Role adminUserSettings.actions=Actions adminUserSettings.apiUser=Limited API User adminUserSettings.webOnlyUser=Web Only User +adminUserSettings.forceChange=Force user to change username/password on login adminUserSettings.submit=Save User ############# # HOME-PAGE # ############# home.desc=Seu melhor utilitário para suas necessidades de PDF. +home.searchBar=Search for features... +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=Multiferramenta de PDF home.multiTool.desc=Mesclar, girar, reorganizar e remover páginas multiTool.tags=Multi Ferramenta, Operação Múltipla, Interface do Usuário, Clique e Arraste, Front-end, Lado do Cliente @@ -333,9 +353,6 @@ login.signinTitle=Please sign in #auto-redact autoRedact.title=Auto Redact autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## autoRedact.colorLabel=Colour autoRedact.textsToRedactLabel=Text to Redact (line-separated) autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret @@ -466,6 +483,7 @@ pipeline.title=Pipeline pageLayout.title=Layout de Múltiplas Páginas pageLayout.header=Layout de Múltiplas Páginas pageLayout.pagesPerSheet=Páginas por folha: +pageLayout.addBorder=Add Borders pageLayout.submit=Enviar @@ -619,6 +637,9 @@ pdfOrganiser.submit=Reorganizar Páginas multiTool.title=Multiferramenta de PDF multiTool.header=Multiferramenta de PDF +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=Remover Página @@ -653,7 +674,10 @@ split.submit=Dividir imageToPDF.title=Imagem para PDF imageToPDF.header=Converter Imagem para PDF imageToPDF.submit=Converter -imageToPDF.selectText.1=Esticar para Ajustar +imageToPDF.selectLabel=Image Fit Options +imageToPDF.fillPage=Fill Page +imageToPDF.fitDocumentToImage=Fit Page to Image +imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.selectText.2=Girar Automaticamente imageToPDF.selectText.3=Lógica de Vários Arquivos (Ativada apenas ao trabalhar com várias imagens) imageToPDF.selectText.4=Mesclar em um Único PDF @@ -756,13 +780,6 @@ changeMetadata.selectText.5=Adicionar Entrada de Metadados Personalizados changeMetadata.submit=Mudar -#xlsToPdf -xlsToPdf.title=Excel para PDF -xlsToPdf.header=Excel para PDF -xlsToPdf.selectText.1=Selecione a Planilha Excel XLS ou XLSX para Converter -xlsToPdf.convert=Converter - - #pdfToPDFA pdfToPDFA.title=PDF para PDF/A pdfToPDFA.header=PDF para PDF/A @@ -806,3 +823,8 @@ PDFToXML.title=PDF para XML PDFToXML.header=PDF para XML PDFToXML.credit=Este serviço usa o LibreOffice para Conversão de Arquivos. PDFToXML.submit=Converter + +#PDFToCSV +PDFToCSV.title=PDF para CSV +PDFToCSV.header=PDF para CSV +PDFToCSV.submit=Eztenna \ No newline at end of file diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 98b58a58a..97ab70b7b 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -35,9 +35,6 @@ delete=Delete username=Username password=Password welcome=Welcome -########################## -### TODO: Translate ### -########################## property=Property black=Black white=White @@ -46,7 +43,11 @@ green=Green blue=Blue custom=Custom... - +changedCredsMessage=Credentials changed! +notAuthenticatedMessage=User not authenticated. +userNotFoundMessage=User not found. +incorrectPasswordMessage=Current password is incorrect. +usernameExistsMessage=New Username already exists. @@ -74,6 +75,19 @@ settings.zipThreshold=Împachetează fișierele când numărul de fișiere desc settings.signOut=Sign Out settings.accountSettings=Account Settings + + +changeCreds.title=Change Credentials +changeCreds.header=Update Your Account Details +changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) +changeCreds.newUsername=New Username +changeCreds.oldPassword=Current Password +changeCreds.newPassword=New Password +changeCreds.confirmNewPassword=Confirm New Password +changeCreds.submit=Submit Changes + + + account.title=Account Settings account.accountSettings=Account Settings account.adminSettings=Admin Settings - View and Add Users @@ -105,14 +119,20 @@ adminUserSettings.role=Role adminUserSettings.actions=Actions adminUserSettings.apiUser=Limited API User adminUserSettings.webOnlyUser=Web Only User +adminUserSettings.forceChange=Force user to change username/password on login adminUserSettings.submit=Save User ############# # HOME-PAGE # ############# home.desc=Un singur punct de oprire găzduit local pentru toate nevoile tale legate de fișiere PDF. +home.searchBar=Search for features... +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=Instrument multiplu PDF home.multiTool.desc=Unifică, rotește, rearanjează și elimină pagini multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side @@ -333,9 +353,6 @@ login.signinTitle=Please sign in #auto-redact autoRedact.title=Auto Redact autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## autoRedact.colorLabel=Colour autoRedact.textsToRedactLabel=Text to Redact (line-separated) autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret @@ -466,6 +483,7 @@ pipeline.title=Pipeline pageLayout.title=Multi Page Layout pageLayout.header=Multi Page Layout pageLayout.pagesPerSheet=Pages per sheet: +pageLayout.addBorder=Add Borders pageLayout.submit=Submit @@ -619,6 +637,9 @@ pdfOrganiser.submit=Rearanjați paginile multiTool.title=Instrument PDF multiplu multiTool.header=Instrument PDF multiplu +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=Înlăturare pagini @@ -653,7 +674,10 @@ split.submit=Împarte imageToPDF.title=Imagine în PDF imageToPDF.header=Imagine în PDF imageToPDF.submit=Convertă -imageToPDF.selectText.1=Redimensionare pentru a se potrivi +imageToPDF.selectLabel=Image Fit Options +imageToPDF.fillPage=Fill Page +imageToPDF.fitDocumentToImage=Fit Page to Image +imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.selectText.2=Rotire automată a PDF-ului imageToPDF.selectText.3=Logica pentru mai multe fișiere (activată numai dacă se lucrează cu mai multe imagini) imageToPDF.selectText.4=Unifică într-un singur PDF @@ -756,13 +780,6 @@ changeMetadata.selectText.5=Adăugați Intrare Metadate Personalizate changeMetadata.submit=Schimbare -#xlsToPdf -xlsToPdf.title=Excel to PDF -xlsToPdf.header=Excel to PDF -xlsToPdf.selectText.1=Selectați fișierul Excel XLS sau XLSX pentru a converti -xlsToPdf.convert=convert - - #pdfToPDFA pdfToPDFA.title=PDF către PDF/A pdfToPDFA.header=PDF către PDF/A @@ -806,3 +823,8 @@ PDFToXML.title=PDF către XML PDFToXML.header=PDF către XML PDFToXML.credit=Acest serviciu utilizează LibreOffice pentru conversia fișierului. PDFToXML.submit=Convert + +#PDFToCSV +PDFToCSV.title=PDF n CSV +PDFToCSV.header=PDF n CSV +PDFToCSV.submit=Extrage diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 08f86f6bb..17d16dcb4 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -20,7 +20,7 @@ close=Закрыть filesSelected=файлов выбрано noFavourites=Нет избранного bored=Скучно ждать? -alphabet=\u0430\u043B\u0444\u0430\u0432\u0438\u0442 +alphabet=Алфавит downloadPdf=Скачать PDF text=Текст font=Шрифт @@ -35,9 +35,6 @@ delete=Delete username=Username password=Password welcome=Welcome -########################## -### TODO: Translate ### -########################## property=Property black=Black white=White @@ -46,7 +43,11 @@ green=Green blue=Blue custom=Custom... - +changedCredsMessage=Credentials changed! +notAuthenticatedMessage=User not authenticated. +userNotFoundMessage=User not found. +incorrectPasswordMessage=Current password is incorrect. +usernameExistsMessage=New Username already exists. @@ -57,7 +58,7 @@ navbar.convert=Конвертировать navbar.security=Безопасность navbar.other=Другое navbar.darkmode=Темный режим -navbar.pageOps=Операции со страницей +navbar.pageOps=Операции с страницей navbar.settings=Настройки ############# @@ -74,6 +75,19 @@ settings.zipThreshold=Zip-файлы, когда количество загру settings.signOut=Sign Out settings.accountSettings=Account Settings + + +changeCreds.title=Change Credentials +changeCreds.header=Update Your Account Details +changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) +changeCreds.newUsername=New Username +changeCreds.oldPassword=Current Password +changeCreds.newPassword=New Password +changeCreds.confirmNewPassword=Confirm New Password +changeCreds.submit=Submit Changes + + + account.title=Account Settings account.accountSettings=Account Settings account.adminSettings=Admin Settings - View and Add Users @@ -105,14 +119,20 @@ adminUserSettings.role=Role adminUserSettings.actions=Actions adminUserSettings.apiUser=Limited API User adminUserSettings.webOnlyUser=Web Only User +adminUserSettings.forceChange=Force user to change username/password on login adminUserSettings.submit=Save User ############# # HOME-PAGE # ############# home.desc=Ваш локальный универсальный магазин для всех ваших потребностей в PDF. +home.searchBar=Search for features... +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=Мультиинструмент PDF home.multiTool.desc=Объединение, поворот, изменение порядка и удаление страниц multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side @@ -239,83 +259,101 @@ home.compare.title=Сравнение home.compare.desc=Сравнивает и показывает различия между двумя PDF-документами compare.tags=differentiate,contrast,changes,analysis -home.certSign.title=Sign with Certificate -home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) +home.certSign.title=Подписать сертификатом +home.certSign.desc=Подписать PDF сертификатом/ключом (PEM/P12) certSign.tags=authenticate,PEM,P12,official,encrypt -home.pageLayout.title=Multi-Page Layout -home.pageLayout.desc=Merge multiple pages of a PDF document into a single page +home.pageLayout.title=Объединить страницы +home.pageLayout.desc=Объединение нескольких страниц документа PDF в одну страницу 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=Изменить размер/масштаб страницы +home.scalePages.desc=Изменить размер/масштаб страницы и/или ее содержимого. scalePages.tags=resize,modify,dimension,adapt -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts +home.pipeline.title=Конвейер (расширенный) +home.pipeline.desc=Выполняйте несколько действий с PDF-файлами, определяя конвейерные сценарии. pipeline.tags=automate,sequence,scripted,batch-process -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location +home.add-page-numbers.title=Добавить номера страниц +home.add-page-numbers.desc=Добавляйте номера страниц по всему документу в заданном месте add-page-numbers.tags=paginate,label,organize,index -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=Автоматическое переименование PDF-файла +home.auto-rename.desc=Автоматическое переименование файла PDF на основе его обнаруженного заголовка auto-rename.tags=auto-detect,header-based,organize,relabel -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF +home.adjust-contrast.title=Настройка цветов/контрастности +home.adjust-contrast.desc=Настройка контрастность, насыщенность и яркость PDF-файла adjust-contrast.tags=color-correction,tune,modify,enhance -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) +home.crop.title=Обрезать PDF-файл +home.crop.desc=Обрезать PDF-файл, чтобы уменьшить его размер (текст сохраняется!) 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=Автоматическое разделение страниц +home.autoSplitPDF.desc=Автоматическое разделение отсканированного PDF-файла с помощью физического разделителя отсканированных страниц QR-кода 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=Дезинфицировать +home.sanitizePdf.desc=Удаление скриптов и других элементов из 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/сайт в PDF +home.URLToPDF.desc=Конвертирует любой http(s)URL в 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 в PDF +home.HTMLToPDF.desc=Конвертирует любой HTML-файл или zip-файл в 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 в PDF +home.MarkdownToPDF.desc=Конвертирует любой файл Markdown в 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=Получите ВСЮ информацию в формате PDF +home.getPdfInfo.desc=Собирает любую возможную информацию в PDF-файлах. getPdfInfo.tags=infomation,data,stats,statistics -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF +home.extractPage.title=Извлечь страницу(ы) +home.extractPage.desc=Извлекает выбранные страницы из 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 в одну большую страницу +home.PdfToSinglePage.desc=Объединяет все страницы PDF в одну большую страницу. PdfToSinglePage.tags=single page -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF +home.showJS.title=Показать Javascript +home.showJS.desc=Ищет и отображает любой JS, внедренный в PDF-файл. showJS.tags=JS home.autoRedact.title=Auto Redact home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text showJS.tags=JS +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to 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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + ########################### # # # WEB PAGES # @@ -333,9 +371,6 @@ login.signinTitle=Please sign in #auto-redact autoRedact.title=Auto Redact autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## autoRedact.colorLabel=Colour autoRedact.textsToRedactLabel=Text to Redact (line-separated) autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret @@ -347,115 +382,115 @@ autoRedact.submitButton=Submit #showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show +showJS.title=Показать Javascript +showJS.header=Показать Javascript +showJS.downloadJS=Скачать Javascript +showJS.submit=Показать #pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page +pdfToSinglePage.title=PDF на одну страницу +pdfToSinglePage.header=PDF на одну страницу +pdfToSinglePage.submit=Преобразовать в одну страницу #pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract +pageExtracter.title=Извлечь страницы +pageExtracter.header=Извлечь страницы +pageExtracter.submit=Извлечь #getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON +getPdfInfo.title=Получить информацию в PDF +getPdfInfo.header=Получить информацию в PDF +getPdfInfo.submit=Получить информацию +getPdfInfo.downloadJson=Скачать JSON #markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint +MarkdownToPDF.title=Markdown в PDF +MarkdownToPDF.header=Markdown в PDF +MarkdownToPDF.submit=Конвертировать +MarkdownToPDF.help=Работа в процессе +MarkdownToPDF.credit=Использует WeasyPrint #url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint +URLToPDF.title=URL в PDF +URLToPDF.header=URL в PDF +URLToPDF.submit=Конвертировать +URLToPDF.credit=Использует 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.title=HTML в PDF +HTMLToPDF.header=HTML в PDF +HTMLToPDF.help=Принимает файлы HTML и ZIP-файлы, содержащие html/css/изображения и т. д. +HTMLToPDF.submit=Конвертировать +HTMLToPDF.credit=Использует WeasyPrint #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=Дезинфицировать PDF +sanitizePDF.header=Дезинфицировать PDF файл +sanitizePDF.selectText.1=Удалить JavaScript +sanitizePDF.selectText.2=Удалить встроенные файлы +sanitizePDF.selectText.3=Удалить метаданные +sanitizePDF.selectText.4=Удалить ссылки +sanitizePDF.selectText.5=Удалить шрифты +sanitizePDF.submit=Дезинфицировать #addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text +addPageNumbers.title=Добавить номера страниц +addPageNumbers.header=Добавить номера страниц +addPageNumbers.selectText.1=Выберите PDF-файл: +addPageNumbers.selectText.2=Размер поля +addPageNumbers.selectText.3=Позиция +addPageNumbers.selectText.4=Стартовый номер +addPageNumbers.selectText.5=Страницы для нумерации +addPageNumbers.selectText.6=Свой текст addPageNumbers.customTextDesc=Custom Text addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers +addPageNumbers.submit=Добавить номера страниц #auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename +auto-rename.title=Автоматическое переименование +auto-rename.header=Автоматическое переименование PDF +auto-rename.submit=Автоматическое переименование #adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download +adjustContrast.title=Настройка контрастности +adjustContrast.header=Настройка контрастности +adjustContrast.contrast=Контраст: +adjustContrast.brightness=Яркость: +adjustContrast.saturation=Насыщенность: +adjustContrast.download=Скачать #crop -crop.title=Crop -crop.header=Crop Image -crop.submit=Submit +crop.title=Обрезать +crop.header=Обрезать изображение +crop.submit=Отправить #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=Автоматическое разделение PDF +autoSplitPDF.header=Автоматическое разделение PDF +autoSplitPDF.description=Распечатывайте, вставляйте, сканируйте, загружайте и позволяйте нам автоматически разделять ваши документы. Никакой ручной сортировки работы не требуется. +autoSplitPDF.selectText.1=Печатайте несколько раздельных листов (подойдет черно-белый вариант). +autoSplitPDF.selectText.2=Сканируйте все документы одновременно, вставив между ними разделительный лист. +autoSplitPDF.selectText.3=Загрузите один большой отсканированный PDF-файл, и пусть Stirling PDF сделает все остальное. +autoSplitPDF.selectText.4=Разделительные страницы автоматически обнаруживаются и удаляются, гарантируя аккуратный окончательный документ. +autoSplitPDF.formPrompt=Отравить PDF-файл, содержащий разделители страниц Stirling-PDF: +autoSplitPDF.duplexMode=Дуплексный режим (сканирование спереди и сзади) +autoSplitPDF.dividerDownload1=Скачать 'Auto Splitter Divider (minimal).pdf' +autoSplitPDF.dividerDownload2=Скачать 'Auto Splitter Divider (with instructions).pdf' +autoSplitPDF.submit=Отравить #pipeline @@ -463,18 +498,19 @@ pipeline.title=Pipeline #pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -pageLayout.submit=Submit +pageLayout.title=Многостраничный макет +pageLayout.header=Многостраничный макет +pageLayout.pagesPerSheet=Страниц на одном листе: +pageLayout.addBorder=Add Borders +pageLayout.submit=Отправить #scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit +scalePages.title=Отрегулировать масштаб страницы +scalePages.header=Отрегулировать масштаб страницы +scalePages.pageSize=Размер страницы документа. +scalePages.scaleFactor=Уровень масштабирования (обрезки) страницы. +scalePages.submit=Отправить #certSign @@ -619,6 +655,9 @@ pdfOrganiser.submit=Переупорядочить страницы multiTool.title=Мультиинструмент PDF multiTool.header=Мультиинструмент PDF +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=Удаление страниц @@ -653,7 +692,10 @@ split.submit=Разделить imageToPDF.title=Изображение в PDF imageToPDF.header=Изображение в PDF imageToPDF.submit=Конвертировать -imageToPDF.selectText.1=Растянуть, чтобы соответствовать +imageToPDF.selectLabel=Image Fit Options +imageToPDF.fillPage=Fill Page +imageToPDF.fitDocumentToImage=Fit Page to Image +imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.selectText.2=Автоматический поворот PDF imageToPDF.selectText.3=Многофайловая логика (включена только при работе с несколькими изображениями) imageToPDF.selectText.4=Объединить в один PDF @@ -756,13 +798,6 @@ changeMetadata.selectText.5=Добавить пользовательскую з changeMetadata.submit=Изменить -#xlsToPdf -xlsToPdf.title=Excel в PDF -xlsToPdf.header=Excel в PDF -xlsToPdf.selectText.1=Выберите книгу Excel XLS или XLSX для преобразования -xlsToPdf.convert=Конвертировать - - #pdfToPDFA pdfToPDFA.title=PDF в PDF/A pdfToPDFA.header=PDF в PDF/A @@ -806,3 +841,45 @@ PDFToXML.title=PDF в XML PDFToXML.header=PDF в XML PDFToXML.credit=Этот сервис использует LibreOffice для преобразования файлов. PDFToXML.submit=Конвертировать + +#PDFToCSV +PDFToCSV.title=PDF ? CSV +PDFToCSV.header=PDF ? CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=??????? + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index fd3fbfd0f..780a3fb17 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -35,9 +35,6 @@ delete=Delete username=Username password=Password welcome=Welcome -########################## -### TODO: Translate ### -########################## property=Property black=Black white=White @@ -46,7 +43,11 @@ green=Green blue=Blue custom=Custom... - +changedCredsMessage=Credentials changed! +notAuthenticatedMessage=User not authenticated. +userNotFoundMessage=User not found. +incorrectPasswordMessage=Current password is incorrect. +usernameExistsMessage=New Username already exists. @@ -74,6 +75,19 @@ settings.zipThreshold=Zip-filer när antalet nedladdade filer överskrider settings.signOut=Sign Out settings.accountSettings=Account Settings + + +changeCreds.title=Change Credentials +changeCreds.header=Update Your Account Details +changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) +changeCreds.newUsername=New Username +changeCreds.oldPassword=Current Password +changeCreds.newPassword=New Password +changeCreds.confirmNewPassword=Confirm New Password +changeCreds.submit=Submit Changes + + + account.title=Account Settings account.accountSettings=Account Settings account.adminSettings=Admin Settings - View and Add Users @@ -105,14 +119,20 @@ adminUserSettings.role=Role adminUserSettings.actions=Actions adminUserSettings.apiUser=Limited API User adminUserSettings.webOnlyUser=Web Only User +adminUserSettings.forceChange=Force user to change username/password on login adminUserSettings.submit=Save User ############# # HOME-PAGE # ############# home.desc=Din lokala one-stop-shop för alla dina PDF-behov. +home.searchBar=Search for features... +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=PDF Multi-verktyg home.multiTool.desc=Sammanfoga, rotera, ordna om och ta bort sidor multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side @@ -316,6 +336,24 @@ home.autoRedact.title=Auto Redact home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text showJS.tags=JS +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to 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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + ########################### # # # WEB PAGES # @@ -333,9 +371,6 @@ login.signinTitle=Please sign in #auto-redact autoRedact.title=Auto Redact autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## autoRedact.colorLabel=Colour autoRedact.textsToRedactLabel=Text to Redact (line-separated) autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret @@ -466,6 +501,7 @@ pipeline.title=Pipeline pageLayout.title=Multi Page Layout pageLayout.header=Multi Page Layout pageLayout.pagesPerSheet=Pages per sheet: +pageLayout.addBorder=Add Borders pageLayout.submit=Submit @@ -619,6 +655,9 @@ pdfOrganiser.submit=Ordna om sidor multiTool.title=PDF-multiverktyg multiTool.header=PDF Multi-verktyg +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=Sidborttagare @@ -653,7 +692,10 @@ split.submit=Dela imageToPDF.title=Bild till PDF imageToPDF.header=Bild till PDF imageToPDF.submit=Konvertera -imageToPDF.selectText.1=Sträck för att passa +imageToPDF.selectLabel=Image Fit Options +imageToPDF.fillPage=Fill Page +imageToPDF.fitDocumentToImage=Fit Page to Image +imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.selectText.2=Rotera PDF automatiskt imageToPDF.selectText.3=Multifillogik (Endast aktiverad om man arbetar med flera bilder) imageToPDF.selectText.4=Slå samman till en enda PDF @@ -756,13 +798,6 @@ changeMetadata.selectText.5=Lägg till anpassad metadatapost changeMetadata.submit=Ändra -#xlsToPdf -xlsToPdf.title=Excel till PDF -xlsToPdf.header=Excel till PDF -xlsToPdf.selectText.1=Välj XLS eller XLSX Excel-ark att konvertera -xlsToPdf.convert=konvertera - - #pdfToPDFA pdfToPDFA.title=PDF till PDF/A pdfToPDFA.header=PDF till PDF/A @@ -806,3 +841,45 @@ PDFToXML.title=PDF till XML PDFToXML.header=PDF till XML PDFToXML.credit=Denna tjänst använder LibreOffice för filkonvertering. PDFToXML.submit=Konvertera + +#PDFToCSV +PDFToCSV.title=PDF till CSV +PDFToCSV.header=PDF till CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=Navvit + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties new file mode 100644 index 000000000..098f491d9 --- /dev/null +++ b/src/main/resources/messages_tr_TR.properties @@ -0,0 +1,885 @@ +########### +# Generic # +########### +# the direction that the language is written (ltr=left to right, rtl = right to left) +language.direction=ltr + +pdfPrompt=PDF(leri) seçin +multiPdfPrompt=PDF seçin (2+) +multiPdfDropPrompt=Tüm gerekli PDF'leri seçin (ya da sürükleyip bırakın) +imgPrompt=Resim(leri) seçin +genericSubmit=Gönder +processTimeWarning=Uyarı: Bu işlem, dosya boyutuna bağlı olarak bir dakikaya kadar sürebilir. +pageOrderPrompt=Özel Sayfa Sırası (Virgülle ayrılmış sayfa numaraları veya 2n+1 gibi bir fonksiyon girin) : +goToPage=Git +true=Doğru +false=Yanlış +unknown=Bilinmeyen +save=Kaydet +close=Kapat +filesSelected=dosya seçildi +noFavourites=Favori eklenmedi +bored=Sıkıldınız mı? +alphabet=Alfabe +downloadPdf=PDF İndir +text=Metin +font=Yazı tipi +selectFillter=-- Seçiniz -- +pageNum=Sayfa Numarası +sizes.small=Küçük +sizes.medium=Orta +sizes.large=Büyük +sizes.x-large=Çok Büyük +error.pdfPassword=PDF belgesi şifreli ve şifre ya sağlanmadı ya da yanlış. +delete=Sil +username=Kullanıcı Adı +password=Parola +welcome=Hoş geldiniz +property=Özellik +black=Siyah +white=Beyaz +red=Kırmızı +green=Yeşil +blue=Mavi +custom=Özel + +changedCredsMessage=Bilgiler değiştirildi! +notAuthenticatedMessage=Kullanıcı doğrulanmadı. +userNotFoundMessage=Kullanıcı bulunamadı. +incorrectPasswordMessage=Mevcut şifre yanlış. +usernameExistsMessage=Yeni Kullanıcı Adı zaten var. + + + +############# +# NAVBAR # +############# +navbar.convert=Dönüştür +navbar.security=Güvenlik +navbar.other=Çeşitli +navbar.darkmode=Karanlık Mod +navbar.pageOps=Sayfa İşlemleri +navbar.settings=Ayarlar + +############# +# SETTINGS # +############# +settings.title=Ayarlar +settings.update=Güncelleme mevcut +settings.appVersion=Uygulama Sürümü: +settings.downloadOption.title=İndirme seçeneği seçin (Zip olmayan tek dosya indirmeler için): +settings.downloadOption.1=Aynı pencerede aç +settings.downloadOption.2=Yeni pencerede aç +settings.downloadOption.3=Dosyayı indir +settings.zipThreshold=İndirilen dosya sayısı şu değeri aştığında zip dosyası oluştur: +settings.signOut=Oturumu Kapat +settings.accountSettings=Hesap Ayarları + + + +changeCreds.title=Giriş Bilgilerini Değiştir +changeCreds.header=Hesap Detaylarınızı Güncelleyin +changeCreds.changeUserAndPassword=Varsayılan giriş bilgilerini kullanıyorsunuz. Lütfen yeni bir şifre (ve istenirse kullanıcı adı) girin +changeCreds.newUsername=Yeni Kullanıcı Adı +changeCreds.oldPassword=Mevcut Şifre +changeCreds.newPassword=Yeni Şifre +changeCreds.confirmNewPassword=Yeni Şifreyi Onayla +changeCreds.submit=Değişiklikleri Gönder + + + +account.title=Hesap Ayarları +account.accountSettings=Hesap Ayarları +account.adminSettings=Yönetici Ayarları - Kullanıcıları Görüntüle ve Ekle +account.userControlSettings=Kullanıcı Kontrol Ayarları +account.changeUsername=Kullanıcı Adını Değiştir +account.changeUsername=Kullanıcı Adını Değiştir +account.password=Onay Şifresi +account.oldPassword=Eski Şifre +account.newPassword=Yeni Şifre +account.changePassword=Şifreyi Değiştir +account.confirmNewPassword=Yeni Şifreyi Onayla +account.signOut=Çıkış Yap +account.yourApiKey=API Anahtarınız +account.syncTitle=Hesap Ayarları ile Tarayıcı Ayarlarını Eşitle +account.settingsCompare=Ayar Karşılaştırması: +account.property=Özellik +account.webBrowserSettings=Web Tarayıcı Ayarı +account.syncToBrowser=Hesaptan Tarayıcıya Eşitle +account.syncToAccount=Tarayıcıdan Hesaba Eşitle + + +adminUserSettings.title=Kullanıcı Kontrol Ayarları +adminUserSettings.header=Yönetici Kullanıcı Kontrol Ayarları +adminUserSettings.admin=Yönetici +adminUserSettings.user=Kullanıcı +adminUserSettings.addUser=Yeni Kullanıcı Ekle +adminUserSettings.roles=Roller +adminUserSettings.role=Rol +adminUserSettings.actions=Eylemler +adminUserSettings.apiUser=Sınırlı API Kullanıcısı +adminUserSettings.webOnlyUser=Sadece Web Kullanıcısı +adminUserSettings.forceChange=Kullanıcının girişte kullanıcı adı/şifre değiştirmesini zorla +adminUserSettings.submit=Kullanıcıyı Kaydet + +############# +# HOME-PAGE # +############# +home.desc=Yerel olarak barındırılan tüm PDF ihtiyaçlarınız için tek durak noktanız. +home.searchBar=Search for features... + + +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + +home.multiTool.title=PDF Çoklu Araç +home.multiTool.desc=Birleştir, Döndür, Yeniden Düzenle ve Sayfaları Kaldır +multiTool.tags=Çoklu Araç,Çoklu işlem,Arayüz,tıklama sürükleme,ön uç,istemci tarafı,etkileşimli,taşınabilir,taşı + +home.merge.title=Birleştir +home.merge.desc=Çoklu PDF'leri tek bir dosyada kolayca birleştirin. +merge.tags=birleştir,Sayfa işlemleri,Arka uç,sunucu tarafı + +home.split.title=Ayır +home.split.desc=PDF'leri birden fazla belgeye ayırın +split.tags=Sayfa işlemleri,böl,Çoklu Sayfa,kes,sunucu tarafı + +home.rotate.title=Döndür +home.rotate.desc=PDF'lerinizi kolayca döndürün. +rotate.tags=sunucu tarafı + + +home.imageToPdf.title=Resimden PDF'e +home.imageToPdf.desc=Bir resmi (PNG, JPEG, GIF) PDF'e dönüştürün. +imageToPdf.tags=dönüşüm,img,jpg,fotoğraf,resim + +home.pdfToImage.title=PDF'den Resme +home.pdfToImage.desc=PDF'yi bir resme dönüştürün. (PNG, JPEG, GIF) +pdfToImage.tags=dönüşüm,img,jpg,fotoğraf,resim + +home.pdfOrganiser.title=Düzenle +home.pdfOrganiser.desc=Sayfaları herhangi bir sırayla kaldırın/düzenleyin +pdfOrganiser.tags=çift,çift,yan,yana,sırala,taşı + + +home.addImage.title=Resim Ekle +home.addImage.desc=PDF'e belirli bir konuma resim ekler +addImage.tags=img,jpg,fotoğraf,resim + +home.watermark.title=Filigran Ekle +home.watermark.desc=PDF belgenize özel bir filigran ekleyin. +watermark.tags=Metin,tekrarlayan,etiket,kendi,telif hakkı,marka,img,jpg,fotoğraf,resim + +home.permissions.title=İzinleri Değiştir +home.permissions.desc=PDF belgenizin izinlerini değiştirin +permissions.tags=oku,yaz,düzenle,yazdır + + +home.removePages.title=Kaldır +home.removePages.desc=PDF belgenizden istenmeyen sayfaları silin. +removePages.tags=Sayfaları kaldır,sayfaları sil + +home.addPassword.title=Parola Ekle +home.addPassword.desc=PDF belgenizi bir parola ile şifreleyin. +addPassword.tags=güvenli, güvenlik + +home.removePassword.title=Parolayı Kaldır +home.removePassword.desc=PDF belgenizden parola korumasını kaldırın. +removePassword.tags=güvenli,Şifreyi çöz,güvenlik,parolasız,parolayı sil + +home.compressPdfs.title=Sıkıştır +home.compressPdfs.desc=PDF'lerin dosya boyutunu azaltmak için sıkıştırın. +compressPdfs.tags=sıkıştır,küçük,minik + + +home.changeMetadata.title=Metaveriyi Değiştir +home.changeMetadata.desc=Bir PDF belgesinden metaveriyi değiştir/kaldır/ekle +changeMetadata.tags=Başlık,yazar,tarih,oluşturma,zaman,yayıncı,üretici,istatistikler + +home.fileToPDF.title=Dosyayı PDF'e Dönüştür +home.fileToPDF.desc=Hemen hemen her dosyayı PDF'e dönüştürün (DOCX, PNG, XLS, PPT, TXT ve daha fazlası) +fileToPDF.tags=dönüşüm,format,belge,fotoğraf,slayt,metin,dönüşüm,ofis,doküman,word,excel,powerpoint + +home.ocr.title=OCR / Taramaları Temizle +home.ocr.desc=Taramaları temizler ve bir PDF içindeki resimlerden metni algılar ve tekrar metin olarak ekler. +ocr.tags=tanıma,metin,resim,tarama,okuma,tanımlama,algılama,düzenlenebilir + + +home.extractImages.title=Resimleri Çıkar +home.extractImages.desc=Bir PDF'ten tüm resimleri çıkarır ve bunları zip olarak kaydeder. +extractImages.tags=fotoğraf,resim,kaydet,arşiv,zip,yakala,al + +home.pdfToPDFA.title=PDF'den PDF/A'ya +home.pdfToPDFA.desc=PDF'yi uzun vadeli saklama için PDF/A'ya dönüştürün +pdfToPDFA.tags=arşiv,uzun vadeli,standart,dönüşüm,saklama,koruma + +home.PDFToWord.title=PDF'den Word'e +home.PDFToWord.desc=PDF'yi Word formatlarına dönüştürün (DOC, DOCX ve ODT) +PDFToWord.tags=doc,docx,odt,word,dönüşüm,format,dönüşüm,ofis,microsoft,docfile + +home.PDFToPresentation.title=PDF'den Sunuma +home.PDFToPresentation.desc=PDF'yi Sunum formatlarına dönüştürün (PPT, PPTX ve ODP) +PDFToPresentation.tags=slaytlar,show,ofis,microsoft + +home.PDFToText.title=PDF'den RTF (Metin)'e +home.PDFToText.desc=PDF'i Metin veya RTF formatına dönüştür +PDFToText.tags=zenginformat,zenginmetinformatı,zengin metin formatı + +home.PDFToHTML.title=PDF'den HTML'e +home.PDFToHTML.desc=PDF'i HTML formatına dönüştür +PDFToHTML.tags=web içeriği,tarayıcı dostu + + +home.PDFToXML.title=PDF'den XML'e +home.PDFToXML.desc=PDF'i XML formatına dönüştür +PDFToXML.tags=veri-çıkarımı,yapılandırılmış-içerik,entegrasyon,dönüşüm,dönüştür + +home.ScannerImageSplit.title=Taranmış Fotoğrafları Tespit Et/Böl +home.ScannerImageSplit.desc=Bir fotoğraf/PDF içerisindeki birden fazla fotoğrafı ayırır +ScannerImageSplit.tags=ayır,otomatik-tespit,taramalar,çoklu-fotoğraf,düzenle + +home.sign.title=İmzala +home.sign.desc=Çizim, metin veya resim ile PDF'e imza ekler +sign.tags=onayla,başharfler,çizili-imza,metin-imza,resim-imza + +home.flatten.title=Düzleştir +home.flatten.desc=PDF'ten tüm etkileşimli öğeleri ve formları kaldırır +flatten.tags=statik,devre dışı bırak,etkileşimsiz,sadeleştir + +home.repair.title=Onar +home.repair.desc=Bozuk/kırık bir PDF'i onarmaya çalışır +repair.tags=onar,geri yükle,düzelt,geri getir + +home.removeBlanks.title=Boş Sayfaları Kaldır +home.removeBlanks.desc=Bir belgeden boş sayfaları tespit eder ve kaldırır +removeBlanks.tags=temizle,sadeleştir,içeriksiz,düzenle + +home.compare.title=Karşılaştır +home.compare.desc=2 PDF Belgesi arasındaki farkları karşılaştırır ve gösterir +compare.tags=farklılaştır,karşılaştır,değişiklikler,analiz + +home.certSign.title=Sertifika ile İmzala +home.certSign.desc=Bir PDF'i Sertifika/Anahtar (PEM/P12) ile imzalar +certSign.tags=doğrula,PEM,P12,resmi,şifrele + +home.pageLayout.title=Çoklu-Sayfa Düzeni +home.pageLayout.desc=Bir PDF belgesinin çoklu sayfalarını tek bir sayfada birleştirir +pageLayout.tags=birleştir,kompozit,tek-görünüm,düzenle + +home.scalePages.title=Sayfa boyutunu/ölçeğini ayarla +home.scalePages.desc=Bir sayfanın ve/veya içeriğinin boyutunu/ölçeğini değiştirir +scalePages.tags=boyutlandır,değiştir,boyut,uyarla + +home.pipeline.title=Hattı (İleri Seviye) +home.pipeline.desc=Hattı betikleri tanımlayarak PDF'lere birden fazla işlemi çalıştır +pipeline.tags=otomatikleştir,sıralı,betikli,toplu-işlem + +home.add-page-numbers.title=Sayfa Numaraları Ekle +home.add-page-numbers.desc=Bir belgeye belirli bir konuma sayfa numaraları ekler +add-page-numbers.tags=sayfalandır,etiket,düzenle,dizin + +home.auto-rename.title=PDF Dosyasını Otomatik Yeniden Adlandır +home.auto-rename.desc=Tespit edilen başlığa dayanarak bir PDF dosyasını otomatik olarak yeniden adlandırır +auto-rename.tags=otomatik-tespit,başlık-tabanlı,düzenle,yeniden-etiketle + +home.adjust-contrast.title=Renkleri/Kontrastı Ayarla +home.adjust-contrast.desc=Bir PDF'in Kontrastını, Doygunluğunu ve Parlaklığını ayarlar +adjust-contrast.tags=renk-düzeltme,ayarla,değiştir,artır + +home.crop.title=PDF'i Kırp +home.crop.desc=Boyutunu azaltmak için bir PDF'i kırpar (metni korur!) +crop.tags=kırp,küçült,düzenle,şekillendir + +home.autoSplitPDF.title=Sayfaları Otomatik Böl +home.autoSplitPDF.desc=Fiziksel taranmış sayfa bölücü QR Kod ile Taranmış PDF'i Otomatik Böl +autoSplitPDF.tags=QR-tabanlı,ayır,tarama-segmenti,düzenle + +home.sanitizePdf.title=Temizle +home.sanitizePdf.desc=PDF dosyalarından betikleri ve diğer öğeleri kaldırır +sanitizePdf.tags=temizle,güvende,korunaklı,tehditleri-kaldır + +home.URLToPDF.title=URL/Websitesi PDF'e +home.URLToPDF.desc=Herhangi bir http(s)URL'yi PDF'e dönüştürür +URLToPDF.tags=web-yakala,sayfa-kaydet,webten-dökümana,arşivle + +home.HTMLToPDF.title=HTML'den PDF'e +home.HTMLToPDF.desc=Herhangi bir HTML dosyasını veya zip'i PDF'e dönüştürür +HTMLToPDF.tags=biçimlendirme,web-içeriği,dönüşüm,dönüştür + + +home.MarkdownToPDF.title=Markdown'dan PDF'e +home.MarkdownToPDF.desc=Herhangi bir Markdown dosyasını PDF'e dönüştürür +MarkdownToPDF.tags=biçimlendirme,web-içeriği,dönüşüm,dönüştür + + +home.getPdfInfo.title=PDF Hakkında TÜM Bilgiyi Al +home.getPdfInfo.desc=PDF'ler hakkında mümkün olan her türlü bilgiyi toplar +getPdfInfo.tags=bilgi,veri,istatistikler,istatistik + + +home.extractPage.title=Sayfa(ları) Çıkar +home.extractPage.desc=PDF'ten seçili sayfaları çıkarır +extractPage.tags=çıkar + + +home.PdfToSinglePage.title=PDF'i Tek Büyük Sayfaya +home.PdfToSinglePage.desc=Tüm PDF sayfalarını tek büyük bir sayfada birleştirir +PdfToSinglePage.tags=tek sayfa + + +home.showJS.title=Javascript'i Göster +home.showJS.desc=Bir PDF'e enjekte edilen herhangi bir JS'i araştırır ve gösterir +showJS.tags=Karart,Gizle,karartma,siyah,markör,gizli + +home.autoRedact.title=Otomatik Karartma +home.autoRedact.desc=Giriş metnine dayanarak bir PDF'teki metni Otomatik Karartır (Redakte) +showJS.tags=Karart,Gizle,karartma,siyah,markör,gizli + +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to 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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize + +########################### +# # +# WEB PAGES # +# # +########################### +#login +login.title=Giriş Yap +login.signin=Giriş Yap +login.rememberme=Beni hatırla +login.invalid=Geçersiz kullanıcı adı veya şifre. +login.locked=Hesabınız kilitlendi. +login.signinTitle=Lütfen giriş yapınız. + + +#auto-redact +autoRedact.title=Otomatik Karartma +autoRedact.header=Otomatik Karartma +autoRedact.colorLabel=Renk +autoRedact.textsToRedactLabel=Karartılacak Metin (satır ayrılmış) +autoRedact.textsToRedactPlaceholder=Örn. \nGizli \nÇok Gizli +autoRedact.useRegexLabel=Regex Kullan +autoRedact.wholeWordSearchLabel=Tam Kelime Arama +autoRedact.customPaddingLabel=Özel Ekstra Dolgu +autoRedact.convertPDFToImageLabel=PDF'i PDF-Görüntü'ye dönüştür (Kutunun arkasındaki metni kaldırmak için kullanılır) +autoRedact.submitButton=Gönder + + +#showJS +showJS.title=Javascript'i Göster +showJS.header=Javascript'i Göster +showJS.downloadJS=Javascript İndir +showJS.submit=Göster + + +#pdfToSinglePage +pdfToSinglePage.title=PDF'i Tek Sayfaya +pdfToSinglePage.header=PDF'i Tek Sayfaya +pdfToSinglePage.submit=Tek Sayfaya Dönüştür + + +#pageExtracter +pageExtracter.title=Sayfaları Çıkar +pageExtracter.header=Sayfaları Çıkar +pageExtracter.submit=Çıkar + + +#getPdfInfo +getPdfInfo.title=PDF Hakkında Bilgi Al +getPdfInfo.header=PDF Hakkında Bilgi Al +getPdfInfo.submit=Bilgi Al +getPdfInfo.downloadJson=JSON İndir + + +#markdown-to-pdf +MarkdownToPDF.title=Markdown'dan PDF'e +MarkdownToPDF.header=Markdown'dan PDF'e +MarkdownToPDF.submit=Dönüştür +MarkdownToPDF.help=Devam eden iş +MarkdownToPDF.credit=WeasyPrint Kullanıyor + + + +#url-to-pdf +URLToPDF.title=URL'den PDF'e +URLToPDF.header=URL'den PDF'e +URLToPDF.submit=Dönüştür +URLToPDF.credit=WeasyPrint Kullanıyor + + +#html-to-pdf +HTMLToPDF.title=HTML'den PDF'e +HTMLToPDF.header=HTML'den PDF'e +HTMLToPDF.help=HTML dosyalarını ve html/css/görsel vb. içeren ZIP'leri kabul eder +HTMLToPDF.submit=Dönüştür +HTMLToPDF.credit=WeasyPrint Kullanıyor + + +#sanitizePDF +sanitizePDF.title=PDF'i Temizle +sanitizePDF.header=PDF dosyasını temizle +sanitizePDF.selectText.1=JavaScript işlemlerini kaldır +sanitizePDF.selectText.2=Gömülü dosyaları kaldır +sanitizePDF.selectText.3=Üst veriyi kaldır +sanitizePDF.selectText.4=Linkleri kaldır +sanitizePDF.selectText.5=Fontları kaldır +sanitizePDF.submit=PDF'i Temizle + + +#addPageNumbers +addPageNumbers.title=Sayfa Numaraları Ekle +addPageNumbers.header=Sayfa Numaraları Ekle +addPageNumbers.selectText.1=PDF dosyasını seçin: +addPageNumbers.selectText.2=Kenar Boyutu +addPageNumbers.selectText.3=Pozisyon +addPageNumbers.selectText.4=Başlangıç Numarası +addPageNumbers.selectText.5=Numaralandırılacak Sayfalar +addPageNumbers.selectText.6=Özel Metin +addPageNumbers.customTextDesc=Özel Metin +addPageNumbers.numberPagesDesc=Hangi sayfaların numaralandırılacağını, varsayılan 'all', ayrıca 1-5 veya 2,5,9 vb. kabul eder +addPageNumbers.customNumberDesc=Varsayılan {n}, ayrıca 'Sayfa {n} / {total}', 'Metin-{n}', '{filename}-{n} kabul eder +addPageNumbers.submit=Sayfa Numaraları Ekle + + +#auto-rename +auto-rename.title=Otomatik Yeniden Adlandır +auto-rename.header=PDF'i Otomatik Yeniden Adlandır +auto-rename.submit=Otomatik Yeniden Adlandır + + +#adjustContrast +adjustContrast.title=Kontrastı Ayarla +adjustContrast.header=Kontrastı Ayarla +adjustContrast.contrast=Kontrast: +adjustContrast.brightness=Parlaklık: +adjustContrast.saturation=Doygunluk: +adjustContrast.download=İndir + + +#crop +crop.title=Kırp +crop.header=Resmi Kırp +crop.submit=Gönder + + +#autoSplitPDF +autoSplitPDF.title=PDF'i Otomatik Böl +autoSplitPDF.header=PDF'i Otomatik Böl +autoSplitPDF.description=Yazdır, Ekle, Tara, yükle ve belgelerinizi otomatik olarak ayırmamıza izin ver. Elle sıralama yapmaya gerek yok. +autoSplitPDF.selectText.1=Aşağıdan bazı ayırıcı sayfaları yazdırın (Siyah ve beyaz olabilir). +autoSplitPDF.selectText.2=Ayırıcı sayfayı aralarına ekleyerek tüm belgelerinizi birden tara. +autoSplitPDF.selectText.3=Tek büyük taranmış PDF dosyasını yükleyin ve gerisini Stirling PDF'in halletmesine izin verin. +autoSplitPDF.selectText.4=Ayırıcı sayfalar otomatik olarak tespit edilir ve kaldırılır, düzgün bir final belgesi garantilidir. +autoSplitPDF.formPrompt=Stirling-PDF Sayfa ayırıcıları içeren PDF'i gönderin: +autoSplitPDF.duplexMode=Çift Taraflı Mod (Ön ve arka tarama) +autoSplitPDF.dividerDownload1='Otomatik Ayırıcı Ayırıcı (minimal).pdf' indir +autoSplitPDF.dividerDownload2='Otomatik Ayırıcı Ayırıcı (talimatlarla).pdf' indir +autoSplitPDF.submit=Gönder + + +#pipeline +pipeline.title=Pipeline + + +#pageLayout +pageLayout.title=Çoklu Sayfa Düzeni +pageLayout.header=Çoklu Sayfa Düzeni +pageLayout.pagesPerSheet=Sayfa başına sayfalar: +pageLayout.addBorder=Kenarlık Ekle +pageLayout.submit=Gönder + + +#scalePages +scalePages.title=Sayfa Ölçeğini Ayarla +scalePages.header=Sayfa Ölçeğini Ayarla +scalePages.pageSize=Belgenin bir sayfa boyutu. +scalePages.scaleFactor=Bir sayfanın yakınlaştırma seviyesi (kırpma). +scalePages.submit=Gönder + + +#certSign +certSign.title=Sertifika İmzalama +certSign.header=Sertifikanızla bir PDF imzalayın (Devam eden iş) +certSign.selectPDF=İmzalamak için bir PDF Dosyası seçin: +certSign.selectKey=Özel Anahtar Dosyanızı Seçin (PKCS#8 formatında, .pem veya .der olabilir): +certSign.selectCert=Sertifika Dosyanızı Seçin (X.509 formatında, .pem veya .der olabilir): +certSign.selectP12=PKCS#12 Anahtar Deposu Dosyanızı Seçin (.p12 veya .pfx) (İsteğe bağlı, sağlanırsa, özel anahtarınızı ve sertifikanızı içermelidir): +certSign.certType=Sertifika Türü +certSign.password=Anahtar Deposu veya Özel Anahtar Şifrenizi Girin (Varsa): +certSign.showSig=İmzayı Göster +certSign.reason=Neden +certSign.location=Konum +certSign.name=İsim +certSign.submit=PDF'i İmzala + + +#removeBlanks +removeBlanks.title=Boşları Kaldır +removeBlanks.header=Boş Sayfaları Kaldır +removeBlanks.threshold=Pixel Beyazlık Eşiği: +removeBlanks.thresholdDesc=Bir beyaz pixelin 'Beyaz' olarak sınıflandırılması için ne kadar beyaz olması gerektiğini belirlemek için eşik. 0 = Siyah, 255 saf beyaz. +removeBlanks.whitePercent=Beyaz Yüzde (%): +removeBlanks.whitePercentDesc=Bir sayfanın 'beyaz' pixel olması gereken yüzdesi +removeBlanks.submit=Boşları Kaldır + + +#compare +compare.title=Karşılaştır +compare.header=PDF'leri Karşılaştır +compare.document.1=Belge 1 +compare.document.2=Belge 2 +compare.submit=Karşılaştır + + +#sign +sign.title=İmzala +sign.header=PDF'lere İmza At +sign.upload=Resim Yükle +sign.draw=İmza Çiz +sign.text=Metin Girişi +sign.clear=Temizle +sign.add=Ekle + + +#repair +repair.title=Onar +repair.header=PDF'leri Onar +repair.submit=Onar + + +#flatten +flatten.title=Düzleştir +flatten.header=PDF'leri Düzleştir +flatten.submit=Düzleştir + + +#ScannerImageSplit +ScannerImageSplit.selectText.1=Açı Eşiği: +ScannerImageSplit.selectText.2=Resmin döndürülmesi için gereken minimum mutlak açıyı ayarlar (varsayılan: 10). +ScannerImageSplit.selectText.3=Tolerans: +ScannerImageSplit.selectText.4=Tahmini arka plan rengi etrafındaki renk varyasyon aralığını belirler (varsayılan: 30). +ScannerImageSplit.selectText.5=Minimum Alan: +ScannerImageSplit.selectText.6=Bir fotoğraf için minimum alan eşiğini ayarlar (varsayılan: 10000). +ScannerImageSplit.selectText.7=Minimum Kontur Alanı: +ScannerImageSplit.selectText.8=Bir fotoğraf için minimum kontur alanı eşiğini ayarlar +ScannerImageSplit.selectText.9=Kenar Boyutu: +ScannerImageSplit.selectText.10=Çıktıda beyaz kenarların önlenmesi için eklenen ve kaldırılan kenarın boyutunu ayarlar (varsayılan: 1). + + +#OCR +ocr.title=OCR / Tarama Temizleme +ocr.header=Taramaları Temizle / OCR (Optik Karakter Tanıma) +ocr.selectText.1=PDF içinde tespit edilecek dilleri seçin (Listelenenler şu anda tespit edilenlerdir): +ocr.selectText.2=OCR'li PDF ile birlikte OCR metnini içeren metin dosyası oluştur +ocr.selectText.3=Skew açıda taranan sayfaları geri döndürerek düzeltin +ocr.selectText.4=OCR'nin arka planda metin bulmasını azaltmak için sayfayı temizle. (Çıktıda değişiklik yok) +ocr.selectText.5=OCR'nin arka planda metin bulmasını azaltmak için sayfayı temizle, temizlemeyi çıktıda korur. +ocr.selectText.6=İnteraktif metni olan sayfaları yoksay, sadece resim olan sayfaları OCR yapar +ocr.selectText.7=Zorla OCR, tüm orijinal metin öğelerini kaldırarak Her sayfayı OCR yapar +ocr.selectText.8=Normal (PDF metin içeriyorsa hata verir) +ocr.selectText.9=Ek Ayarlar +ocr.selectText.10=OCR Modu +ocr.selectText.11=OCR'den sonra resimleri kaldır (TÜM resimleri kaldırır, sadece dönüşüm adımının bir parçasıysa yararlıdır) +ocr.selectText.12=Render Türü (İleri Seviye) +ocr.help=Lütfen bu belgede başka dillerde nasıl kullanılacağı ve/veya docker'da kullanılmaması hakkında bilgi edinin +ocr.credit=Bu hizmet OCR için OCRmyPDF ve Tesseract'ı kullanır. +ocr.submit=PDF'i OCR ile İşle + + +#extractImages +extractImages.title=Resimleri Çıkar +extractImages.header=Resimleri Çıkar +extractImages.selectText=Çıkarılan resimleri dönüştürmek için resim formatını seçin +extractImages.submit=Çıkar + + +#File to PDF +fileToPDF.title=Dosyadan PDF'e +fileToPDF.header=Herhangi bir dosyayı PDF'e dönüştür +fileToPDF.credit=Bu hizmet dosya dönüşümü için LibreOffice ve Unoconv'u kullanır. +fileToPDF.supportedFileTypes=Desteklenen dosya türleri aşağıdakileri içermelidir ancak desteklenen formatların tam güncellenmiş listesi için lütfen LibreOffice dokümantasyonuna başvurun +fileToPDF.submit=PDF'e Dönüştür + + +#compress +compress.title=Sıkıştır +compress.header=PDF'i Sıkıştır +compress.credit=Bu hizmet PDF Sıkıştırma/Optimizasyonu için Ghostscript kullanır. +compress.selectText.1=Manuel Mod - 1'den 4'e +compress.selectText.2=Optimizasyon seviyesi: +compress.selectText.3=4 (Metin resimleri için hiç uygun değil) +compress.selectText.4=Otomatik mod - PDF'in tam boyutuna ulaşmak için kaliteyi otomatik ayarlar +compress.selectText.5=Beklenen PDF Boyutu (örn. 25MB, 10.8MB, 25KB) +compress.submit=Sıkıştır + + +#Add image +addImage.title=Resim Ekle +addImage.header=PDF'e resim ekle +addImage.everyPage=Her Sayfa? +addImage.upload=Resim ekle +addImage.submit=Resim ekle + + +#merge +merge.title=Birleştir +merge.header=Çoklu PDF'leri Birleştir (2+) +merge.sortByName=İsme göre sırala +merge.sortByDate=Tarihe göre sırala +merge.submit=Birleştir + + +#pdfOrganiser +pdfOrganiser.title=Sayfa Organizatörü +pdfOrganiser.header=PDF Sayfa Organizatörü +pdfOrganiser.submit=Sayfaları Yeniden Düzenle + + +#multiTool +multiTool.title=PDF Çoklu Araç +multiTool.header=PDF Çoklu Araç + +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF + +#pageRemover +pageRemover.title=Sayfa Silici +pageRemover.header=PDF Sayfa silici +pageRemover.pagesToDelete=Silinmesi gereken sayfalar (Virgülle ayrılmış sayfa numaraları listesi girin): +pageRemover.submit=Sayfaları Sil + + +#rotate +rotate.title=PDF Döndür +rotate.header=PDF Döndür +rotate.selectAngle=Döndürme açısını seçin (90 derecenin katları olarak): +rotate.submit=Döndür + + +#merge +split.title=PDF Ayır +split.header=PDF Ayır +split.desc.1=Seçtiğiniz numaralar, bir ayrım yapmak istediğiniz sayfa numarasıdır +split.desc.2=Bu nedenle, 1,3,7-8 seçmek 10 sayfalı bir belgeyi şunlarla 6 ayrı PDF'e böler: +split.desc.3=Belge #1: Sayfa 1 +split.desc.4=Belge #2: Sayfa 2 ve 3 +split.desc.5=Belge #3: Sayfa 4, 5 ve 6 +split.desc.6=Belge #4: Sayfa 7 +split.desc.7=Belge #5: Sayfa 8 +split.desc.8=Belge #6: Sayfa 9 ve 10 +split.splitPages=Ayrılacak sayfaları girin: +split.submit=Ayır + + +#merge +imageToPDF.title=Resimden PDF'e +imageToPDF.header=Resimden PDF'e +imageToPDF.submit=Dönüştür +imageToPDF.selectLabel=Resim Uydurma Seçenekleri +imageToPDF.fillPage=Sayfayı Doldur +imageToPDF.fitDocumentToImage=Resme Uygun Sayfa +imageToPDF.maintainAspectRatio=En Boy Oranını Koru +imageToPDF.selectText.2=PDF'yi otomatik döndür +imageToPDF.selectText.3=Çoklu dosya mantığı (Yalnızca birden fazla resimle çalışırken etkinleştirilir) +imageToPDF.selectText.4=Tek bir PDF'e birleştir +imageToPDF.selectText.5=Ayrı PDF'lere dönüştür + + +#pdfToImage +pdfToImage.title=PDF'den Resme +pdfToImage.header=PDF'den Resme +pdfToImage.selectText=Resim Formatı +pdfToImage.singleOrMultiple=Sonuç resim tipi +pdfToImage.single=Tüm sayfaları birleştiren Tek Büyük Resim +pdfToImage.multi=Çoklu Resimler, sayfa başına bir resim +pdfToImage.colorType=Renk türü +pdfToImage.color=Renk +pdfToImage.grey=Gri tonlama +pdfToImage.blackwhite=Siyah ve Beyaz (Veri kaybolabilir!) +pdfToImage.submit=Dönüştür + + +#addPassword +addPassword.title=Parola Ekle +addPassword.header=Parola Ekle (Şifrele) +addPassword.selectText.1=Şifrelenecek PDF'i seçin +addPassword.selectText.2=Kullanıcı Parolası +addPassword.selectText.3=Şifreleme Anahtar Uzunluğu +addPassword.selectText.4=Daha yüksek değerler daha güçlüdür, ancak daha düşük değerler daha iyi uyumluluğa sahiptir. +addPassword.selectText.5=İzinlerin ayarlanması (Sahip parolası ile birlikte kullanılması önerilir) +addPassword.selectText.6=Belgenin birleştirilmesini önle +addPassword.selectText.7=İçeriğin çıkarılmasını önle +addPassword.selectText.8=Erişilebilirlik için çıkarmanın önlenmesi +addPassword.selectText.9=Formun doldurulmasını önle +addPassword.selectText.10=Değişikliği önle +addPassword.selectText.11=Açıklama değişikliğini önle +addPassword.selectText.12=Yazdırmayı önle +addPassword.selectText.13=Farklı formatlarda yazdırmayı önle +addPassword.selectText.14=Sahip Parolası +addPassword.selectText.15=Açıldığında belgeyle ne yapılacağını kısıtlar (Tüm okuyucular tarafından desteklenmez) +addPassword.selectText.16=Belgenin kendisinin açılmasını kısıtlar +addPassword.submit=Şifrele + + +#watermark +watermark.title=Filigran Ekle +watermark.header=Filigran Ekle +watermark.selectText.1=Filigran eklemek için PDF seçin: +watermark.selectText.2=Filigran Metni: +watermark.selectText.3=Yazı Boyutu: +watermark.selectText.4=Döndürme (0-360): +watermark.selectText.5=genişlikBoşluk (Yatayda her filigran arasında boşluk): +watermark.selectText.6=yükseklikBoşluk (Dikeyde her filigran arasında boşluk): +watermark.selectText.7=Opaklık (0% - 100%): +watermark.selectText.8=Filigran Türü: +watermark.selectText.9=Filigran Resmi: +watermark.submit=Filigran Ekle + + +#Change permissions +permissions.title=İzinleri Değiştir +permissions.header=İzinleri Değiştir +permissions.warning=İzinlerin değiştirilemez olması için bunları add-password sayfası aracılığıyla bir parola ile ayarlamaları önerilir +permissions.selectText.1=İzinlerini değiştirmek için PDF seçin +permissions.selectText.2=Ayarlanacak izinler +permissions.selectText.3=Belgenin birleştirilmesini önle +permissions.selectText.4=İçeriğin çıkarılmasını önle +permissions.selectText.5=Erişilebilirlik için çıkarmanın önlenmesi +permissions.selectText.6=Formun doldurulmasını önle +permissions.selectText.7=Değişikliği önle +permissions.selectText.8=Açıklama değişikliğini önle +permissions.selectText.9=Yazdırmayı önle +permissions.selectText.10=Farklı formatlarda yazdırmayı önle +permissions.submit=Değiştir + + +#remove password +removePassword.title=Parola Kaldır +removePassword.header=Parola Kaldır (Şifre Çöz) +removePassword.selectText.1=Şifreyi Çözmek için PDF Seçin +removePassword.selectText.2=Parola +removePassword.submit=Kaldır + + +#changeMetadata +changeMetadata.title=Başlık: +changeMetadata.header=Metaveriyi Değiştir +changeMetadata.selectText.1=Değiştirmek istediğiniz değişkenleri düzenleyin +changeMetadata.selectText.2=Tüm metaveriyi sil +changeMetadata.selectText.3=Özel Metaveriyi Göster: +changeMetadata.author=Yazar: +changeMetadata.creationDate=Oluşturma Tarihi (yyyy/MM/dd HH:mm:ss): +changeMetadata.creator=Oluşturan: +changeMetadata.keywords=Anahtar Kelimeler: +changeMetadata.modDate=Değişiklik Tarihi (yyyy/MM/dd HH:mm:ss): +changeMetadata.producer=Üretici: +changeMetadata.subject=Konu: +changeMetadata.title=Başlık: +changeMetadata.trapped=Tuzak: +changeMetadata.selectText.4=Diğer Metaveri: +changeMetadata.selectText.5=Özel Metaveri Girişi Ekle +changeMetadata.submit=Değiştir + + +#pdfToPDFA +pdfToPDFA.title=PDF'den PDF/A'ya +pdfToPDFA.header=PDF'den PDF/A'ya +pdfToPDFA.credit=Bu hizmet PDF/A dönüşümü için OCRmyPDF kullanır +pdfToPDFA.submit=Dönüştür + + +#PDFToWord +PDFToWord.title=PDF'den Word'e +PDFToWord.header=PDF'den Word'e +PDFToWord.selectText.1=Çıktı dosya formatı +PDFToWord.credit=Bu hizmet dosya dönüşümü için LibreOffice kullanır. +PDFToWord.submit=Dönüştür + + +#PDFToPresentation +PDFToPresentation.title=PDF'den Sunuma +PDFToPresentation.header=PDF'den Sunuma +PDFToPresentation.selectText.1=Çıktı dosya formatı +PDFToPresentation.credit=Bu hizmet dosya dönüşümü için LibreOffice kullanır. +PDFToPresentation.submit=Dönüştür + + +#PDFToText +PDFToText.title=PDF'den RTF (Metin)'e +PDFToText.header=PDF'den RTF (Metin)'e +PDFToText.selectText.1=Çıktı dosya formatı +PDFToText.credit=Bu hizmet dosya dönüşümü için LibreOffice kullanır. +PDFToText.submit=Dönüştür + + +#PDFToHTML +PDFToHTML.title=PDF'den HTML'e +PDFToHTML.header=PDF'den HTML'e +PDFToHTML.credit=Bu hizmet dosya dönüşümü için LibreOffice kullanır. +PDFToHTML.submit=Dönüştür + + +#PDFToXML +PDFToXML.title=PDF'den XML'e +PDFToXML.header=PDF'den XML'e +PDFToXML.credit=Bu hizmet dosya dönüşümü için LibreOffice kullanır. +PDFToXML.submit=Dönüştür + +#PDFToCSV +PDFToCSV.title=PDF to CSV +PDFToCSV.header=PDF to CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=Extract + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 1eea17a1a..f5ec23393 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -12,33 +12,30 @@ genericSubmit=提交 processTimeWarning=警告:此过程可能需要多达一分钟,具体时间取决于文件大小 pageOrderPrompt=页面顺序(输入逗号分隔的页码列表): goToPage=到 -true=True -false=False +true=对 +false=错 unknown=未知 save=保存 close=关闭 -filesSelected=\u9009\u62E9\u7684\u6587\u4EF6 -noFavourites=\u6CA1\u6709\u6DFB\u52A0\u6536\u85CF\u5939 -bored=\u65E0\u804A\u7B49\u5F85\uFF1F -alphabet=\u5B57\u6BCD\u8868 -downloadPdf=\u4E0B\u8F7DPDF -text=\u6587\u672C -font=\u5B57\u4F53 +filesSelected=选中的文件 +noFavourites=没有添加收藏夹 +bored=无聊等待吗? +alphabet=字母表 +downloadPdf=下载PDF +text=文本 +font=字体 selectFillter=-- 选择-- pageNum=页码 -sizes.small=Small -sizes.medium=Medium -sizes.large=Large -sizes.x-large=X-Large -error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect -delete=Delete -username=Username -password=Password -welcome=Welcome -########################## -### TODO: Translate ### -########################## -property=Property +sizes.small=小型尺寸 +sizes.medium=中型尺寸 +sizes.large=大型尺寸 +sizes.x-large=稍大型尺寸 +error.pdfPassword=PDF 文档有密码,未提供密码或密码不正确 +delete=删除 +username=用户名 +password=密码 +welcome=欢迎 +property=资产 black=Black white=White red=Red @@ -46,7 +43,11 @@ green=Green blue=Blue custom=Custom... - +changedCredsMessage=凭证已更改! +notAuthenticatedMessage=用户未经过身份验证。 +userNotFoundMessage=未找到用户。 +incorrectPasswordMessage=当前密码不正确。 +usernameExistsMessage=新用户名已存在。 @@ -71,250 +72,287 @@ settings.downloadOption.1=在同一窗口打开 settings.downloadOption.2=在新窗口中打开 settings.downloadOption.3=下载文件 settings.zipThreshold=当下载的文件数量超过限制时,将文件压缩。 -settings.signOut=Sign Out -settings.accountSettings=Account Settings - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser +settings.signOut=登出 +settings.accountSettings=帐号设定 -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.submit=Save User + +changeCreds.title=更改凭证 +changeCreds.header=更新您的账户详情 +changeCreds.changeUserAndPassword=您正在使用默认登录凭据。请输入新密码(如果需要,还可以输入新用户名) +changeCreds.newUsername=新用户名 +changeCreds.oldPassword=当前密码 +changeCreds.newPassword=新密码 +changeCreds.confirmNewPassword=确认新密码 +changeCreds.submit=提交更改 + + + +account.title=帐号设定 +account.accountSettings=帐号设定 +account.adminSettings=管理员设置 - 查看和添加用户 +account.userControlSettings=用户控制设置 +account.changeUsername=更改用户名 +account.changeUsername=更改用户名 +account.password=确认密码 +account.oldPassword=旧密码 +account.newPassword=新密码 +account.changePassword=更改密码 +account.confirmNewPassword=确认新密码 +account.signOut=退出登录 +account.yourApiKey=您的 API 密钥 +account.syncTitle=将浏览器设置与账户同步 +account.settingsCompare=设置比较: +account.property=属性 +account.webBrowserSettings=Web 浏览器设置 +account.syncToBrowser=同步账户 -> 浏览器 +account.syncToAccount=同步账户 <- 浏览器 + + +adminUserSettings.title=用户控制设置 +adminUserSettings.header=管理员用户控制设置 +adminUserSettings.admin=管理员 +adminUserSettings.user=用户 +adminUserSettings.addUser=添加新用户 +adminUserSettings.roles=角色 +adminUserSettings.role=角色 +adminUserSettings.actions=操作 +adminUserSettings.apiUser=有限 API 用户 +adminUserSettings.webOnlyUser=仅限 Web 用户 +adminUserSettings.forceChange=强制用户在登录时更改用户名/密码 +adminUserSettings.submit=保存用户 ############# # HOME-PAGE # ############# -home.desc=您的本地托管一站式服务,满足您的所有PDF需求。 +home.desc=CZL一站式服务,满足您的所有PDF需求。 +home.searchBar=Search for features... +home.viewPdf.title=View PDF +home.viewPdf.desc=View, annotate, add text or images +viewPdf.tags=view,read,annotate,text,image + home.multiTool.title=PDF多功能工具 home.multiTool.desc=合并、旋转、重新排列和删除PDF页面 -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side +multiTool.tags=多工具,多操作,用户界面,点击拖动,前端,客户端 home.merge.title=合并 home.merge.desc=轻松合并多个PDF为一个。 -merge.tags=merge,Page operations,Back end,server side +merge.tags=合并,页面操作,后端,服务器端 home.split.title=拆分 home.split.desc=将 PDF 拆分为多个文档。 -split.tags=Page operations,divide,Multi Page,cut,server side +split.tags=页面操作,划分,多页面,剪切,服务器端 home.rotate.title=旋转 home.rotate.desc=旋转PDF。 -rotate.tags=server side +rotate.tags=服务器端 home.imageToPdf.title=转换图像到PDF -home.imageToPdf.desc=转换图像(PNG, JPEG, GIF)到 PDF。 -imageToPdf.tags=conversion,img,jpg,picture,photo +home.imageToPdf.desc=将图像(PNG、JPEG、GIF)转换为PDF。 +imageToPdf.tags=转换、图像、JPG、图片、照片 home.pdfToImage.title=转换PDF到图像 -home.pdfToImage.desc=转换PDF到图像(PNG, JPEG, GIF) -pdfToImage.tags=conversion,img,jpg,picture,photo +home.pdfToImage.desc=将PDF转换为图像(PNG、JPEG、GIF)。 +pdfToImage.tags=转换、图像、JPG、图片、照片 home.pdfOrganiser.title=整理 -home.pdfOrganiser.desc=按任何顺序删除/重新排列页面。 -pdfOrganiser.tags=duplex,even,odd,sort,move +home.pdfOrganiser.desc=按任意顺序删除/重新排列页面。 +pdfOrganiser.tags=双面、偶数、奇数、排序、移动 home.addImage.title=在PDF中添加图片 -home.addImage.desc=将图像添加到PDF的设定位置上 -addImage.tags=img,jpg,picture,photo +home.addImage.desc=将图像添加到PDF的指定位置。 +addImage.tags=图像、JPG、图片、照片 home.watermark.title=添加水印 -home.watermark.desc=在PDF中添加一个自定义的水印。 -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo +home.watermark.desc=在PDF中添加自定义水印。 +watermark.tags=文本、重复、标签、自定义、版权、商标、图像、JPG、图片、照片 home.permissions.title=更改权限 -home.permissions.desc=改变你的PDF文档的权限。 -permissions.tags=read,write,edit,print +home.permissions.desc=更改PDF文档的权限。 +permissions.tags=阅读、写入、编辑、打印 home.removePages.title=删除 -home.removePages.desc=从你的PDF文档中删除不需要的页面。 -removePages.tags=Remove pages,delete pages +home.removePages.desc=从PDF文档中删除不需要的页面。 +removePages.tags=删除页面、删除 home.addPassword.title=添加密码 -home.addPassword.desc=用密码来加密你的PDF文档。 -addPassword.tags=secure,security +home.addPassword.desc=使用密码对PDF文档进行加密。 +addPassword.tags=安全、密码、加密 home.removePassword.title=删除密码 -home.removePassword.desc=从你的PDF文档中移除密码保护。 -removePassword.tags=secure,Decrypt,security,unpassword,delete password +home.removePassword.desc=从PDF文档中移除密码保护。 +removePassword.tags=安全、解密、密码、安全性、删除密码 home.compressPdfs.title=压缩 -home.compressPdfs.desc=压缩PDF文件以减少其文件大小。 -compressPdfs.tags=squish,small,tiny +home.compressPdfs.desc=压缩PDF文件以减小文件大小。 +compressPdfs.tags=压缩、小、微小 home.changeMetadata.title=更改元数据 home.changeMetadata.desc=更改/删除/添加PDF文档的元数据。 -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats +changeMetadata.tags=标题、作者、日期、创建、时间、发布者、制作人、统计数据 home.fileToPDF.title=将文件转换为PDF文件 -home.fileToPDF.desc=将几乎所有文件转换为PDF(DOCX、PNG、XLS、PPT、TXT等) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint +home.fileToPDF.desc=将几乎所有文件转换为PDF(DOCX、PNG、XLS、PPT、TXT等)。 +fileToPDF.tags=转换、格式、文档、图片、幻灯片、文本、转换、办公室、文档、Word、Excel、PowerPoint home.ocr.title=运行OCR/清理扫描 -home.ocr.desc=清理和检测PDF中的文本图像,并将其重新添加为文本。 -ocr.tags=recognition,text,image,scan,read,identify,detection,editable +home.ocr.desc=清理和识别PDF中的图像文本,并将其转换为可编辑文本。 +ocr.tags=识别、文本、图像、扫描、阅读、识别、检测、可编辑 home.extractImages.title=提取图像 -home.extractImages.desc=从PDF中提取所有的图像并将其保存到压缩包中。 -extractImages.tags=picture,photo,save,archive,zip,capture,grab +home.extractImages.desc=从PDF中提取所有图像并保存到压缩包中。 +extractImages.tags=图片、照片、保存、归档、压缩包、截取、抓取 home.pdfToPDFA.title=PDF To PDF/A -home.pdfToPDFA.desc=将PDF转换为PDF/A以便长期保存 -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation +home.pdfToPDFA.desc=将PDF转换为PDF/A以进行长期保存。 +pdfToPDFA.tags=归档、长期、标准、转换、存储、保存 -home.PDFToWord.title=PDF to Word +home.PDFToWord.title=PDF转Word home.PDFToWord.desc=将PDF转换为Word格式(DOC、DOCX和ODT)。 -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile +PDFToWord.tags=doc、docx、odt、word、转换、格式、办公、Microsoft、文档 -home.PDFToPresentation.title=PDF To Presentation -home.PDFToPresentation.desc=将PDF转换成演示文稿格式(PPT、PPTX和ODP)。 -PDFToPresentation.tags=slides,show,office,microsoft +home.PDFToPresentation.title=PDF转演示文稿 +home.PDFToPresentation.desc=将PDF转换为演示文稿格式(PPT、PPTX和ODP)。 +PDFToPresentation.tags=幻灯片、展示、办公、Microsoft -home.PDFToText.title=PDF to RTF (Text) -home.PDFToText.desc=将PDF转换为文本或RTF格式 -PDFToText.tags=richformat,richtextformat,rich text format +home.PDFToText.title=PDF转RTF(文本) +home.PDFToText.desc=将PDF转换为文本或RTF格式。 +PDFToText.tags=富文本格式、RTF、富文本格式 -home.PDFToHTML.title=PDF To HTML -home.PDFToHTML.desc=将PDF转换为HTML格式 -PDFToHTML.tags=web content,browser friendly +home.PDFToHTML.title=PDF转HTML +home.PDFToHTML.desc=将PDF转换为HTML格式。 +PDFToHTML.tags=网页内容、浏览器友好 -home.PDFToXML.title=PDF To XML -home.PDFToXML.desc=将PDF转换为XML格式 -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert +home.PDFToXML.title=PDF转XML +home.PDFToXML.desc=将PDF转换为XML格式。 +PDFToXML.tags=数据提取、结构化内容、互操作、转换 -home.ScannerImageSplit.title=检测/分割扫描的照片 -home.ScannerImageSplit.desc=从一张照片/PDF中分割出多张照片 -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize +home.ScannerImageSplit.title=检测/分割扫描图像 +home.ScannerImageSplit.desc=从一张照片或PDF中分割出多张照片。 +ScannerImageSplit.tags=分离、自动检测、扫描、多张照片、整理 -home.sign.title=\u6807\u5FD7 -home.sign.desc=\u901A\u8FC7\u7ED8\u56FE\u3001\u6587\u672C\u6216\u56FE\u50CF\u5411 PDF \u6DFB\u52A0\u7B7E\u540D -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature +home.sign.title=标志 +home.sign.desc=通过绘图、文字或图像向PDF添加签名 +sign.tags=授权、缩写、手绘签名、文本签名、图像签名 -home.flatten.title=\u5C55\u5E73 -home.flatten.desc=\u4ECE PDF \u4E2D\u5220\u9664\u6240\u6709\u4EA4\u4E92\u5143\u7D20\u548C\u8868\u5355 -flatten.tags=static,deactivate,non-interactive,streamline +home.flatten.title=展平 +home.flatten.desc=从PDF中删除所有互动元素和表单 +flatten.tags=静态、停用、非交互、简化 -home.repair.title=\u4FEE\u590D -home.repair.desc=\u5C1D\u8BD5\u4FEE\u590D\u635F\u574F/\u635F\u574F\u7684 PDF -repair.tags=fix,restore,correction,recover +home.repair.title=修复 +home.repair.desc=尝试修复损坏/损坏的PDF +repair.tags=修复、恢复、纠正、恢复 -home.removeBlanks.title=\u5220\u9664\u7A7A\u767D\u9875 -home.removeBlanks.desc=\u68C0\u6D4B\u5E76\u5220\u9664\u6587\u6863\u4E2D\u7684\u7A7A\u767D\u9875 -removeBlanks.tags=cleanup,streamline,non-content,organize +home.removeBlanks.title=删除空白页 +home.removeBlanks.desc=检测并删除文档中的空白页 +removeBlanks.tags=清理、简化、非内容、整理 -home.compare.title=\u6BD4\u8F83 -home.compare.desc=\u6BD4\u8F83\u5E76\u663E\u793A 2 \u4E2A PDF \u6587\u6863\u4E4B\u95F4\u7684\u5DEE\u5F02 -compare.tags=differentiate,contrast,changes,analysis +home.compare.title=比较 +home.compare.desc=比较并显示两个PDF文档之间的差异 +compare.tags=区分、对比、更改、分析 -home.certSign.title=Sign with Certificate -home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt +home.certSign.title=使用证书签署 +home.certSign.desc=使用证书/密钥(PEM/P12)对PDF进行签署 +certSign.tags=身份验证、PEM、P12、官方、加密 -home.pageLayout.title=Multi-Page Layout -home.pageLayout.desc=Merge multiple pages of a PDF document into a single page -pageLayout.tags=merge,composite,single-view,organize +home.pageLayout.title=多页布局 +home.pageLayout.desc=将PDF文档的多个页面合并成一页 +pageLayout.tags=合并、组合、单视图、整理 -home.scalePages.title=Adjust page size/scale -home.scalePages.desc=Change the size/scale of page and/or its contents. -scalePages.tags=resize,modify,dimension,adapt +home.scalePages.title=调整页面尺寸/缩放 +home.scalePages.desc=调整页面及/或其内容的尺寸/缩放 +scalePages.tags=调整大小、修改、尺寸、适应 -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts -pipeline.tags=automate,sequence,scripted,batch-process +home.pipeline.title=管道(高级版) +home.pipeline.desc=通过定义管道脚本在PDF上运行多个操作 +pipeline.tags=自动化、顺序、脚本化、批处理 -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location -add-page-numbers.tags=paginate,label,organize,index +home.add-page-numbers.title=添加页码 +home.add-page-numbers.desc=在文档的指定位置添加页码 +add-page-numbers.tags=分页、标签、整理、索引 -home.auto-rename.title=Auto Rename PDF File -home.auto-rename.desc=Auto renames a PDF file based on its detected header -auto-rename.tags=auto-detect,header-based,organize,relabel +home.auto-rename.title=自动重命名PDF文件 +home.auto-rename.desc=根据检测到的标题自动对PDF文件进行重命名 +auto-rename.tags=自动检测、基于标题、整理、重新标记 -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF -adjust-contrast.tags=color-correction,tune,modify,enhance +home.adjust-contrast.title=调整颜色/对比度 +home.adjust-contrast.desc=调整PDF的对比度、饱和度和亮度 +adjust-contrast.tags=颜色校正、调节、修改、增强 -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) -crop.tags=trim,shrink,edit,shape +home.crop.title=裁剪PDF +home.crop.desc=裁剪PDF以减小其文件大小(保留文本!) +crop.tags=修剪、缩小、编辑、形状 -home.autoSplitPDF.title=Auto Split Pages -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code -autoSplitPDF.tags=QR-based,separate,scan-segment,organize +home.autoSplitPDF.title=自动拆分页面 +home.autoSplitPDF.desc=使用物理扫描页面分割器QR代码自动拆分扫描的PDF +autoSplitPDF.tags=基于QR码、分离、扫描分割、整理 -home.sanitizePdf.title=Sanitize -home.sanitizePdf.desc=Remove scripts and other elements from PDF files -sanitizePdf.tags=clean,secure,safe,remove-threats +home.sanitizePdf.title=清理 +home.sanitizePdf.desc=从PDF文件中删除脚本和其他元素 +sanitizePdf.tags=清理、安全、安全、删除威胁 -home.URLToPDF.title=URL/Website To PDF -home.URLToPDF.desc=Converts any http(s)URL to PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive +home.URLToPDF.title=URL/网站转PDF +home.URLToPDF.desc=将任何http(s)URL转换为PDF +URLToPDF.tags=网页捕获、保存网页、网页转文档、归档 -home.HTMLToPDF.title=HTML to PDF -home.HTMLToPDF.desc=Converts any HTML file or zip to PDF -HTMLToPDF.tags=markup,web-content,transformation,convert +home.HTMLToPDF.title=HTML转PDF +home.HTMLToPDF.desc=将任何HTML文件或zip文件转换为PDF +HTMLToPDF.tags=标记、网页内容、转换、转换 -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert +home.MarkdownToPDF.title=Markdown转PDF +home.MarkdownToPDF.desc=将任何Markdown文件转换为PDF +MarkdownToPDF.tags=标记、网页内容、转换、转换 -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs -getPdfInfo.tags=infomation,data,stats,statistics +home.getPdfInfo.title=获取PDF的所有信息 +home.getPdfInfo.desc=获取PDF的所有可能的信息 +getPdfInfo.tags=信息、数据、统计、统计数据 -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF -extractPage.tags=extract +home.extractPage.title=提取页面 +home.extractPage.desc=从PDF中提取选定的页面 +extractPage.tags=提取 -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page -PdfToSinglePage.tags=single page +home.PdfToSinglePage.title=PDF转单一大页 +home.PdfToSinglePage.desc=将所有PDF页面合并为一个大的单页 +PdfToSinglePage.tags=单页 -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF -showJS.tags=JS +home.showJS.title=显示JavaScript +home.showJS.desc=搜索并显示嵌入到PDF中的任何JavaScript代码 +showJS.tags=JavaScript -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -showJS.tags=JS +home.autoRedact.title=自动删除 +home.autoRedact.desc=根据输入文本自动删除(覆盖)PDF中的文本 +showJS.tags=JavaScript + +home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.desc=Extracts Tables from a PDF converting it to 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 +autoSizeSplitPDF.tags=pdf,split,document,organization + + +home.overlay-pdfs.title=Overlay PDFs +home.overlay-pdfs.desc=Overlays PDFs on-top of another 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 +split-by-sections.tags=Section Split, Divide, Customize ########################### # # @@ -322,159 +360,157 @@ showJS.tags=JS # # ########################### #login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in +login.title=登录 +login.signin=登录 +login.rememberme=记住我 +login.invalid=用户名或密码无效。 +login.locked=您的账户已被锁定。 +login.signinTitle=请登录 #auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -########################## -### TODO: Translate ### -########################## -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=自动删除 +autoRedact.header=自动删除 +autoRedact.colorLabel=颜色 +autoRedact.textsToRedactLabel=要删除的文本(每行一个) +autoRedact.textsToRedactPlaceholder=例如:\n保密\n绝密 +autoRedact.useRegexLabel=使用正则表达式 +autoRedact.wholeWordSearchLabel=全字匹配 +autoRedact.customPaddingLabel=自定义额外间距 +autoRedact.convertPDFToImageLabel=将PDF转换为PDF-Image(用于删除方框后面的文本) +autoRedact.submitButton=提交 #showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show +showJS.title=显示 JavaScript +showJS.header=显示 JavaScript +showJS.downloadJS=下载 JavaScript +showJS.submit=显示 #pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page +pdfToSinglePage.title=PDF转为单页 +pdfToSinglePage.header=PDF转为单页 +pdfToSinglePage.submit=转为单页 #pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract +pageExtracter.title=提取页面 +pageExtracter.header=提取页面 +pageExtracter.submit=提取 #getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON +getPdfInfo.title=获取PDF信息 +getPdfInfo.header=获取PDF信息 +getPdfInfo.submit=获取信息 +getPdfInfo.downloadJson=下载JSON #markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint +MarkdownToPDF.title=Markdown转PDF +MarkdownToPDF.header=Markdown转PDF +MarkdownToPDF.submit=转换 +MarkdownToPDF.help=正在努力中 +MarkdownToPDF.credit=使用WeasyPrint #url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint +URLToPDF.title=URL转PDF +URLToPDF.header=URL转PDF +URLToPDF.submit=转换 +URLToPDF.credit=使用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.title=HTML转PDF +HTMLToPDF.header=HTML转PDF +HTMLToPDF.help=接受HTML文件和包含所需的html/css/images等的ZIP文件 +HTMLToPDF.submit=转换 +HTMLToPDF.credit=使用WeasyPrint #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=清理PDF +sanitizePDF.header=清理PDF文件 +sanitizePDF.selectText.1=移除JavaScript操作 +sanitizePDF.selectText.2=移除嵌入的文件 +sanitizePDF.selectText.3=移除元数据 +sanitizePDF.selectText.4=移除链接 +sanitizePDF.selectText.5=移除字体 +sanitizePDF.submit=清理PDF #addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers +addPageNumbers.title=添加页码 +addPageNumbers.header=添加页码 +addPageNumbers.selectText.1=选择PDF文件: +addPageNumbers.selectText.2=边距大小 +addPageNumbers.selectText.3=位置 +addPageNumbers.selectText.4=起始页码 +addPageNumbers.selectText.5=添加页码的页数 +addPageNumbers.selectText.6=自定义文本 +addPageNumbers.customTextDesc=自定义文本 +addPageNumbers.numberPagesDesc=要添加页码的页数,默认为“所有”,也可以接受1-5或2,5,9等 +addPageNumbers.customNumberDesc=默认为{n},也可以接受“第{n}页/共{total}页”,“文本-{n}”,“{filename}-{n}” +addPageNumbers.submit=添加页码 #auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename +auto-rename.title=自动重命名 +auto-rename.header=自动重命名PDF +auto-rename.submit=自动重命名 #adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download +adjustContrast.title=调整对比度 +adjustContrast.header=调整对比度 +adjustContrast.contrast=对比度: +adjustContrast.brightness=亮度: +adjustContrast.saturation=饱和度: +adjustContrast.download=下载 #crop -crop.title=Crop -crop.header=Crop Image -crop.submit=Submit +crop.title=裁剪 +crop.header=裁剪图像 +crop.submit=提交 #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=自动拆分PDF +autoSplitPDF.header=自动拆分PDF +autoSplitPDF.description=打印、插入、扫描、上传,让我们自动分离您的文档。无需手动排序。 +autoSplitPDF.selectText.1=从下面打印一些分隔页(黑白打印即可)。 +autoSplitPDF.selectText.2=在文档之间插入分隔页,一次性扫描所有文档。 +autoSplitPDF.selectText.3=上传单个大型扫描的PDF文件,让Stirling PDF处理剩下的事情。 +autoSplitPDF.selectText.4=分隔页会自动检测和删除,确保最终文档整洁。 +autoSplitPDF.formPrompt=提交包含Stirling-PDF分隔页的PDF: +autoSplitPDF.duplexMode=双面模式(正反面扫描) +autoSplitPDF.dividerDownload1=下载“自动拆分分隔页(最小化).pdf” +autoSplitPDF.dividerDownload2=下载“自动拆分分隔页(带指导说明).pdf” +autoSplitPDF.submit=提交 #pipeline -pipeline.title=Pipeline +pipeline.title=流水线 #pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -pageLayout.submit=Submit +pageLayout.title=多页布局 +pageLayout.header=多页布局 +pageLayout.pagesPerSheet=每页的页面数: +pageLayout.addBorder=添加边框 +pageLayout.submit=提交 #scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit +scalePages.title=调整页面缩放比例 +scalePages.header=调整页面缩放比例 +scalePages.pageSize=文档页面的尺寸。 +scalePages.scaleFactor=页面的缩放级别(裁剪)。 +scalePages.submit=提交 #certSign @@ -494,43 +530,43 @@ certSign.submit=签署 PDF #removeBlanks -removeBlanks.title=\u5220\u9664\u7A7A\u767D -removeBlanks.header=\u5220\u9664\u7A7A\u767D\u9875 -removeBlanks.threshold=\u9608\u503C\uFF1A -removeBlanks.thresholdDesc=\u786E\u5B9A\u767D\u8272\u50CF\u7D20\u5FC5\u987B\u6709\u591A\u767D\u7684\u9608\u503C -removeBlanks.whitePercent=\u767D\u8272\u767E\u5206\u6BD4\uFF08%\uFF09\uFF1A -removeBlanks.whitePercentDesc=\u5FC5\u987B\u4E3A\u767D\u8272\u624D\u80FD\u5220\u9664\u7684\u9875\u9762\u767E\u5206\u6BD4 -removeBlanks.submit=\u5220\u9664\u7A7A\u767D +removeBlanks.title=删除空白 +removeBlanks.header=删除空白页 +removeBlanks.threshold=阈值: +removeBlanks.thresholdDesc=确定白色像素必须有多白的阈值 +removeBlanks.whitePercent=白色百分比(%): +removeBlanks.whitePercentDesc=必须为白色才能删除的页面百分比 +removeBlanks.submit=删除空白 #compare -compare.title=\u6BD4\u8F83 -compare.header=\u6BD4\u8F83 PDF -compare.document.1=\u6587\u6863 1 -compare.document.2=\u6587\u6863 2 -compare.submit=\u6BD4\u8F83 +compare.title=比较 +compare.header=比较 PDF +compare.document.1=文档 1 +compare.document.2=文档 2 +compare.submit=比较 #sign -sign.title=\u7B7E\u540D -sign.header=\u7B7E\u7F72 PDF -sign.upload=\u4E0A\u4F20\u56FE\u7247 -sign.draw=\u7ED8\u5236\u7B7E\u540D -sign.text=\u6587\u672C\u8F93\u5165 -sign.clear=\u6E05\u9664 -sign.add=\u6DFB\u52A0 +sign.title=签名 +sign.header=签署 PDF +sign.upload=上传图片 +sign.draw=绘制签名 +sign.text=文本输入 +sign.clear=清除 +sign.add=添加 #repair -repair.title=\u4FEE\u590D -repair.header=\u4FEE\u590D PDF -repair.submit=\u4FEE\u590D +repair.title=修复 +repair.header=修复 PDF +repair.submit=修复 #flatten -flatten.title=\u5C55\u5E73 -flatten.header=\u5C55\u5E73 PDF -flatten.submit=\u5C55\u5E73 +flatten.title=展平 +flatten.header=展平 PDF +flatten.submit=展平 #ScannerImageSplit @@ -595,7 +631,7 @@ compress.submit=压缩 #Add image addImage.title=添加图像 -addImage.header=添加图片到PDF (Work in progress) +addImage.header=添加图片到PDF(正在进行中) addImage.everyPage=每一页? addImage.upload=添加图片 addImage.submit=添加图片 @@ -604,8 +640,8 @@ addImage.submit=添加图片 #merge merge.title=合并 merge.header=合并多个PDF(2个以上)。 -merge.sortByName=Sort by name -merge.sortByDate=Sort by date +merge.sortByName=按名称排序 +merge.sortByDate=按日期排序 merge.submit=合并 @@ -619,6 +655,9 @@ pdfOrganiser.submit=重新排列页面 multiTool.title=PDF多功能工具 multiTool.header=PDF多功能工具 +#view pdf +viewPdf.title=View PDF +viewPdf.header=View PDF #pageRemover pageRemover.title=删除页面 @@ -639,12 +678,12 @@ split.title=拆分PDF split.header=拆分PDF split.desc.1=选择希望进行分割的页数 split.desc.2=如选择1,3,7-8将把一个10页的文件分割成6个独立的PDF: -split.desc.3=Document #1: Page 1 -split.desc.4=Document #2: Page 2 and 3 -split.desc.5=Document #3: Page 4, 5 and 6 -split.desc.6=Document #4: Page 7 -split.desc.7=Document #5: Page 8 -split.desc.8=Document #6: Page 9 and 10 +split.desc.3=文档 #1:第1页 +split.desc.4=文档 #2:第2页和第3页 +split.desc.5=文档 #3:第4页、第5页和第6页 +split.desc.6=文档 #4:第7页 +split.desc.7=文档 #5:第8页 +split.desc.8=文档 #6:第9页和第10页 split.splitPages=输入要分割的页面: split.submit=拆分 @@ -653,7 +692,10 @@ split.submit=拆分 imageToPDF.title=图片转PDF imageToPDF.header=图像转为PDF imageToPDF.submit=转换 -imageToPDF.selectText.1=拉伸至适合的尺寸 +imageToPDF.selectLabel=图片适应选项 +imageToPDF.fillPage=填充页面 +imageToPDF.fitDocumentToImage=适应图片大小 +imageToPDF.maintainAspectRatio=保持纵横比例 imageToPDF.selectText.2=自动旋转PDF imageToPDF.selectText.3=多文件逻辑(仅在处理多个图像时启用) imageToPDF.selectText.4=合并成一个PDF文件 @@ -689,10 +731,10 @@ addPassword.selectText.9=防止填写表格 addPassword.selectText.10=防止修改 addPassword.selectText.11=防止修改注释 addPassword.selectText.12=防止打印 -addPassword.selectText.13=防止打印不同的格� -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=防止打印不同的格式 +addPassword.selectText.14=所有者密码 +addPassword.selectText.15=限制打开后对文档的操作(不被所有阅读器支持) +addPassword.selectText.16=限制打开文档本身 addPassword.submit=加密 @@ -703,11 +745,11 @@ watermark.selectText.1=选择要添加水印的PDF: watermark.selectText.2=水印文本: watermark.selectText.3=字体大小: watermark.selectText.4=旋转(0-360): -watermark.selectText.5=widthSpacer(水平方向上每个水印之间的空间): -watermark.selectText.6=heightSpacer(每个水印之间的垂直空间): +watermark.selectText.5=水平间距(每个水印之间的水平距离): +watermark.selectText.6=垂直间距(每个水印之间的垂直距离): watermark.selectText.7=透明度(0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: +watermark.selectText.8=水印类型: +watermark.selectText.9=水印图片: watermark.submit=添加水印 @@ -756,16 +798,9 @@ changeMetadata.selectText.5=添加自定义元数据条目 changeMetadata.submit=更改 -#xlsToPdf -xlsToPdf.title=Excel转PDF -xlsToPdf.header=Excel转PDF -xlsToPdf.selectText.1=选择要转换的XLS或XLSX Excel表格 -xlsToPdf.convert=转换 - - #pdfToPDFA -pdfToPDFA.title=PDF To PDF/A -pdfToPDFA.header=PDF to PDF/A +pdfToPDFA.title=将PDF转换为PDF/A +pdfToPDFA.header=PDF转换为PDF/A pdfToPDFA.credit=此服务使用OCRmyPDF进行PDF/A转换 pdfToPDFA.submit=转换 @@ -779,7 +814,7 @@ PDFToWord.submit=转换 #PDFToPresentation -PDFToPresentation.title=PDF To Presentation +PDFToPresentation.title=PDF转换为演示文稿 PDFToPresentation.header=将PDF转为演示文稿 PDFToPresentation.selectText.1=输出文件格式 PDFToPresentation.credit=该服务使用LibreOffice进行文件转换。 @@ -806,3 +841,45 @@ PDFToXML.title=PDF To XML PDFToXML.header=将PDF转换为XML PDFToXML.credit=此服务使用LibreOffice进行文件转换。 PDFToXML.submit=转换 + +#PDFToCSV +PDFToCSV.title=PDF ? CSV +PDFToCSV.header=PDF ? CSV +PDFToCSV.prompt=Choose page to extract table +PDFToCSV.submit=?? + +#split-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 + + +#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 + + +#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 diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index 2fd0e2517..0f229ba44 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -4,16 +4,11 @@ security: enableLogin: false # set to 'true' to enable login - initialLogin: - username: 'username' # Specify the initial username for first boot (e.g. 'admin') - password: 'password' # Specify the initial password for first boot (e.g. 'password123') csrfDisabled: true system: defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc) googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow - rootURIPath: / # Set the application's root URI (e.g. /pdf-app) - customStaticFilePath: '/customFiles/static/' # Directory path for custom static files #ui: # appName: exampleAppName # Application's visible name diff --git a/src/main/resources/static/css/bootstrap-icons.min.css b/src/main/resources/static/css/bootstrap-icons.min.css new file mode 100644 index 000000000..b882fd5ad --- /dev/null +++ b/src/main/resources/static/css/bootstrap-icons.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap Icons v1.11.2 (https://icons.getbootstrap.com/) + * Copyright 2019-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */@font-face{font-display:block;font-family:bootstrap-icons;src:url("fonts/bootstrap-icons.woff2?7141511ac37f13e1a387fb9fc6646256") format("woff2"),url("fonts/bootstrap-icons.woff?7141511ac37f13e1a387fb9fc6646256") format("woff")}.bi::before,[class*=" bi-"]::before,[class^=bi-]::before{display:inline-block;font-family:bootstrap-icons!important;font-style:normal;font-weight:400!important;font-variant:normal;text-transform:none;line-height:1;vertical-align:-.125em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.bi-123::before{content:"\f67f"}.bi-alarm-fill::before{content:"\f101"}.bi-alarm::before{content:"\f102"}.bi-align-bottom::before{content:"\f103"}.bi-align-center::before{content:"\f104"}.bi-align-end::before{content:"\f105"}.bi-align-middle::before{content:"\f106"}.bi-align-start::before{content:"\f107"}.bi-align-top::before{content:"\f108"}.bi-alt::before{content:"\f109"}.bi-app-indicator::before{content:"\f10a"}.bi-app::before{content:"\f10b"}.bi-archive-fill::before{content:"\f10c"}.bi-archive::before{content:"\f10d"}.bi-arrow-90deg-down::before{content:"\f10e"}.bi-arrow-90deg-left::before{content:"\f10f"}.bi-arrow-90deg-right::before{content:"\f110"}.bi-arrow-90deg-up::before{content:"\f111"}.bi-arrow-bar-down::before{content:"\f112"}.bi-arrow-bar-left::before{content:"\f113"}.bi-arrow-bar-right::before{content:"\f114"}.bi-arrow-bar-up::before{content:"\f115"}.bi-arrow-clockwise::before{content:"\f116"}.bi-arrow-counterclockwise::before{content:"\f117"}.bi-arrow-down-circle-fill::before{content:"\f118"}.bi-arrow-down-circle::before{content:"\f119"}.bi-arrow-down-left-circle-fill::before{content:"\f11a"}.bi-arrow-down-left-circle::before{content:"\f11b"}.bi-arrow-down-left-square-fill::before{content:"\f11c"}.bi-arrow-down-left-square::before{content:"\f11d"}.bi-arrow-down-left::before{content:"\f11e"}.bi-arrow-down-right-circle-fill::before{content:"\f11f"}.bi-arrow-down-right-circle::before{content:"\f120"}.bi-arrow-down-right-square-fill::before{content:"\f121"}.bi-arrow-down-right-square::before{content:"\f122"}.bi-arrow-down-right::before{content:"\f123"}.bi-arrow-down-short::before{content:"\f124"}.bi-arrow-down-square-fill::before{content:"\f125"}.bi-arrow-down-square::before{content:"\f126"}.bi-arrow-down-up::before{content:"\f127"}.bi-arrow-down::before{content:"\f128"}.bi-arrow-left-circle-fill::before{content:"\f129"}.bi-arrow-left-circle::before{content:"\f12a"}.bi-arrow-left-right::before{content:"\f12b"}.bi-arrow-left-short::before{content:"\f12c"}.bi-arrow-left-square-fill::before{content:"\f12d"}.bi-arrow-left-square::before{content:"\f12e"}.bi-arrow-left::before{content:"\f12f"}.bi-arrow-repeat::before{content:"\f130"}.bi-arrow-return-left::before{content:"\f131"}.bi-arrow-return-right::before{content:"\f132"}.bi-arrow-right-circle-fill::before{content:"\f133"}.bi-arrow-right-circle::before{content:"\f134"}.bi-arrow-right-short::before{content:"\f135"}.bi-arrow-right-square-fill::before{content:"\f136"}.bi-arrow-right-square::before{content:"\f137"}.bi-arrow-right::before{content:"\f138"}.bi-arrow-up-circle-fill::before{content:"\f139"}.bi-arrow-up-circle::before{content:"\f13a"}.bi-arrow-up-left-circle-fill::before{content:"\f13b"}.bi-arrow-up-left-circle::before{content:"\f13c"}.bi-arrow-up-left-square-fill::before{content:"\f13d"}.bi-arrow-up-left-square::before{content:"\f13e"}.bi-arrow-up-left::before{content:"\f13f"}.bi-arrow-up-right-circle-fill::before{content:"\f140"}.bi-arrow-up-right-circle::before{content:"\f141"}.bi-arrow-up-right-square-fill::before{content:"\f142"}.bi-arrow-up-right-square::before{content:"\f143"}.bi-arrow-up-right::before{content:"\f144"}.bi-arrow-up-short::before{content:"\f145"}.bi-arrow-up-square-fill::before{content:"\f146"}.bi-arrow-up-square::before{content:"\f147"}.bi-arrow-up::before{content:"\f148"}.bi-arrows-angle-contract::before{content:"\f149"}.bi-arrows-angle-expand::before{content:"\f14a"}.bi-arrows-collapse::before{content:"\f14b"}.bi-arrows-expand::before{content:"\f14c"}.bi-arrows-fullscreen::before{content:"\f14d"}.bi-arrows-move::before{content:"\f14e"}.bi-aspect-ratio-fill::before{content:"\f14f"}.bi-aspect-ratio::before{content:"\f150"}.bi-asterisk::before{content:"\f151"}.bi-at::before{content:"\f152"}.bi-award-fill::before{content:"\f153"}.bi-award::before{content:"\f154"}.bi-back::before{content:"\f155"}.bi-backspace-fill::before{content:"\f156"}.bi-backspace-reverse-fill::before{content:"\f157"}.bi-backspace-reverse::before{content:"\f158"}.bi-backspace::before{content:"\f159"}.bi-badge-3d-fill::before{content:"\f15a"}.bi-badge-3d::before{content:"\f15b"}.bi-badge-4k-fill::before{content:"\f15c"}.bi-badge-4k::before{content:"\f15d"}.bi-badge-8k-fill::before{content:"\f15e"}.bi-badge-8k::before{content:"\f15f"}.bi-badge-ad-fill::before{content:"\f160"}.bi-badge-ad::before{content:"\f161"}.bi-badge-ar-fill::before{content:"\f162"}.bi-badge-ar::before{content:"\f163"}.bi-badge-cc-fill::before{content:"\f164"}.bi-badge-cc::before{content:"\f165"}.bi-badge-hd-fill::before{content:"\f166"}.bi-badge-hd::before{content:"\f167"}.bi-badge-tm-fill::before{content:"\f168"}.bi-badge-tm::before{content:"\f169"}.bi-badge-vo-fill::before{content:"\f16a"}.bi-badge-vo::before{content:"\f16b"}.bi-badge-vr-fill::before{content:"\f16c"}.bi-badge-vr::before{content:"\f16d"}.bi-badge-wc-fill::before{content:"\f16e"}.bi-badge-wc::before{content:"\f16f"}.bi-bag-check-fill::before{content:"\f170"}.bi-bag-check::before{content:"\f171"}.bi-bag-dash-fill::before{content:"\f172"}.bi-bag-dash::before{content:"\f173"}.bi-bag-fill::before{content:"\f174"}.bi-bag-plus-fill::before{content:"\f175"}.bi-bag-plus::before{content:"\f176"}.bi-bag-x-fill::before{content:"\f177"}.bi-bag-x::before{content:"\f178"}.bi-bag::before{content:"\f179"}.bi-bar-chart-fill::before{content:"\f17a"}.bi-bar-chart-line-fill::before{content:"\f17b"}.bi-bar-chart-line::before{content:"\f17c"}.bi-bar-chart-steps::before{content:"\f17d"}.bi-bar-chart::before{content:"\f17e"}.bi-basket-fill::before{content:"\f17f"}.bi-basket::before{content:"\f180"}.bi-basket2-fill::before{content:"\f181"}.bi-basket2::before{content:"\f182"}.bi-basket3-fill::before{content:"\f183"}.bi-basket3::before{content:"\f184"}.bi-battery-charging::before{content:"\f185"}.bi-battery-full::before{content:"\f186"}.bi-battery-half::before{content:"\f187"}.bi-battery::before{content:"\f188"}.bi-bell-fill::before{content:"\f189"}.bi-bell::before{content:"\f18a"}.bi-bezier::before{content:"\f18b"}.bi-bezier2::before{content:"\f18c"}.bi-bicycle::before{content:"\f18d"}.bi-binoculars-fill::before{content:"\f18e"}.bi-binoculars::before{content:"\f18f"}.bi-blockquote-left::before{content:"\f190"}.bi-blockquote-right::before{content:"\f191"}.bi-book-fill::before{content:"\f192"}.bi-book-half::before{content:"\f193"}.bi-book::before{content:"\f194"}.bi-bookmark-check-fill::before{content:"\f195"}.bi-bookmark-check::before{content:"\f196"}.bi-bookmark-dash-fill::before{content:"\f197"}.bi-bookmark-dash::before{content:"\f198"}.bi-bookmark-fill::before{content:"\f199"}.bi-bookmark-heart-fill::before{content:"\f19a"}.bi-bookmark-heart::before{content:"\f19b"}.bi-bookmark-plus-fill::before{content:"\f19c"}.bi-bookmark-plus::before{content:"\f19d"}.bi-bookmark-star-fill::before{content:"\f19e"}.bi-bookmark-star::before{content:"\f19f"}.bi-bookmark-x-fill::before{content:"\f1a0"}.bi-bookmark-x::before{content:"\f1a1"}.bi-bookmark::before{content:"\f1a2"}.bi-bookmarks-fill::before{content:"\f1a3"}.bi-bookmarks::before{content:"\f1a4"}.bi-bookshelf::before{content:"\f1a5"}.bi-bootstrap-fill::before{content:"\f1a6"}.bi-bootstrap-reboot::before{content:"\f1a7"}.bi-bootstrap::before{content:"\f1a8"}.bi-border-all::before{content:"\f1a9"}.bi-border-bottom::before{content:"\f1aa"}.bi-border-center::before{content:"\f1ab"}.bi-border-inner::before{content:"\f1ac"}.bi-border-left::before{content:"\f1ad"}.bi-border-middle::before{content:"\f1ae"}.bi-border-outer::before{content:"\f1af"}.bi-border-right::before{content:"\f1b0"}.bi-border-style::before{content:"\f1b1"}.bi-border-top::before{content:"\f1b2"}.bi-border-width::before{content:"\f1b3"}.bi-border::before{content:"\f1b4"}.bi-bounding-box-circles::before{content:"\f1b5"}.bi-bounding-box::before{content:"\f1b6"}.bi-box-arrow-down-left::before{content:"\f1b7"}.bi-box-arrow-down-right::before{content:"\f1b8"}.bi-box-arrow-down::before{content:"\f1b9"}.bi-box-arrow-in-down-left::before{content:"\f1ba"}.bi-box-arrow-in-down-right::before{content:"\f1bb"}.bi-box-arrow-in-down::before{content:"\f1bc"}.bi-box-arrow-in-left::before{content:"\f1bd"}.bi-box-arrow-in-right::before{content:"\f1be"}.bi-box-arrow-in-up-left::before{content:"\f1bf"}.bi-box-arrow-in-up-right::before{content:"\f1c0"}.bi-box-arrow-in-up::before{content:"\f1c1"}.bi-box-arrow-left::before{content:"\f1c2"}.bi-box-arrow-right::before{content:"\f1c3"}.bi-box-arrow-up-left::before{content:"\f1c4"}.bi-box-arrow-up-right::before{content:"\f1c5"}.bi-box-arrow-up::before{content:"\f1c6"}.bi-box-seam::before{content:"\f1c7"}.bi-box::before{content:"\f1c8"}.bi-braces::before{content:"\f1c9"}.bi-bricks::before{content:"\f1ca"}.bi-briefcase-fill::before{content:"\f1cb"}.bi-briefcase::before{content:"\f1cc"}.bi-brightness-alt-high-fill::before{content:"\f1cd"}.bi-brightness-alt-high::before{content:"\f1ce"}.bi-brightness-alt-low-fill::before{content:"\f1cf"}.bi-brightness-alt-low::before{content:"\f1d0"}.bi-brightness-high-fill::before{content:"\f1d1"}.bi-brightness-high::before{content:"\f1d2"}.bi-brightness-low-fill::before{content:"\f1d3"}.bi-brightness-low::before{content:"\f1d4"}.bi-broadcast-pin::before{content:"\f1d5"}.bi-broadcast::before{content:"\f1d6"}.bi-brush-fill::before{content:"\f1d7"}.bi-brush::before{content:"\f1d8"}.bi-bucket-fill::before{content:"\f1d9"}.bi-bucket::before{content:"\f1da"}.bi-bug-fill::before{content:"\f1db"}.bi-bug::before{content:"\f1dc"}.bi-building::before{content:"\f1dd"}.bi-bullseye::before{content:"\f1de"}.bi-calculator-fill::before{content:"\f1df"}.bi-calculator::before{content:"\f1e0"}.bi-calendar-check-fill::before{content:"\f1e1"}.bi-calendar-check::before{content:"\f1e2"}.bi-calendar-date-fill::before{content:"\f1e3"}.bi-calendar-date::before{content:"\f1e4"}.bi-calendar-day-fill::before{content:"\f1e5"}.bi-calendar-day::before{content:"\f1e6"}.bi-calendar-event-fill::before{content:"\f1e7"}.bi-calendar-event::before{content:"\f1e8"}.bi-calendar-fill::before{content:"\f1e9"}.bi-calendar-minus-fill::before{content:"\f1ea"}.bi-calendar-minus::before{content:"\f1eb"}.bi-calendar-month-fill::before{content:"\f1ec"}.bi-calendar-month::before{content:"\f1ed"}.bi-calendar-plus-fill::before{content:"\f1ee"}.bi-calendar-plus::before{content:"\f1ef"}.bi-calendar-range-fill::before{content:"\f1f0"}.bi-calendar-range::before{content:"\f1f1"}.bi-calendar-week-fill::before{content:"\f1f2"}.bi-calendar-week::before{content:"\f1f3"}.bi-calendar-x-fill::before{content:"\f1f4"}.bi-calendar-x::before{content:"\f1f5"}.bi-calendar::before{content:"\f1f6"}.bi-calendar2-check-fill::before{content:"\f1f7"}.bi-calendar2-check::before{content:"\f1f8"}.bi-calendar2-date-fill::before{content:"\f1f9"}.bi-calendar2-date::before{content:"\f1fa"}.bi-calendar2-day-fill::before{content:"\f1fb"}.bi-calendar2-day::before{content:"\f1fc"}.bi-calendar2-event-fill::before{content:"\f1fd"}.bi-calendar2-event::before{content:"\f1fe"}.bi-calendar2-fill::before{content:"\f1ff"}.bi-calendar2-minus-fill::before{content:"\f200"}.bi-calendar2-minus::before{content:"\f201"}.bi-calendar2-month-fill::before{content:"\f202"}.bi-calendar2-month::before{content:"\f203"}.bi-calendar2-plus-fill::before{content:"\f204"}.bi-calendar2-plus::before{content:"\f205"}.bi-calendar2-range-fill::before{content:"\f206"}.bi-calendar2-range::before{content:"\f207"}.bi-calendar2-week-fill::before{content:"\f208"}.bi-calendar2-week::before{content:"\f209"}.bi-calendar2-x-fill::before{content:"\f20a"}.bi-calendar2-x::before{content:"\f20b"}.bi-calendar2::before{content:"\f20c"}.bi-calendar3-event-fill::before{content:"\f20d"}.bi-calendar3-event::before{content:"\f20e"}.bi-calendar3-fill::before{content:"\f20f"}.bi-calendar3-range-fill::before{content:"\f210"}.bi-calendar3-range::before{content:"\f211"}.bi-calendar3-week-fill::before{content:"\f212"}.bi-calendar3-week::before{content:"\f213"}.bi-calendar3::before{content:"\f214"}.bi-calendar4-event::before{content:"\f215"}.bi-calendar4-range::before{content:"\f216"}.bi-calendar4-week::before{content:"\f217"}.bi-calendar4::before{content:"\f218"}.bi-camera-fill::before{content:"\f219"}.bi-camera-reels-fill::before{content:"\f21a"}.bi-camera-reels::before{content:"\f21b"}.bi-camera-video-fill::before{content:"\f21c"}.bi-camera-video-off-fill::before{content:"\f21d"}.bi-camera-video-off::before{content:"\f21e"}.bi-camera-video::before{content:"\f21f"}.bi-camera::before{content:"\f220"}.bi-camera2::before{content:"\f221"}.bi-capslock-fill::before{content:"\f222"}.bi-capslock::before{content:"\f223"}.bi-card-checklist::before{content:"\f224"}.bi-card-heading::before{content:"\f225"}.bi-card-image::before{content:"\f226"}.bi-card-list::before{content:"\f227"}.bi-card-text::before{content:"\f228"}.bi-caret-down-fill::before{content:"\f229"}.bi-caret-down-square-fill::before{content:"\f22a"}.bi-caret-down-square::before{content:"\f22b"}.bi-caret-down::before{content:"\f22c"}.bi-caret-left-fill::before{content:"\f22d"}.bi-caret-left-square-fill::before{content:"\f22e"}.bi-caret-left-square::before{content:"\f22f"}.bi-caret-left::before{content:"\f230"}.bi-caret-right-fill::before{content:"\f231"}.bi-caret-right-square-fill::before{content:"\f232"}.bi-caret-right-square::before{content:"\f233"}.bi-caret-right::before{content:"\f234"}.bi-caret-up-fill::before{content:"\f235"}.bi-caret-up-square-fill::before{content:"\f236"}.bi-caret-up-square::before{content:"\f237"}.bi-caret-up::before{content:"\f238"}.bi-cart-check-fill::before{content:"\f239"}.bi-cart-check::before{content:"\f23a"}.bi-cart-dash-fill::before{content:"\f23b"}.bi-cart-dash::before{content:"\f23c"}.bi-cart-fill::before{content:"\f23d"}.bi-cart-plus-fill::before{content:"\f23e"}.bi-cart-plus::before{content:"\f23f"}.bi-cart-x-fill::before{content:"\f240"}.bi-cart-x::before{content:"\f241"}.bi-cart::before{content:"\f242"}.bi-cart2::before{content:"\f243"}.bi-cart3::before{content:"\f244"}.bi-cart4::before{content:"\f245"}.bi-cash-stack::before{content:"\f246"}.bi-cash::before{content:"\f247"}.bi-cast::before{content:"\f248"}.bi-chat-dots-fill::before{content:"\f249"}.bi-chat-dots::before{content:"\f24a"}.bi-chat-fill::before{content:"\f24b"}.bi-chat-left-dots-fill::before{content:"\f24c"}.bi-chat-left-dots::before{content:"\f24d"}.bi-chat-left-fill::before{content:"\f24e"}.bi-chat-left-quote-fill::before{content:"\f24f"}.bi-chat-left-quote::before{content:"\f250"}.bi-chat-left-text-fill::before{content:"\f251"}.bi-chat-left-text::before{content:"\f252"}.bi-chat-left::before{content:"\f253"}.bi-chat-quote-fill::before{content:"\f254"}.bi-chat-quote::before{content:"\f255"}.bi-chat-right-dots-fill::before{content:"\f256"}.bi-chat-right-dots::before{content:"\f257"}.bi-chat-right-fill::before{content:"\f258"}.bi-chat-right-quote-fill::before{content:"\f259"}.bi-chat-right-quote::before{content:"\f25a"}.bi-chat-right-text-fill::before{content:"\f25b"}.bi-chat-right-text::before{content:"\f25c"}.bi-chat-right::before{content:"\f25d"}.bi-chat-square-dots-fill::before{content:"\f25e"}.bi-chat-square-dots::before{content:"\f25f"}.bi-chat-square-fill::before{content:"\f260"}.bi-chat-square-quote-fill::before{content:"\f261"}.bi-chat-square-quote::before{content:"\f262"}.bi-chat-square-text-fill::before{content:"\f263"}.bi-chat-square-text::before{content:"\f264"}.bi-chat-square::before{content:"\f265"}.bi-chat-text-fill::before{content:"\f266"}.bi-chat-text::before{content:"\f267"}.bi-chat::before{content:"\f268"}.bi-check-all::before{content:"\f269"}.bi-check-circle-fill::before{content:"\f26a"}.bi-check-circle::before{content:"\f26b"}.bi-check-square-fill::before{content:"\f26c"}.bi-check-square::before{content:"\f26d"}.bi-check::before{content:"\f26e"}.bi-check2-all::before{content:"\f26f"}.bi-check2-circle::before{content:"\f270"}.bi-check2-square::before{content:"\f271"}.bi-check2::before{content:"\f272"}.bi-chevron-bar-contract::before{content:"\f273"}.bi-chevron-bar-down::before{content:"\f274"}.bi-chevron-bar-expand::before{content:"\f275"}.bi-chevron-bar-left::before{content:"\f276"}.bi-chevron-bar-right::before{content:"\f277"}.bi-chevron-bar-up::before{content:"\f278"}.bi-chevron-compact-down::before{content:"\f279"}.bi-chevron-compact-left::before{content:"\f27a"}.bi-chevron-compact-right::before{content:"\f27b"}.bi-chevron-compact-up::before{content:"\f27c"}.bi-chevron-contract::before{content:"\f27d"}.bi-chevron-double-down::before{content:"\f27e"}.bi-chevron-double-left::before{content:"\f27f"}.bi-chevron-double-right::before{content:"\f280"}.bi-chevron-double-up::before{content:"\f281"}.bi-chevron-down::before{content:"\f282"}.bi-chevron-expand::before{content:"\f283"}.bi-chevron-left::before{content:"\f284"}.bi-chevron-right::before{content:"\f285"}.bi-chevron-up::before{content:"\f286"}.bi-circle-fill::before{content:"\f287"}.bi-circle-half::before{content:"\f288"}.bi-circle-square::before{content:"\f289"}.bi-circle::before{content:"\f28a"}.bi-clipboard-check::before{content:"\f28b"}.bi-clipboard-data::before{content:"\f28c"}.bi-clipboard-minus::before{content:"\f28d"}.bi-clipboard-plus::before{content:"\f28e"}.bi-clipboard-x::before{content:"\f28f"}.bi-clipboard::before{content:"\f290"}.bi-clock-fill::before{content:"\f291"}.bi-clock-history::before{content:"\f292"}.bi-clock::before{content:"\f293"}.bi-cloud-arrow-down-fill::before{content:"\f294"}.bi-cloud-arrow-down::before{content:"\f295"}.bi-cloud-arrow-up-fill::before{content:"\f296"}.bi-cloud-arrow-up::before{content:"\f297"}.bi-cloud-check-fill::before{content:"\f298"}.bi-cloud-check::before{content:"\f299"}.bi-cloud-download-fill::before{content:"\f29a"}.bi-cloud-download::before{content:"\f29b"}.bi-cloud-drizzle-fill::before{content:"\f29c"}.bi-cloud-drizzle::before{content:"\f29d"}.bi-cloud-fill::before{content:"\f29e"}.bi-cloud-fog-fill::before{content:"\f29f"}.bi-cloud-fog::before{content:"\f2a0"}.bi-cloud-fog2-fill::before{content:"\f2a1"}.bi-cloud-fog2::before{content:"\f2a2"}.bi-cloud-hail-fill::before{content:"\f2a3"}.bi-cloud-hail::before{content:"\f2a4"}.bi-cloud-haze-fill::before{content:"\f2a6"}.bi-cloud-haze::before{content:"\f2a7"}.bi-cloud-haze2-fill::before{content:"\f2a8"}.bi-cloud-lightning-fill::before{content:"\f2a9"}.bi-cloud-lightning-rain-fill::before{content:"\f2aa"}.bi-cloud-lightning-rain::before{content:"\f2ab"}.bi-cloud-lightning::before{content:"\f2ac"}.bi-cloud-minus-fill::before{content:"\f2ad"}.bi-cloud-minus::before{content:"\f2ae"}.bi-cloud-moon-fill::before{content:"\f2af"}.bi-cloud-moon::before{content:"\f2b0"}.bi-cloud-plus-fill::before{content:"\f2b1"}.bi-cloud-plus::before{content:"\f2b2"}.bi-cloud-rain-fill::before{content:"\f2b3"}.bi-cloud-rain-heavy-fill::before{content:"\f2b4"}.bi-cloud-rain-heavy::before{content:"\f2b5"}.bi-cloud-rain::before{content:"\f2b6"}.bi-cloud-slash-fill::before{content:"\f2b7"}.bi-cloud-slash::before{content:"\f2b8"}.bi-cloud-sleet-fill::before{content:"\f2b9"}.bi-cloud-sleet::before{content:"\f2ba"}.bi-cloud-snow-fill::before{content:"\f2bb"}.bi-cloud-snow::before{content:"\f2bc"}.bi-cloud-sun-fill::before{content:"\f2bd"}.bi-cloud-sun::before{content:"\f2be"}.bi-cloud-upload-fill::before{content:"\f2bf"}.bi-cloud-upload::before{content:"\f2c0"}.bi-cloud::before{content:"\f2c1"}.bi-clouds-fill::before{content:"\f2c2"}.bi-clouds::before{content:"\f2c3"}.bi-cloudy-fill::before{content:"\f2c4"}.bi-cloudy::before{content:"\f2c5"}.bi-code-slash::before{content:"\f2c6"}.bi-code-square::before{content:"\f2c7"}.bi-code::before{content:"\f2c8"}.bi-collection-fill::before{content:"\f2c9"}.bi-collection-play-fill::before{content:"\f2ca"}.bi-collection-play::before{content:"\f2cb"}.bi-collection::before{content:"\f2cc"}.bi-columns-gap::before{content:"\f2cd"}.bi-columns::before{content:"\f2ce"}.bi-command::before{content:"\f2cf"}.bi-compass-fill::before{content:"\f2d0"}.bi-compass::before{content:"\f2d1"}.bi-cone-striped::before{content:"\f2d2"}.bi-cone::before{content:"\f2d3"}.bi-controller::before{content:"\f2d4"}.bi-cpu-fill::before{content:"\f2d5"}.bi-cpu::before{content:"\f2d6"}.bi-credit-card-2-back-fill::before{content:"\f2d7"}.bi-credit-card-2-back::before{content:"\f2d8"}.bi-credit-card-2-front-fill::before{content:"\f2d9"}.bi-credit-card-2-front::before{content:"\f2da"}.bi-credit-card-fill::before{content:"\f2db"}.bi-credit-card::before{content:"\f2dc"}.bi-crop::before{content:"\f2dd"}.bi-cup-fill::before{content:"\f2de"}.bi-cup-straw::before{content:"\f2df"}.bi-cup::before{content:"\f2e0"}.bi-cursor-fill::before{content:"\f2e1"}.bi-cursor-text::before{content:"\f2e2"}.bi-cursor::before{content:"\f2e3"}.bi-dash-circle-dotted::before{content:"\f2e4"}.bi-dash-circle-fill::before{content:"\f2e5"}.bi-dash-circle::before{content:"\f2e6"}.bi-dash-square-dotted::before{content:"\f2e7"}.bi-dash-square-fill::before{content:"\f2e8"}.bi-dash-square::before{content:"\f2e9"}.bi-dash::before{content:"\f2ea"}.bi-diagram-2-fill::before{content:"\f2eb"}.bi-diagram-2::before{content:"\f2ec"}.bi-diagram-3-fill::before{content:"\f2ed"}.bi-diagram-3::before{content:"\f2ee"}.bi-diamond-fill::before{content:"\f2ef"}.bi-diamond-half::before{content:"\f2f0"}.bi-diamond::before{content:"\f2f1"}.bi-dice-1-fill::before{content:"\f2f2"}.bi-dice-1::before{content:"\f2f3"}.bi-dice-2-fill::before{content:"\f2f4"}.bi-dice-2::before{content:"\f2f5"}.bi-dice-3-fill::before{content:"\f2f6"}.bi-dice-3::before{content:"\f2f7"}.bi-dice-4-fill::before{content:"\f2f8"}.bi-dice-4::before{content:"\f2f9"}.bi-dice-5-fill::before{content:"\f2fa"}.bi-dice-5::before{content:"\f2fb"}.bi-dice-6-fill::before{content:"\f2fc"}.bi-dice-6::before{content:"\f2fd"}.bi-disc-fill::before{content:"\f2fe"}.bi-disc::before{content:"\f2ff"}.bi-discord::before{content:"\f300"}.bi-display-fill::before{content:"\f301"}.bi-display::before{content:"\f302"}.bi-distribute-horizontal::before{content:"\f303"}.bi-distribute-vertical::before{content:"\f304"}.bi-door-closed-fill::before{content:"\f305"}.bi-door-closed::before{content:"\f306"}.bi-door-open-fill::before{content:"\f307"}.bi-door-open::before{content:"\f308"}.bi-dot::before{content:"\f309"}.bi-download::before{content:"\f30a"}.bi-droplet-fill::before{content:"\f30b"}.bi-droplet-half::before{content:"\f30c"}.bi-droplet::before{content:"\f30d"}.bi-earbuds::before{content:"\f30e"}.bi-easel-fill::before{content:"\f30f"}.bi-easel::before{content:"\f310"}.bi-egg-fill::before{content:"\f311"}.bi-egg-fried::before{content:"\f312"}.bi-egg::before{content:"\f313"}.bi-eject-fill::before{content:"\f314"}.bi-eject::before{content:"\f315"}.bi-emoji-angry-fill::before{content:"\f316"}.bi-emoji-angry::before{content:"\f317"}.bi-emoji-dizzy-fill::before{content:"\f318"}.bi-emoji-dizzy::before{content:"\f319"}.bi-emoji-expressionless-fill::before{content:"\f31a"}.bi-emoji-expressionless::before{content:"\f31b"}.bi-emoji-frown-fill::before{content:"\f31c"}.bi-emoji-frown::before{content:"\f31d"}.bi-emoji-heart-eyes-fill::before{content:"\f31e"}.bi-emoji-heart-eyes::before{content:"\f31f"}.bi-emoji-laughing-fill::before{content:"\f320"}.bi-emoji-laughing::before{content:"\f321"}.bi-emoji-neutral-fill::before{content:"\f322"}.bi-emoji-neutral::before{content:"\f323"}.bi-emoji-smile-fill::before{content:"\f324"}.bi-emoji-smile-upside-down-fill::before{content:"\f325"}.bi-emoji-smile-upside-down::before{content:"\f326"}.bi-emoji-smile::before{content:"\f327"}.bi-emoji-sunglasses-fill::before{content:"\f328"}.bi-emoji-sunglasses::before{content:"\f329"}.bi-emoji-wink-fill::before{content:"\f32a"}.bi-emoji-wink::before{content:"\f32b"}.bi-envelope-fill::before{content:"\f32c"}.bi-envelope-open-fill::before{content:"\f32d"}.bi-envelope-open::before{content:"\f32e"}.bi-envelope::before{content:"\f32f"}.bi-eraser-fill::before{content:"\f330"}.bi-eraser::before{content:"\f331"}.bi-exclamation-circle-fill::before{content:"\f332"}.bi-exclamation-circle::before{content:"\f333"}.bi-exclamation-diamond-fill::before{content:"\f334"}.bi-exclamation-diamond::before{content:"\f335"}.bi-exclamation-octagon-fill::before{content:"\f336"}.bi-exclamation-octagon::before{content:"\f337"}.bi-exclamation-square-fill::before{content:"\f338"}.bi-exclamation-square::before{content:"\f339"}.bi-exclamation-triangle-fill::before{content:"\f33a"}.bi-exclamation-triangle::before{content:"\f33b"}.bi-exclamation::before{content:"\f33c"}.bi-exclude::before{content:"\f33d"}.bi-eye-fill::before{content:"\f33e"}.bi-eye-slash-fill::before{content:"\f33f"}.bi-eye-slash::before{content:"\f340"}.bi-eye::before{content:"\f341"}.bi-eyedropper::before{content:"\f342"}.bi-eyeglasses::before{content:"\f343"}.bi-facebook::before{content:"\f344"}.bi-file-arrow-down-fill::before{content:"\f345"}.bi-file-arrow-down::before{content:"\f346"}.bi-file-arrow-up-fill::before{content:"\f347"}.bi-file-arrow-up::before{content:"\f348"}.bi-file-bar-graph-fill::before{content:"\f349"}.bi-file-bar-graph::before{content:"\f34a"}.bi-file-binary-fill::before{content:"\f34b"}.bi-file-binary::before{content:"\f34c"}.bi-file-break-fill::before{content:"\f34d"}.bi-file-break::before{content:"\f34e"}.bi-file-check-fill::before{content:"\f34f"}.bi-file-check::before{content:"\f350"}.bi-file-code-fill::before{content:"\f351"}.bi-file-code::before{content:"\f352"}.bi-file-diff-fill::before{content:"\f353"}.bi-file-diff::before{content:"\f354"}.bi-file-earmark-arrow-down-fill::before{content:"\f355"}.bi-file-earmark-arrow-down::before{content:"\f356"}.bi-file-earmark-arrow-up-fill::before{content:"\f357"}.bi-file-earmark-arrow-up::before{content:"\f358"}.bi-file-earmark-bar-graph-fill::before{content:"\f359"}.bi-file-earmark-bar-graph::before{content:"\f35a"}.bi-file-earmark-binary-fill::before{content:"\f35b"}.bi-file-earmark-binary::before{content:"\f35c"}.bi-file-earmark-break-fill::before{content:"\f35d"}.bi-file-earmark-break::before{content:"\f35e"}.bi-file-earmark-check-fill::before{content:"\f35f"}.bi-file-earmark-check::before{content:"\f360"}.bi-file-earmark-code-fill::before{content:"\f361"}.bi-file-earmark-code::before{content:"\f362"}.bi-file-earmark-diff-fill::before{content:"\f363"}.bi-file-earmark-diff::before{content:"\f364"}.bi-file-earmark-easel-fill::before{content:"\f365"}.bi-file-earmark-easel::before{content:"\f366"}.bi-file-earmark-excel-fill::before{content:"\f367"}.bi-file-earmark-excel::before{content:"\f368"}.bi-file-earmark-fill::before{content:"\f369"}.bi-file-earmark-font-fill::before{content:"\f36a"}.bi-file-earmark-font::before{content:"\f36b"}.bi-file-earmark-image-fill::before{content:"\f36c"}.bi-file-earmark-image::before{content:"\f36d"}.bi-file-earmark-lock-fill::before{content:"\f36e"}.bi-file-earmark-lock::before{content:"\f36f"}.bi-file-earmark-lock2-fill::before{content:"\f370"}.bi-file-earmark-lock2::before{content:"\f371"}.bi-file-earmark-medical-fill::before{content:"\f372"}.bi-file-earmark-medical::before{content:"\f373"}.bi-file-earmark-minus-fill::before{content:"\f374"}.bi-file-earmark-minus::before{content:"\f375"}.bi-file-earmark-music-fill::before{content:"\f376"}.bi-file-earmark-music::before{content:"\f377"}.bi-file-earmark-person-fill::before{content:"\f378"}.bi-file-earmark-person::before{content:"\f379"}.bi-file-earmark-play-fill::before{content:"\f37a"}.bi-file-earmark-play::before{content:"\f37b"}.bi-file-earmark-plus-fill::before{content:"\f37c"}.bi-file-earmark-plus::before{content:"\f37d"}.bi-file-earmark-post-fill::before{content:"\f37e"}.bi-file-earmark-post::before{content:"\f37f"}.bi-file-earmark-ppt-fill::before{content:"\f380"}.bi-file-earmark-ppt::before{content:"\f381"}.bi-file-earmark-richtext-fill::before{content:"\f382"}.bi-file-earmark-richtext::before{content:"\f383"}.bi-file-earmark-ruled-fill::before{content:"\f384"}.bi-file-earmark-ruled::before{content:"\f385"}.bi-file-earmark-slides-fill::before{content:"\f386"}.bi-file-earmark-slides::before{content:"\f387"}.bi-file-earmark-spreadsheet-fill::before{content:"\f388"}.bi-file-earmark-spreadsheet::before{content:"\f389"}.bi-file-earmark-text-fill::before{content:"\f38a"}.bi-file-earmark-text::before{content:"\f38b"}.bi-file-earmark-word-fill::before{content:"\f38c"}.bi-file-earmark-word::before{content:"\f38d"}.bi-file-earmark-x-fill::before{content:"\f38e"}.bi-file-earmark-x::before{content:"\f38f"}.bi-file-earmark-zip-fill::before{content:"\f390"}.bi-file-earmark-zip::before{content:"\f391"}.bi-file-earmark::before{content:"\f392"}.bi-file-easel-fill::before{content:"\f393"}.bi-file-easel::before{content:"\f394"}.bi-file-excel-fill::before{content:"\f395"}.bi-file-excel::before{content:"\f396"}.bi-file-fill::before{content:"\f397"}.bi-file-font-fill::before{content:"\f398"}.bi-file-font::before{content:"\f399"}.bi-file-image-fill::before{content:"\f39a"}.bi-file-image::before{content:"\f39b"}.bi-file-lock-fill::before{content:"\f39c"}.bi-file-lock::before{content:"\f39d"}.bi-file-lock2-fill::before{content:"\f39e"}.bi-file-lock2::before{content:"\f39f"}.bi-file-medical-fill::before{content:"\f3a0"}.bi-file-medical::before{content:"\f3a1"}.bi-file-minus-fill::before{content:"\f3a2"}.bi-file-minus::before{content:"\f3a3"}.bi-file-music-fill::before{content:"\f3a4"}.bi-file-music::before{content:"\f3a5"}.bi-file-person-fill::before{content:"\f3a6"}.bi-file-person::before{content:"\f3a7"}.bi-file-play-fill::before{content:"\f3a8"}.bi-file-play::before{content:"\f3a9"}.bi-file-plus-fill::before{content:"\f3aa"}.bi-file-plus::before{content:"\f3ab"}.bi-file-post-fill::before{content:"\f3ac"}.bi-file-post::before{content:"\f3ad"}.bi-file-ppt-fill::before{content:"\f3ae"}.bi-file-ppt::before{content:"\f3af"}.bi-file-richtext-fill::before{content:"\f3b0"}.bi-file-richtext::before{content:"\f3b1"}.bi-file-ruled-fill::before{content:"\f3b2"}.bi-file-ruled::before{content:"\f3b3"}.bi-file-slides-fill::before{content:"\f3b4"}.bi-file-slides::before{content:"\f3b5"}.bi-file-spreadsheet-fill::before{content:"\f3b6"}.bi-file-spreadsheet::before{content:"\f3b7"}.bi-file-text-fill::before{content:"\f3b8"}.bi-file-text::before{content:"\f3b9"}.bi-file-word-fill::before{content:"\f3ba"}.bi-file-word::before{content:"\f3bb"}.bi-file-x-fill::before{content:"\f3bc"}.bi-file-x::before{content:"\f3bd"}.bi-file-zip-fill::before{content:"\f3be"}.bi-file-zip::before{content:"\f3bf"}.bi-file::before{content:"\f3c0"}.bi-files-alt::before{content:"\f3c1"}.bi-files::before{content:"\f3c2"}.bi-film::before{content:"\f3c3"}.bi-filter-circle-fill::before{content:"\f3c4"}.bi-filter-circle::before{content:"\f3c5"}.bi-filter-left::before{content:"\f3c6"}.bi-filter-right::before{content:"\f3c7"}.bi-filter-square-fill::before{content:"\f3c8"}.bi-filter-square::before{content:"\f3c9"}.bi-filter::before{content:"\f3ca"}.bi-flag-fill::before{content:"\f3cb"}.bi-flag::before{content:"\f3cc"}.bi-flower1::before{content:"\f3cd"}.bi-flower2::before{content:"\f3ce"}.bi-flower3::before{content:"\f3cf"}.bi-folder-check::before{content:"\f3d0"}.bi-folder-fill::before{content:"\f3d1"}.bi-folder-minus::before{content:"\f3d2"}.bi-folder-plus::before{content:"\f3d3"}.bi-folder-symlink-fill::before{content:"\f3d4"}.bi-folder-symlink::before{content:"\f3d5"}.bi-folder-x::before{content:"\f3d6"}.bi-folder::before{content:"\f3d7"}.bi-folder2-open::before{content:"\f3d8"}.bi-folder2::before{content:"\f3d9"}.bi-fonts::before{content:"\f3da"}.bi-forward-fill::before{content:"\f3db"}.bi-forward::before{content:"\f3dc"}.bi-front::before{content:"\f3dd"}.bi-fullscreen-exit::before{content:"\f3de"}.bi-fullscreen::before{content:"\f3df"}.bi-funnel-fill::before{content:"\f3e0"}.bi-funnel::before{content:"\f3e1"}.bi-gear-fill::before{content:"\f3e2"}.bi-gear-wide-connected::before{content:"\f3e3"}.bi-gear-wide::before{content:"\f3e4"}.bi-gear::before{content:"\f3e5"}.bi-gem::before{content:"\f3e6"}.bi-geo-alt-fill::before{content:"\f3e7"}.bi-geo-alt::before{content:"\f3e8"}.bi-geo-fill::before{content:"\f3e9"}.bi-geo::before{content:"\f3ea"}.bi-gift-fill::before{content:"\f3eb"}.bi-gift::before{content:"\f3ec"}.bi-github::before{content:"\f3ed"}.bi-globe::before{content:"\f3ee"}.bi-globe2::before{content:"\f3ef"}.bi-google::before{content:"\f3f0"}.bi-graph-down::before{content:"\f3f1"}.bi-graph-up::before{content:"\f3f2"}.bi-grid-1x2-fill::before{content:"\f3f3"}.bi-grid-1x2::before{content:"\f3f4"}.bi-grid-3x2-gap-fill::before{content:"\f3f5"}.bi-grid-3x2-gap::before{content:"\f3f6"}.bi-grid-3x2::before{content:"\f3f7"}.bi-grid-3x3-gap-fill::before{content:"\f3f8"}.bi-grid-3x3-gap::before{content:"\f3f9"}.bi-grid-3x3::before{content:"\f3fa"}.bi-grid-fill::before{content:"\f3fb"}.bi-grid::before{content:"\f3fc"}.bi-grip-horizontal::before{content:"\f3fd"}.bi-grip-vertical::before{content:"\f3fe"}.bi-hammer::before{content:"\f3ff"}.bi-hand-index-fill::before{content:"\f400"}.bi-hand-index-thumb-fill::before{content:"\f401"}.bi-hand-index-thumb::before{content:"\f402"}.bi-hand-index::before{content:"\f403"}.bi-hand-thumbs-down-fill::before{content:"\f404"}.bi-hand-thumbs-down::before{content:"\f405"}.bi-hand-thumbs-up-fill::before{content:"\f406"}.bi-hand-thumbs-up::before{content:"\f407"}.bi-handbag-fill::before{content:"\f408"}.bi-handbag::before{content:"\f409"}.bi-hash::before{content:"\f40a"}.bi-hdd-fill::before{content:"\f40b"}.bi-hdd-network-fill::before{content:"\f40c"}.bi-hdd-network::before{content:"\f40d"}.bi-hdd-rack-fill::before{content:"\f40e"}.bi-hdd-rack::before{content:"\f40f"}.bi-hdd-stack-fill::before{content:"\f410"}.bi-hdd-stack::before{content:"\f411"}.bi-hdd::before{content:"\f412"}.bi-headphones::before{content:"\f413"}.bi-headset::before{content:"\f414"}.bi-heart-fill::before{content:"\f415"}.bi-heart-half::before{content:"\f416"}.bi-heart::before{content:"\f417"}.bi-heptagon-fill::before{content:"\f418"}.bi-heptagon-half::before{content:"\f419"}.bi-heptagon::before{content:"\f41a"}.bi-hexagon-fill::before{content:"\f41b"}.bi-hexagon-half::before{content:"\f41c"}.bi-hexagon::before{content:"\f41d"}.bi-hourglass-bottom::before{content:"\f41e"}.bi-hourglass-split::before{content:"\f41f"}.bi-hourglass-top::before{content:"\f420"}.bi-hourglass::before{content:"\f421"}.bi-house-door-fill::before{content:"\f422"}.bi-house-door::before{content:"\f423"}.bi-house-fill::before{content:"\f424"}.bi-house::before{content:"\f425"}.bi-hr::before{content:"\f426"}.bi-hurricane::before{content:"\f427"}.bi-image-alt::before{content:"\f428"}.bi-image-fill::before{content:"\f429"}.bi-image::before{content:"\f42a"}.bi-images::before{content:"\f42b"}.bi-inbox-fill::before{content:"\f42c"}.bi-inbox::before{content:"\f42d"}.bi-inboxes-fill::before{content:"\f42e"}.bi-inboxes::before{content:"\f42f"}.bi-info-circle-fill::before{content:"\f430"}.bi-info-circle::before{content:"\f431"}.bi-info-square-fill::before{content:"\f432"}.bi-info-square::before{content:"\f433"}.bi-info::before{content:"\f434"}.bi-input-cursor-text::before{content:"\f435"}.bi-input-cursor::before{content:"\f436"}.bi-instagram::before{content:"\f437"}.bi-intersect::before{content:"\f438"}.bi-journal-album::before{content:"\f439"}.bi-journal-arrow-down::before{content:"\f43a"}.bi-journal-arrow-up::before{content:"\f43b"}.bi-journal-bookmark-fill::before{content:"\f43c"}.bi-journal-bookmark::before{content:"\f43d"}.bi-journal-check::before{content:"\f43e"}.bi-journal-code::before{content:"\f43f"}.bi-journal-medical::before{content:"\f440"}.bi-journal-minus::before{content:"\f441"}.bi-journal-plus::before{content:"\f442"}.bi-journal-richtext::before{content:"\f443"}.bi-journal-text::before{content:"\f444"}.bi-journal-x::before{content:"\f445"}.bi-journal::before{content:"\f446"}.bi-journals::before{content:"\f447"}.bi-joystick::before{content:"\f448"}.bi-justify-left::before{content:"\f449"}.bi-justify-right::before{content:"\f44a"}.bi-justify::before{content:"\f44b"}.bi-kanban-fill::before{content:"\f44c"}.bi-kanban::before{content:"\f44d"}.bi-key-fill::before{content:"\f44e"}.bi-key::before{content:"\f44f"}.bi-keyboard-fill::before{content:"\f450"}.bi-keyboard::before{content:"\f451"}.bi-ladder::before{content:"\f452"}.bi-lamp-fill::before{content:"\f453"}.bi-lamp::before{content:"\f454"}.bi-laptop-fill::before{content:"\f455"}.bi-laptop::before{content:"\f456"}.bi-layer-backward::before{content:"\f457"}.bi-layer-forward::before{content:"\f458"}.bi-layers-fill::before{content:"\f459"}.bi-layers-half::before{content:"\f45a"}.bi-layers::before{content:"\f45b"}.bi-layout-sidebar-inset-reverse::before{content:"\f45c"}.bi-layout-sidebar-inset::before{content:"\f45d"}.bi-layout-sidebar-reverse::before{content:"\f45e"}.bi-layout-sidebar::before{content:"\f45f"}.bi-layout-split::before{content:"\f460"}.bi-layout-text-sidebar-reverse::before{content:"\f461"}.bi-layout-text-sidebar::before{content:"\f462"}.bi-layout-text-window-reverse::before{content:"\f463"}.bi-layout-text-window::before{content:"\f464"}.bi-layout-three-columns::before{content:"\f465"}.bi-layout-wtf::before{content:"\f466"}.bi-life-preserver::before{content:"\f467"}.bi-lightbulb-fill::before{content:"\f468"}.bi-lightbulb-off-fill::before{content:"\f469"}.bi-lightbulb-off::before{content:"\f46a"}.bi-lightbulb::before{content:"\f46b"}.bi-lightning-charge-fill::before{content:"\f46c"}.bi-lightning-charge::before{content:"\f46d"}.bi-lightning-fill::before{content:"\f46e"}.bi-lightning::before{content:"\f46f"}.bi-link-45deg::before{content:"\f470"}.bi-link::before{content:"\f471"}.bi-linkedin::before{content:"\f472"}.bi-list-check::before{content:"\f473"}.bi-list-nested::before{content:"\f474"}.bi-list-ol::before{content:"\f475"}.bi-list-stars::before{content:"\f476"}.bi-list-task::before{content:"\f477"}.bi-list-ul::before{content:"\f478"}.bi-list::before{content:"\f479"}.bi-lock-fill::before{content:"\f47a"}.bi-lock::before{content:"\f47b"}.bi-mailbox::before{content:"\f47c"}.bi-mailbox2::before{content:"\f47d"}.bi-map-fill::before{content:"\f47e"}.bi-map::before{content:"\f47f"}.bi-markdown-fill::before{content:"\f480"}.bi-markdown::before{content:"\f481"}.bi-mask::before{content:"\f482"}.bi-megaphone-fill::before{content:"\f483"}.bi-megaphone::before{content:"\f484"}.bi-menu-app-fill::before{content:"\f485"}.bi-menu-app::before{content:"\f486"}.bi-menu-button-fill::before{content:"\f487"}.bi-menu-button-wide-fill::before{content:"\f488"}.bi-menu-button-wide::before{content:"\f489"}.bi-menu-button::before{content:"\f48a"}.bi-menu-down::before{content:"\f48b"}.bi-menu-up::before{content:"\f48c"}.bi-mic-fill::before{content:"\f48d"}.bi-mic-mute-fill::before{content:"\f48e"}.bi-mic-mute::before{content:"\f48f"}.bi-mic::before{content:"\f490"}.bi-minecart-loaded::before{content:"\f491"}.bi-minecart::before{content:"\f492"}.bi-moisture::before{content:"\f493"}.bi-moon-fill::before{content:"\f494"}.bi-moon-stars-fill::before{content:"\f495"}.bi-moon-stars::before{content:"\f496"}.bi-moon::before{content:"\f497"}.bi-mouse-fill::before{content:"\f498"}.bi-mouse::before{content:"\f499"}.bi-mouse2-fill::before{content:"\f49a"}.bi-mouse2::before{content:"\f49b"}.bi-mouse3-fill::before{content:"\f49c"}.bi-mouse3::before{content:"\f49d"}.bi-music-note-beamed::before{content:"\f49e"}.bi-music-note-list::before{content:"\f49f"}.bi-music-note::before{content:"\f4a0"}.bi-music-player-fill::before{content:"\f4a1"}.bi-music-player::before{content:"\f4a2"}.bi-newspaper::before{content:"\f4a3"}.bi-node-minus-fill::before{content:"\f4a4"}.bi-node-minus::before{content:"\f4a5"}.bi-node-plus-fill::before{content:"\f4a6"}.bi-node-plus::before{content:"\f4a7"}.bi-nut-fill::before{content:"\f4a8"}.bi-nut::before{content:"\f4a9"}.bi-octagon-fill::before{content:"\f4aa"}.bi-octagon-half::before{content:"\f4ab"}.bi-octagon::before{content:"\f4ac"}.bi-option::before{content:"\f4ad"}.bi-outlet::before{content:"\f4ae"}.bi-paint-bucket::before{content:"\f4af"}.bi-palette-fill::before{content:"\f4b0"}.bi-palette::before{content:"\f4b1"}.bi-palette2::before{content:"\f4b2"}.bi-paperclip::before{content:"\f4b3"}.bi-paragraph::before{content:"\f4b4"}.bi-patch-check-fill::before{content:"\f4b5"}.bi-patch-check::before{content:"\f4b6"}.bi-patch-exclamation-fill::before{content:"\f4b7"}.bi-patch-exclamation::before{content:"\f4b8"}.bi-patch-minus-fill::before{content:"\f4b9"}.bi-patch-minus::before{content:"\f4ba"}.bi-patch-plus-fill::before{content:"\f4bb"}.bi-patch-plus::before{content:"\f4bc"}.bi-patch-question-fill::before{content:"\f4bd"}.bi-patch-question::before{content:"\f4be"}.bi-pause-btn-fill::before{content:"\f4bf"}.bi-pause-btn::before{content:"\f4c0"}.bi-pause-circle-fill::before{content:"\f4c1"}.bi-pause-circle::before{content:"\f4c2"}.bi-pause-fill::before{content:"\f4c3"}.bi-pause::before{content:"\f4c4"}.bi-peace-fill::before{content:"\f4c5"}.bi-peace::before{content:"\f4c6"}.bi-pen-fill::before{content:"\f4c7"}.bi-pen::before{content:"\f4c8"}.bi-pencil-fill::before{content:"\f4c9"}.bi-pencil-square::before{content:"\f4ca"}.bi-pencil::before{content:"\f4cb"}.bi-pentagon-fill::before{content:"\f4cc"}.bi-pentagon-half::before{content:"\f4cd"}.bi-pentagon::before{content:"\f4ce"}.bi-people-fill::before{content:"\f4cf"}.bi-people::before{content:"\f4d0"}.bi-percent::before{content:"\f4d1"}.bi-person-badge-fill::before{content:"\f4d2"}.bi-person-badge::before{content:"\f4d3"}.bi-person-bounding-box::before{content:"\f4d4"}.bi-person-check-fill::before{content:"\f4d5"}.bi-person-check::before{content:"\f4d6"}.bi-person-circle::before{content:"\f4d7"}.bi-person-dash-fill::before{content:"\f4d8"}.bi-person-dash::before{content:"\f4d9"}.bi-person-fill::before{content:"\f4da"}.bi-person-lines-fill::before{content:"\f4db"}.bi-person-plus-fill::before{content:"\f4dc"}.bi-person-plus::before{content:"\f4dd"}.bi-person-square::before{content:"\f4de"}.bi-person-x-fill::before{content:"\f4df"}.bi-person-x::before{content:"\f4e0"}.bi-person::before{content:"\f4e1"}.bi-phone-fill::before{content:"\f4e2"}.bi-phone-landscape-fill::before{content:"\f4e3"}.bi-phone-landscape::before{content:"\f4e4"}.bi-phone-vibrate-fill::before{content:"\f4e5"}.bi-phone-vibrate::before{content:"\f4e6"}.bi-phone::before{content:"\f4e7"}.bi-pie-chart-fill::before{content:"\f4e8"}.bi-pie-chart::before{content:"\f4e9"}.bi-pin-angle-fill::before{content:"\f4ea"}.bi-pin-angle::before{content:"\f4eb"}.bi-pin-fill::before{content:"\f4ec"}.bi-pin::before{content:"\f4ed"}.bi-pip-fill::before{content:"\f4ee"}.bi-pip::before{content:"\f4ef"}.bi-play-btn-fill::before{content:"\f4f0"}.bi-play-btn::before{content:"\f4f1"}.bi-play-circle-fill::before{content:"\f4f2"}.bi-play-circle::before{content:"\f4f3"}.bi-play-fill::before{content:"\f4f4"}.bi-play::before{content:"\f4f5"}.bi-plug-fill::before{content:"\f4f6"}.bi-plug::before{content:"\f4f7"}.bi-plus-circle-dotted::before{content:"\f4f8"}.bi-plus-circle-fill::before{content:"\f4f9"}.bi-plus-circle::before{content:"\f4fa"}.bi-plus-square-dotted::before{content:"\f4fb"}.bi-plus-square-fill::before{content:"\f4fc"}.bi-plus-square::before{content:"\f4fd"}.bi-plus::before{content:"\f4fe"}.bi-power::before{content:"\f4ff"}.bi-printer-fill::before{content:"\f500"}.bi-printer::before{content:"\f501"}.bi-puzzle-fill::before{content:"\f502"}.bi-puzzle::before{content:"\f503"}.bi-question-circle-fill::before{content:"\f504"}.bi-question-circle::before{content:"\f505"}.bi-question-diamond-fill::before{content:"\f506"}.bi-question-diamond::before{content:"\f507"}.bi-question-octagon-fill::before{content:"\f508"}.bi-question-octagon::before{content:"\f509"}.bi-question-square-fill::before{content:"\f50a"}.bi-question-square::before{content:"\f50b"}.bi-question::before{content:"\f50c"}.bi-rainbow::before{content:"\f50d"}.bi-receipt-cutoff::before{content:"\f50e"}.bi-receipt::before{content:"\f50f"}.bi-reception-0::before{content:"\f510"}.bi-reception-1::before{content:"\f511"}.bi-reception-2::before{content:"\f512"}.bi-reception-3::before{content:"\f513"}.bi-reception-4::before{content:"\f514"}.bi-record-btn-fill::before{content:"\f515"}.bi-record-btn::before{content:"\f516"}.bi-record-circle-fill::before{content:"\f517"}.bi-record-circle::before{content:"\f518"}.bi-record-fill::before{content:"\f519"}.bi-record::before{content:"\f51a"}.bi-record2-fill::before{content:"\f51b"}.bi-record2::before{content:"\f51c"}.bi-reply-all-fill::before{content:"\f51d"}.bi-reply-all::before{content:"\f51e"}.bi-reply-fill::before{content:"\f51f"}.bi-reply::before{content:"\f520"}.bi-rss-fill::before{content:"\f521"}.bi-rss::before{content:"\f522"}.bi-rulers::before{content:"\f523"}.bi-save-fill::before{content:"\f524"}.bi-save::before{content:"\f525"}.bi-save2-fill::before{content:"\f526"}.bi-save2::before{content:"\f527"}.bi-scissors::before{content:"\f528"}.bi-screwdriver::before{content:"\f529"}.bi-search::before{content:"\f52a"}.bi-segmented-nav::before{content:"\f52b"}.bi-server::before{content:"\f52c"}.bi-share-fill::before{content:"\f52d"}.bi-share::before{content:"\f52e"}.bi-shield-check::before{content:"\f52f"}.bi-shield-exclamation::before{content:"\f530"}.bi-shield-fill-check::before{content:"\f531"}.bi-shield-fill-exclamation::before{content:"\f532"}.bi-shield-fill-minus::before{content:"\f533"}.bi-shield-fill-plus::before{content:"\f534"}.bi-shield-fill-x::before{content:"\f535"}.bi-shield-fill::before{content:"\f536"}.bi-shield-lock-fill::before{content:"\f537"}.bi-shield-lock::before{content:"\f538"}.bi-shield-minus::before{content:"\f539"}.bi-shield-plus::before{content:"\f53a"}.bi-shield-shaded::before{content:"\f53b"}.bi-shield-slash-fill::before{content:"\f53c"}.bi-shield-slash::before{content:"\f53d"}.bi-shield-x::before{content:"\f53e"}.bi-shield::before{content:"\f53f"}.bi-shift-fill::before{content:"\f540"}.bi-shift::before{content:"\f541"}.bi-shop-window::before{content:"\f542"}.bi-shop::before{content:"\f543"}.bi-shuffle::before{content:"\f544"}.bi-signpost-2-fill::before{content:"\f545"}.bi-signpost-2::before{content:"\f546"}.bi-signpost-fill::before{content:"\f547"}.bi-signpost-split-fill::before{content:"\f548"}.bi-signpost-split::before{content:"\f549"}.bi-signpost::before{content:"\f54a"}.bi-sim-fill::before{content:"\f54b"}.bi-sim::before{content:"\f54c"}.bi-skip-backward-btn-fill::before{content:"\f54d"}.bi-skip-backward-btn::before{content:"\f54e"}.bi-skip-backward-circle-fill::before{content:"\f54f"}.bi-skip-backward-circle::before{content:"\f550"}.bi-skip-backward-fill::before{content:"\f551"}.bi-skip-backward::before{content:"\f552"}.bi-skip-end-btn-fill::before{content:"\f553"}.bi-skip-end-btn::before{content:"\f554"}.bi-skip-end-circle-fill::before{content:"\f555"}.bi-skip-end-circle::before{content:"\f556"}.bi-skip-end-fill::before{content:"\f557"}.bi-skip-end::before{content:"\f558"}.bi-skip-forward-btn-fill::before{content:"\f559"}.bi-skip-forward-btn::before{content:"\f55a"}.bi-skip-forward-circle-fill::before{content:"\f55b"}.bi-skip-forward-circle::before{content:"\f55c"}.bi-skip-forward-fill::before{content:"\f55d"}.bi-skip-forward::before{content:"\f55e"}.bi-skip-start-btn-fill::before{content:"\f55f"}.bi-skip-start-btn::before{content:"\f560"}.bi-skip-start-circle-fill::before{content:"\f561"}.bi-skip-start-circle::before{content:"\f562"}.bi-skip-start-fill::before{content:"\f563"}.bi-skip-start::before{content:"\f564"}.bi-slack::before{content:"\f565"}.bi-slash-circle-fill::before{content:"\f566"}.bi-slash-circle::before{content:"\f567"}.bi-slash-square-fill::before{content:"\f568"}.bi-slash-square::before{content:"\f569"}.bi-slash::before{content:"\f56a"}.bi-sliders::before{content:"\f56b"}.bi-smartwatch::before{content:"\f56c"}.bi-snow::before{content:"\f56d"}.bi-snow2::before{content:"\f56e"}.bi-snow3::before{content:"\f56f"}.bi-sort-alpha-down-alt::before{content:"\f570"}.bi-sort-alpha-down::before{content:"\f571"}.bi-sort-alpha-up-alt::before{content:"\f572"}.bi-sort-alpha-up::before{content:"\f573"}.bi-sort-down-alt::before{content:"\f574"}.bi-sort-down::before{content:"\f575"}.bi-sort-numeric-down-alt::before{content:"\f576"}.bi-sort-numeric-down::before{content:"\f577"}.bi-sort-numeric-up-alt::before{content:"\f578"}.bi-sort-numeric-up::before{content:"\f579"}.bi-sort-up-alt::before{content:"\f57a"}.bi-sort-up::before{content:"\f57b"}.bi-soundwave::before{content:"\f57c"}.bi-speaker-fill::before{content:"\f57d"}.bi-speaker::before{content:"\f57e"}.bi-speedometer::before{content:"\f57f"}.bi-speedometer2::before{content:"\f580"}.bi-spellcheck::before{content:"\f581"}.bi-square-fill::before{content:"\f582"}.bi-square-half::before{content:"\f583"}.bi-square::before{content:"\f584"}.bi-stack::before{content:"\f585"}.bi-star-fill::before{content:"\f586"}.bi-star-half::before{content:"\f587"}.bi-star::before{content:"\f588"}.bi-stars::before{content:"\f589"}.bi-stickies-fill::before{content:"\f58a"}.bi-stickies::before{content:"\f58b"}.bi-sticky-fill::before{content:"\f58c"}.bi-sticky::before{content:"\f58d"}.bi-stop-btn-fill::before{content:"\f58e"}.bi-stop-btn::before{content:"\f58f"}.bi-stop-circle-fill::before{content:"\f590"}.bi-stop-circle::before{content:"\f591"}.bi-stop-fill::before{content:"\f592"}.bi-stop::before{content:"\f593"}.bi-stoplights-fill::before{content:"\f594"}.bi-stoplights::before{content:"\f595"}.bi-stopwatch-fill::before{content:"\f596"}.bi-stopwatch::before{content:"\f597"}.bi-subtract::before{content:"\f598"}.bi-suit-club-fill::before{content:"\f599"}.bi-suit-club::before{content:"\f59a"}.bi-suit-diamond-fill::before{content:"\f59b"}.bi-suit-diamond::before{content:"\f59c"}.bi-suit-heart-fill::before{content:"\f59d"}.bi-suit-heart::before{content:"\f59e"}.bi-suit-spade-fill::before{content:"\f59f"}.bi-suit-spade::before{content:"\f5a0"}.bi-sun-fill::before{content:"\f5a1"}.bi-sun::before{content:"\f5a2"}.bi-sunglasses::before{content:"\f5a3"}.bi-sunrise-fill::before{content:"\f5a4"}.bi-sunrise::before{content:"\f5a5"}.bi-sunset-fill::before{content:"\f5a6"}.bi-sunset::before{content:"\f5a7"}.bi-symmetry-horizontal::before{content:"\f5a8"}.bi-symmetry-vertical::before{content:"\f5a9"}.bi-table::before{content:"\f5aa"}.bi-tablet-fill::before{content:"\f5ab"}.bi-tablet-landscape-fill::before{content:"\f5ac"}.bi-tablet-landscape::before{content:"\f5ad"}.bi-tablet::before{content:"\f5ae"}.bi-tag-fill::before{content:"\f5af"}.bi-tag::before{content:"\f5b0"}.bi-tags-fill::before{content:"\f5b1"}.bi-tags::before{content:"\f5b2"}.bi-telegram::before{content:"\f5b3"}.bi-telephone-fill::before{content:"\f5b4"}.bi-telephone-forward-fill::before{content:"\f5b5"}.bi-telephone-forward::before{content:"\f5b6"}.bi-telephone-inbound-fill::before{content:"\f5b7"}.bi-telephone-inbound::before{content:"\f5b8"}.bi-telephone-minus-fill::before{content:"\f5b9"}.bi-telephone-minus::before{content:"\f5ba"}.bi-telephone-outbound-fill::before{content:"\f5bb"}.bi-telephone-outbound::before{content:"\f5bc"}.bi-telephone-plus-fill::before{content:"\f5bd"}.bi-telephone-plus::before{content:"\f5be"}.bi-telephone-x-fill::before{content:"\f5bf"}.bi-telephone-x::before{content:"\f5c0"}.bi-telephone::before{content:"\f5c1"}.bi-terminal-fill::before{content:"\f5c2"}.bi-terminal::before{content:"\f5c3"}.bi-text-center::before{content:"\f5c4"}.bi-text-indent-left::before{content:"\f5c5"}.bi-text-indent-right::before{content:"\f5c6"}.bi-text-left::before{content:"\f5c7"}.bi-text-paragraph::before{content:"\f5c8"}.bi-text-right::before{content:"\f5c9"}.bi-textarea-resize::before{content:"\f5ca"}.bi-textarea-t::before{content:"\f5cb"}.bi-textarea::before{content:"\f5cc"}.bi-thermometer-half::before{content:"\f5cd"}.bi-thermometer-high::before{content:"\f5ce"}.bi-thermometer-low::before{content:"\f5cf"}.bi-thermometer-snow::before{content:"\f5d0"}.bi-thermometer-sun::before{content:"\f5d1"}.bi-thermometer::before{content:"\f5d2"}.bi-three-dots-vertical::before{content:"\f5d3"}.bi-three-dots::before{content:"\f5d4"}.bi-toggle-off::before{content:"\f5d5"}.bi-toggle-on::before{content:"\f5d6"}.bi-toggle2-off::before{content:"\f5d7"}.bi-toggle2-on::before{content:"\f5d8"}.bi-toggles::before{content:"\f5d9"}.bi-toggles2::before{content:"\f5da"}.bi-tools::before{content:"\f5db"}.bi-tornado::before{content:"\f5dc"}.bi-trash-fill::before{content:"\f5dd"}.bi-trash::before{content:"\f5de"}.bi-trash2-fill::before{content:"\f5df"}.bi-trash2::before{content:"\f5e0"}.bi-tree-fill::before{content:"\f5e1"}.bi-tree::before{content:"\f5e2"}.bi-triangle-fill::before{content:"\f5e3"}.bi-triangle-half::before{content:"\f5e4"}.bi-triangle::before{content:"\f5e5"}.bi-trophy-fill::before{content:"\f5e6"}.bi-trophy::before{content:"\f5e7"}.bi-tropical-storm::before{content:"\f5e8"}.bi-truck-flatbed::before{content:"\f5e9"}.bi-truck::before{content:"\f5ea"}.bi-tsunami::before{content:"\f5eb"}.bi-tv-fill::before{content:"\f5ec"}.bi-tv::before{content:"\f5ed"}.bi-twitch::before{content:"\f5ee"}.bi-twitter::before{content:"\f5ef"}.bi-type-bold::before{content:"\f5f0"}.bi-type-h1::before{content:"\f5f1"}.bi-type-h2::before{content:"\f5f2"}.bi-type-h3::before{content:"\f5f3"}.bi-type-italic::before{content:"\f5f4"}.bi-type-strikethrough::before{content:"\f5f5"}.bi-type-underline::before{content:"\f5f6"}.bi-type::before{content:"\f5f7"}.bi-ui-checks-grid::before{content:"\f5f8"}.bi-ui-checks::before{content:"\f5f9"}.bi-ui-radios-grid::before{content:"\f5fa"}.bi-ui-radios::before{content:"\f5fb"}.bi-umbrella-fill::before{content:"\f5fc"}.bi-umbrella::before{content:"\f5fd"}.bi-union::before{content:"\f5fe"}.bi-unlock-fill::before{content:"\f5ff"}.bi-unlock::before{content:"\f600"}.bi-upc-scan::before{content:"\f601"}.bi-upc::before{content:"\f602"}.bi-upload::before{content:"\f603"}.bi-vector-pen::before{content:"\f604"}.bi-view-list::before{content:"\f605"}.bi-view-stacked::before{content:"\f606"}.bi-vinyl-fill::before{content:"\f607"}.bi-vinyl::before{content:"\f608"}.bi-voicemail::before{content:"\f609"}.bi-volume-down-fill::before{content:"\f60a"}.bi-volume-down::before{content:"\f60b"}.bi-volume-mute-fill::before{content:"\f60c"}.bi-volume-mute::before{content:"\f60d"}.bi-volume-off-fill::before{content:"\f60e"}.bi-volume-off::before{content:"\f60f"}.bi-volume-up-fill::before{content:"\f610"}.bi-volume-up::before{content:"\f611"}.bi-vr::before{content:"\f612"}.bi-wallet-fill::before{content:"\f613"}.bi-wallet::before{content:"\f614"}.bi-wallet2::before{content:"\f615"}.bi-watch::before{content:"\f616"}.bi-water::before{content:"\f617"}.bi-whatsapp::before{content:"\f618"}.bi-wifi-1::before{content:"\f619"}.bi-wifi-2::before{content:"\f61a"}.bi-wifi-off::before{content:"\f61b"}.bi-wifi::before{content:"\f61c"}.bi-wind::before{content:"\f61d"}.bi-window-dock::before{content:"\f61e"}.bi-window-sidebar::before{content:"\f61f"}.bi-window::before{content:"\f620"}.bi-wrench::before{content:"\f621"}.bi-x-circle-fill::before{content:"\f622"}.bi-x-circle::before{content:"\f623"}.bi-x-diamond-fill::before{content:"\f624"}.bi-x-diamond::before{content:"\f625"}.bi-x-octagon-fill::before{content:"\f626"}.bi-x-octagon::before{content:"\f627"}.bi-x-square-fill::before{content:"\f628"}.bi-x-square::before{content:"\f629"}.bi-x::before{content:"\f62a"}.bi-youtube::before{content:"\f62b"}.bi-zoom-in::before{content:"\f62c"}.bi-zoom-out::before{content:"\f62d"}.bi-bank::before{content:"\f62e"}.bi-bank2::before{content:"\f62f"}.bi-bell-slash-fill::before{content:"\f630"}.bi-bell-slash::before{content:"\f631"}.bi-cash-coin::before{content:"\f632"}.bi-check-lg::before{content:"\f633"}.bi-coin::before{content:"\f634"}.bi-currency-bitcoin::before{content:"\f635"}.bi-currency-dollar::before{content:"\f636"}.bi-currency-euro::before{content:"\f637"}.bi-currency-exchange::before{content:"\f638"}.bi-currency-pound::before{content:"\f639"}.bi-currency-yen::before{content:"\f63a"}.bi-dash-lg::before{content:"\f63b"}.bi-exclamation-lg::before{content:"\f63c"}.bi-file-earmark-pdf-fill::before{content:"\f63d"}.bi-file-earmark-pdf::before{content:"\f63e"}.bi-file-pdf-fill::before{content:"\f63f"}.bi-file-pdf::before{content:"\f640"}.bi-gender-ambiguous::before{content:"\f641"}.bi-gender-female::before{content:"\f642"}.bi-gender-male::before{content:"\f643"}.bi-gender-trans::before{content:"\f644"}.bi-headset-vr::before{content:"\f645"}.bi-info-lg::before{content:"\f646"}.bi-mastodon::before{content:"\f647"}.bi-messenger::before{content:"\f648"}.bi-piggy-bank-fill::before{content:"\f649"}.bi-piggy-bank::before{content:"\f64a"}.bi-pin-map-fill::before{content:"\f64b"}.bi-pin-map::before{content:"\f64c"}.bi-plus-lg::before{content:"\f64d"}.bi-question-lg::before{content:"\f64e"}.bi-recycle::before{content:"\f64f"}.bi-reddit::before{content:"\f650"}.bi-safe-fill::before{content:"\f651"}.bi-safe2-fill::before{content:"\f652"}.bi-safe2::before{content:"\f653"}.bi-sd-card-fill::before{content:"\f654"}.bi-sd-card::before{content:"\f655"}.bi-skype::before{content:"\f656"}.bi-slash-lg::before{content:"\f657"}.bi-translate::before{content:"\f658"}.bi-x-lg::before{content:"\f659"}.bi-safe::before{content:"\f65a"}.bi-apple::before{content:"\f65b"}.bi-microsoft::before{content:"\f65d"}.bi-windows::before{content:"\f65e"}.bi-behance::before{content:"\f65c"}.bi-dribbble::before{content:"\f65f"}.bi-line::before{content:"\f660"}.bi-medium::before{content:"\f661"}.bi-paypal::before{content:"\f662"}.bi-pinterest::before{content:"\f663"}.bi-signal::before{content:"\f664"}.bi-snapchat::before{content:"\f665"}.bi-spotify::before{content:"\f666"}.bi-stack-overflow::before{content:"\f667"}.bi-strava::before{content:"\f668"}.bi-wordpress::before{content:"\f669"}.bi-vimeo::before{content:"\f66a"}.bi-activity::before{content:"\f66b"}.bi-easel2-fill::before{content:"\f66c"}.bi-easel2::before{content:"\f66d"}.bi-easel3-fill::before{content:"\f66e"}.bi-easel3::before{content:"\f66f"}.bi-fan::before{content:"\f670"}.bi-fingerprint::before{content:"\f671"}.bi-graph-down-arrow::before{content:"\f672"}.bi-graph-up-arrow::before{content:"\f673"}.bi-hypnotize::before{content:"\f674"}.bi-magic::before{content:"\f675"}.bi-person-rolodex::before{content:"\f676"}.bi-person-video::before{content:"\f677"}.bi-person-video2::before{content:"\f678"}.bi-person-video3::before{content:"\f679"}.bi-person-workspace::before{content:"\f67a"}.bi-radioactive::before{content:"\f67b"}.bi-webcam-fill::before{content:"\f67c"}.bi-webcam::before{content:"\f67d"}.bi-yin-yang::before{content:"\f67e"}.bi-bandaid-fill::before{content:"\f680"}.bi-bandaid::before{content:"\f681"}.bi-bluetooth::before{content:"\f682"}.bi-body-text::before{content:"\f683"}.bi-boombox::before{content:"\f684"}.bi-boxes::before{content:"\f685"}.bi-dpad-fill::before{content:"\f686"}.bi-dpad::before{content:"\f687"}.bi-ear-fill::before{content:"\f688"}.bi-ear::before{content:"\f689"}.bi-envelope-check-fill::before{content:"\f68b"}.bi-envelope-check::before{content:"\f68c"}.bi-envelope-dash-fill::before{content:"\f68e"}.bi-envelope-dash::before{content:"\f68f"}.bi-envelope-exclamation-fill::before{content:"\f691"}.bi-envelope-exclamation::before{content:"\f692"}.bi-envelope-plus-fill::before{content:"\f693"}.bi-envelope-plus::before{content:"\f694"}.bi-envelope-slash-fill::before{content:"\f696"}.bi-envelope-slash::before{content:"\f697"}.bi-envelope-x-fill::before{content:"\f699"}.bi-envelope-x::before{content:"\f69a"}.bi-explicit-fill::before{content:"\f69b"}.bi-explicit::before{content:"\f69c"}.bi-git::before{content:"\f69d"}.bi-infinity::before{content:"\f69e"}.bi-list-columns-reverse::before{content:"\f69f"}.bi-list-columns::before{content:"\f6a0"}.bi-meta::before{content:"\f6a1"}.bi-nintendo-switch::before{content:"\f6a4"}.bi-pc-display-horizontal::before{content:"\f6a5"}.bi-pc-display::before{content:"\f6a6"}.bi-pc-horizontal::before{content:"\f6a7"}.bi-pc::before{content:"\f6a8"}.bi-playstation::before{content:"\f6a9"}.bi-plus-slash-minus::before{content:"\f6aa"}.bi-projector-fill::before{content:"\f6ab"}.bi-projector::before{content:"\f6ac"}.bi-qr-code-scan::before{content:"\f6ad"}.bi-qr-code::before{content:"\f6ae"}.bi-quora::before{content:"\f6af"}.bi-quote::before{content:"\f6b0"}.bi-robot::before{content:"\f6b1"}.bi-send-check-fill::before{content:"\f6b2"}.bi-send-check::before{content:"\f6b3"}.bi-send-dash-fill::before{content:"\f6b4"}.bi-send-dash::before{content:"\f6b5"}.bi-send-exclamation-fill::before{content:"\f6b7"}.bi-send-exclamation::before{content:"\f6b8"}.bi-send-fill::before{content:"\f6b9"}.bi-send-plus-fill::before{content:"\f6ba"}.bi-send-plus::before{content:"\f6bb"}.bi-send-slash-fill::before{content:"\f6bc"}.bi-send-slash::before{content:"\f6bd"}.bi-send-x-fill::before{content:"\f6be"}.bi-send-x::before{content:"\f6bf"}.bi-send::before{content:"\f6c0"}.bi-steam::before{content:"\f6c1"}.bi-terminal-dash::before{content:"\f6c3"}.bi-terminal-plus::before{content:"\f6c4"}.bi-terminal-split::before{content:"\f6c5"}.bi-ticket-detailed-fill::before{content:"\f6c6"}.bi-ticket-detailed::before{content:"\f6c7"}.bi-ticket-fill::before{content:"\f6c8"}.bi-ticket-perforated-fill::before{content:"\f6c9"}.bi-ticket-perforated::before{content:"\f6ca"}.bi-ticket::before{content:"\f6cb"}.bi-tiktok::before{content:"\f6cc"}.bi-window-dash::before{content:"\f6cd"}.bi-window-desktop::before{content:"\f6ce"}.bi-window-fullscreen::before{content:"\f6cf"}.bi-window-plus::before{content:"\f6d0"}.bi-window-split::before{content:"\f6d1"}.bi-window-stack::before{content:"\f6d2"}.bi-window-x::before{content:"\f6d3"}.bi-xbox::before{content:"\f6d4"}.bi-ethernet::before{content:"\f6d5"}.bi-hdmi-fill::before{content:"\f6d6"}.bi-hdmi::before{content:"\f6d7"}.bi-usb-c-fill::before{content:"\f6d8"}.bi-usb-c::before{content:"\f6d9"}.bi-usb-fill::before{content:"\f6da"}.bi-usb-plug-fill::before{content:"\f6db"}.bi-usb-plug::before{content:"\f6dc"}.bi-usb-symbol::before{content:"\f6dd"}.bi-usb::before{content:"\f6de"}.bi-boombox-fill::before{content:"\f6df"}.bi-displayport::before{content:"\f6e1"}.bi-gpu-card::before{content:"\f6e2"}.bi-memory::before{content:"\f6e3"}.bi-modem-fill::before{content:"\f6e4"}.bi-modem::before{content:"\f6e5"}.bi-motherboard-fill::before{content:"\f6e6"}.bi-motherboard::before{content:"\f6e7"}.bi-optical-audio-fill::before{content:"\f6e8"}.bi-optical-audio::before{content:"\f6e9"}.bi-pci-card::before{content:"\f6ea"}.bi-router-fill::before{content:"\f6eb"}.bi-router::before{content:"\f6ec"}.bi-thunderbolt-fill::before{content:"\f6ef"}.bi-thunderbolt::before{content:"\f6f0"}.bi-usb-drive-fill::before{content:"\f6f1"}.bi-usb-drive::before{content:"\f6f2"}.bi-usb-micro-fill::before{content:"\f6f3"}.bi-usb-micro::before{content:"\f6f4"}.bi-usb-mini-fill::before{content:"\f6f5"}.bi-usb-mini::before{content:"\f6f6"}.bi-cloud-haze2::before{content:"\f6f7"}.bi-device-hdd-fill::before{content:"\f6f8"}.bi-device-hdd::before{content:"\f6f9"}.bi-device-ssd-fill::before{content:"\f6fa"}.bi-device-ssd::before{content:"\f6fb"}.bi-displayport-fill::before{content:"\f6fc"}.bi-mortarboard-fill::before{content:"\f6fd"}.bi-mortarboard::before{content:"\f6fe"}.bi-terminal-x::before{content:"\f6ff"}.bi-arrow-through-heart-fill::before{content:"\f700"}.bi-arrow-through-heart::before{content:"\f701"}.bi-badge-sd-fill::before{content:"\f702"}.bi-badge-sd::before{content:"\f703"}.bi-bag-heart-fill::before{content:"\f704"}.bi-bag-heart::before{content:"\f705"}.bi-balloon-fill::before{content:"\f706"}.bi-balloon-heart-fill::before{content:"\f707"}.bi-balloon-heart::before{content:"\f708"}.bi-balloon::before{content:"\f709"}.bi-box2-fill::before{content:"\f70a"}.bi-box2-heart-fill::before{content:"\f70b"}.bi-box2-heart::before{content:"\f70c"}.bi-box2::before{content:"\f70d"}.bi-braces-asterisk::before{content:"\f70e"}.bi-calendar-heart-fill::before{content:"\f70f"}.bi-calendar-heart::before{content:"\f710"}.bi-calendar2-heart-fill::before{content:"\f711"}.bi-calendar2-heart::before{content:"\f712"}.bi-chat-heart-fill::before{content:"\f713"}.bi-chat-heart::before{content:"\f714"}.bi-chat-left-heart-fill::before{content:"\f715"}.bi-chat-left-heart::before{content:"\f716"}.bi-chat-right-heart-fill::before{content:"\f717"}.bi-chat-right-heart::before{content:"\f718"}.bi-chat-square-heart-fill::before{content:"\f719"}.bi-chat-square-heart::before{content:"\f71a"}.bi-clipboard-check-fill::before{content:"\f71b"}.bi-clipboard-data-fill::before{content:"\f71c"}.bi-clipboard-fill::before{content:"\f71d"}.bi-clipboard-heart-fill::before{content:"\f71e"}.bi-clipboard-heart::before{content:"\f71f"}.bi-clipboard-minus-fill::before{content:"\f720"}.bi-clipboard-plus-fill::before{content:"\f721"}.bi-clipboard-pulse::before{content:"\f722"}.bi-clipboard-x-fill::before{content:"\f723"}.bi-clipboard2-check-fill::before{content:"\f724"}.bi-clipboard2-check::before{content:"\f725"}.bi-clipboard2-data-fill::before{content:"\f726"}.bi-clipboard2-data::before{content:"\f727"}.bi-clipboard2-fill::before{content:"\f728"}.bi-clipboard2-heart-fill::before{content:"\f729"}.bi-clipboard2-heart::before{content:"\f72a"}.bi-clipboard2-minus-fill::before{content:"\f72b"}.bi-clipboard2-minus::before{content:"\f72c"}.bi-clipboard2-plus-fill::before{content:"\f72d"}.bi-clipboard2-plus::before{content:"\f72e"}.bi-clipboard2-pulse-fill::before{content:"\f72f"}.bi-clipboard2-pulse::before{content:"\f730"}.bi-clipboard2-x-fill::before{content:"\f731"}.bi-clipboard2-x::before{content:"\f732"}.bi-clipboard2::before{content:"\f733"}.bi-emoji-kiss-fill::before{content:"\f734"}.bi-emoji-kiss::before{content:"\f735"}.bi-envelope-heart-fill::before{content:"\f736"}.bi-envelope-heart::before{content:"\f737"}.bi-envelope-open-heart-fill::before{content:"\f738"}.bi-envelope-open-heart::before{content:"\f739"}.bi-envelope-paper-fill::before{content:"\f73a"}.bi-envelope-paper-heart-fill::before{content:"\f73b"}.bi-envelope-paper-heart::before{content:"\f73c"}.bi-envelope-paper::before{content:"\f73d"}.bi-filetype-aac::before{content:"\f73e"}.bi-filetype-ai::before{content:"\f73f"}.bi-filetype-bmp::before{content:"\f740"}.bi-filetype-cs::before{content:"\f741"}.bi-filetype-css::before{content:"\f742"}.bi-filetype-csv::before{content:"\f743"}.bi-filetype-doc::before{content:"\f744"}.bi-filetype-docx::before{content:"\f745"}.bi-filetype-exe::before{content:"\f746"}.bi-filetype-gif::before{content:"\f747"}.bi-filetype-heic::before{content:"\f748"}.bi-filetype-html::before{content:"\f749"}.bi-filetype-java::before{content:"\f74a"}.bi-filetype-jpg::before{content:"\f74b"}.bi-filetype-js::before{content:"\f74c"}.bi-filetype-jsx::before{content:"\f74d"}.bi-filetype-key::before{content:"\f74e"}.bi-filetype-m4p::before{content:"\f74f"}.bi-filetype-md::before{content:"\f750"}.bi-filetype-mdx::before{content:"\f751"}.bi-filetype-mov::before{content:"\f752"}.bi-filetype-mp3::before{content:"\f753"}.bi-filetype-mp4::before{content:"\f754"}.bi-filetype-otf::before{content:"\f755"}.bi-filetype-pdf::before{content:"\f756"}.bi-filetype-php::before{content:"\f757"}.bi-filetype-png::before{content:"\f758"}.bi-filetype-ppt::before{content:"\f75a"}.bi-filetype-psd::before{content:"\f75b"}.bi-filetype-py::before{content:"\f75c"}.bi-filetype-raw::before{content:"\f75d"}.bi-filetype-rb::before{content:"\f75e"}.bi-filetype-sass::before{content:"\f75f"}.bi-filetype-scss::before{content:"\f760"}.bi-filetype-sh::before{content:"\f761"}.bi-filetype-svg::before{content:"\f762"}.bi-filetype-tiff::before{content:"\f763"}.bi-filetype-tsx::before{content:"\f764"}.bi-filetype-ttf::before{content:"\f765"}.bi-filetype-txt::before{content:"\f766"}.bi-filetype-wav::before{content:"\f767"}.bi-filetype-woff::before{content:"\f768"}.bi-filetype-xls::before{content:"\f76a"}.bi-filetype-xml::before{content:"\f76b"}.bi-filetype-yml::before{content:"\f76c"}.bi-heart-arrow::before{content:"\f76d"}.bi-heart-pulse-fill::before{content:"\f76e"}.bi-heart-pulse::before{content:"\f76f"}.bi-heartbreak-fill::before{content:"\f770"}.bi-heartbreak::before{content:"\f771"}.bi-hearts::before{content:"\f772"}.bi-hospital-fill::before{content:"\f773"}.bi-hospital::before{content:"\f774"}.bi-house-heart-fill::before{content:"\f775"}.bi-house-heart::before{content:"\f776"}.bi-incognito::before{content:"\f777"}.bi-magnet-fill::before{content:"\f778"}.bi-magnet::before{content:"\f779"}.bi-person-heart::before{content:"\f77a"}.bi-person-hearts::before{content:"\f77b"}.bi-phone-flip::before{content:"\f77c"}.bi-plugin::before{content:"\f77d"}.bi-postage-fill::before{content:"\f77e"}.bi-postage-heart-fill::before{content:"\f77f"}.bi-postage-heart::before{content:"\f780"}.bi-postage::before{content:"\f781"}.bi-postcard-fill::before{content:"\f782"}.bi-postcard-heart-fill::before{content:"\f783"}.bi-postcard-heart::before{content:"\f784"}.bi-postcard::before{content:"\f785"}.bi-search-heart-fill::before{content:"\f786"}.bi-search-heart::before{content:"\f787"}.bi-sliders2-vertical::before{content:"\f788"}.bi-sliders2::before{content:"\f789"}.bi-trash3-fill::before{content:"\f78a"}.bi-trash3::before{content:"\f78b"}.bi-valentine::before{content:"\f78c"}.bi-valentine2::before{content:"\f78d"}.bi-wrench-adjustable-circle-fill::before{content:"\f78e"}.bi-wrench-adjustable-circle::before{content:"\f78f"}.bi-wrench-adjustable::before{content:"\f790"}.bi-filetype-json::before{content:"\f791"}.bi-filetype-pptx::before{content:"\f792"}.bi-filetype-xlsx::before{content:"\f793"}.bi-1-circle-fill::before{content:"\f796"}.bi-1-circle::before{content:"\f797"}.bi-1-square-fill::before{content:"\f798"}.bi-1-square::before{content:"\f799"}.bi-2-circle-fill::before{content:"\f79c"}.bi-2-circle::before{content:"\f79d"}.bi-2-square-fill::before{content:"\f79e"}.bi-2-square::before{content:"\f79f"}.bi-3-circle-fill::before{content:"\f7a2"}.bi-3-circle::before{content:"\f7a3"}.bi-3-square-fill::before{content:"\f7a4"}.bi-3-square::before{content:"\f7a5"}.bi-4-circle-fill::before{content:"\f7a8"}.bi-4-circle::before{content:"\f7a9"}.bi-4-square-fill::before{content:"\f7aa"}.bi-4-square::before{content:"\f7ab"}.bi-5-circle-fill::before{content:"\f7ae"}.bi-5-circle::before{content:"\f7af"}.bi-5-square-fill::before{content:"\f7b0"}.bi-5-square::before{content:"\f7b1"}.bi-6-circle-fill::before{content:"\f7b4"}.bi-6-circle::before{content:"\f7b5"}.bi-6-square-fill::before{content:"\f7b6"}.bi-6-square::before{content:"\f7b7"}.bi-7-circle-fill::before{content:"\f7ba"}.bi-7-circle::before{content:"\f7bb"}.bi-7-square-fill::before{content:"\f7bc"}.bi-7-square::before{content:"\f7bd"}.bi-8-circle-fill::before{content:"\f7c0"}.bi-8-circle::before{content:"\f7c1"}.bi-8-square-fill::before{content:"\f7c2"}.bi-8-square::before{content:"\f7c3"}.bi-9-circle-fill::before{content:"\f7c6"}.bi-9-circle::before{content:"\f7c7"}.bi-9-square-fill::before{content:"\f7c8"}.bi-9-square::before{content:"\f7c9"}.bi-airplane-engines-fill::before{content:"\f7ca"}.bi-airplane-engines::before{content:"\f7cb"}.bi-airplane-fill::before{content:"\f7cc"}.bi-airplane::before{content:"\f7cd"}.bi-alexa::before{content:"\f7ce"}.bi-alipay::before{content:"\f7cf"}.bi-android::before{content:"\f7d0"}.bi-android2::before{content:"\f7d1"}.bi-box-fill::before{content:"\f7d2"}.bi-box-seam-fill::before{content:"\f7d3"}.bi-browser-chrome::before{content:"\f7d4"}.bi-browser-edge::before{content:"\f7d5"}.bi-browser-firefox::before{content:"\f7d6"}.bi-browser-safari::before{content:"\f7d7"}.bi-c-circle-fill::before{content:"\f7da"}.bi-c-circle::before{content:"\f7db"}.bi-c-square-fill::before{content:"\f7dc"}.bi-c-square::before{content:"\f7dd"}.bi-capsule-pill::before{content:"\f7de"}.bi-capsule::before{content:"\f7df"}.bi-car-front-fill::before{content:"\f7e0"}.bi-car-front::before{content:"\f7e1"}.bi-cassette-fill::before{content:"\f7e2"}.bi-cassette::before{content:"\f7e3"}.bi-cc-circle-fill::before{content:"\f7e6"}.bi-cc-circle::before{content:"\f7e7"}.bi-cc-square-fill::before{content:"\f7e8"}.bi-cc-square::before{content:"\f7e9"}.bi-cup-hot-fill::before{content:"\f7ea"}.bi-cup-hot::before{content:"\f7eb"}.bi-currency-rupee::before{content:"\f7ec"}.bi-dropbox::before{content:"\f7ed"}.bi-escape::before{content:"\f7ee"}.bi-fast-forward-btn-fill::before{content:"\f7ef"}.bi-fast-forward-btn::before{content:"\f7f0"}.bi-fast-forward-circle-fill::before{content:"\f7f1"}.bi-fast-forward-circle::before{content:"\f7f2"}.bi-fast-forward-fill::before{content:"\f7f3"}.bi-fast-forward::before{content:"\f7f4"}.bi-filetype-sql::before{content:"\f7f5"}.bi-fire::before{content:"\f7f6"}.bi-google-play::before{content:"\f7f7"}.bi-h-circle-fill::before{content:"\f7fa"}.bi-h-circle::before{content:"\f7fb"}.bi-h-square-fill::before{content:"\f7fc"}.bi-h-square::before{content:"\f7fd"}.bi-indent::before{content:"\f7fe"}.bi-lungs-fill::before{content:"\f7ff"}.bi-lungs::before{content:"\f800"}.bi-microsoft-teams::before{content:"\f801"}.bi-p-circle-fill::before{content:"\f804"}.bi-p-circle::before{content:"\f805"}.bi-p-square-fill::before{content:"\f806"}.bi-p-square::before{content:"\f807"}.bi-pass-fill::before{content:"\f808"}.bi-pass::before{content:"\f809"}.bi-prescription::before{content:"\f80a"}.bi-prescription2::before{content:"\f80b"}.bi-r-circle-fill::before{content:"\f80e"}.bi-r-circle::before{content:"\f80f"}.bi-r-square-fill::before{content:"\f810"}.bi-r-square::before{content:"\f811"}.bi-repeat-1::before{content:"\f812"}.bi-repeat::before{content:"\f813"}.bi-rewind-btn-fill::before{content:"\f814"}.bi-rewind-btn::before{content:"\f815"}.bi-rewind-circle-fill::before{content:"\f816"}.bi-rewind-circle::before{content:"\f817"}.bi-rewind-fill::before{content:"\f818"}.bi-rewind::before{content:"\f819"}.bi-train-freight-front-fill::before{content:"\f81a"}.bi-train-freight-front::before{content:"\f81b"}.bi-train-front-fill::before{content:"\f81c"}.bi-train-front::before{content:"\f81d"}.bi-train-lightrail-front-fill::before{content:"\f81e"}.bi-train-lightrail-front::before{content:"\f81f"}.bi-truck-front-fill::before{content:"\f820"}.bi-truck-front::before{content:"\f821"}.bi-ubuntu::before{content:"\f822"}.bi-unindent::before{content:"\f823"}.bi-unity::before{content:"\f824"}.bi-universal-access-circle::before{content:"\f825"}.bi-universal-access::before{content:"\f826"}.bi-virus::before{content:"\f827"}.bi-virus2::before{content:"\f828"}.bi-wechat::before{content:"\f829"}.bi-yelp::before{content:"\f82a"}.bi-sign-stop-fill::before{content:"\f82b"}.bi-sign-stop-lights-fill::before{content:"\f82c"}.bi-sign-stop-lights::before{content:"\f82d"}.bi-sign-stop::before{content:"\f82e"}.bi-sign-turn-left-fill::before{content:"\f82f"}.bi-sign-turn-left::before{content:"\f830"}.bi-sign-turn-right-fill::before{content:"\f831"}.bi-sign-turn-right::before{content:"\f832"}.bi-sign-turn-slight-left-fill::before{content:"\f833"}.bi-sign-turn-slight-left::before{content:"\f834"}.bi-sign-turn-slight-right-fill::before{content:"\f835"}.bi-sign-turn-slight-right::before{content:"\f836"}.bi-sign-yield-fill::before{content:"\f837"}.bi-sign-yield::before{content:"\f838"}.bi-ev-station-fill::before{content:"\f839"}.bi-ev-station::before{content:"\f83a"}.bi-fuel-pump-diesel-fill::before{content:"\f83b"}.bi-fuel-pump-diesel::before{content:"\f83c"}.bi-fuel-pump-fill::before{content:"\f83d"}.bi-fuel-pump::before{content:"\f83e"}.bi-0-circle-fill::before{content:"\f83f"}.bi-0-circle::before{content:"\f840"}.bi-0-square-fill::before{content:"\f841"}.bi-0-square::before{content:"\f842"}.bi-rocket-fill::before{content:"\f843"}.bi-rocket-takeoff-fill::before{content:"\f844"}.bi-rocket-takeoff::before{content:"\f845"}.bi-rocket::before{content:"\f846"}.bi-stripe::before{content:"\f847"}.bi-subscript::before{content:"\f848"}.bi-superscript::before{content:"\f849"}.bi-trello::before{content:"\f84a"}.bi-envelope-at-fill::before{content:"\f84b"}.bi-envelope-at::before{content:"\f84c"}.bi-regex::before{content:"\f84d"}.bi-text-wrap::before{content:"\f84e"}.bi-sign-dead-end-fill::before{content:"\f84f"}.bi-sign-dead-end::before{content:"\f850"}.bi-sign-do-not-enter-fill::before{content:"\f851"}.bi-sign-do-not-enter::before{content:"\f852"}.bi-sign-intersection-fill::before{content:"\f853"}.bi-sign-intersection-side-fill::before{content:"\f854"}.bi-sign-intersection-side::before{content:"\f855"}.bi-sign-intersection-t-fill::before{content:"\f856"}.bi-sign-intersection-t::before{content:"\f857"}.bi-sign-intersection-y-fill::before{content:"\f858"}.bi-sign-intersection-y::before{content:"\f859"}.bi-sign-intersection::before{content:"\f85a"}.bi-sign-merge-left-fill::before{content:"\f85b"}.bi-sign-merge-left::before{content:"\f85c"}.bi-sign-merge-right-fill::before{content:"\f85d"}.bi-sign-merge-right::before{content:"\f85e"}.bi-sign-no-left-turn-fill::before{content:"\f85f"}.bi-sign-no-left-turn::before{content:"\f860"}.bi-sign-no-parking-fill::before{content:"\f861"}.bi-sign-no-parking::before{content:"\f862"}.bi-sign-no-right-turn-fill::before{content:"\f863"}.bi-sign-no-right-turn::before{content:"\f864"}.bi-sign-railroad-fill::before{content:"\f865"}.bi-sign-railroad::before{content:"\f866"}.bi-building-add::before{content:"\f867"}.bi-building-check::before{content:"\f868"}.bi-building-dash::before{content:"\f869"}.bi-building-down::before{content:"\f86a"}.bi-building-exclamation::before{content:"\f86b"}.bi-building-fill-add::before{content:"\f86c"}.bi-building-fill-check::before{content:"\f86d"}.bi-building-fill-dash::before{content:"\f86e"}.bi-building-fill-down::before{content:"\f86f"}.bi-building-fill-exclamation::before{content:"\f870"}.bi-building-fill-gear::before{content:"\f871"}.bi-building-fill-lock::before{content:"\f872"}.bi-building-fill-slash::before{content:"\f873"}.bi-building-fill-up::before{content:"\f874"}.bi-building-fill-x::before{content:"\f875"}.bi-building-fill::before{content:"\f876"}.bi-building-gear::before{content:"\f877"}.bi-building-lock::before{content:"\f878"}.bi-building-slash::before{content:"\f879"}.bi-building-up::before{content:"\f87a"}.bi-building-x::before{content:"\f87b"}.bi-buildings-fill::before{content:"\f87c"}.bi-buildings::before{content:"\f87d"}.bi-bus-front-fill::before{content:"\f87e"}.bi-bus-front::before{content:"\f87f"}.bi-ev-front-fill::before{content:"\f880"}.bi-ev-front::before{content:"\f881"}.bi-globe-americas::before{content:"\f882"}.bi-globe-asia-australia::before{content:"\f883"}.bi-globe-central-south-asia::before{content:"\f884"}.bi-globe-europe-africa::before{content:"\f885"}.bi-house-add-fill::before{content:"\f886"}.bi-house-add::before{content:"\f887"}.bi-house-check-fill::before{content:"\f888"}.bi-house-check::before{content:"\f889"}.bi-house-dash-fill::before{content:"\f88a"}.bi-house-dash::before{content:"\f88b"}.bi-house-down-fill::before{content:"\f88c"}.bi-house-down::before{content:"\f88d"}.bi-house-exclamation-fill::before{content:"\f88e"}.bi-house-exclamation::before{content:"\f88f"}.bi-house-gear-fill::before{content:"\f890"}.bi-house-gear::before{content:"\f891"}.bi-house-lock-fill::before{content:"\f892"}.bi-house-lock::before{content:"\f893"}.bi-house-slash-fill::before{content:"\f894"}.bi-house-slash::before{content:"\f895"}.bi-house-up-fill::before{content:"\f896"}.bi-house-up::before{content:"\f897"}.bi-house-x-fill::before{content:"\f898"}.bi-house-x::before{content:"\f899"}.bi-person-add::before{content:"\f89a"}.bi-person-down::before{content:"\f89b"}.bi-person-exclamation::before{content:"\f89c"}.bi-person-fill-add::before{content:"\f89d"}.bi-person-fill-check::before{content:"\f89e"}.bi-person-fill-dash::before{content:"\f89f"}.bi-person-fill-down::before{content:"\f8a0"}.bi-person-fill-exclamation::before{content:"\f8a1"}.bi-person-fill-gear::before{content:"\f8a2"}.bi-person-fill-lock::before{content:"\f8a3"}.bi-person-fill-slash::before{content:"\f8a4"}.bi-person-fill-up::before{content:"\f8a5"}.bi-person-fill-x::before{content:"\f8a6"}.bi-person-gear::before{content:"\f8a7"}.bi-person-lock::before{content:"\f8a8"}.bi-person-slash::before{content:"\f8a9"}.bi-person-up::before{content:"\f8aa"}.bi-scooter::before{content:"\f8ab"}.bi-taxi-front-fill::before{content:"\f8ac"}.bi-taxi-front::before{content:"\f8ad"}.bi-amd::before{content:"\f8ae"}.bi-database-add::before{content:"\f8af"}.bi-database-check::before{content:"\f8b0"}.bi-database-dash::before{content:"\f8b1"}.bi-database-down::before{content:"\f8b2"}.bi-database-exclamation::before{content:"\f8b3"}.bi-database-fill-add::before{content:"\f8b4"}.bi-database-fill-check::before{content:"\f8b5"}.bi-database-fill-dash::before{content:"\f8b6"}.bi-database-fill-down::before{content:"\f8b7"}.bi-database-fill-exclamation::before{content:"\f8b8"}.bi-database-fill-gear::before{content:"\f8b9"}.bi-database-fill-lock::before{content:"\f8ba"}.bi-database-fill-slash::before{content:"\f8bb"}.bi-database-fill-up::before{content:"\f8bc"}.bi-database-fill-x::before{content:"\f8bd"}.bi-database-fill::before{content:"\f8be"}.bi-database-gear::before{content:"\f8bf"}.bi-database-lock::before{content:"\f8c0"}.bi-database-slash::before{content:"\f8c1"}.bi-database-up::before{content:"\f8c2"}.bi-database-x::before{content:"\f8c3"}.bi-database::before{content:"\f8c4"}.bi-houses-fill::before{content:"\f8c5"}.bi-houses::before{content:"\f8c6"}.bi-nvidia::before{content:"\f8c7"}.bi-person-vcard-fill::before{content:"\f8c8"}.bi-person-vcard::before{content:"\f8c9"}.bi-sina-weibo::before{content:"\f8ca"}.bi-tencent-qq::before{content:"\f8cb"}.bi-wikipedia::before{content:"\f8cc"}.bi-alphabet-uppercase::before{content:"\f2a5"}.bi-alphabet::before{content:"\f68a"}.bi-amazon::before{content:"\f68d"}.bi-arrows-collapse-vertical::before{content:"\f690"}.bi-arrows-expand-vertical::before{content:"\f695"}.bi-arrows-vertical::before{content:"\f698"}.bi-arrows::before{content:"\f6a2"}.bi-ban-fill::before{content:"\f6a3"}.bi-ban::before{content:"\f6b6"}.bi-bing::before{content:"\f6c2"}.bi-cake::before{content:"\f6e0"}.bi-cake2::before{content:"\f6ed"}.bi-cookie::before{content:"\f6ee"}.bi-copy::before{content:"\f759"}.bi-crosshair::before{content:"\f769"}.bi-crosshair2::before{content:"\f794"}.bi-emoji-astonished-fill::before{content:"\f795"}.bi-emoji-astonished::before{content:"\f79a"}.bi-emoji-grimace-fill::before{content:"\f79b"}.bi-emoji-grimace::before{content:"\f7a0"}.bi-emoji-grin-fill::before{content:"\f7a1"}.bi-emoji-grin::before{content:"\f7a6"}.bi-emoji-surprise-fill::before{content:"\f7a7"}.bi-emoji-surprise::before{content:"\f7ac"}.bi-emoji-tear-fill::before{content:"\f7ad"}.bi-emoji-tear::before{content:"\f7b2"}.bi-envelope-arrow-down-fill::before{content:"\f7b3"}.bi-envelope-arrow-down::before{content:"\f7b8"}.bi-envelope-arrow-up-fill::before{content:"\f7b9"}.bi-envelope-arrow-up::before{content:"\f7be"}.bi-feather::before{content:"\f7bf"}.bi-feather2::before{content:"\f7c4"}.bi-floppy-fill::before{content:"\f7c5"}.bi-floppy::before{content:"\f7d8"}.bi-floppy2-fill::before{content:"\f7d9"}.bi-floppy2::before{content:"\f7e4"}.bi-gitlab::before{content:"\f7e5"}.bi-highlighter::before{content:"\f7f8"}.bi-marker-tip::before{content:"\f802"}.bi-nvme-fill::before{content:"\f803"}.bi-nvme::before{content:"\f80c"}.bi-opencollective::before{content:"\f80d"}.bi-pci-card-network::before{content:"\f8cd"}.bi-pci-card-sound::before{content:"\f8ce"}.bi-radar::before{content:"\f8cf"}.bi-send-arrow-down-fill::before{content:"\f8d0"}.bi-send-arrow-down::before{content:"\f8d1"}.bi-send-arrow-up-fill::before{content:"\f8d2"}.bi-send-arrow-up::before{content:"\f8d3"}.bi-sim-slash-fill::before{content:"\f8d4"}.bi-sim-slash::before{content:"\f8d5"}.bi-sourceforge::before{content:"\f8d6"}.bi-substack::before{content:"\f8d7"}.bi-threads-fill::before{content:"\f8d8"}.bi-threads::before{content:"\f8d9"}.bi-transparency::before{content:"\f8da"}.bi-twitter-x::before{content:"\f8db"}.bi-type-h4::before{content:"\f8dc"}.bi-type-h5::before{content:"\f8dd"}.bi-type-h6::before{content:"\f8de"}.bi-backpack-fill::before{content:"\f8df"}.bi-backpack::before{content:"\f8e0"}.bi-backpack2-fill::before{content:"\f8e1"}.bi-backpack2::before{content:"\f8e2"}.bi-backpack3-fill::before{content:"\f8e3"}.bi-backpack3::before{content:"\f8e4"}.bi-backpack4-fill::before{content:"\f8e5"}.bi-backpack4::before{content:"\f8e6"}.bi-brilliance::before{content:"\f8e7"}.bi-cake-fill::before{content:"\f8e8"}.bi-cake2-fill::before{content:"\f8e9"}.bi-duffle-fill::before{content:"\f8ea"}.bi-duffle::before{content:"\f8eb"}.bi-exposure::before{content:"\f8ec"}.bi-gender-neuter::before{content:"\f8ed"}.bi-highlights::before{content:"\f8ee"}.bi-luggage-fill::before{content:"\f8ef"}.bi-luggage::before{content:"\f8f0"}.bi-mailbox-flag::before{content:"\f8f1"}.bi-mailbox2-flag::before{content:"\f8f2"}.bi-noise-reduction::before{content:"\f8f3"}.bi-passport-fill::before{content:"\f8f4"}.bi-passport::before{content:"\f8f5"}.bi-person-arms-up::before{content:"\f8f6"}.bi-person-raised-hand::before{content:"\f8f7"}.bi-person-standing-dress::before{content:"\f8f8"}.bi-person-standing::before{content:"\f8f9"}.bi-person-walking::before{content:"\f8fa"}.bi-person-wheelchair::before{content:"\f8fb"}.bi-shadows::before{content:"\f8fc"}.bi-suitcase-fill::before{content:"\f8fd"}.bi-suitcase-lg-fill::before{content:"\f8fe"}.bi-suitcase-lg::before{content:"\f8ff"}.bi-suitcase::before{content:"\f900"}.bi-suitcase2-fill::before{content:"\f901"}.bi-suitcase2::before{content:"\f902"}.bi-vignette::before{content:"\f903"} \ No newline at end of file diff --git a/src/main/resources/static/css/dark-mode.css b/src/main/resources/static/css/dark-mode.css index cf2e028d3..82e01676d 100644 --- a/src/main/resources/static/css/dark-mode.css +++ b/src/main/resources/static/css/dark-mode.css @@ -91,3 +91,26 @@ hr { border-color: rgba(255, 255, 255, 0.6); /* semi-transparent white */ background-color: rgba(255, 255, 255, 0.6); /* for some browsers that might use background instead of border for
*/ } + +#global-buttons-container input { + background-color: #323948; + caret-color: #ffffff; + color: #ffffff; +} +#global-buttons-container input::placeholder { + color: #ffffff; +} + +#global-buttons-container input:disabled::-webkit-input-placeholder { /* WebKit browsers */ + color: #6E6865; +} +#global-buttons-container input:disabled:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + color: #6E6865; +} +#global-buttons-container input:disabled::-moz-placeholder { /* Mozilla Firefox 19+ */ + color: #6E6865; +} +#global-buttons-container input:disabled:-ms-input-placeholder { /* Internet Explorer 10+ */ + color: #6E6865; +} + diff --git a/src/main/resources/static/css/home.css b/src/main/resources/static/css/home.css index 9bd1ce708..ab3b3348c 100644 --- a/src/main/resources/static/css/home.css +++ b/src/main/resources/static/css/home.css @@ -1,15 +1,22 @@ -#searchBar { - background-image: url('/images/search.svg'); - background-position: 16px 16px; - background-repeat: no-repeat; - width: 100%; - font-size: 16px; +#searchBar { + background-image: url('/images/search.svg'); + background-position: 16px 16px; + background-repeat: no-repeat; + width: 100%; + font-size: 16px; margin-bottom: 12px; - padding: 12px 20px 12px 40px; + padding: 12px 20px 12px 40px; border: 1px solid #ddd; - - + + } +.dark-mode-search { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' hei… 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z'/%3E%3C/svg%3E") !important; + color: #f8f9fa !important; + background-color: #212529 !important; + border-color: #343a40 !important; + } + .features-container { @@ -25,10 +32,10 @@ display: flex; flex-direction: column; align-items: flex-start; - background: rgba(13, 110, 253, 0.05); + background: rgba(13, 110, 253, 0.05); transition: transform 0.3s, border 0.3s; transform-origin: center center; - outline: 2px solid transparent; + outline: 2px solid transparent; } .feature-card a { diff --git a/src/main/resources/static/css/light-mode.css b/src/main/resources/static/css/light-mode.css index b696c036d..08efbf4c0 100644 --- a/src/main/resources/static/css/light-mode.css +++ b/src/main/resources/static/css/light-mode.css @@ -2,4 +2,23 @@ body { --body-background-color: 255, 255, 255; --base-font-color: 33, 37, 41; -} \ No newline at end of file +} + + +#global-buttons-container input { + background-color: #ffffff; + /*caret-color: #ffffff;*/ + /*color: #ffffff;*/ +} +/*#global-buttons-container input:disabled::-webkit-input-placeholder { !* WebKit browsers *!*/ +/* color: #98A0AB;*/ +/*}*/ +/*#global-buttons-container input:disabled:-moz-placeholder { !* Mozilla Firefox 4 to 18 *!*/ +/* color: #98A0AB;*/ +/*}*/ +/*#global-buttons-container input:disabled::-moz-placeholder { !* Mozilla Firefox 19+ *!*/ +/* color: #98A0AB;*/ +/*}*/ +/*#global-buttons-container input:disabled:-ms-input-placeholder { !* Internet Explorer 10+ *!*/ +/* color: #98A0AB;*/ +/*}*/ diff --git a/src/main/resources/static/fonts/Arimo-Regular.woff2 b/src/main/resources/static/fonts/Arimo-Regular.woff2 new file mode 100644 index 000000000..0c299d96d Binary files /dev/null and b/src/main/resources/static/fonts/Arimo-Regular.woff2 differ diff --git a/src/main/resources/static/fonts/Tinos-Regular.woff2 b/src/main/resources/static/fonts/Tinos-Regular.woff2 new file mode 100644 index 000000000..2719db41e Binary files /dev/null and b/src/main/resources/static/fonts/Tinos-Regular.woff2 differ diff --git a/src/main/resources/static/images/book-opened.svg b/src/main/resources/static/images/book-opened.svg new file mode 100644 index 000000000..e642d31ae --- /dev/null +++ b/src/main/resources/static/images/book-opened.svg @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/images/flags/bg.svg b/src/main/resources/static/images/flags/bg.svg new file mode 100644 index 000000000..b100dd0dc --- /dev/null +++ b/src/main/resources/static/images/flags/bg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/main/resources/static/images/flags/gr.svg b/src/main/resources/static/images/flags/gr.svg new file mode 100644 index 000000000..599741eec --- /dev/null +++ b/src/main/resources/static/images/flags/gr.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/main/resources/static/images/flags/hu.svg b/src/main/resources/static/images/flags/hu.svg new file mode 100644 index 000000000..e7359a3b7 --- /dev/null +++ b/src/main/resources/static/images/flags/hu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/static/images/flags/tr.svg b/src/main/resources/static/images/flags/tr.svg new file mode 100644 index 000000000..a92804f88 --- /dev/null +++ b/src/main/resources/static/images/flags/tr.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/main/resources/static/images/no-chat.svg b/src/main/resources/static/images/no-chat.svg new file mode 100644 index 000000000..8db220383 --- /dev/null +++ b/src/main/resources/static/images/no-chat.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/images/overlay.svg b/src/main/resources/static/images/overlay.svg new file mode 100644 index 000000000..393ce40c9 --- /dev/null +++ b/src/main/resources/static/images/overlay.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/main/resources/static/images/pdf-csv.svg b/src/main/resources/static/images/pdf-csv.svg new file mode 100644 index 000000000..95d68c105 --- /dev/null +++ b/src/main/resources/static/images/pdf-csv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/resources/static/js/darkmode.js b/src/main/resources/static/js/darkmode.js index ebf9c6831..d3c622662 100644 --- a/src/main/resources/static/js/darkmode.js +++ b/src/main/resources/static/js/darkmode.js @@ -1,90 +1,150 @@ -var toggleCount = 0; -var lastToggleTime = Date.now(); +var toggleCount = 0 +var lastToggleTime = Date.now() var elements = { - lightModeStyles: null, - darkModeStyles: null, - rainbowModeStyles: null, - darkModeIcon: null -}; - -function getElements() { - elements.lightModeStyles = document.getElementById("light-mode-styles"); - elements.darkModeStyles = document.getElementById("dark-mode-styles"); - elements.rainbowModeStyles = document.getElementById("rainbow-mode-styles"); - elements.darkModeIcon = document.getElementById("dark-mode-icon"); + lightModeStyles: null, + darkModeStyles: null, + rainbowModeStyles: null, + darkModeIcon: null, + searchBar: null, + formControls: null, + navbar: null, + navIcons: null, + navDropdownMenus: null, } +function getElements() { + elements.lightModeStyles = document.getElementById("light-mode-styles") + elements.darkModeStyles = document.getElementById("dark-mode-styles") + elements.rainbowModeStyles = document.getElementById("rainbow-mode-styles") + elements.darkModeIcon = document.getElementById("dark-mode-icon") + elements.searchBar = document.getElementById("searchBar") + elements.formControls = document.querySelectorAll(".form-control") + elements.navbar = document.querySelectorAll("nav.navbar") + elements.navIcons = document.querySelectorAll("nav .icon, .navbar-icon") + elements.navDropdownMenus = document.querySelectorAll("nav .dropdown-menu") +} function setMode(mode) { - var event = new CustomEvent('modeChanged', { detail: mode }); - document.dispatchEvent(event); - elements.lightModeStyles.disabled = mode !== "off"; - elements.darkModeStyles.disabled = mode !== "on"; - elements.rainbowModeStyles.disabled = mode !== "rainbow"; - var jumbotron = document.getElementById('jumbotron'); - if (mode === "on") { - elements.darkModeIcon.src = "moon.svg"; - // Add the table-dark class to tables for dark mode - var tables = document.querySelectorAll('.table'); - tables.forEach(table => { - table.classList.add('table-dark'); - }); - if(jumbotron) { - jumbotron.classList.add('bg-dark'); - jumbotron.classList.remove('bg-light'); - } - } else if (mode === "off") { - elements.darkModeIcon.src = "sun.svg"; - // Remove the table-dark class for light mode - var tables = document.querySelectorAll('.table-dark'); - tables.forEach(table => { - table.classList.remove('table-dark'); - }); - if(jumbotron){ - console.log(mode) - jumbotron.classList.remove('bg-dark'); - jumbotron.classList.add('bg-light'); - } - } else if (mode === "rainbow") { - elements.darkModeIcon.src = "rainbow.svg"; - } + var event = new CustomEvent("modeChanged", { detail: mode }); + document.dispatchEvent(event); + + if (elements && elements.lightModeStyles) { + elements.lightModeStyles.disabled = mode !== "off"; + } + if (elements && elements.darkModeStyles) { + elements.darkModeStyles.disabled = mode !== "on"; + } + if (elements && elements.rainbowModeStyles) { + elements.rainbowModeStyles.disabled = mode !== "rainbow"; + } + + var jumbotron = document.getElementById("jumbotron"); + + if (mode === "on") { + if (elements && elements.darkModeIcon) { + elements.darkModeIcon.src = "moon.svg"; + } + if (elements && elements.searchBar) { + elements.searchBar.classList.add("dark-mode-search"); + } + if (elements && elements.formControls) { + elements.formControls.forEach(input => input.classList.add("bg-dark", "text-white")); + } + if (elements && elements.navbar) { + elements.navbar.forEach(navElement => { + navElement.classList.remove("navbar-light", "bg-light"); + navElement.classList.add("navbar-dark", "bg-dark"); + }); + } + if (elements && elements.navDropdownMenus) { + elements.navDropdownMenus.forEach(menu => menu.classList.add("dropdown-menu-dark")); + } + if (elements && elements.navIcons) { + elements.navIcons.forEach(icon => (icon.style.filter = "invert(1)")); + } + var tables = document.querySelectorAll(".table"); + tables.forEach(table => { + table.classList.add("table-dark"); + }); + if (jumbotron) { + jumbotron.classList.add("bg-dark"); + jumbotron.classList.remove("bg-light"); + } + } else if (mode === "off") { + if (elements && elements.darkModeIcon) { + elements.darkModeIcon.src = "sun.svg"; + } + if (elements && elements.searchBar) { + elements.searchBar.classList.remove("dark-mode-search"); + } + if (elements && elements.formControls) { + elements.formControls.forEach(input => input.classList.remove("bg-dark", "text-white")); + } + if (elements && elements.navbar) { + elements.navbar.forEach(navElement => { + navElement.classList.remove("navbar-dark", "bg-dark"); + navElement.classList.add("navbar-light", "bg-light"); + }); + } + if (elements && elements.navDropdownMenus) { + elements.navDropdownMenus.forEach(menu => menu.classList.remove("dropdown-menu-dark")); + } + if (elements && elements.navIcons) { + elements.navIcons.forEach(icon => (icon.style.filter = "none")); + } + var tables = document.querySelectorAll(".table-dark"); + tables.forEach(table => { + table.classList.remove("table-dark"); + }); + if (jumbotron) { + jumbotron.classList.remove("bg-dark"); + jumbotron.classList.add("bg-light"); + } + } else if (mode === "rainbow") { + if (elements && elements.darkModeIcon) { + elements.darkModeIcon.src = "rainbow.svg"; + } + } } function toggleDarkMode() { - var currentTime = Date.now(); - if (currentTime - lastToggleTime < 1000) { - toggleCount++; - } else { - toggleCount = 1; - } - lastToggleTime = currentTime; + var currentTime = Date.now() + if (currentTime - lastToggleTime < 1000) { + toggleCount++ + } else { + toggleCount = 1 + } + lastToggleTime = currentTime - if (toggleCount >= 18) { - localStorage.setItem("dark-mode", "rainbow"); - setMode("rainbow"); - } else if (localStorage.getItem("dark-mode") == "on") { - localStorage.setItem("dark-mode", "off"); - setMode("off"); - } else { - localStorage.setItem("dark-mode", "on"); - setMode("on"); - } + if (toggleCount >= 18) { + localStorage.setItem("dark-mode", "rainbow") + setMode("rainbow") + } else if (localStorage.getItem("dark-mode") == "on") { + localStorage.setItem("dark-mode", "off") + setMode("off") + } else { + localStorage.setItem("dark-mode", "on") + setMode("on") + } } -document.addEventListener("DOMContentLoaded", function() { - getElements(); +document.addEventListener("DOMContentLoaded", function () { + getElements() - var currentMode = localStorage.getItem("dark-mode"); - if (currentMode === "on" || currentMode === "off" || currentMode === "rainbow") { - setMode(currentMode); - } else if (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) { - setMode("on"); - } else { - setMode("off"); + var currentMode = localStorage.getItem("dark-mode") + if (currentMode === "on" || currentMode === "off" || currentMode === "rainbow") { + setMode(currentMode) + } else if (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) { + setMode("on") + } else { + setMode("off") + } + + var darkModeToggle = document.getElementById("dark-mode-toggle"); + if (darkModeToggle !== null) { + darkModeToggle.addEventListener("click", function (event) { + event.preventDefault(); + toggleDarkMode(); + }); } - - document.getElementById("dark-mode-toggle").addEventListener("click", function(event) { - event.preventDefault(); - toggleDarkMode(); - }); -}); +}) diff --git a/src/main/resources/static/js/githubVersion.js b/src/main/resources/static/js/githubVersion.js index 35433f769..0fddc3ef2 100644 --- a/src/main/resources/static/js/githubVersion.js +++ b/src/main/resources/static/js/githubVersion.js @@ -16,26 +16,40 @@ function compareVersions(version1, version2) { return 0; } -async function getLatestReleaseVersion() { - const url = "https://api.github.com/repos/Frooodle/Stirling-PDF/releases/latest"; - const response = await fetch(url); - const data = await response.json(); - return data.tag_name.substring(1); -} +async function getLatestReleaseVersion() { + const url = "https://api.github.com/repos/Frooodle/Stirling-PDF/releases/latest"; + try { + const response = await fetch(url); + const data = await response.json(); + return data.tag_name ? data.tag_name.substring(1) : ""; + } catch (error) { + console.error("Failed to fetch latest version:", error); + return ""; // Return an empty string if the fetch fails + } +} async function checkForUpdate() { - const latestVersion = await getLatestReleaseVersion(); - console.log("latestVersion=" + latestVersion) - console.log("currentVersion=" + currentVersion) - console.log("compareVersions(latestVersion, currentVersion) > 0)=" + compareVersions(latestVersion, currentVersion)) - if (latestVersion != null && latestVersion != "" && compareVersions(latestVersion, currentVersion) > 0) { - document.getElementById("update-btn").style.display = "block"; - console.log("visible") - } else { - document.getElementById("update-btn").style.display = "none"; - console.log("hidden") + // Initialize the update button as hidden + var updateBtn = document.getElementById("update-btn"); + if (updateBtn !== null) { + updateBtn.style.display = "none"; } + + + const latestVersion = await getLatestReleaseVersion(); + console.log("latestVersion=" + latestVersion) + console.log("currentVersion=" + currentVersion) + console.log("compareVersions(latestVersion, currentVersion) > 0)=" + compareVersions(latestVersion, currentVersion)) + if (latestVersion && compareVersions(latestVersion, currentVersion) > 0) { + document.getElementById("update-btn").style.display = "block"; + console.log("visible") + } else { + console.log("hidden") + } } -checkForUpdate(); \ No newline at end of file + +document.addEventListener('DOMContentLoaded', (event) => { + checkForUpdate(); +}); \ No newline at end of file diff --git a/src/main/resources/static/js/multitool/DragDropManager.js b/src/main/resources/static/js/multitool/DragDropManager.js index 93fbbdf10..887cda71f 100644 --- a/src/main/resources/static/js/multitool/DragDropManager.js +++ b/src/main/resources/static/js/multitool/DragDropManager.js @@ -1,5 +1,3 @@ - - class DragDropManager { dragContainer; wrapper; @@ -47,16 +45,15 @@ class DragDropManager { const img = div.querySelector('img'); div.classList.add('drag-manager_dragging'); const imageSrc = img.src; - + const imgEl = document.createElement('img'); imgEl.classList.add('dragged-img'); imgEl.src = imageSrc; this.draggedImageEl = imgEl; - imgEl.style.left = screenX; - imgEl.style.right = screenY; + imgEl.style.visibility = 'hidden'; imgEl.style.transform = `rotate(${img.style.rotate === '' ? '0deg' : img.style.rotate}) translate(-50%, -50%)`; this.dragContainer.appendChild(imgEl); - + window.addEventListener('mouseup', this.stopDraggingPage) window.addEventListener('mousemove', this.onDragEl) this.wrapper.classList.add('drag-manager_dragging-container'); @@ -66,12 +63,13 @@ class DragDropManager { onDragEl(mouseEvent) { const { clientX, clientY } = mouseEvent; if(this.draggedImageEl) { + this.draggedImageEl.style.visibility = 'visible'; this.draggedImageEl.style.left = `${clientX}px`; - this.draggedImageEl.style.top = `${clientY}px`; + this.draggedImageEl.style.top = `${clientY}px`; } } - + stopDraggingPage() { window.removeEventListener('mousemove', this.onDragEl); this.wrapper.classList.remove('drag-manager_dragging-container'); @@ -103,7 +101,7 @@ class DragDropManager { const onDragStart = () => { this.startDraggingPage(div); } - + const onMouseEnter = () => { if (this.pageDragging) { this.hoveredEl = div; @@ -124,4 +122,4 @@ class DragDropManager { } } -export default DragDropManager; \ No newline at end of file +export default DragDropManager; diff --git a/src/main/resources/static/js/multitool/PdfActionsManager.js b/src/main/resources/static/js/multitool/PdfActionsManager.js index 4bff39e33..3a4fd33de 100644 --- a/src/main/resources/static/js/multitool/PdfActionsManager.js +++ b/src/main/resources/static/js/multitool/PdfActionsManager.js @@ -55,6 +55,17 @@ class PdfActionsManager { deletePageButtonCallback(e) { var imgContainer = this.getPageContainer(e.target); this.pagesContainer.removeChild(imgContainer); + if (this.pagesContainer.childElementCount === 0) { + const filenameInput = document.getElementById('filename-input'); + const filenameParagraph = document.getElementById('filename'); + const downloadBtn = document.getElementById('export-button'); + + filenameInput.disabled = true; + filenameInput.value = ""; + filenameParagraph.innerText = ""; + + downloadBtn.disabled = true; + } }; insertFileButtonCallback(e) { diff --git a/src/main/resources/static/js/multitool/PdfContainer.js b/src/main/resources/static/js/multitool/PdfContainer.js index 45c92be10..4c7c84975 100644 --- a/src/main/resources/static/js/multitool/PdfContainer.js +++ b/src/main/resources/static/js/multitool/PdfContainer.js @@ -3,17 +3,21 @@ class PdfContainer { pagesContainer; pagesContainerWrapper; pdfAdapters; + downloadLink; constructor(id, wrapperId, pdfAdapters) { - this.fileName = null; this.pagesContainer = document.getElementById(id) this.pagesContainerWrapper = document.getElementById(wrapperId); + this.downloadLink = null; this.movePageTo = this.movePageTo.bind(this); this.addPdfs = this.addPdfs.bind(this); this.addPdfsFromFiles = this.addPdfsFromFiles.bind(this); this.rotateElement = this.rotateElement.bind(this); this.rotateAll = this.rotateAll.bind(this); this.exportPdf = this.exportPdf.bind(this); + this.updateFilename = this.updateFilename.bind(this); + this.setDownloadAttribute = this.setDownloadAttribute.bind(this); + this.preventIllegalChars = this.preventIllegalChars.bind(this); this.pdfAdapters = pdfAdapters; @@ -28,6 +32,15 @@ class PdfContainer { window.addPdfs = this.addPdfs; window.exportPdf = this.exportPdf; window.rotateAll = this.rotateAll; + + const filenameInput = document.getElementById('filename-input'); + const downloadBtn = document.getElementById('export-button'); + + filenameInput.onkeyup = this.updateFilename; + filenameInput.onkeydown = this.preventIllegalChars; + filenameInput.disabled = true; + filenameInput.innerText = ""; + downloadBtn.disabled = true; } movePageTo(startElement, endElement, scrollTo = false) { @@ -60,6 +73,29 @@ class PdfContainer { input.setAttribute("accept", "application/pdf"); input.onchange = async(e) => { const files = e.target.files; + if (files.length > 0) { + const filenameInput = document.getElementById('filename-input'); + const pagesContainer = document.getElementById('pages-container'); + const downloadBtn = document.getElementById('export-button'); + + filenameInput.disabled = false; + + if (pagesContainer.childElementCount === 0) { + filenameInput.value = ""; + this.filename = null; + downloadBtn.disabled = true; + } else { + this.filename = filenameInput.value; + } + + if (this.filename === null || this.filename === undefined) { + filenameInput.value = files[0].name; + } else { + filenameInput.value = this.filename; + } + + } + this.addPdfsFromFiles(files, nextSiblingElement); } @@ -192,6 +228,27 @@ class PdfContainer { const url = URL.createObjectURL(pdfBlob); const downloadOption = localStorage.getItem('downloadOption'); + const filenameInput = document.getElementById('filename-input'); + + let inputArr = filenameInput.value.split('.'); + + if (inputArr !== null && inputArr !== undefined && inputArr.length > 0) { + + inputArr = inputArr.filter(n => n); // remove all empty strings, nulls or undefined + + if (inputArr.length > 1) { + inputArr.pop(); // remove right part after last dot + } + + filenameInput.value = inputArr.join(''); + this.filename = filenameInput.value; + } + + if (!filenameInput.value.includes('.pdf')) { + filenameInput.value = filenameInput.value + '.pdf'; + this.filename = filenameInput.value; + } + if (downloadOption === 'sameWindow') { // Open the file in the same window window.location.href = url; @@ -200,12 +257,45 @@ class PdfContainer { window.open(url, '_blank'); } else { // Download the file - const downloadLink = document.createElement('a'); - downloadLink.href = url; - downloadLink.download = this.fileName ? this.fileName : 'managed.pdf'; - downloadLink.click(); + this.downloadLink = document.createElement('a'); + this.downloadLink.id = 'download-link'; + this.downloadLink.href = url; + // downloadLink.download = this.fileName ? this.fileName : 'managed.pdf'; + // downloadLink.download = this.fileName; + this.downloadLink.setAttribute('download', this.filename ? this.fileName : 'managed.pdf'); + this.downloadLink.setAttribute('target', '_blank'); + this.downloadLink.onclick = this.setDownloadAttribute; + this.downloadLink.click(); } } + + setDownloadAttribute() { + this.downloadLink.setAttribute("download", this.filename ? this.filename : 'managed.pdf'); + } + + updateFilename() { + const filenameInput = document.getElementById('filename-input'); + const downloadBtn = document.getElementById('export-button'); + + if (filenameInput.value === "") { + downloadBtn.disabled = true; + return; + } + + downloadBtn.disabled = false; + this.filename = filenameInput.value; + } + + preventIllegalChars(e) { + // const filenameInput = document.getElementById('filename-input'); + // + // filenameInput.value = filenameInput.value.replace('.pdf', ''); + // + // // prevent . + // if (filenameInput.value.includes('.')) { + // filenameInput.value.replace('.',''); + // } + } } export default PdfContainer; diff --git a/src/main/resources/static/pdfjs/cmaps/78-EUC-H.bcmap b/src/main/resources/static/pdfjs/cmaps/78-EUC-H.bcmap new file mode 100644 index 000000000..2655fc70a Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/78-EUC-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/78-EUC-V.bcmap b/src/main/resources/static/pdfjs/cmaps/78-EUC-V.bcmap new file mode 100644 index 000000000..f1ed85382 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/78-EUC-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/78-H.bcmap b/src/main/resources/static/pdfjs/cmaps/78-H.bcmap new file mode 100644 index 000000000..39e89d333 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/78-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/78-RKSJ-H.bcmap b/src/main/resources/static/pdfjs/cmaps/78-RKSJ-H.bcmap new file mode 100644 index 000000000..e4167cb51 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/78-RKSJ-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/78-RKSJ-V.bcmap b/src/main/resources/static/pdfjs/cmaps/78-RKSJ-V.bcmap new file mode 100644 index 000000000..50b1646e9 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/78-RKSJ-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/78-V.bcmap b/src/main/resources/static/pdfjs/cmaps/78-V.bcmap new file mode 100644 index 000000000..d7af99b5e Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/78-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/78ms-RKSJ-H.bcmap b/src/main/resources/static/pdfjs/cmaps/78ms-RKSJ-H.bcmap new file mode 100644 index 000000000..37077d01e Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/78ms-RKSJ-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/78ms-RKSJ-V.bcmap b/src/main/resources/static/pdfjs/cmaps/78ms-RKSJ-V.bcmap new file mode 100644 index 000000000..acf23231a Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/78ms-RKSJ-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/83pv-RKSJ-H.bcmap b/src/main/resources/static/pdfjs/cmaps/83pv-RKSJ-H.bcmap new file mode 100644 index 000000000..2359bc529 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/83pv-RKSJ-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/90ms-RKSJ-H.bcmap b/src/main/resources/static/pdfjs/cmaps/90ms-RKSJ-H.bcmap new file mode 100644 index 000000000..af8293829 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/90ms-RKSJ-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/90ms-RKSJ-V.bcmap b/src/main/resources/static/pdfjs/cmaps/90ms-RKSJ-V.bcmap new file mode 100644 index 000000000..780549de1 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/90ms-RKSJ-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/90msp-RKSJ-H.bcmap b/src/main/resources/static/pdfjs/cmaps/90msp-RKSJ-H.bcmap new file mode 100644 index 000000000..bfd3119c6 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/90msp-RKSJ-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/90msp-RKSJ-V.bcmap b/src/main/resources/static/pdfjs/cmaps/90msp-RKSJ-V.bcmap new file mode 100644 index 000000000..25ef14ab4 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/90msp-RKSJ-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/90pv-RKSJ-H.bcmap b/src/main/resources/static/pdfjs/cmaps/90pv-RKSJ-H.bcmap new file mode 100644 index 000000000..02f713bb8 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/90pv-RKSJ-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/90pv-RKSJ-V.bcmap b/src/main/resources/static/pdfjs/cmaps/90pv-RKSJ-V.bcmap new file mode 100644 index 000000000..d08e0cc5d Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/90pv-RKSJ-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Add-H.bcmap b/src/main/resources/static/pdfjs/cmaps/Add-H.bcmap new file mode 100644 index 000000000..59442acaf Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Add-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Add-RKSJ-H.bcmap b/src/main/resources/static/pdfjs/cmaps/Add-RKSJ-H.bcmap new file mode 100644 index 000000000..a3065e441 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Add-RKSJ-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Add-RKSJ-V.bcmap b/src/main/resources/static/pdfjs/cmaps/Add-RKSJ-V.bcmap new file mode 100644 index 000000000..040014cfc Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Add-RKSJ-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Add-V.bcmap b/src/main/resources/static/pdfjs/cmaps/Add-V.bcmap new file mode 100644 index 000000000..2f816d320 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Add-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-0.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-0.bcmap new file mode 100644 index 000000000..88ec04af4 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-0.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-1.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-1.bcmap new file mode 100644 index 000000000..03a501477 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-1.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-2.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-2.bcmap new file mode 100644 index 000000000..2aa95141f Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-2.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-3.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-3.bcmap new file mode 100644 index 000000000..86d8b8c79 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-3.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-4.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-4.bcmap new file mode 100644 index 000000000..f50fc6c14 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-4.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-5.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-5.bcmap new file mode 100644 index 000000000..6caf4a831 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-5.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-6.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-6.bcmap new file mode 100644 index 000000000..b77fb0705 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-6.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap new file mode 100644 index 000000000..69d79a2c2 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-0.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-0.bcmap new file mode 100644 index 000000000..36101083f Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-0.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-1.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-1.bcmap new file mode 100644 index 000000000..707bb1065 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-1.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-2.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-2.bcmap new file mode 100644 index 000000000..f7648cc3f Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-2.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-3.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-3.bcmap new file mode 100644 index 000000000..852145890 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-3.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-4.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-4.bcmap new file mode 100644 index 000000000..e40c63ab1 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-4.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-5.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-5.bcmap new file mode 100644 index 000000000..d7623b500 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-5.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap new file mode 100644 index 000000000..758652593 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-0.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-0.bcmap new file mode 100644 index 000000000..f0e94ec19 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-0.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-1.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-1.bcmap new file mode 100644 index 000000000..dad42c5ad Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-1.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-2.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-2.bcmap new file mode 100644 index 000000000..090819a06 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-2.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-3.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-3.bcmap new file mode 100644 index 000000000..087dfc155 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-3.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-4.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-4.bcmap new file mode 100644 index 000000000..46aa9bffe Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-4.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-5.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-5.bcmap new file mode 100644 index 000000000..5b4b65cc6 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-5.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-6.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-6.bcmap new file mode 100644 index 000000000..e77d699ab Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-6.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap new file mode 100644 index 000000000..128a14107 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-Korea1-0.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-Korea1-0.bcmap new file mode 100644 index 000000000..cef1a9985 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-Korea1-0.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-Korea1-1.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-Korea1-1.bcmap new file mode 100644 index 000000000..11ffa36df Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-Korea1-1.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-Korea1-2.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-Korea1-2.bcmap new file mode 100644 index 000000000..3172308c7 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-Korea1-2.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap b/src/main/resources/static/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap new file mode 100644 index 000000000..f3371c0cb Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/B5-H.bcmap b/src/main/resources/static/pdfjs/cmaps/B5-H.bcmap new file mode 100644 index 000000000..beb4d2281 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/B5-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/B5-V.bcmap b/src/main/resources/static/pdfjs/cmaps/B5-V.bcmap new file mode 100644 index 000000000..2d4f87d50 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/B5-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/B5pc-H.bcmap b/src/main/resources/static/pdfjs/cmaps/B5pc-H.bcmap new file mode 100644 index 000000000..ce0013167 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/B5pc-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/B5pc-V.bcmap b/src/main/resources/static/pdfjs/cmaps/B5pc-V.bcmap new file mode 100644 index 000000000..73b99ff2f Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/B5pc-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/CNS-EUC-H.bcmap b/src/main/resources/static/pdfjs/cmaps/CNS-EUC-H.bcmap new file mode 100644 index 000000000..61d1d0cb0 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/CNS-EUC-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/CNS-EUC-V.bcmap b/src/main/resources/static/pdfjs/cmaps/CNS-EUC-V.bcmap new file mode 100644 index 000000000..1a393a51e Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/CNS-EUC-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/CNS1-H.bcmap b/src/main/resources/static/pdfjs/cmaps/CNS1-H.bcmap new file mode 100644 index 000000000..f738e218a Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/CNS1-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/CNS1-V.bcmap b/src/main/resources/static/pdfjs/cmaps/CNS1-V.bcmap new file mode 100644 index 000000000..9c3169f0d Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/CNS1-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/CNS2-H.bcmap b/src/main/resources/static/pdfjs/cmaps/CNS2-H.bcmap new file mode 100644 index 000000000..c89b3527f Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/CNS2-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/CNS2-V.bcmap b/src/main/resources/static/pdfjs/cmaps/CNS2-V.bcmap new file mode 100644 index 000000000..7588cec83 --- /dev/null +++ b/src/main/resources/static/pdfjs/cmaps/CNS2-V.bcmap @@ -0,0 +1,3 @@ +RCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSECNS2-H \ No newline at end of file diff --git a/src/main/resources/static/pdfjs/cmaps/ETHK-B5-H.bcmap b/src/main/resources/static/pdfjs/cmaps/ETHK-B5-H.bcmap new file mode 100644 index 000000000..cb29415de Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/ETHK-B5-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/ETHK-B5-V.bcmap b/src/main/resources/static/pdfjs/cmaps/ETHK-B5-V.bcmap new file mode 100644 index 000000000..f09aec631 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/ETHK-B5-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/ETen-B5-H.bcmap b/src/main/resources/static/pdfjs/cmaps/ETen-B5-H.bcmap new file mode 100644 index 000000000..c2d77462d Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/ETen-B5-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/ETen-B5-V.bcmap b/src/main/resources/static/pdfjs/cmaps/ETen-B5-V.bcmap new file mode 100644 index 000000000..89bff159e Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/ETen-B5-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/ETenms-B5-H.bcmap b/src/main/resources/static/pdfjs/cmaps/ETenms-B5-H.bcmap new file mode 100644 index 000000000..a7d69db5e --- /dev/null +++ b/src/main/resources/static/pdfjs/cmaps/ETenms-B5-H.bcmap @@ -0,0 +1,3 @@ +RCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSE ETen-B5-H` ^ \ No newline at end of file diff --git a/src/main/resources/static/pdfjs/cmaps/ETenms-B5-V.bcmap b/src/main/resources/static/pdfjs/cmaps/ETenms-B5-V.bcmap new file mode 100644 index 000000000..adc5d618d Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/ETenms-B5-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/EUC-H.bcmap b/src/main/resources/static/pdfjs/cmaps/EUC-H.bcmap new file mode 100644 index 000000000..e92ea5b3b Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/EUC-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/EUC-V.bcmap b/src/main/resources/static/pdfjs/cmaps/EUC-V.bcmap new file mode 100644 index 000000000..7a7c18322 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/EUC-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Ext-H.bcmap b/src/main/resources/static/pdfjs/cmaps/Ext-H.bcmap new file mode 100644 index 000000000..3b5cde44d Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Ext-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Ext-RKSJ-H.bcmap b/src/main/resources/static/pdfjs/cmaps/Ext-RKSJ-H.bcmap new file mode 100644 index 000000000..ea4d2d97b Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Ext-RKSJ-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Ext-RKSJ-V.bcmap b/src/main/resources/static/pdfjs/cmaps/Ext-RKSJ-V.bcmap new file mode 100644 index 000000000..3457c2770 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Ext-RKSJ-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Ext-V.bcmap b/src/main/resources/static/pdfjs/cmaps/Ext-V.bcmap new file mode 100644 index 000000000..4999ca404 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Ext-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GB-EUC-H.bcmap b/src/main/resources/static/pdfjs/cmaps/GB-EUC-H.bcmap new file mode 100644 index 000000000..e39908b98 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GB-EUC-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GB-EUC-V.bcmap b/src/main/resources/static/pdfjs/cmaps/GB-EUC-V.bcmap new file mode 100644 index 000000000..d5be5446a Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GB-EUC-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GB-H.bcmap b/src/main/resources/static/pdfjs/cmaps/GB-H.bcmap new file mode 100644 index 000000000..39189c54e --- /dev/null +++ b/src/main/resources/static/pdfjs/cmaps/GB-H.bcmap @@ -0,0 +1,4 @@ +RCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSE!!]aX!!]`21> p z$]"Rd-U7* 4%+ Z {/%<9Kb1]." `],"] +"]h"]F"]$"]"]`"]>"]"]z"]X"]6"]"]r"]P"]."] "]j"]H"]&"]"]b"]@"]"]|"]Z"]8"]"]t"]R"]0"]"]l"]J"]("]"]d"]B"] "X~']W"]5"]"]q"]O"]-"] "]i"]G"]%"]"]a"]?"]"]{"]Y"]7"]"]s"]Q"]/"] "]k"]I"]'"]"]c"]A"]"]}"]["]9 \ No newline at end of file diff --git a/src/main/resources/static/pdfjs/cmaps/GB-V.bcmap b/src/main/resources/static/pdfjs/cmaps/GB-V.bcmap new file mode 100644 index 000000000..310834512 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GB-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBK-EUC-H.bcmap b/src/main/resources/static/pdfjs/cmaps/GBK-EUC-H.bcmap new file mode 100644 index 000000000..05fff7e82 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBK-EUC-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBK-EUC-V.bcmap b/src/main/resources/static/pdfjs/cmaps/GBK-EUC-V.bcmap new file mode 100644 index 000000000..0cdf6bed6 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBK-EUC-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBK2K-H.bcmap b/src/main/resources/static/pdfjs/cmaps/GBK2K-H.bcmap new file mode 100644 index 000000000..46f6ba596 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBK2K-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBK2K-V.bcmap b/src/main/resources/static/pdfjs/cmaps/GBK2K-V.bcmap new file mode 100644 index 000000000..d9a947984 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBK2K-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBKp-EUC-H.bcmap b/src/main/resources/static/pdfjs/cmaps/GBKp-EUC-H.bcmap new file mode 100644 index 000000000..5cb0af687 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBKp-EUC-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBKp-EUC-V.bcmap b/src/main/resources/static/pdfjs/cmaps/GBKp-EUC-V.bcmap new file mode 100644 index 000000000..bca93b8ef Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBKp-EUC-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBT-EUC-H.bcmap b/src/main/resources/static/pdfjs/cmaps/GBT-EUC-H.bcmap new file mode 100644 index 000000000..4b4e2d322 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBT-EUC-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBT-EUC-V.bcmap b/src/main/resources/static/pdfjs/cmaps/GBT-EUC-V.bcmap new file mode 100644 index 000000000..38f706699 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBT-EUC-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBT-H.bcmap b/src/main/resources/static/pdfjs/cmaps/GBT-H.bcmap new file mode 100644 index 000000000..8437ac337 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBT-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBT-V.bcmap b/src/main/resources/static/pdfjs/cmaps/GBT-V.bcmap new file mode 100644 index 000000000..697ab4a8e Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBT-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBTpc-EUC-H.bcmap b/src/main/resources/static/pdfjs/cmaps/GBTpc-EUC-H.bcmap new file mode 100644 index 000000000..f6e50e893 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBTpc-EUC-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBTpc-EUC-V.bcmap b/src/main/resources/static/pdfjs/cmaps/GBTpc-EUC-V.bcmap new file mode 100644 index 000000000..6c0d71a2d Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBTpc-EUC-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBpc-EUC-H.bcmap b/src/main/resources/static/pdfjs/cmaps/GBpc-EUC-H.bcmap new file mode 100644 index 000000000..c9edf67cf Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBpc-EUC-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/GBpc-EUC-V.bcmap b/src/main/resources/static/pdfjs/cmaps/GBpc-EUC-V.bcmap new file mode 100644 index 000000000..31450c97f Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/GBpc-EUC-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/H.bcmap b/src/main/resources/static/pdfjs/cmaps/H.bcmap new file mode 100644 index 000000000..7b24ea462 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/HKdla-B5-H.bcmap b/src/main/resources/static/pdfjs/cmaps/HKdla-B5-H.bcmap new file mode 100644 index 000000000..7d30c0500 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/HKdla-B5-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/HKdla-B5-V.bcmap b/src/main/resources/static/pdfjs/cmaps/HKdla-B5-V.bcmap new file mode 100644 index 000000000..78946940d Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/HKdla-B5-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/HKdlb-B5-H.bcmap b/src/main/resources/static/pdfjs/cmaps/HKdlb-B5-H.bcmap new file mode 100644 index 000000000..d829a2310 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/HKdlb-B5-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/HKdlb-B5-V.bcmap b/src/main/resources/static/pdfjs/cmaps/HKdlb-B5-V.bcmap new file mode 100644 index 000000000..2b572b50a Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/HKdlb-B5-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/HKgccs-B5-H.bcmap b/src/main/resources/static/pdfjs/cmaps/HKgccs-B5-H.bcmap new file mode 100644 index 000000000..971a4f23f Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/HKgccs-B5-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/HKgccs-B5-V.bcmap b/src/main/resources/static/pdfjs/cmaps/HKgccs-B5-V.bcmap new file mode 100644 index 000000000..d353ca256 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/HKgccs-B5-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/HKm314-B5-H.bcmap b/src/main/resources/static/pdfjs/cmaps/HKm314-B5-H.bcmap new file mode 100644 index 000000000..576dc0111 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/HKm314-B5-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/HKm314-B5-V.bcmap b/src/main/resources/static/pdfjs/cmaps/HKm314-B5-V.bcmap new file mode 100644 index 000000000..0e96d0e22 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/HKm314-B5-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/HKm471-B5-H.bcmap b/src/main/resources/static/pdfjs/cmaps/HKm471-B5-H.bcmap new file mode 100644 index 000000000..11d170c75 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/HKm471-B5-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/HKm471-B5-V.bcmap b/src/main/resources/static/pdfjs/cmaps/HKm471-B5-V.bcmap new file mode 100644 index 000000000..54959bf9e Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/HKm471-B5-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/HKscs-B5-H.bcmap b/src/main/resources/static/pdfjs/cmaps/HKscs-B5-H.bcmap new file mode 100644 index 000000000..6ef7857ad Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/HKscs-B5-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/HKscs-B5-V.bcmap b/src/main/resources/static/pdfjs/cmaps/HKscs-B5-V.bcmap new file mode 100644 index 000000000..1fb2fa2a2 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/HKscs-B5-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Hankaku.bcmap b/src/main/resources/static/pdfjs/cmaps/Hankaku.bcmap new file mode 100644 index 000000000..4b8ec7fce Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Hankaku.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Hiragana.bcmap b/src/main/resources/static/pdfjs/cmaps/Hiragana.bcmap new file mode 100644 index 000000000..17e983e77 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Hiragana.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/KSC-EUC-H.bcmap b/src/main/resources/static/pdfjs/cmaps/KSC-EUC-H.bcmap new file mode 100644 index 000000000..a45c65f00 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/KSC-EUC-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/KSC-EUC-V.bcmap b/src/main/resources/static/pdfjs/cmaps/KSC-EUC-V.bcmap new file mode 100644 index 000000000..0e7b21f0a Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/KSC-EUC-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/KSC-H.bcmap b/src/main/resources/static/pdfjs/cmaps/KSC-H.bcmap new file mode 100644 index 000000000..b9b22b678 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/KSC-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/KSC-Johab-H.bcmap b/src/main/resources/static/pdfjs/cmaps/KSC-Johab-H.bcmap new file mode 100644 index 000000000..2531ffcf4 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/KSC-Johab-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/KSC-Johab-V.bcmap b/src/main/resources/static/pdfjs/cmaps/KSC-Johab-V.bcmap new file mode 100644 index 000000000..367ceb226 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/KSC-Johab-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/KSC-V.bcmap b/src/main/resources/static/pdfjs/cmaps/KSC-V.bcmap new file mode 100644 index 000000000..6ae2f0b6b Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/KSC-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/KSCms-UHC-H.bcmap b/src/main/resources/static/pdfjs/cmaps/KSCms-UHC-H.bcmap new file mode 100644 index 000000000..a8d4240e6 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/KSCms-UHC-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap b/src/main/resources/static/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap new file mode 100644 index 000000000..8b4ae18fd Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap b/src/main/resources/static/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap new file mode 100644 index 000000000..b655dbcfb Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/KSCms-UHC-V.bcmap b/src/main/resources/static/pdfjs/cmaps/KSCms-UHC-V.bcmap new file mode 100644 index 000000000..21f97f65b Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/KSCms-UHC-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/KSCpc-EUC-H.bcmap b/src/main/resources/static/pdfjs/cmaps/KSCpc-EUC-H.bcmap new file mode 100644 index 000000000..e06f361eb Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/KSCpc-EUC-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/KSCpc-EUC-V.bcmap b/src/main/resources/static/pdfjs/cmaps/KSCpc-EUC-V.bcmap new file mode 100644 index 000000000..f3c9113fc Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/KSCpc-EUC-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Katakana.bcmap b/src/main/resources/static/pdfjs/cmaps/Katakana.bcmap new file mode 100644 index 000000000..524303c4f Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Katakana.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/LICENSE b/src/main/resources/static/pdfjs/cmaps/LICENSE new file mode 100644 index 000000000..b1ad168ad --- /dev/null +++ b/src/main/resources/static/pdfjs/cmaps/LICENSE @@ -0,0 +1,36 @@ +%%Copyright: ----------------------------------------------------------- +%%Copyright: Copyright 1990-2009 Adobe Systems Incorporated. +%%Copyright: All rights reserved. +%%Copyright: +%%Copyright: Redistribution and use in source and binary forms, with or +%%Copyright: without modification, are permitted provided that the +%%Copyright: following conditions are met: +%%Copyright: +%%Copyright: Redistributions of source code must retain the above +%%Copyright: copyright notice, this list of conditions and the following +%%Copyright: disclaimer. +%%Copyright: +%%Copyright: Redistributions in binary form must reproduce the above +%%Copyright: copyright notice, this list of conditions and the following +%%Copyright: disclaimer in the documentation and/or other materials +%%Copyright: provided with the distribution. +%%Copyright: +%%Copyright: Neither the name of Adobe Systems Incorporated nor the names +%%Copyright: of its contributors may be used to endorse or promote +%%Copyright: products derived from this software without specific prior +%%Copyright: written permission. +%%Copyright: +%%Copyright: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +%%Copyright: CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +%%Copyright: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +%%Copyright: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +%%Copyright: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +%%Copyright: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +%%Copyright: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +%%Copyright: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +%%Copyright: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +%%Copyright: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%%Copyright: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +%%Copyright: OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +%%Copyright: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +%%Copyright: ----------------------------------------------------------- diff --git a/src/main/resources/static/pdfjs/cmaps/NWP-H.bcmap b/src/main/resources/static/pdfjs/cmaps/NWP-H.bcmap new file mode 100644 index 000000000..afc5e4b05 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/NWP-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/NWP-V.bcmap b/src/main/resources/static/pdfjs/cmaps/NWP-V.bcmap new file mode 100644 index 000000000..bb5785e32 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/NWP-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/RKSJ-H.bcmap b/src/main/resources/static/pdfjs/cmaps/RKSJ-H.bcmap new file mode 100644 index 000000000..fb8d298e9 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/RKSJ-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/RKSJ-V.bcmap b/src/main/resources/static/pdfjs/cmaps/RKSJ-V.bcmap new file mode 100644 index 000000000..a2555a6c0 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/RKSJ-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/Roman.bcmap b/src/main/resources/static/pdfjs/cmaps/Roman.bcmap new file mode 100644 index 000000000..f896dcf1c Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/Roman.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniCNS-UCS2-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniCNS-UCS2-H.bcmap new file mode 100644 index 000000000..d5db27c5c Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniCNS-UCS2-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniCNS-UCS2-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniCNS-UCS2-V.bcmap new file mode 100644 index 000000000..1dc9b7a21 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniCNS-UCS2-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF16-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF16-H.bcmap new file mode 100644 index 000000000..961afefb6 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF16-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF16-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF16-V.bcmap new file mode 100644 index 000000000..df0cffe86 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF16-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF32-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF32-H.bcmap new file mode 100644 index 000000000..1ab18a143 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF32-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF32-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF32-V.bcmap new file mode 100644 index 000000000..ad14662e2 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF32-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF8-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF8-H.bcmap new file mode 100644 index 000000000..83c6bd7c4 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF8-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF8-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF8-V.bcmap new file mode 100644 index 000000000..22a27e4dd Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniCNS-UTF8-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniGB-UCS2-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniGB-UCS2-H.bcmap new file mode 100644 index 000000000..5bd6228ce Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniGB-UCS2-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniGB-UCS2-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniGB-UCS2-V.bcmap new file mode 100644 index 000000000..53c534b7f Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniGB-UCS2-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniGB-UTF16-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniGB-UTF16-H.bcmap new file mode 100644 index 000000000..b95045b40 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniGB-UTF16-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniGB-UTF16-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniGB-UTF16-V.bcmap new file mode 100644 index 000000000..51f023e0d Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniGB-UTF16-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniGB-UTF32-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniGB-UTF32-H.bcmap new file mode 100644 index 000000000..f0dbd14f3 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniGB-UTF32-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniGB-UTF32-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniGB-UTF32-V.bcmap new file mode 100644 index 000000000..ce9c30a98 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniGB-UTF32-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniGB-UTF8-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniGB-UTF8-H.bcmap new file mode 100644 index 000000000..982ca462b Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniGB-UTF8-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniGB-UTF8-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniGB-UTF8-V.bcmap new file mode 100644 index 000000000..f78020dd4 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniGB-UTF8-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS-UCS2-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS-UCS2-H.bcmap new file mode 100644 index 000000000..7daf56afa Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS-UCS2-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap new file mode 100644 index 000000000..ac9975c58 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap new file mode 100644 index 000000000..3da0a1c62 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS-UCS2-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS-UCS2-V.bcmap new file mode 100644 index 000000000..c50b9ddfd Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS-UCS2-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF16-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF16-H.bcmap new file mode 100644 index 000000000..676134463 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF16-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF16-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF16-V.bcmap new file mode 100644 index 000000000..70bf90c0e Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF16-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF32-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF32-H.bcmap new file mode 100644 index 000000000..7a83d53ae Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF32-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF32-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF32-V.bcmap new file mode 100644 index 000000000..7a8713539 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF32-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF8-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF8-H.bcmap new file mode 100644 index 000000000..9f0334cac Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF8-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF8-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF8-V.bcmap new file mode 100644 index 000000000..808a94f0f Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS-UTF8-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap new file mode 100644 index 000000000..d768bf811 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap new file mode 100644 index 000000000..3d5bf6fb4 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap new file mode 100644 index 000000000..09eee10d4 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap new file mode 100644 index 000000000..6c5460013 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap new file mode 100644 index 000000000..1b1a64f50 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap new file mode 100644 index 000000000..994aa9ef9 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap new file mode 100644 index 000000000..643f921b6 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap new file mode 100644 index 000000000..c148f67f5 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap new file mode 100644 index 000000000..1849d809a Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap new file mode 100644 index 000000000..a83a677c5 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap new file mode 100644 index 000000000..f527248ad Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap new file mode 100644 index 000000000..e1a988dc9 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap new file mode 100644 index 000000000..47e054a96 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniKS-UCS2-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniKS-UCS2-H.bcmap new file mode 100644 index 000000000..b5b94852a Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniKS-UCS2-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniKS-UCS2-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniKS-UCS2-V.bcmap new file mode 100644 index 000000000..026adcaad Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniKS-UCS2-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniKS-UTF16-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniKS-UTF16-H.bcmap new file mode 100644 index 000000000..fd4e66e81 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniKS-UTF16-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniKS-UTF16-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniKS-UTF16-V.bcmap new file mode 100644 index 000000000..075efb705 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniKS-UTF16-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniKS-UTF32-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniKS-UTF32-H.bcmap new file mode 100644 index 000000000..769d2142c Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniKS-UTF32-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniKS-UTF32-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniKS-UTF32-V.bcmap new file mode 100644 index 000000000..bdab208b6 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniKS-UTF32-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniKS-UTF8-H.bcmap b/src/main/resources/static/pdfjs/cmaps/UniKS-UTF8-H.bcmap new file mode 100644 index 000000000..6ff8674af Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniKS-UTF8-H.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/UniKS-UTF8-V.bcmap b/src/main/resources/static/pdfjs/cmaps/UniKS-UTF8-V.bcmap new file mode 100644 index 000000000..8dfa76a58 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/UniKS-UTF8-V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/V.bcmap b/src/main/resources/static/pdfjs/cmaps/V.bcmap new file mode 100644 index 000000000..fdec99066 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/V.bcmap differ diff --git a/src/main/resources/static/pdfjs/cmaps/WP-Symbol.bcmap b/src/main/resources/static/pdfjs/cmaps/WP-Symbol.bcmap new file mode 100644 index 000000000..46729bbf3 Binary files /dev/null and b/src/main/resources/static/pdfjs/cmaps/WP-Symbol.bcmap differ diff --git a/src/main/resources/static/pdfjs/css/viewer.css b/src/main/resources/static/pdfjs/css/viewer.css new file mode 100644 index 000000000..14a8aff0e --- /dev/null +++ b/src/main/resources/static/pdfjs/css/viewer.css @@ -0,0 +1,3603 @@ +/* Copyright 2014 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +:root { + --highlight-bg-color: rgba(180, 0, 170, 1); + --highlight-selected-bg-color: rgba(0, 100, 0, 1); +} + +@media screen and (forced-colors: active) { + :root { + --highlight-bg-color: Highlight; + --highlight-selected-bg-color: ButtonText; + } +} + +.textLayer { + position: absolute; + text-align: initial; + inset: 0; + overflow: hidden; + opacity: 0.25; + line-height: 1; + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; + text-size-adjust: none; + forced-color-adjust: none; + transform-origin: 0 0; + z-index: 2; +} + +.textLayer :is(span, br) { + color: transparent; + position: absolute; + white-space: pre; + cursor: text; + transform-origin: 0% 0%; +} + +/* Only necessary in Google Chrome, see issue 14205, and most unfortunately + * the problem doesn't show up in "text" reference tests. */ +.textLayer span.markedContent { + top: 0; + height: 0; +} + +.textLayer .highlight { + margin: -1px; + padding: 1px; + background-color: var(--highlight-bg-color); + border-radius: 4px; +} + +.textLayer .highlight.appended { + position: initial; +} + +.textLayer .highlight.begin { + border-radius: 4px 0 0 4px; +} + +.textLayer .highlight.end { + border-radius: 0 4px 4px 0; +} + +.textLayer .highlight.middle { + border-radius: 0; +} + +.textLayer .highlight.selected { + background-color: var(--highlight-selected-bg-color); +} + +.textLayer ::-moz-selection { + background: blue; + background: AccentColor; /* stylelint-disable-line declaration-block-no-duplicate-properties */ +} + +.textLayer ::selection { + background: blue; + background: AccentColor; /* stylelint-disable-line declaration-block-no-duplicate-properties */ +} + +/* Avoids https://github.com/mozilla/pdf.js/issues/13840 in Chrome */ +.textLayer br::-moz-selection { + background: transparent; +} + +.textLayer br::selection { + background: transparent; +} + +.textLayer .endOfContent { + display: block; + position: absolute; + inset: 100% 0 0; + z-index: -1; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.textLayer .endOfContent.active { + top: 0; +} + + +:root { + --annotation-unfocused-field-background: url("data:image/svg+xml;charset=UTF-8,"); + --input-focus-border-color: Highlight; + --input-focus-outline: 1px solid Canvas; + --input-unfocused-border-color: transparent; + --input-disabled-border-color: transparent; + --input-hover-border-color: black; + --link-outline: none; +} + +@media screen and (forced-colors: active) { + :root { + --input-focus-border-color: CanvasText; + --input-unfocused-border-color: ActiveText; + --input-disabled-border-color: GrayText; + --input-hover-border-color: Highlight; + --link-outline: 1.5px solid LinkText; + --hcm-highligh-filter: invert(100%); + } + + .annotationLayer .textWidgetAnnotation :is(input, textarea):required, + .annotationLayer .choiceWidgetAnnotation select:required, + .annotationLayer + .buttonWidgetAnnotation:is(.checkBox, .radioButton) + input:required { + outline: 1.5px solid selectedItem; + } + + .annotationLayer .linkAnnotation:hover { + -webkit-backdrop-filter: var(--hcm-highligh-filter); + backdrop-filter: var(--hcm-highligh-filter); + } + + .annotationLayer .linkAnnotation > a:hover { + opacity: 0 !important; + background: none !important; + box-shadow: none; + } + + .annotationLayer .popupAnnotation .popup { + outline: calc(1.5px * var(--scale-factor)) solid CanvasText !important; + background-color: ButtonFace !important; + color: ButtonText !important; + } + + .annotationLayer .highlightArea:hover::after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + -webkit-backdrop-filter: var(--hcm-highligh-filter); + backdrop-filter: var(--hcm-highligh-filter); + content: ""; + pointer-events: none; + } + + .annotationLayer .popupAnnotation.focused .popup { + outline: calc(3px * var(--scale-factor)) solid Highlight !important; + } +} + +.annotationLayer { + position: absolute; + top: 0; + left: 0; + pointer-events: none; + transform-origin: 0 0; + z-index: 3; +} + +.annotationLayer[data-main-rotation="90"] .norotate { + transform: rotate(270deg) translateX(-100%); +} + +.annotationLayer[data-main-rotation="180"] .norotate { + transform: rotate(180deg) translate(-100%, -100%); +} + +.annotationLayer[data-main-rotation="270"] .norotate { + transform: rotate(90deg) translateY(-100%); +} + +.annotationLayer canvas { + position: absolute; + width: 100%; + height: 100%; + pointer-events: none; +} + +.annotationLayer section { + position: absolute; + text-align: initial; + pointer-events: auto; + box-sizing: border-box; + transform-origin: 0 0; +} + +.annotationLayer .linkAnnotation { + outline: var(--link-outline); +} + +.annotationLayer :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton) > a { + position: absolute; + font-size: 1em; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.annotationLayer +:is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder) +> a:hover { + opacity: 0.2; + background-color: rgba(255, 255, 0, 1); + box-shadow: 0 2px 10px rgba(255, 255, 0, 1); +} + +.annotationLayer .linkAnnotation.hasBorder:hover { + background-color: rgba(255, 255, 0, 0.2); +} + +.annotationLayer .hasBorder { + background-size: 100% 100%; +} + +.annotationLayer .textAnnotation img { + position: absolute; + cursor: pointer; + width: 100%; + height: 100%; + top: 0; + left: 0; +} + +.annotationLayer .textWidgetAnnotation :is(input, textarea), +.annotationLayer .choiceWidgetAnnotation select, +.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input { + background-image: var(--annotation-unfocused-field-background); + border: 2px solid var(--input-unfocused-border-color); + box-sizing: border-box; + font: calc(9px * var(--scale-factor)) sans-serif; + height: 100%; + margin: 0; + vertical-align: top; + width: 100%; +} + +.annotationLayer .textWidgetAnnotation :is(input, textarea):required, +.annotationLayer .choiceWidgetAnnotation select:required, +.annotationLayer +.buttonWidgetAnnotation:is(.checkBox, .radioButton) +input:required { + outline: 1.5px solid red; +} + +.annotationLayer .choiceWidgetAnnotation select option { + padding: 0; +} + +.annotationLayer .buttonWidgetAnnotation.radioButton input { + border-radius: 50%; +} + +.annotationLayer .textWidgetAnnotation textarea { + resize: none; +} + +.annotationLayer .textWidgetAnnotation :is(input, textarea)[disabled], +.annotationLayer .choiceWidgetAnnotation select[disabled], +.annotationLayer +.buttonWidgetAnnotation:is(.checkBox, .radioButton) +input[disabled] { + background: none; + border: 2px solid var(--input-disabled-border-color); + cursor: not-allowed; +} + +.annotationLayer .textWidgetAnnotation :is(input, textarea):hover, +.annotationLayer .choiceWidgetAnnotation select:hover, +.annotationLayer +.buttonWidgetAnnotation:is(.checkBox, .radioButton) +input:hover { + border: 2px solid var(--input-hover-border-color); +} + +.annotationLayer .textWidgetAnnotation :is(input, textarea):hover, +.annotationLayer .choiceWidgetAnnotation select:hover, +.annotationLayer .buttonWidgetAnnotation.checkBox input:hover { + border-radius: 2px; +} + +.annotationLayer .textWidgetAnnotation :is(input, textarea):focus, +.annotationLayer .choiceWidgetAnnotation select:focus { + background: none; + border: 2px solid var(--input-focus-border-color); + border-radius: 2px; + outline: var(--input-focus-outline); +} + +.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) :focus { + background-image: none; + background-color: transparent; +} + +.annotationLayer .buttonWidgetAnnotation.checkBox :focus { + border: 2px solid var(--input-focus-border-color); + border-radius: 2px; + outline: var(--input-focus-outline); +} + +.annotationLayer .buttonWidgetAnnotation.radioButton :focus { + border: 2px solid var(--input-focus-border-color); + outline: var(--input-focus-outline); +} + +.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::before, +.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::after, +.annotationLayer .buttonWidgetAnnotation.radioButton input:checked::before { + background-color: CanvasText; + content: ""; + display: block; + position: absolute; +} + +.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::before, +.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::after { + height: 80%; + left: 45%; + width: 1px; +} + +.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::before { + transform: rotate(45deg); +} + +.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::after { + transform: rotate(-45deg); +} + +.annotationLayer .buttonWidgetAnnotation.radioButton input:checked::before { + border-radius: 50%; + height: 50%; + left: 30%; + top: 20%; + width: 50%; +} + +.annotationLayer .textWidgetAnnotation input.comb { + font-family: monospace; + padding-left: 2px; + padding-right: 0; +} + +.annotationLayer .textWidgetAnnotation input.comb:focus { + /* + * Letter spacing is placed on the right side of each character. Hence, the + * letter spacing of the last character may be placed outside the visible + * area, causing horizontal scrolling. We avoid this by extending the width + * when the element has focus and revert this when it loses focus. + */ + width: 103%; +} + +.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.annotationLayer .fileAttachmentAnnotation .popupTriggerArea { + height: 100%; + width: 100%; +} + +.annotationLayer .popupAnnotation { + position: absolute; + font-size: calc(9px * var(--scale-factor)); + pointer-events: none; + width: -moz-max-content; + width: max-content; + max-width: 45%; + height: auto; +} + +.annotationLayer .popup { + background-color: rgba(255, 255, 153, 1); + box-shadow: 0 calc(2px * var(--scale-factor)) calc(5px * var(--scale-factor)) rgba(136, 136, 136, 1); + border-radius: calc(2px * var(--scale-factor)); + outline: 1.5px solid rgb(255, 255, 74); + padding: calc(6px * var(--scale-factor)); + cursor: pointer; + font: message-box; + white-space: normal; + word-wrap: break-word; + pointer-events: auto; +} + +.annotationLayer .popupAnnotation.focused .popup { + outline-width: 3px; +} + +.annotationLayer .popup * { + font-size: calc(9px * var(--scale-factor)); +} + +.annotationLayer .popup > .header { + display: inline-block; +} + +.annotationLayer .popup > .header h1 { + display: inline; +} + +.annotationLayer .popup > .header .popupDate { + display: inline-block; + margin-left: calc(5px * var(--scale-factor)); + width: -moz-fit-content; + width: fit-content; +} + +.annotationLayer .popupContent { + border-top: 1px solid rgba(51, 51, 51, 1); + margin-top: calc(2px * var(--scale-factor)); + padding-top: calc(2px * var(--scale-factor)); +} + +.annotationLayer .richText > * { + white-space: pre-wrap; + font-size: calc(9px * var(--scale-factor)); +} + +.annotationLayer .popupTriggerArea { + cursor: pointer; +} + +.annotationLayer section svg { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; +} + +.annotationLayer .annotationTextContent { + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + color: transparent; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + pointer-events: none; +} + +.annotationLayer .annotationTextContent span { + width: 100%; + display: inline-block; +} + +.annotationLayer svg.quadrilateralsContainer { + contain: strict; + width: 0; + height: 0; + position: absolute; + top: 0; + left: 0; + z-index: -1; +} + + +:root { + --xfa-unfocused-field-background: url("data:image/svg+xml;charset=UTF-8,"); + --xfa-focus-outline: auto; +} + +@media screen and (forced-colors: active) { + :root { + --xfa-focus-outline: 2px solid CanvasText; + } + + .xfaLayer *:required { + outline: 1.5px solid selectedItem; + } +} + +.xfaLayer { + background-color: transparent; +} + +.xfaLayer .highlight { + margin: -1px; + padding: 1px; + background-color: rgba(239, 203, 237, 1); + border-radius: 4px; +} + +.xfaLayer .highlight.appended { + position: initial; +} + +.xfaLayer .highlight.begin { + border-radius: 4px 0 0 4px; +} + +.xfaLayer .highlight.end { + border-radius: 0 4px 4px 0; +} + +.xfaLayer .highlight.middle { + border-radius: 0; +} + +.xfaLayer .highlight.selected { + background-color: rgba(203, 223, 203, 1); +} + +.xfaPage { + overflow: hidden; + position: relative; +} + +.xfaContentarea { + position: absolute; +} + +.xfaPrintOnly { + display: none; +} + +.xfaLayer { + position: absolute; + text-align: initial; + top: 0; + left: 0; + transform-origin: 0 0; + line-height: 1.2; +} + +.xfaLayer * { + color: inherit; + font: inherit; + font-style: inherit; + font-weight: inherit; + font-kerning: inherit; + letter-spacing: -0.01px; + text-align: inherit; + text-decoration: inherit; + box-sizing: border-box; + background-color: transparent; + padding: 0; + margin: 0; + pointer-events: auto; + line-height: inherit; +} + +.xfaLayer *:required { + outline: 1.5px solid red; +} + +.xfaLayer div, +.xfaLayer svg, +.xfaLayer svg * { + pointer-events: none; +} + +.xfaLayer a { + color: blue; +} + +.xfaRich li { + margin-left: 3em; +} + +.xfaFont { + color: black; + font-weight: normal; + font-kerning: none; + font-size: 10px; + font-style: normal; + letter-spacing: 0; + text-decoration: none; + vertical-align: 0; +} + +.xfaCaption { + overflow: hidden; + flex: 0 0 auto; +} + +.xfaCaptionForCheckButton { + overflow: hidden; + flex: 1 1 auto; +} + +.xfaLabel { + height: 100%; + width: 100%; +} + +.xfaLeft { + display: flex; + flex-direction: row; + align-items: center; +} + +.xfaRight { + display: flex; + flex-direction: row-reverse; + align-items: center; +} + +:is(.xfaLeft, .xfaRight) > :is(.xfaCaption, .xfaCaptionForCheckButton) { + max-height: 100%; +} + +.xfaTop { + display: flex; + flex-direction: column; + align-items: flex-start; +} + +.xfaBottom { + display: flex; + flex-direction: column-reverse; + align-items: flex-start; +} + +:is(.xfaTop, .xfaBottom) > :is(.xfaCaption, .xfaCaptionForCheckButton) { + width: 100%; +} + +.xfaBorder { + background-color: transparent; + position: absolute; + pointer-events: none; +} + +.xfaWrapped { + width: 100%; + height: 100%; +} + +:is(.xfaTextfield, .xfaSelect):focus { + background-image: none; + background-color: transparent; + outline: var(--xfa-focus-outline); + outline-offset: -1px; +} + +:is(.xfaCheckbox, .xfaRadio):focus { + outline: var(--xfa-focus-outline); +} + +.xfaTextfield, +.xfaSelect { + height: 100%; + width: 100%; + flex: 1 1 auto; + border: none; + resize: none; + background-image: var(--xfa-unfocused-field-background); +} + +.xfaSelect { + padding-inline: 2px; +} + +:is(.xfaTop, .xfaBottom) > :is(.xfaTextfield, .xfaSelect) { + flex: 0 1 auto; +} + +.xfaButton { + cursor: pointer; + width: 100%; + height: 100%; + border: none; + text-align: center; +} + +.xfaLink { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; +} + +.xfaCheckbox, +.xfaRadio { + width: 100%; + height: 100%; + flex: 0 0 auto; + border: none; +} + +.xfaRich { + white-space: pre-wrap; + width: 100%; + height: 100%; +} + +.xfaImage { + -o-object-position: left top; + object-position: left top; + -o-object-fit: contain; + object-fit: contain; + width: 100%; + height: 100%; +} + +.xfaLrTb, +.xfaRlTb, +.xfaTb { + display: flex; + flex-direction: column; + align-items: stretch; +} + +.xfaLr { + display: flex; + flex-direction: row; + align-items: stretch; +} + +.xfaRl { + display: flex; + flex-direction: row-reverse; + align-items: stretch; +} + +.xfaTb > div { + justify-content: left; +} + +.xfaPosition { + position: relative; +} + +.xfaArea { + position: relative; +} + +.xfaValignMiddle { + display: flex; + align-items: center; +} + +.xfaTable { + display: flex; + flex-direction: column; + align-items: stretch; +} + +.xfaTable .xfaRow { + display: flex; + flex-direction: row; + align-items: stretch; +} + +.xfaTable .xfaRlRow { + display: flex; + flex-direction: row-reverse; + align-items: stretch; + flex: 1; +} + +.xfaTable .xfaRlRow > div { + flex: 1; +} + +:is(.xfaNonInteractive, .xfaDisabled, .xfaReadOnly) :is(input, textarea) { + background: initial; +} + +@media print { + .xfaTextfield, + .xfaSelect { + background: transparent; + } + + .xfaSelect { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + text-indent: 1px; + text-overflow: ""; + } +} + +/* Ignored in GECKOVIEW builds: */ + +:root { + --outline-width: 2px; + --outline-color: #0060df; + --outline-around-width: 1px; + --outline-around-color: #f0f0f4; + --hover-outline-around-color: var(--outline-around-color); + --focus-outline: solid var(--outline-width) var(--outline-color); + --unfocus-outline: solid var(--outline-width) transparent; + --focus-outline-around: solid var(--outline-around-width) var(--outline-around-color); + --hover-outline-color: #8f8f9d; + --hover-outline: solid var(--outline-width) var(--hover-outline-color); + --hover-outline-around: solid var(--outline-around-width) var(--hover-outline-around-color); + --freetext-line-height: 1.35; + --freetext-padding: 2px; + --resizer-bg-color: var(--outline-color); + --resizer-size: 6px; + --resizer-shift: calc( + 0px - (var(--outline-width) + var(--resizer-size)) / 2 - + var(--outline-around-width) + ); + --editorFreeText-editing-cursor: text; + --editorInk-editing-cursor: url(../images/cursor-editorInk.svg) 0 16, pointer; + + --alt-text-opacity: 0.8; + --alt-text-add-image: url(../images/altText_add.svg); + --alt-text-done-image: url(../images/altText_done.svg); + --alt-text-bg-color: rgba(43, 42, 51, var(--alt-text-opacity)); + --alt-text-fg-color: #fbfbfe; + --alt-text-border-color: var(--alt-text-bg-color); + --alt-text-hover-bg-color: rgba(82, 82, 94, var(--alt-text-opacity)); + --alt-text-hover-fg-color: var(--alt-text-fg-color); + --alt-text-hover-border-color: var(--alt-text-hover-bg-color); + --alt-text-active-bg-color: rgba(91, 91, 102, var(--alt-text-opacity)); + --alt-text-active-fg-color: var(--alt-text-fg-color); + --alt-text-active-border-color: var(--alt-text-hover-bg-color); + --alt-text-focus-outline-color: #0060df; + --alt-text-focus-border-color: #f0f0f4; + --alt-text-shadow: 0 2px 6px 0 rgba(28, 27, 34, 0.5); +} + +@media (-webkit-min-device-pixel-ratio: 1.1), (min-resolution: 1.1dppx) { + :root { + --editorFreeText-editing-cursor: url(../images/cursor-editorFreeText.svg) 0 16, + text; + } +} + +@media screen and (forced-colors: active) { + :root { + --outline-color: CanvasText; + --outline-around-color: ButtonFace; + --resizer-bg-color: ButtonText; + --hover-outline-color: Highlight; + --hover-outline-around-color: SelectedItemText; + + --alt-text-bg-color: Canvas; + --alt-text-fg-color: ButtonText; + --alt-text-border-color: ButtonText; + --alt-text-hover-bg-color: Canvas; + --alt-text-hover-fg-color: SelectedItem; + --alt-text-hover-border-color: SelectedItem; + --alt-text-active-bg-color: ButtonFace; + --alt-text-active-fg-color: SelectedItem; + --alt-text-active-border-color: ButtonText; + --alt-text-focus-outline-color: CanvasText; + --alt-text-focus-border-color: ButtonText; + --alt-text-shadow: none; + --alt-text-opacity: 1; + } +} + +[data-editor-rotation="90"] { + transform: rotate(90deg); +} + +[data-editor-rotation="180"] { + transform: rotate(180deg); +} + +[data-editor-rotation="270"] { + transform: rotate(270deg); +} + +.annotationEditorLayer { + background: transparent; + position: absolute; + inset: 0; + font-size: calc(100px * var(--scale-factor)); + transform-origin: 0 0; + cursor: auto; + z-index: 4; +} + +.annotationEditorLayer.waiting { + content: ""; + cursor: wait; + position: absolute; + inset: 0; + width: 100%; + height: 100%; +} + +.annotationEditorLayer.freeTextEditing { + cursor: var(--editorFreeText-editing-cursor); +} + +.annotationEditorLayer.inkEditing { + cursor: var(--editorInk-editing-cursor); +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) { + position: absolute; + background: transparent; + z-index: 1; + transform-origin: 0 0; + cursor: auto; + max-width: 100%; + max-height: 100%; + border: var(--unfocus-outline); +} + +.annotationEditorLayer .draggable.selectedEditor:is(.freeTextEditor, .inkEditor, .stampEditor) { + cursor: move; +} + +.annotationEditorLayer .selectedEditor:is(.freeTextEditor, .inkEditor, .stampEditor) { + border: var(--focus-outline); + outline: var(--focus-outline-around); +} + +.annotationEditorLayer .selectedEditor:is(.freeTextEditor, .inkEditor, .stampEditor)::before { + /* + This is a workaround for the lack of support for stripes(...) (see + https://drafts.csswg.org/css-images-4/#stripes). + The outline should be composed of 1px white, 2px blue and 1px white. + This could be achieved in different ways: + - using a linear-gradient; + - using a box-shadow; + - using an outline on the selected element and an outline+border on + the ::before pseudo-element. + All these options lead to incorrect rendering likely due to rounding + issues. + That said it doesn't mean that the current is ideal, but it's the best + we could come up with for the moment. + One drawback of this approach is that we use a border on the selected + element which means that we must take care of it when positioning the + div in js (see AnnotationEditor._borderLineWidth in editor.js). + */ + content: ""; + position: absolute; + inset: 0; + border: var(--focus-outline-around); + pointer-events: none; +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor):hover:not(.selectedEditor) { + border: var(--hover-outline); + outline: var(--hover-outline-around); +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor):hover:not(.selectedEditor)::before { + content: ""; + position: absolute; + inset: 0; + border: var(--focus-outline-around); +} + +.annotationEditorLayer .freeTextEditor { + padding: calc(var(--freetext-padding) * var(--scale-factor)); + width: auto; + height: auto; + touch-action: none; +} + +.annotationEditorLayer .freeTextEditor .internal { + background: transparent; + border: none; + inset: 0; + overflow: visible; + white-space: nowrap; + font: 10px sans-serif; + line-height: var(--freetext-line-height); + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.annotationEditorLayer .freeTextEditor .overlay { + position: absolute; + display: none; + background: transparent; + inset: 0; + width: 100%; + height: 100%; +} + +.annotationEditorLayer .freeTextEditor .overlay.enabled { + display: block; +} + +.annotationEditorLayer .freeTextEditor .internal:empty::before { + content: attr(default-content); + color: gray; +} + +.annotationEditorLayer .freeTextEditor .internal:focus { + outline: none; + -webkit-user-select: auto; + -moz-user-select: auto; + user-select: auto; +} + +.annotationEditorLayer .inkEditor { + width: 100%; + height: 100%; +} + +.annotationEditorLayer .inkEditor.editing { + cursor: inherit; +} + +.annotationEditorLayer .inkEditor .inkEditorCanvas { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + touch-action: none; +} + +.annotationEditorLayer .stampEditor { + width: auto; + height: auto; +} + +.annotationEditorLayer .stampEditor canvas { + width: 100%; + height: 100%; +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers { + position: absolute; + inset: 0; +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers.hidden { + display: none; +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer { + width: var(--resizer-size); + height: var(--resizer-size); + background: content-box var(--resizer-bg-color); + border: var(--focus-outline-around); + border-radius: 2px; + position: absolute; +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.topLeft { + top: var(--resizer-shift); + left: var(--resizer-shift); +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.topMiddle { + top: var(--resizer-shift); + left: calc(50% + var(--resizer-shift)); +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.topRight { + top: var(--resizer-shift); + right: var(--resizer-shift); +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.middleRight { + top: calc(50% + var(--resizer-shift)); + right: var(--resizer-shift); +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.bottomRight { + bottom: var(--resizer-shift); + right: var(--resizer-shift); +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.bottomMiddle { + bottom: var(--resizer-shift); + left: calc(50% + var(--resizer-shift)); +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.bottomLeft { + bottom: var(--resizer-shift); + left: var(--resizer-shift); +} + +.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.middleLeft { + top: calc(50% + var(--resizer-shift)); + left: var(--resizer-shift); +} + +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topLeft, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topLeft, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topLeft, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topLeft, +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomRight, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomRight, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomRight, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomRight { + cursor: nwse-resize; +} + +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topMiddle, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topMiddle, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topMiddle, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topMiddle, +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomMiddle, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomMiddle, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomMiddle, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomMiddle { + cursor: ns-resize; +} + +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topRight, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topRight, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topRight, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topRight, +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomLeft, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomLeft, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomLeft, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomLeft { + cursor: nesw-resize; +} + +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.middleRight, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.middleRight, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.middleRight, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.middleRight, +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.middleLeft, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.middleLeft, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.middleLeft, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.middleLeft { + cursor: ew-resize; +} + +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topLeft, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topLeft, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topLeft, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topLeft, +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomRight, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomRight, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomRight, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomRight { + cursor: nesw-resize; +} + +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topMiddle, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topMiddle, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topMiddle, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topMiddle, +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomMiddle, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomMiddle, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomMiddle, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomMiddle { + cursor: ew-resize; +} + +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topRight, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topRight, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topRight, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topRight, +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomLeft, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomLeft, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomLeft, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomLeft { + cursor: nwse-resize; +} + +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.middleRight, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.middleRight, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.middleRight, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.middleRight, +.annotationEditorLayer[data-main-rotation="0"] +:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.middleLeft, +.annotationEditorLayer[data-main-rotation="90"] +:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.middleLeft, +.annotationEditorLayer[data-main-rotation="180"] +:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.middleLeft, +.annotationEditorLayer[data-main-rotation="270"] +:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.middleLeft { + cursor: ns-resize; +} + +.annotationEditorLayer +:is( + [data-main-rotation="0"] [data-editor-rotation="90"], + [data-main-rotation="90"] [data-editor-rotation="0"], + [data-main-rotation="180"] [data-editor-rotation="270"], + [data-main-rotation="270"] [data-editor-rotation="180"] + ) .altText { + rotate: 270deg; +} + +[dir="ltr"] .annotationEditorLayer +:is( + [data-main-rotation="0"] [data-editor-rotation="90"], + [data-main-rotation="90"] [data-editor-rotation="0"], + [data-main-rotation="180"] [data-editor-rotation="270"], + [data-main-rotation="270"] [data-editor-rotation="180"] + ) .altText { + inset-inline-start: calc(100% - 8px); +} + +[dir="ltr"] .annotationEditorLayer +:is( + [data-main-rotation="0"] [data-editor-rotation="90"], + [data-main-rotation="90"] [data-editor-rotation="0"], + [data-main-rotation="180"] [data-editor-rotation="270"], + [data-main-rotation="270"] [data-editor-rotation="180"] + ) .altText.small { + inset-inline-start: calc(100% + 8px); + inset-block-start: 100%; +} + +[dir="rtl"] .annotationEditorLayer +:is( + [data-main-rotation="0"] [data-editor-rotation="90"], + [data-main-rotation="90"] [data-editor-rotation="0"], + [data-main-rotation="180"] [data-editor-rotation="270"], + [data-main-rotation="270"] [data-editor-rotation="180"] + ) .altText { + inset-block-end: calc(100% - 8px); +} + +[dir="rtl"] .annotationEditorLayer +:is( + [data-main-rotation="0"] [data-editor-rotation="90"], + [data-main-rotation="90"] [data-editor-rotation="0"], + [data-main-rotation="180"] [data-editor-rotation="270"], + [data-main-rotation="270"] [data-editor-rotation="180"] + ) .altText.small { + inset-inline-start: -8px; + inset-block-start: 0; +} + +.annotationEditorLayer +:is( + [data-main-rotation="0"] [data-editor-rotation="180"], + [data-main-rotation="90"] [data-editor-rotation="90"], + [data-main-rotation="180"] [data-editor-rotation="0"], + [data-main-rotation="270"] [data-editor-rotation="270"] + ) .altText { + rotate: 180deg; + + inset-block-end: calc(100% - 8px); + inset-inline-start: calc(100% - 8px); +} + +.annotationEditorLayer +:is( + [data-main-rotation="0"] [data-editor-rotation="180"], + [data-main-rotation="90"] [data-editor-rotation="90"], + [data-main-rotation="180"] [data-editor-rotation="0"], + [data-main-rotation="270"] [data-editor-rotation="270"] + ) .altText.small { + inset-inline-start: 100%; + inset-block-start: -8px; +} + +.annotationEditorLayer +:is( + [data-main-rotation="0"] [data-editor-rotation="270"], + [data-main-rotation="90"] [data-editor-rotation="180"], + [data-main-rotation="180"] [data-editor-rotation="90"], + [data-main-rotation="270"] [data-editor-rotation="0"] + ) .altText { + rotate: 90deg; +} + +[dir="ltr"] .annotationEditorLayer +:is( + [data-main-rotation="0"] [data-editor-rotation="270"], + [data-main-rotation="90"] [data-editor-rotation="180"], + [data-main-rotation="180"] [data-editor-rotation="90"], + [data-main-rotation="270"] [data-editor-rotation="0"] + ) .altText { + inset-block-end: calc(100% - 8px); +} + +[dir="ltr"] .annotationEditorLayer +:is( + [data-main-rotation="0"] [data-editor-rotation="270"], + [data-main-rotation="90"] [data-editor-rotation="180"], + [data-main-rotation="180"] [data-editor-rotation="90"], + [data-main-rotation="270"] [data-editor-rotation="0"] + ) .altText.small { + inset-inline-start: -8px; + inset-block-start: 0; +} + +[dir="rtl"] .annotationEditorLayer +:is( + [data-main-rotation="0"] [data-editor-rotation="270"], + [data-main-rotation="90"] [data-editor-rotation="180"], + [data-main-rotation="180"] [data-editor-rotation="90"], + [data-main-rotation="270"] [data-editor-rotation="0"] + ) .altText { + inset-inline-start: calc(100% - 8px); +} + +[dir="rtl"] .annotationEditorLayer +:is( + [data-main-rotation="0"] [data-editor-rotation="270"], + [data-main-rotation="90"] [data-editor-rotation="180"], + [data-main-rotation="180"] [data-editor-rotation="90"], + [data-main-rotation="270"] [data-editor-rotation="0"] + ) .altText.small { + inset-inline-start: calc(100% + 8px); + inset-block-start: 100%; +} + +.altText { + display: flex; + align-items: center; + justify-content: center; + padding-inline: 4px; + width: auto; + height: 24px; + min-width: 88px; + z-index: 1; + pointer-events: all; + + color: var(--alt-text-fg-color); + font: menu; + font-size: 12px; + border-radius: 4px; + border: 1px solid var(--alt-text-border-color); + background-color: var(--alt-text-bg-color); + box-shadow: var(--alt-text-shadow); + + position: absolute; + inset-block-end: 8px; + inset-inline-start: 8px; +} + +[dir="ltr"] .altText { + transform-origin: 0 100%; +} + +[dir="rtl"] .altText { + transform-origin: 100% 100%; +} + +.altText.small { + + inset-block-end: unset; + inset-inline-start: 0; + inset-block-start: calc(100% + 8px); +} + +[dir="ltr"] .altText.small { + transform-origin: 0 0; +} + +[dir="rtl"] .altText.small { + transform-origin: 100% 0; +} + +.altText:hover { + background-color: var(--alt-text-hover-bg-color); + border-color: var(--alt-text-hover-border-color); + color: var(--alt-text-hover-fg-color); + cursor: pointer; +} + +.altText:hover::before { + background-color: var(--alt-text-hover-fg-color); +} + +.altText:active { + background-color: var(--alt-text-active-bg-color); + border-color: var(--alt-text-active-border-color); + color: var(--alt-text-active-fg-color); +} + +.altText:active::before { + background-color: var(--alt-text-active-fg-color); +} + +.altText:focus-visible { + outline: 2px solid var(--alt-text-focus-outline-color); + border-color: var(--alt-text-focus-border-color); +} + +.altText::before { + content: ""; + -webkit-mask-image: var(--alt-text-add-image); + mask-image: var(--alt-text-add-image); + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-position: center; + display: inline-block; + width: 12px; + height: 13px; + background-color: var(--alt-text-fg-color); + margin-inline-end: 4px; +} + +.altText.done::before { + -webkit-mask-image: var(--alt-text-done-image); + mask-image: var(--alt-text-done-image); +} + +.altText .tooltip { + display: none; +} + +.altText .tooltip.show { + --alt-text-tooltip-bg: #f0f0f4; + --alt-text-tooltip-fg: #15141a; + --alt-text-tooltip-border: #8f8f9d; + --alt-text-tooltip-shadow: 0px 2px 6px 0px rgba(58, 57, 68, 0.2); + + display: inline-flex; + flex-direction: column; + align-items: center; + justify-content: center; + position: absolute; + top: calc(100% + 2px); + inset-inline-start: 0; + padding-block: 2px 3px; + padding-inline: 3px; + max-width: 300px; + width: -moz-max-content; + width: max-content; + height: auto; + font-size: 12px; + + border: 0.5px solid var(--alt-text-tooltip-border); + background: var(--alt-text-tooltip-bg); + box-shadow: var(--alt-text-tooltip-shadow); + color: var(--alt-text-tooltip-fg); + + pointer-events: none; +} + +@media (prefers-color-scheme: dark) { + + .altText .tooltip.show { + --alt-text-tooltip-bg: #1c1b22; + --alt-text-tooltip-fg: #fbfbfe; + --alt-text-tooltip-shadow: 0px 2px 6px 0px #15141a; + } +} + +@media screen and (forced-colors: active) { + + .altText .tooltip.show { + --alt-text-tooltip-bg: Canvas; + --alt-text-tooltip-fg: CanvasText; + --alt-text-tooltip-border: CanvasText; + --alt-text-tooltip-shadow: none; + } +} + +#altTextDialog { + --dialog-bg-color: white; + --dialog-border-color: white; + --dialog-shadow: 0 2px 14px 0 rgba(58, 57, 68, 0.2); + --text-primary-color: #15141a; + --text-secondary-color: #5b5b66; + --hover-filter: brightness(0.9); + --focus-ring-color: #0060df; + --focus-ring-outline: 2px solid var(--focus-ring-color); + + --textarea-border-color: #8f8f9d; + --textarea-bg-color: white; + --textarea-fg-color: var(--text-secondary-color); + + --radio-bg-color: #f0f0f4; + --radio-checked-bg-color: #fbfbfe; + --radio-border-color: #8f8f9d; + --radio-checked-border-color: #0060df; + + --button-cancel-bg-color: #f0f0f4; + --button-cancel-fg-color: var(--text-primary-color); + --button-cancel-border-color: var(--button-cancel-bg-color); + --button-cancel-hover-bg-color: var(--button-cancel-bg-color); + --button-cancel-hover-fg-color: var(--button-cancel-fg-color); + --button-cancel-hover-border-color: var(--button-cancel-hover-bg-color); + + --button-save-bg-color: #0060df; + --button-save-fg-color: #fbfbfe; + --button-save-hover-bg-color: var(--button-save-bg-color); + --button-save-hover-fg-color: var(--button-save-fg-color); + --button-save-hover-border-color: var(--button-save-hover-bg-color); + --button-save-disabled-bg-color: var(--button-save-bg-color); + --button-save-disabled-fg-color: var(--button-save-fg-color); + --button-save-disabled-opacity: 0.4; + + font: message-box; + font-size: 13px; + font-weight: 400; + line-height: 150%; + border-radius: 4px; + padding: 12px 16px; + border: 1px solid var(--dialog-border-color); + background: var(--dialog-bg-color); + color: var(--text-primary-color); + box-shadow: var(--dialog-shadow); +} + +@media (prefers-color-scheme: dark) { + + #altTextDialog { + --dialog-bg-color: #1c1b22; + --dialog-border-color: #1c1b22; + --dialog-shadow: 0 2px 14px 0 #15141a; + --text-primary-color: #fbfbfe; + --text-secondary-color: #cfcfd8; + --focus-ring-color: #00ddff; + --hover-filter: brightness(1.4); + + --textarea-bg-color: #42414d; + + --radio-bg-color: #2b2a33; + --radio-checked-bg-color: #15141a; + --radio-checked-border-color: #00ddff; + + --button-cancel-bg-color: #2b2a33; + --button-save-bg-color: #00ddff; + --button-save-fg-color: #15141a; + } +} + +@media screen and (forced-colors: active) { + + #altTextDialog { + --dialog-bg-color: Canvas; + --dialog-border-color: CanvasText; + --dialog-shadow: none; + --text-primary-color: CanvasText; + --text-secondary-color: CanvasText; + --hover-filter: none; + --focus-ring-color: ButtonBorder; + + --textarea-border-color: ButtonBorder; + --textarea-bg-color: Field; + --textarea-fg-color: ButtonText; + + --radio-bg-color: ButtonFace; + --radio-checked-bg-color: ButtonFace; + --radio-border-color: ButtonText; + --radio-checked-border-color: ButtonText; + + --button-cancel-bg-color: ButtonFace; + --button-cancel-fg-color: ButtonText; + --button-cancel-border-color: ButtonText; + --button-cancel-hover-bg-color: AccentColor; + --button-cancel-hover-fg-color: AccentColorText; + + --button-save-bg-color: ButtonText; + --button-save-fg-color: ButtonFace; + --button-save-hover-bg-color: AccentColor; + --button-save-hover-fg-color: AccentColorText; + --button-save-disabled-bg-color: GrayText; + --button-save-disabled-fg-color: Canvas; + --button-save-disabled-opacity: 1; + } +} + +#altTextDialog::backdrop { + /* This is needed to avoid to darken the image the user want to describe. */ + -webkit-mask: url(#alttext-manager-mask); + mask: url(#alttext-manager-mask); +} + +#altTextDialog.positioned { + margin: 0; +} + +#altTextDialog #altTextContainer { + width: 300px; + height: -moz-fit-content; + height: fit-content; + display: inline-flex; + flex-direction: column; + align-items: flex-start; + gap: 16px; +} + +#altTextDialog #altTextContainer *:focus-visible { + outline: var(--focus-ring-outline); + outline-offset: 2px; +} + +#altTextDialog #altTextContainer .radio { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 4px; +} + +#altTextDialog #altTextContainer .radio .radioButton { + display: flex; + gap: 8px; + align-self: stretch; + align-items: center; +} + +#altTextDialog #altTextContainer .radio .radioButton input { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + box-sizing: border-box; + width: 16px; + height: 16px; + border-radius: 50%; + background-color: var(--radio-bg-color); + border: 1px solid var(--radio-border-color); +} + +#altTextDialog #altTextContainer .radio .radioButton input:hover { + filter: var(--hover-filter); +} + +#altTextDialog #altTextContainer .radio .radioButton input:checked { + background-color: var(--radio-checked-bg-color); + border: 4px solid var(--radio-checked-border-color); +} + +#altTextDialog #altTextContainer .radio .radioLabel { + display: flex; + padding-inline-start: 24px; + align-items: flex-start; + gap: 10px; + align-self: stretch; +} + +#altTextDialog #altTextContainer .radio .radioLabel span { + flex: 1 0 0; + font-size: 11px; + color: var(--text-secondary-color); +} + +#altTextDialog #altTextContainer #overallDescription { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 4px; + align-self: stretch; +} + +#altTextDialog #altTextContainer #overallDescription span { + align-self: stretch; +} + +#altTextDialog #altTextContainer #overallDescription .title { + font-size: 13px; + font-style: normal; + font-weight: 590; +} + +#altTextDialog #altTextContainer #addDescription { + display: flex; + flex-direction: column; + align-items: stretch; + gap: 8px; +} + +#altTextDialog #altTextContainer #addDescription .descriptionArea { + flex: 1; + padding-inline: 24px 10px; +} + +#altTextDialog #altTextContainer #addDescription .descriptionArea textarea { + font: inherit; + width: 100%; + min-height: 75px; + padding: 8px; + resize: none; + margin: 0; + box-sizing: border-box; + border-radius: 4px; + border: 1px solid var(--textarea-border-color); + background: var(--textarea-bg-color); + color: var(--textarea-fg-color); +} + +#altTextDialog #altTextContainer #addDescription .descriptionArea textarea:focus { + outline-offset: 0; + border-color: transparent; +} + +#altTextDialog #altTextContainer #addDescription .descriptionArea textarea:disabled { + pointer-events: none; + opacity: 0.4; +} + +#altTextDialog #altTextContainer #buttons { + display: flex; + justify-content: flex-end; + align-items: flex-start; + gap: 8px; + align-self: stretch; +} + +#altTextDialog #altTextContainer #buttons button { + border-radius: 4px; + border: 1px solid; + font: menu; + font-weight: 600; + padding: 4px 16px; + width: auto; + height: 32px; +} + +#altTextDialog #altTextContainer #buttons button:hover { + cursor: pointer; + filter: var(--hover-filter); +} + +#altTextDialog #altTextContainer #buttons button#altTextCancel { + color: var(--button-cancel-fg-color); + background-color: var(--button-cancel-bg-color); + border-color: var(--button-cancel-border-color); +} + +#altTextDialog #altTextContainer #buttons button#altTextCancel:hover { + color: var(--button-cancel-hover-fg-color); + background-color: var(--button-cancel-hover-bg-color); + border-color: var(--button-cancel-hover-border-color); +} + +#altTextDialog #altTextContainer #buttons button#altTextSave { + color: var(--button-save-hover-fg-color); + background-color: var(--button-save-hover-bg-color); + border-color: var(--button-save-hover-border-color); + opacity: 1; +} + +#altTextDialog #altTextContainer #buttons button#altTextSave:hover { + color: var(--button-save-hover-fg-color); + background-color: var(--button-save-hover-bg-color); + border-color: var(--button-save-hover-border-color); +} + +#altTextDialog #altTextContainer #buttons button#altTextSave:disabled { + color: var(--button-save-disabled-fg-color); + background-color: var(--button-save-disabled-bg-color); + opacity: var(--button-save-disabled-opacity); + pointer-events: none; +} + +:root { + --viewer-container-height: 0; + --pdfViewer-padding-bottom: 0; + --page-margin: 1px auto -8px; + --page-border: 9px solid transparent; + --spreadHorizontalWrapped-margin-LR: -3.5px; + --loading-icon-delay: 400ms; +} + +@media screen and (forced-colors: active) { + :root { + --pdfViewer-padding-bottom: 9px; + --page-margin: 8px auto -1px; + --page-border: 1px solid CanvasText; + --spreadHorizontalWrapped-margin-LR: 3.5px; + } +} + +[data-main-rotation="90"] { + transform: rotate(90deg) translateY(-100%); +} + +[data-main-rotation="180"] { + transform: rotate(180deg) translate(-100%, -100%); +} + +[data-main-rotation="270"] { + transform: rotate(270deg) translateX(-100%); +} + +#hiddenCopyElement { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; + display: none; +} + +.pdfViewer { + /* Define this variable here and not in :root to avoid to reflow all the UI + when scaling (see #15929). */ + --scale-factor: 1; + + padding-bottom: var(--pdfViewer-padding-bottom); +} + +.pdfViewer .canvasWrapper { + overflow: hidden; + width: 100%; + height: 100%; + z-index: 1; +} + +.pdfViewer .page { + direction: ltr; + width: 816px; + height: 1056px; + margin: var(--page-margin); + position: relative; + overflow: visible; + border: var(--page-border); + background-clip: content-box; + background-color: rgba(255, 255, 255, 1); +} + +.pdfViewer .dummyPage { + position: relative; + width: 0; + height: var(--viewer-container-height); +} + +.pdfViewer.noUserSelect { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pdfViewer.removePageBorders .page { + margin: 0 auto 10px; + border: none; +} + +.pdfViewer:is(.scrollHorizontal, .scrollWrapped), +.spread { + margin-inline: 3.5px; + text-align: center; +} + +.pdfViewer.scrollHorizontal, +.spread { + white-space: nowrap; +} + +.pdfViewer.removePageBorders, +.pdfViewer:is(.scrollHorizontal, .scrollWrapped) .spread { + margin-inline: 0; +} + +.spread :is(.page, .dummyPage), +.pdfViewer:is(.scrollHorizontal, .scrollWrapped) :is(.page, .spread) { + display: inline-block; + vertical-align: middle; +} + +.spread .page, +.pdfViewer:is(.scrollHorizontal, .scrollWrapped) .page { + margin-inline: var(--spreadHorizontalWrapped-margin-LR); +} + +.pdfViewer.removePageBorders .spread .page, +.pdfViewer.removePageBorders:is(.scrollHorizontal, .scrollWrapped) .page { + margin-inline: 5px; +} + +.pdfViewer .page canvas { + margin: 0; + display: block; +} + +.pdfViewer .page canvas .structTree { + contain: strict; +} + +.pdfViewer .page canvas[hidden] { + display: none; +} + +.pdfViewer .page canvas[zooming] { + width: 100%; + height: 100%; +} + +.pdfViewer .page.loadingIcon::after { + position: absolute; + top: 0; + left: 0; + content: ""; + width: 100%; + height: 100%; + background: url("../images/loading-icon.gif") center no-repeat; + display: none; + /* Using a delay with background-image doesn't work, + consequently we use the display. */ + transition-property: display; + transition-delay: var(--loading-icon-delay); + z-index: 5; + contain: strict; +} + +.pdfViewer .page.loading::after { + display: block; +} + +.pdfViewer .page:not(.loading)::after { + transition-property: none; + display: none; +} + +.pdfPresentationMode .pdfViewer { + padding-bottom: 0; +} + +.pdfPresentationMode .spread { + margin: 0; +} + +.pdfPresentationMode .pdfViewer .page { + margin: 0 auto; + border: 2px solid transparent; +} + +:root { + --dir-factor: 1; + --inline-start: left; + --inline-end: right; + + --sidebar-width: 200px; + --sidebar-transition-duration: 200ms; + --sidebar-transition-timing-function: ease; + + --toolbar-icon-opacity: 0.7; + --doorhanger-icon-opacity: 0.9; + + --main-color: rgba(12, 12, 13, 1); + --body-bg-color: rgba(212, 212, 215, 1); + --progressBar-color: rgba(10, 132, 255, 1); + --progressBar-bg-color: rgba(221, 221, 222, 1); + --progressBar-blend-color: rgba(116, 177, 239, 1); + --scrollbar-color: auto; + --scrollbar-bg-color: auto; + --toolbar-icon-bg-color: rgba(0, 0, 0, 1); + --toolbar-icon-hover-bg-color: rgba(0, 0, 0, 1); + + --sidebar-narrow-bg-color: rgba(212, 212, 215, 0.9); + --sidebar-toolbar-bg-color: rgba(245, 246, 247, 1); + --toolbar-bg-color: rgba(249, 249, 250, 1); + --toolbar-border-color: rgba(184, 184, 184, 1); + --toolbar-box-shadow: 0 1px 0 var(--toolbar-border-color); + --toolbar-border-bottom: none; + --toolbarSidebar-box-shadow: inset calc(-1px * var(--dir-factor)) 0 0 rgba(0, 0, 0, 0.25), + 0 1px 0 rgba(0, 0, 0, 0.15), 0 0 1px rgba(0, 0, 0, 0.1); + --toolbarSidebar-border-bottom: none; + --button-hover-color: rgba(221, 222, 223, 1); + --toggled-btn-color: rgba(0, 0, 0, 1); + --toggled-btn-bg-color: rgba(0, 0, 0, 0.3); + --toggled-hover-active-btn-color: rgba(0, 0, 0, 0.4); + --toggled-hover-btn-outline: none; + --dropdown-btn-bg-color: rgba(215, 215, 219, 1); + --dropdown-btn-border: none; + --separator-color: rgba(0, 0, 0, 0.3); + --field-color: rgba(6, 6, 6, 1); + --field-bg-color: rgba(255, 255, 255, 1); + --field-border-color: rgba(187, 187, 188, 1); + --treeitem-color: rgba(0, 0, 0, 0.8); + --treeitem-bg-color: rgba(0, 0, 0, 0.15); + --treeitem-hover-color: rgba(0, 0, 0, 0.9); + --treeitem-selected-color: rgba(0, 0, 0, 0.9); + --treeitem-selected-bg-color: rgba(0, 0, 0, 0.25); + --thumbnail-hover-color: rgba(0, 0, 0, 0.1); + --thumbnail-selected-color: rgba(0, 0, 0, 0.2); + --doorhanger-bg-color: rgba(255, 255, 255, 1); + --doorhanger-border-color: rgba(12, 12, 13, 0.2); + --doorhanger-hover-color: rgba(12, 12, 13, 1); + --doorhanger-hover-bg-color: rgba(237, 237, 237, 1); + --doorhanger-separator-color: rgba(222, 222, 222, 1); + --dialog-button-border: none; + --dialog-button-bg-color: rgba(12, 12, 13, 0.1); + --dialog-button-hover-bg-color: rgba(12, 12, 13, 0.3); + + --loading-icon: url(../images/loading.svg); + --treeitem-expanded-icon: url(../images/treeitem-expanded.svg); + --treeitem-collapsed-icon: url(../images/treeitem-collapsed.svg); + --toolbarButton-editorFreeText-icon: url(../images/toolbarButton-editorFreeText.svg); + --toolbarButton-editorInk-icon: url(../images/toolbarButton-editorInk.svg); + --toolbarButton-editorStamp-icon: url(../images/toolbarButton-editorStamp.svg); + --toolbarButton-menuArrow-icon: url(../images/toolbarButton-menuArrow.svg); + --toolbarButton-sidebarToggle-icon: url(../images/toolbarButton-sidebarToggle.svg); + --toolbarButton-backToHome-icon: url(../images/toolBarButton-home.svg); + --toolbarButton-secondaryToolbarToggle-icon: url(../images/toolbarButton-secondaryToolbarToggle.svg); + --toolbarButton-pageUp-icon: url(../images/toolbarButton-pageUp.svg); + --toolbarButton-pageDown-icon: url(../images/toolbarButton-pageDown.svg); + --toolbarButton-zoomOut-icon: url(../images/toolbarButton-zoomOut.svg); + --toolbarButton-zoomIn-icon: url(../images/toolbarButton-zoomIn.svg); + --toolbarButton-presentationMode-icon: url(../images/toolbarButton-presentationMode.svg); + --toolbarButton-print-icon: url(../images/toolbarButton-print.svg); + --toolbarButton-openFile-icon: url(../images/toolbarButton-openFile.svg); + --toolbarButton-download-icon: url(../images/toolbarButton-download.svg); + --toolbarButton-bookmark-icon: url(../images/toolbarButton-bookmark.svg); + --toolbarButton-viewThumbnail-icon: url(../images/toolbarButton-viewThumbnail.svg); + --toolbarButton-viewOutline-icon: url(../images/toolbarButton-viewOutline.svg); + --toolbarButton-viewAttachments-icon: url(../images/toolbarButton-viewAttachments.svg); + --toolbarButton-viewLayers-icon: url(../images/toolbarButton-viewLayers.svg); + --toolbarButton-currentOutlineItem-icon: url(../images/toolbarButton-currentOutlineItem.svg); + --toolbarButton-search-icon: url(../images/toolbarButton-search.svg); + --findbarButton-previous-icon: url(../images/findbarButton-previous.svg); + --findbarButton-next-icon: url(../images/findbarButton-next.svg); + --secondaryToolbarButton-firstPage-icon: url(../images/secondaryToolbarButton-firstPage.svg); + --secondaryToolbarButton-lastPage-icon: url(../images/secondaryToolbarButton-lastPage.svg); + --secondaryToolbarButton-rotateCcw-icon: url(../images/secondaryToolbarButton-rotateCcw.svg); + --secondaryToolbarButton-rotateCw-icon: url(../images/secondaryToolbarButton-rotateCw.svg); + --secondaryToolbarButton-selectTool-icon: url(../images/secondaryToolbarButton-selectTool.svg); + --secondaryToolbarButton-handTool-icon: url(../images/secondaryToolbarButton-handTool.svg); + --secondaryToolbarButton-scrollPage-icon: url(../images/secondaryToolbarButton-scrollPage.svg); + --secondaryToolbarButton-scrollVertical-icon: url(../images/secondaryToolbarButton-scrollVertical.svg); + --secondaryToolbarButton-scrollHorizontal-icon: url(../images/secondaryToolbarButton-scrollHorizontal.svg); + --secondaryToolbarButton-scrollWrapped-icon: url(../images/secondaryToolbarButton-scrollWrapped.svg); + --secondaryToolbarButton-spreadNone-icon: url(../images/secondaryToolbarButton-spreadNone.svg); + --secondaryToolbarButton-spreadOdd-icon: url(../images/secondaryToolbarButton-spreadOdd.svg); + --secondaryToolbarButton-spreadEven-icon: url(../images/secondaryToolbarButton-spreadEven.svg); + --secondaryToolbarButton-documentProperties-icon: url(../images/secondaryToolbarButton-documentProperties.svg); + --editorParams-stampAddImage-icon: url(../images/toolbarButton-zoomIn.svg); +} + +[dir="rtl"]:root { + --dir-factor: -1; + --inline-start: right; + --inline-end: left; +} + +@media (prefers-color-scheme: dark) { + :root { + --main-color: rgba(249, 249, 250, 1); + --body-bg-color: rgba(42, 42, 46, 1); + --progressBar-color: rgba(0, 96, 223, 1); + --progressBar-bg-color: rgba(40, 40, 43, 1); + --progressBar-blend-color: rgba(20, 68, 133, 1); + --scrollbar-color: rgba(121, 121, 123, 1); + --scrollbar-bg-color: rgba(35, 35, 39, 1); + --toolbar-icon-bg-color: rgba(255, 255, 255, 1); + --toolbar-icon-hover-bg-color: rgba(255, 255, 255, 1); + + --sidebar-narrow-bg-color: rgba(42, 42, 46, 0.9); + --sidebar-toolbar-bg-color: rgba(50, 50, 52, 1); + --toolbar-bg-color: rgba(56, 56, 61, 1); + --toolbar-border-color: rgba(12, 12, 13, 1); + --button-hover-color: rgba(102, 102, 103, 1); + --toggled-btn-color: rgba(255, 255, 255, 1); + --toggled-btn-bg-color: rgba(0, 0, 0, 0.3); + --toggled-hover-active-btn-color: rgba(0, 0, 0, 0.4); + --dropdown-btn-bg-color: rgba(74, 74, 79, 1); + --separator-color: rgba(0, 0, 0, 0.3); + --field-color: rgba(250, 250, 250, 1); + --field-bg-color: rgba(64, 64, 68, 1); + --field-border-color: rgba(115, 115, 115, 1); + --treeitem-color: rgba(255, 255, 255, 0.8); + --treeitem-bg-color: rgba(255, 255, 255, 0.15); + --treeitem-hover-color: rgba(255, 255, 255, 0.9); + --treeitem-selected-color: rgba(255, 255, 255, 0.9); + --treeitem-selected-bg-color: rgba(255, 255, 255, 0.25); + --thumbnail-hover-color: rgba(255, 255, 255, 0.1); + --thumbnail-selected-color: rgba(255, 255, 255, 0.2); + --doorhanger-bg-color: rgba(74, 74, 79, 1); + --doorhanger-border-color: rgba(39, 39, 43, 1); + --doorhanger-hover-color: rgba(249, 249, 250, 1); + --doorhanger-hover-bg-color: rgba(93, 94, 98, 1); + --doorhanger-separator-color: rgba(92, 92, 97, 1); + --dialog-button-bg-color: rgba(92, 92, 97, 1); + --dialog-button-hover-bg-color: rgba(115, 115, 115, 1); + + /* This image is used in elements, which unfortunately means that + * the `mask-image` approach used with all of the other images doesn't work + * here; hence why we still have two versions of this particular image. */ + --loading-icon: url(../images/loading-dark.svg); + } +} + +@media screen and (forced-colors: active) { + :root { + --button-hover-color: Highlight; + --doorhanger-hover-bg-color: Highlight; + --toolbar-icon-opacity: 1; + --toolbar-icon-bg-color: ButtonText; + --toolbar-icon-hover-bg-color: ButtonFace; + --toggled-hover-active-btn-color: ButtonText; + --toggled-hover-btn-outline: 2px solid ButtonBorder; + --toolbar-border-color: CanvasText; + --toolbar-border-bottom: 1px solid var(--toolbar-border-color); + --toolbar-box-shadow: none; + --toggled-btn-color: HighlightText; + --toggled-btn-bg-color: LinkText; + --doorhanger-hover-color: ButtonFace; + --doorhanger-border-color-whcm: 1px solid ButtonText; + --doorhanger-triangle-opacity-whcm: 0; + --dialog-button-border: 1px solid Highlight; + --dialog-button-hover-bg-color: Highlight; + --dialog-button-hover-color: ButtonFace; + --dropdown-btn-border: 1px solid ButtonText; + --field-border-color: ButtonText; + --main-color: CanvasText; + --separator-color: GrayText; + --doorhanger-separator-color: GrayText; + --toolbarSidebar-box-shadow: none; + --toolbarSidebar-border-bottom: 1px solid var(--toolbar-border-color); + } +} + +@media screen and (prefers-reduced-motion: reduce) { + :root { + --sidebar-transition-duration: 0; + } +} + +* { + padding: 0; + margin: 0; +} + +html, +body { + height: 100%; + width: 100%; +} + +body { + background-color: var(--body-bg-color); + scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color); +} + +.hidden, +[hidden] { + display: none !important; +} + +#viewerContainer.pdfPresentationMode:-webkit-full-screen { + top: 0; + background-color: rgba(0, 0, 0, 1); + width: 100%; + height: 100%; + overflow: hidden; + cursor: none; + -webkit-user-select: none; + user-select: none; +} + +#viewerContainer.pdfPresentationMode:fullscreen { + top: 0; + background-color: rgba(0, 0, 0, 1); + width: 100%; + height: 100%; + overflow: hidden; + cursor: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.pdfPresentationMode:-webkit-full-screen section:not([data-internal-link]) { + pointer-events: none; +} + +.pdfPresentationMode:fullscreen section:not([data-internal-link]) { + pointer-events: none; +} + +.pdfPresentationMode:-webkit-full-screen .textLayer span { + cursor: none; +} + +.pdfPresentationMode:fullscreen .textLayer span { + cursor: none; +} + +.pdfPresentationMode.pdfPresentationModeControls > *, +.pdfPresentationMode.pdfPresentationModeControls .textLayer span { + cursor: default; +} + +#outerContainer { + width: 100%; + height: 100%; + position: relative; +} + +#sidebarContainer { + position: absolute; + inset-block: 32px 0; + inset-inline-start: calc(-1 * var(--sidebar-width)); + width: var(--sidebar-width); + visibility: hidden; + z-index: 100; + font: message-box; + border-top: 1px solid rgba(51, 51, 51, 1); + border-inline-end: var(--doorhanger-border-color-whcm); + transition-property: inset-inline-start; + transition-duration: var(--sidebar-transition-duration); + transition-timing-function: var(--sidebar-transition-timing-function); +} + +#outerContainer:is(.sidebarMoving, .sidebarOpen) #sidebarContainer { + visibility: visible; +} + +#outerContainer.sidebarOpen #sidebarContainer { + inset-inline-start: 0; +} + +#mainContainer { + position: absolute; + inset: 0; + min-width: 350px; +} + +#sidebarContent { + inset-block: 32px 0; + inset-inline-start: 0; + overflow: auto; + position: absolute; + width: 100%; + box-shadow: inset calc(-1px * var(--dir-factor)) 0 0 rgba(0, 0, 0, 0.25); +} + +#viewerContainer { + overflow: auto; + position: absolute; + inset: 32px 0 0; + outline: none; +} + +#viewerContainer:not(.pdfPresentationMode) { + transition-duration: var(--sidebar-transition-duration); + transition-timing-function: var(--sidebar-transition-timing-function); +} + +#outerContainer.sidebarOpen #viewerContainer:not(.pdfPresentationMode) { + inset-inline-start: var(--sidebar-width); + transition-property: inset-inline-start; +} + +.toolbar { + position: relative; + inset-inline: 0; + z-index: 9999; + cursor: default; + font: message-box; +} + +:is(.toolbar, .editorParamsToolbar, .findbar, #sidebarContainer) +:is(input, button, select), +.secondaryToolbar :is(input, button, a, select) { + outline: none; + font: message-box; +} + +#toolbarContainer { + width: 100%; +} + +#toolbarSidebar { + width: 100%; + height: 32px; + background-color: var(--sidebar-toolbar-bg-color); + box-shadow: var(--toolbarSidebar-box-shadow); + border-bottom: var(--toolbarSidebar-border-bottom); +} + +#sidebarResizer { + position: absolute; + inset-block: 0; + inset-inline-end: -6px; + width: 6px; + z-index: 200; + cursor: ew-resize; +} + +#toolbarContainer, +.findbar, +.secondaryToolbar, +.editorParamsToolbar { + position: relative; + height: 35px; + background-color: var(--toolbar-bg-color); + box-shadow: var(--toolbar-box-shadow); + border-bottom: var(--toolbar-border-bottom); +} + +#toolbarViewer { + height: 35px; +} + +#loadingBar { + /* Define these variables here, and not in :root, to avoid reflowing the + entire viewer when updating progress (see issue 15958). */ + --progressBar-percent: 0%; + --progressBar-end-offset: 0; + + position: absolute; + inset-inline: 0 var(--progressBar-end-offset); + height: 4px; + background-color: var(--progressBar-bg-color); + border-bottom: 1px solid var(--toolbar-border-color); + transition-property: inset-inline-start; + transition-duration: var(--sidebar-transition-duration); + transition-timing-function: var(--sidebar-transition-timing-function); +} + +#outerContainer.sidebarOpen #loadingBar { + inset-inline-start: var(--sidebar-width); +} + +#loadingBar .progress { + position: absolute; + top: 0; + inset-inline-start: 0; + width: 100%; + transform: scaleX(var(--progressBar-percent)); + transform-origin: calc(50% - 50% * var(--dir-factor)) 0; + height: 100%; + background-color: var(--progressBar-color); + overflow: hidden; + transition: transform 200ms; +} + +@keyframes progressIndeterminate { + 0% { + transform: translateX(calc(-142px * var(--dir-factor))); + } + 100% { + transform: translateX(0); + } +} + +#loadingBar.indeterminate .progress { + transform: none; + background-color: var(--progressBar-bg-color); + transition: none; +} + +#loadingBar.indeterminate .progress .glimmer { + position: absolute; + top: 0; + inset-inline-start: 0; + height: 100%; + width: calc(100% + 150px); + background: repeating-linear-gradient( + 135deg, + var(--progressBar-blend-color) 0, + var(--progressBar-bg-color) 5px, + var(--progressBar-bg-color) 45px, + var(--progressBar-color) 55px, + var(--progressBar-color) 95px, + var(--progressBar-blend-color) 100px + ); + animation: progressIndeterminate 1s linear infinite; +} + +#outerContainer.sidebarResizing +:is(#sidebarContainer, #viewerContainer, #loadingBar) { + /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */ + transition-duration: 0s; +} + +.findbar, +.secondaryToolbar, +.editorParamsToolbar { + top: 32px; + position: absolute; + z-index: 30000; + height: auto; + padding: 0 4px; + margin: 4px 2px; + font: message-box; + font-size: 12px; + line-height: 14px; + text-align: left; + cursor: default; +} + +.findbar { + inset-inline-start: 64px; + min-width: 300px; + background-color: var(--toolbar-bg-color); +} + +.findbar > div { + height: 32px; +} + +.findbar > div#findbarInputContainer { + margin-inline-end: 4px; +} + +.findbar.wrapContainers > div, +.findbar.wrapContainers > div#findbarMessageContainer > * { + clear: both; +} + +.findbar.wrapContainers > div#findbarMessageContainer { + height: auto; +} + +.findbar input[type="checkbox"] { + pointer-events: none; +} + +.findbar label { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.findbar label:hover, +.findbar input:focus-visible + label { + color: var(--toggled-btn-color); + background-color: var(--button-hover-color); +} + +.findbar .toolbarField[type="checkbox"]:checked + .toolbarLabel { + background-color: var(--toggled-btn-bg-color) !important; + color: var(--toggled-btn-color); +} + +#findInput { + width: 200px; +} + +#findInput::-moz-placeholder { + font-style: normal; +} + +#findInput::placeholder { + font-style: normal; +} + +#findInput[data-status="pending"] { + background-image: var(--loading-icon); + background-repeat: no-repeat; + background-position: calc(50% + 48% * var(--dir-factor)); +} + +#findInput[data-status="notFound"] { + background-color: rgba(255, 102, 102, 1); +} + +.secondaryToolbar, +.editorParamsToolbar { + padding: 6px 0 10px; + inset-inline-end: 4px; + height: auto; + background-color: var(--doorhanger-bg-color); +} + +.editorParamsToolbarContainer { + width: 220px; + margin-bottom: -4px; +} + +.editorParamsToolbarContainer > .editorParamsSetter { + min-height: 26px; + display: flex; + align-items: center; + justify-content: space-between; + padding-inline: 10px; +} + +.editorParamsToolbarContainer .editorParamsLabel { + padding-inline-end: 10px; + flex: none; + color: var(--main-color); +} + +.editorParamsToolbarContainer .editorParamsColor { + width: 32px; + height: 32px; + flex: none; +} + +.editorParamsToolbarContainer .editorParamsSlider { + background-color: transparent; + width: 90px; + flex: 0 1 0; +} + +.editorParamsToolbarContainer .editorParamsSlider::-moz-range-progress { + background-color: black; +} + +.editorParamsToolbarContainer .editorParamsSlider::-webkit-slider-runnable-track, +.editorParamsToolbarContainer .editorParamsSlider::-moz-range-track { + background-color: black; +} + +.editorParamsToolbarContainer .editorParamsSlider::-webkit-slider-thumb, +.editorParamsToolbarContainer .editorParamsSlider::-moz-range-thumb { + background-color: white; +} + +#secondaryToolbarButtonContainer { + max-width: 220px; + min-height: 26px; + max-height: calc(var(--viewer-container-height) - 40px); + overflow-y: auto; + margin-bottom: -4px; +} + +#editorStampParamsToolbar { + inset-inline-end: 40px; + background-color: var(--toolbar-bg-color); +} + +#editorInkParamsToolbar { + inset-inline-end: 68px; + background-color: var(--toolbar-bg-color); +} + +#editorFreeTextParamsToolbar { + inset-inline-end: 96px; + background-color: var(--toolbar-bg-color); +} + +#editorStampAddImage::before { + -webkit-mask-image: var(--editorParams-stampAddImage-icon); + mask-image: var(--editorParams-stampAddImage-icon); +} + +.doorHanger, +.doorHangerRight { + border-radius: 2px; + box-shadow: 0 1px 5px var(--doorhanger-border-color), + 0 0 0 1px var(--doorhanger-border-color); + border: var(--doorhanger-border-color-whcm); +} + +:is(.doorHanger, .doorHangerRight)::after, +:is(.doorHanger, .doorHangerRight)::before { + bottom: 100%; + border: 8px solid rgba(0, 0, 0, 0); + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + opacity: var(--doorhanger-triangle-opacity-whcm); +} + +.doorHanger::after { + inset-inline-start: 10px; + margin-inline-start: -8px; + border-bottom-color: var(--toolbar-bg-color); +} + +.doorHangerRight::after { + inset-inline-end: 10px; + margin-inline-end: -8px; + border-bottom-color: var(--doorhanger-bg-color); +} + +:is(.doorHanger, .doorHangerRight)::before { + border-bottom-color: var(--doorhanger-border-color); + border-width: 9px; +} + +.doorHanger::before { + inset-inline-start: 10px; + margin-inline-start: -9px; +} + +.doorHangerRight::before { + inset-inline-end: 10px; + margin-inline-end: -9px; +} + +#findResultsCount { + background-color: rgba(217, 217, 217, 1); + color: rgba(82, 82, 82, 1); + text-align: center; + padding: 4px 5px; + margin: 5px; +} + +#findMsg[data-status="notFound"] { + font-weight: bold; +} + +:is(#findResultsCount, #findMsg):empty { + display: none; +} + +#toolbarViewerMiddle { + position: absolute; + left: 50%; + transform: translateX(-50%); +} + +#toolbarViewerLeft, +#toolbarSidebarLeft { + float: var(--inline-start); +} + +#toolbarViewerRight, +#toolbarSidebarRight { + float: var(--inline-end); +} + +#toolbarViewerLeft > *, +#toolbarViewerMiddle > *, +#toolbarViewerRight > *, +#toolbarSidebarLeft *, +#toolbarSidebarRight *, +.findbar * { + position: relative; + float: var(--inline-start); +} + +#toolbarViewerLeft { + padding-inline-start: 1px; +} + +#toolbarViewerRight { + padding-inline-end: 1px; +} + +#toolbarSidebarRight { + padding-inline-end: 2px; +} + +.splitToolbarButton { + margin: 2px; + display: inline-block; +} + +.splitToolbarButton > .toolbarButton { + float: var(--inline-start); +} + +.toolbarButton, +.secondaryToolbarButton, +.dialogButton { + border: none; + background: none; + width: 28px; + height: 28px; + outline: none; +} + +.dialogButton:is(:hover, :focus-visible) { + background-color: var(--dialog-button-hover-bg-color); +} + +.dialogButton:is(:hover, :focus-visible) > span { + color: var(--dialog-button-hover-color); +} + +.toolbarButton > span { + display: inline-block; + width: 0; + height: 0; + overflow: hidden; +} + +:is(.toolbarButton, .secondaryToolbarButton, .dialogButton)[disabled] { + opacity: 0.5; +} + +.splitToolbarButton > .toolbarButton:is(:hover, :focus-visible), +.dropdownToolbarButton:hover { + background-color: var(--button-hover-color); +} + +.splitToolbarButton > .toolbarButton { + position: relative; + margin: 0; +} + +#toolbarSidebar .splitToolbarButton > .toolbarButton { + margin-inline-end: 2px; +} + +.splitToolbarButtonSeparator { + float: var(--inline-start); + margin: 4px 0; + width: 1px; + height: 20px; + background-color: var(--separator-color); +} + +.toolbarButton, +.dropdownToolbarButton, +.secondaryToolbarButton, +.dialogButton { + min-width: 16px; + margin: 2px 1px; + padding: 2px 6px 0; + border: none; + border-radius: 2px; + color: var(--main-color); + font-size: 12px; + line-height: 14px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + cursor: default; + box-sizing: border-box; +} + +.toolbarButton:is(:hover, :focus-visible) { + background-color: var(--button-hover-color); +} + +.secondaryToolbarButton:is(:hover, :focus-visible) { + background-color: var(--doorhanger-hover-bg-color); + color: var(--doorhanger-hover-color); +} + +:is(.toolbarButton, .secondaryToolbarButton).toggled, +.splitToolbarButton.toggled > .toolbarButton.toggled { + background-color: var(--toggled-btn-bg-color); + color: var(--toggled-btn-color); +} + +:is(.toolbarButton, .secondaryToolbarButton).toggled:hover, +.splitToolbarButton.toggled > .toolbarButton.toggled:hover { + outline: var(--toggled-hover-btn-outline) !important; +} + +:is(.toolbarButton, .secondaryToolbarButton).toggled::before { + background-color: var(--toggled-btn-color); +} + +:is(.toolbarButton, .secondaryToolbarButton).toggled:hover:active, +.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active { + background-color: var(--toggled-hover-active-btn-color); +} + +.dropdownToolbarButton { + /* Define this variable here, and not in :root, to avoid reflowing the + entire viewer when updating the width. */ + --scale-select-width: 140px; + + width: var(--scale-select-width); + padding: 0; + background-color: var(--dropdown-btn-bg-color); + border: var(--dropdown-btn-border); +} + +.dropdownToolbarButton::after { + top: 6px; + inset-inline-end: 6px; + pointer-events: none; + -webkit-mask-image: var(--toolbarButton-menuArrow-icon); + mask-image: var(--toolbarButton-menuArrow-icon); +} + +.dropdownToolbarButton > select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + width: inherit; + height: 28px; + font-size: 12px; + color: var(--main-color); + margin: 0; + padding: 1px 0 2px; + padding-inline-start: 6px; + border: none; + background-color: var(--dropdown-btn-bg-color); +} + +.dropdownToolbarButton > select:is(:hover, :focus-visible) { + background-color: var(--button-hover-color); + color: var(--toggled-btn-color); +} + +.dropdownToolbarButton > select > option { + background: var(--doorhanger-bg-color); + color: var(--main-color); +} + +.toolbarButtonSpacer { + width: 30px; + display: inline-block; + height: 1px; +} + +:is(.toolbarButton, .secondaryToolbarButton, .treeItemToggler)::before, +.dropdownToolbarButton::after { + /* All matching images have a size of 16x16 + * All relevant containers have a size of 28x28 */ + position: absolute; + display: inline-block; + width: 16px; + height: 16px; + + content: ""; + background-color: var(--toolbar-icon-bg-color); + -webkit-mask-size: cover; + mask-size: cover; +} + +.dropdownToolbarButton:is(:hover, :focus-visible, :active)::after { + background-color: var(--toolbar-icon-hover-bg-color); +} + +.toolbarButton::before { + opacity: var(--toolbar-icon-opacity); + top: 6px; + left: 6px; +} + +.toolbarButton:is(:hover, :focus-visible)::before, +.secondaryToolbarButton:is(:hover, :focus-visible)::before { + background-color: var(--toolbar-icon-hover-bg-color); +} + +.secondaryToolbarButton::before { + opacity: var(--doorhanger-icon-opacity); + top: 5px; + inset-inline-start: 12px; +} + +#sidebarToggle::before { + -webkit-mask-image: var(--toolbarButton-sidebarToggle-icon); + mask-image: var(--toolbarButton-sidebarToggle-icon); + transform: scaleX(var(--dir-factor)); +} + +#secondaryToolbarToggle::before { + -webkit-mask-image: var(--toolbarButton-secondaryToolbarToggle-icon); + mask-image: var(--toolbarButton-secondaryToolbarToggle-icon); + transform: scaleX(var(--dir-factor)); +} + +#backToHome::before { + -webkit-mask-image: var(--toolbarButton-backToHome-icon); + mask-image: var(--toolbarButton-backToHome-icon); + transform: scaleX(var(--dir-factor)); +} + +#findPrevious::before { + -webkit-mask-image: var(--findbarButton-previous-icon); + mask-image: var(--findbarButton-previous-icon); +} + +#findNext::before { + -webkit-mask-image: var(--findbarButton-next-icon); + mask-image: var(--findbarButton-next-icon); +} + +#previous::before { + -webkit-mask-image: var(--toolbarButton-pageUp-icon); + mask-image: var(--toolbarButton-pageUp-icon); +} + +#next::before { + -webkit-mask-image: var(--toolbarButton-pageDown-icon); + mask-image: var(--toolbarButton-pageDown-icon); +} + +#zoomOut::before { + -webkit-mask-image: var(--toolbarButton-zoomOut-icon); + mask-image: var(--toolbarButton-zoomOut-icon); +} + +#zoomIn::before { + -webkit-mask-image: var(--toolbarButton-zoomIn-icon); + mask-image: var(--toolbarButton-zoomIn-icon); +} + +#presentationMode::before { + -webkit-mask-image: var(--toolbarButton-presentationMode-icon); + mask-image: var(--toolbarButton-presentationMode-icon); +} + +#editorFreeText::before { + -webkit-mask-image: var(--toolbarButton-editorFreeText-icon); + mask-image: var(--toolbarButton-editorFreeText-icon); +} + +#editorInk::before { + -webkit-mask-image: var(--toolbarButton-editorInk-icon); + mask-image: var(--toolbarButton-editorInk-icon); +} + +#editorStamp::before { + -webkit-mask-image: var(--toolbarButton-editorStamp-icon); + mask-image: var(--toolbarButton-editorStamp-icon); +} + +#print::before, +#secondaryPrint::before { + -webkit-mask-image: var(--toolbarButton-print-icon); + mask-image: var(--toolbarButton-print-icon); +} + +:is(#openFile, #secondaryOpenFile)::before { + -webkit-mask-image: var(--toolbarButton-openFile-icon); + mask-image: var(--toolbarButton-openFile-icon); +} + +:is(#backToHome, #secondaryBackToHome)::before { + -webkit-mask-image: var(--toolbarButton-backToHome-icon); + mask-image: var(--toolbarButton-backToHome-icon); +} + +:is(#download, #secondaryDownload)::before { + -webkit-mask-image: var(--toolbarButton-download-icon); + mask-image: var(--toolbarButton-download-icon); +} + +a.secondaryToolbarButton { + padding-top: 5px; + text-decoration: none; +} + +a:is(.toolbarButton, .secondaryToolbarButton)[href="#"] { + opacity: 0.5; + pointer-events: none; +} + +#viewBookmark::before { + -webkit-mask-image: var(--toolbarButton-bookmark-icon); + mask-image: var(--toolbarButton-bookmark-icon); +} + +#viewThumbnail::before { + -webkit-mask-image: var(--toolbarButton-viewThumbnail-icon); + mask-image: var(--toolbarButton-viewThumbnail-icon); +} + +#viewOutline::before { + -webkit-mask-image: var(--toolbarButton-viewOutline-icon); + mask-image: var(--toolbarButton-viewOutline-icon); + transform: scaleX(var(--dir-factor)); +} + +#viewAttachments::before { + -webkit-mask-image: var(--toolbarButton-viewAttachments-icon); + mask-image: var(--toolbarButton-viewAttachments-icon); +} + +#viewLayers::before { + -webkit-mask-image: var(--toolbarButton-viewLayers-icon); + mask-image: var(--toolbarButton-viewLayers-icon); +} + +#currentOutlineItem::before { + -webkit-mask-image: var(--toolbarButton-currentOutlineItem-icon); + mask-image: var(--toolbarButton-currentOutlineItem-icon); + transform: scaleX(var(--dir-factor)); +} + +#viewFind::before { + -webkit-mask-image: var(--toolbarButton-search-icon); + mask-image: var(--toolbarButton-search-icon); +} + +.pdfSidebarNotification::after { + position: absolute; + display: inline-block; + top: 2px; + inset-inline-end: 2px; + /* Create a filled circle, with a diameter of 9 pixels, using only CSS: */ + content: ""; + background-color: rgba(112, 219, 85, 1); + height: 9px; + width: 9px; + border-radius: 50%; +} + +.secondaryToolbarButton { + position: relative; + margin: 0; + padding: 0 0 1px; + padding-inline-start: 36px; + height: auto; + min-height: 26px; + width: auto; + min-width: 100%; + text-align: start; + white-space: normal; + border-radius: 0; + box-sizing: border-box; + display: inline-block; +} + +.secondaryToolbarButton > span { + padding-inline-end: 4px; +} + +#firstPage::before { + -webkit-mask-image: var(--secondaryToolbarButton-firstPage-icon); + mask-image: var(--secondaryToolbarButton-firstPage-icon); +} + +#lastPage::before { + -webkit-mask-image: var(--secondaryToolbarButton-lastPage-icon); + mask-image: var(--secondaryToolbarButton-lastPage-icon); +} + +#pageRotateCcw::before { + -webkit-mask-image: var(--secondaryToolbarButton-rotateCcw-icon); + mask-image: var(--secondaryToolbarButton-rotateCcw-icon); +} + +#pageRotateCw::before { + -webkit-mask-image: var(--secondaryToolbarButton-rotateCw-icon); + mask-image: var(--secondaryToolbarButton-rotateCw-icon); +} + +#cursorSelectTool::before { + -webkit-mask-image: var(--secondaryToolbarButton-selectTool-icon); + mask-image: var(--secondaryToolbarButton-selectTool-icon); +} + +#cursorHandTool::before { + -webkit-mask-image: var(--secondaryToolbarButton-handTool-icon); + mask-image: var(--secondaryToolbarButton-handTool-icon); +} + +#scrollPage::before { + -webkit-mask-image: var(--secondaryToolbarButton-scrollPage-icon); + mask-image: var(--secondaryToolbarButton-scrollPage-icon); +} + +#scrollVertical::before { + -webkit-mask-image: var(--secondaryToolbarButton-scrollVertical-icon); + mask-image: var(--secondaryToolbarButton-scrollVertical-icon); +} + +#scrollHorizontal::before { + -webkit-mask-image: var(--secondaryToolbarButton-scrollHorizontal-icon); + mask-image: var(--secondaryToolbarButton-scrollHorizontal-icon); +} + +#scrollWrapped::before { + -webkit-mask-image: var(--secondaryToolbarButton-scrollWrapped-icon); + mask-image: var(--secondaryToolbarButton-scrollWrapped-icon); +} + +#spreadNone::before { + -webkit-mask-image: var(--secondaryToolbarButton-spreadNone-icon); + mask-image: var(--secondaryToolbarButton-spreadNone-icon); +} + +#spreadOdd::before { + -webkit-mask-image: var(--secondaryToolbarButton-spreadOdd-icon); + mask-image: var(--secondaryToolbarButton-spreadOdd-icon); +} + +#spreadEven::before { + -webkit-mask-image: var(--secondaryToolbarButton-spreadEven-icon); + mask-image: var(--secondaryToolbarButton-spreadEven-icon); +} + +#documentProperties::before { + -webkit-mask-image: var(--secondaryToolbarButton-documentProperties-icon); + mask-image: var(--secondaryToolbarButton-documentProperties-icon); +} + +.verticalToolbarSeparator { + display: block; + margin: 5px 2px; + width: 1px; + height: 22px; + background-color: var(--separator-color); +} + +.horizontalToolbarSeparator { + display: block; + margin: 6px 0; + height: 1px; + width: 100%; + background-color: var(--doorhanger-separator-color); +} + +.toolbarField { + padding: 4px 7px; + margin: 3px 0; + border-radius: 2px; + background-color: var(--field-bg-color); + background-clip: padding-box; + border: 1px solid var(--field-border-color); + box-shadow: none; + color: var(--field-color); + font-size: 12px; + line-height: 16px; + outline: none; +} + +.toolbarField[type="checkbox"] { + opacity: 0; + position: absolute !important; + left: 0; + margin: 10px 0 3px; + margin-inline-start: 7px; +} + +#pageNumber { + -moz-appearance: textfield; /* hides the spinner in moz */ + text-align: end; + width: 40px; + background-size: 0 0; + transition-property: none; +} + +#pageNumber.visiblePageIsLoading { + background-image: var(--loading-icon); + background-repeat: no-repeat; + background-position: calc(50% - 42% * var(--dir-factor)); + background-size: 16px 16px; + /* Using a delay with background-image doesn't work, + consequently we use background-size. */ + transition-property: background-size; + transition-delay: var(--loading-icon-delay); +} + +#pageNumber::-webkit-inner-spin-button { + -webkit-appearance: none; +} + +.toolbarField:focus { + border-color: #0a84ff; +} + +.toolbarLabel { + min-width: 16px; + padding: 7px; + margin: 2px; + border-radius: 2px; + color: var(--main-color); + font-size: 12px; + line-height: 14px; + text-align: left; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + cursor: default; +} + +#numPages.toolbarLabel { + padding-inline-start: 3px; +} + +#thumbnailView, +#outlineView, +#attachmentsView, +#layersView { + position: absolute; + width: calc(100% - 8px); + inset-block: 0; + padding: 4px 4px 0; + overflow: auto; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +#thumbnailView { + width: calc(100% - 60px); + padding: 10px 30px 0; +} + +#thumbnailView > a:is(:active, :focus) { + outline: 0; +} + +.thumbnail { + /* Define these variables here, and not in :root, since the individual + thumbnails may have different sizes. */ + --thumbnail-width: 0; + --thumbnail-height: 0; + + float: var(--inline-start); + width: var(--thumbnail-width); + height: var(--thumbnail-height); + margin: 0 10px 5px; + padding: 1px; + border: 7px solid transparent; + border-radius: 2px; +} + +#thumbnailView > a:last-of-type > .thumbnail { + margin-bottom: 10px; +} + +a:focus > .thumbnail, +.thumbnail:hover { + border-color: var(--thumbnail-hover-color); +} + +.thumbnail.selected { + border-color: var(--thumbnail-selected-color) !important; +} + +.thumbnailImage { + width: var(--thumbnail-width); + height: var(--thumbnail-height); + opacity: 0.9; +} + +a:focus > .thumbnail > .thumbnailImage, +.thumbnail:hover > .thumbnailImage { + opacity: 0.95; +} + +.thumbnail.selected > .thumbnailImage { + opacity: 1 !important; +} + +.thumbnail:not([data-loaded]) > .thumbnailImage { + width: calc(var(--thumbnail-width) - 2px); + height: calc(var(--thumbnail-height) - 2px); + border: 1px dashed rgba(132, 132, 132, 1); +} + +.treeWithDeepNesting > .treeItem, +.treeItem > .treeItems { + margin-inline-start: 20px; +} + +.treeItem > a { + text-decoration: none; + display: inline-block; + /* Subtract the right padding (left, in RTL mode) of the container: */ + min-width: calc(100% - 4px); + height: auto; + margin-bottom: 1px; + padding: 2px 0 5px; + padding-inline-start: 4px; + border-radius: 2px; + color: var(--treeitem-color); + font-size: 13px; + line-height: 15px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + white-space: normal; + cursor: pointer; +} + +#layersView .treeItem > a * { + cursor: pointer; +} + +#layersView .treeItem > a > label { + padding-inline-start: 4px; +} + +#layersView .treeItem > a > label > input { + float: var(--inline-start); + margin-top: 1px; +} + +.treeItemToggler { + position: relative; + float: var(--inline-start); + height: 0; + width: 0; + color: rgba(255, 255, 255, 0.5); +} + +.treeItemToggler::before { + inset-inline-end: 4px; + -webkit-mask-image: var(--treeitem-expanded-icon); + mask-image: var(--treeitem-expanded-icon); +} + +.treeItemToggler.treeItemsHidden::before { + -webkit-mask-image: var(--treeitem-collapsed-icon); + mask-image: var(--treeitem-collapsed-icon); + transform: scaleX(var(--dir-factor)); +} + +.treeItemToggler.treeItemsHidden ~ .treeItems { + display: none; +} + +.treeItem.selected > a { + background-color: var(--treeitem-selected-bg-color); + color: var(--treeitem-selected-color); +} + +.treeItemToggler:hover, +.treeItemToggler:hover + a, +.treeItemToggler:hover ~ .treeItems, +.treeItem > a:hover { + background-color: var(--treeitem-bg-color); + background-clip: padding-box; + border-radius: 2px; + color: var(--treeitem-hover-color); +} + +.dialogButton { + width: auto; + margin: 3px 4px 2px !important; + padding: 2px 11px; + color: var(--main-color); + background-color: var(--dialog-button-bg-color); + border: var(--dialog-button-border) !important; +} + +dialog { + margin: auto; + padding: 15px; + border-spacing: 4px; + color: var(--main-color); + font: message-box; + font-size: 12px; + line-height: 14px; + background-color: var(--doorhanger-bg-color); + border: 1px solid rgba(0, 0, 0, 0.5); + border-radius: 4px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); +} + +dialog::backdrop { + background-color: rgba(0, 0, 0, 0.2); +} + +dialog > .row { + display: table-row; +} + +dialog > .row > * { + display: table-cell; +} + +dialog .toolbarField { + margin: 5px 0; +} + +dialog .separator { + display: block; + margin: 4px 0; + height: 1px; + width: 100%; + background-color: var(--separator-color); +} + +dialog .buttonRow { + text-align: center; + vertical-align: middle; +} + +dialog :link { + color: rgba(255, 255, 255, 1); +} + +#passwordDialog { + text-align: center; +} + +#passwordDialog .toolbarField { + width: 200px; +} + +#documentPropertiesDialog { + text-align: left; +} + +#documentPropertiesDialog .row > * { + min-width: 100px; + text-align: start; +} + +#documentPropertiesDialog .row > span { + width: 125px; + word-wrap: break-word; +} + +#documentPropertiesDialog .row > p { + max-width: 225px; + word-wrap: break-word; +} + +#documentPropertiesDialog .buttonRow { + margin-top: 10px; +} + +.grab-to-pan-grab { + cursor: grab !important; +} + +.grab-to-pan-grab +*:not(input):not(textarea):not(button):not(select):not(:link) { + cursor: inherit !important; +} + +.grab-to-pan-grab:active, +.grab-to-pan-grabbing { + cursor: grabbing !important; +} + +.grab-to-pan-grabbing { + position: fixed; + background: rgba(0, 0, 0, 0); + display: block; + inset: 0; + overflow: hidden; + z-index: 50000; /* should be higher than anything else in PDF.js! */ +} + +@page { + margin: 0; +} + +#printContainer { + display: none; +} + +@media print { + body { + background: rgba(0, 0, 0, 0) none; + } + + body[data-pdfjsprinting] #outerContainer { + display: none; + } + + body[data-pdfjsprinting] #printContainer { + display: block; + } + + #printContainer { + height: 100%; + } + + /* wrapper around (scaled) print canvas elements */ + #printContainer > .printedPage { + page-break-after: always; + page-break-inside: avoid; + + /* The wrapper always cover the whole page. */ + height: 100%; + width: 100%; + + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + } + + #printContainer > .xfaPrintedPage .xfaPage { + position: absolute; + } + + #printContainer > .xfaPrintedPage { + page-break-after: always; + page-break-inside: avoid; + width: 100%; + height: 100%; + position: relative; + } + + #printContainer > .printedPage :is(canvas, img) { + /* The intrinsic canvas / image size will make sure that we fit the page. */ + max-width: 100%; + max-height: 100%; + + direction: ltr; + display: block; + } +} + +.visibleLargeView, +.visibleMediumView { + display: none; +} + +@media all and (max-width: 900px) { + #toolbarViewerMiddle { + display: table; + margin: auto; + left: auto; + position: inherit; + transform: none; + } +} + +@media all and (max-width: 840px) { + #sidebarContainer { + background-color: var(--sidebar-narrow-bg-color); + } + + #outerContainer.sidebarOpen #viewerContainer { + inset-inline-start: 0 !important; + } +} + +@media all and (max-width: 820px) { + #outerContainer .hiddenLargeView { + display: none; + } + + #outerContainer .visibleLargeView { + display: inherit; + } +} + +@media all and (max-width: 750px) { + #outerContainer .hiddenMediumView { + display: none; + } + + #outerContainer .visibleMediumView { + display: inherit; + } +} + +@media all and (max-width: 690px) { + .hiddenSmallView, + .hiddenSmallView * { + display: none; + } + + .toolbarButtonSpacer { + width: 0; + } + + .findbar { + inset-inline-start: 34px; + } +} + +@media all and (max-width: 560px) { + #scaleSelectContainer { + display: none; + } +} diff --git a/src/main/resources/static/pdfjs/example/Welcome.pdf b/src/main/resources/static/pdfjs/example/Welcome.pdf new file mode 100644 index 000000000..f3812141f Binary files /dev/null and b/src/main/resources/static/pdfjs/example/Welcome.pdf differ diff --git a/src/main/resources/static/pdfjs/example/Welcome_old.pdf b/src/main/resources/static/pdfjs/example/Welcome_old.pdf new file mode 100644 index 000000000..baa49de39 Binary files /dev/null and b/src/main/resources/static/pdfjs/example/Welcome_old.pdf differ diff --git a/src/main/resources/static/pdfjs/images/altText_add.svg b/src/main/resources/static/pdfjs/images/altText_add.svg new file mode 100644 index 000000000..1cf111d35 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/altText_add.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/altText_done.svg b/src/main/resources/static/pdfjs/images/altText_done.svg new file mode 100644 index 000000000..95c29af4c --- /dev/null +++ b/src/main/resources/static/pdfjs/images/altText_done.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/annotation-check.svg b/src/main/resources/static/pdfjs/images/annotation-check.svg new file mode 100644 index 000000000..b6849b305 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/annotation-check.svg @@ -0,0 +1,11 @@ + + + + diff --git a/src/main/resources/static/pdfjs/images/annotation-comment.svg b/src/main/resources/static/pdfjs/images/annotation-comment.svg new file mode 100644 index 000000000..83fbfb44c --- /dev/null +++ b/src/main/resources/static/pdfjs/images/annotation-comment.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/src/main/resources/static/pdfjs/images/annotation-help.svg b/src/main/resources/static/pdfjs/images/annotation-help.svg new file mode 100644 index 000000000..81a00ac16 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/annotation-help.svg @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/src/main/resources/static/pdfjs/images/annotation-insert.svg b/src/main/resources/static/pdfjs/images/annotation-insert.svg new file mode 100644 index 000000000..ca9e9e20e --- /dev/null +++ b/src/main/resources/static/pdfjs/images/annotation-insert.svg @@ -0,0 +1,10 @@ + + + + diff --git a/src/main/resources/static/pdfjs/images/annotation-key.svg b/src/main/resources/static/pdfjs/images/annotation-key.svg new file mode 100644 index 000000000..733edc0b8 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/annotation-key.svg @@ -0,0 +1,11 @@ + + + + diff --git a/src/main/resources/static/pdfjs/images/annotation-newparagraph.svg b/src/main/resources/static/pdfjs/images/annotation-newparagraph.svg new file mode 100644 index 000000000..e75f98077 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/annotation-newparagraph.svg @@ -0,0 +1,11 @@ + + + + diff --git a/src/main/resources/static/pdfjs/images/annotation-noicon.svg b/src/main/resources/static/pdfjs/images/annotation-noicon.svg new file mode 100644 index 000000000..21423057a --- /dev/null +++ b/src/main/resources/static/pdfjs/images/annotation-noicon.svg @@ -0,0 +1,7 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/annotation-note.svg b/src/main/resources/static/pdfjs/images/annotation-note.svg new file mode 100644 index 000000000..f5f2c16a5 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/annotation-note.svg @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/src/main/resources/static/pdfjs/images/annotation-paperclip.svg b/src/main/resources/static/pdfjs/images/annotation-paperclip.svg new file mode 100644 index 000000000..a93960b20 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/annotation-paperclip.svg @@ -0,0 +1,6 @@ + + + + diff --git a/src/main/resources/static/pdfjs/images/annotation-paragraph.svg b/src/main/resources/static/pdfjs/images/annotation-paragraph.svg new file mode 100644 index 000000000..be06ce9b3 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/annotation-paragraph.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/src/main/resources/static/pdfjs/images/annotation-pushpin.svg b/src/main/resources/static/pdfjs/images/annotation-pushpin.svg new file mode 100644 index 000000000..325f9d3f0 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/annotation-pushpin.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/src/main/resources/static/pdfjs/images/cursor-editorFreeText.svg b/src/main/resources/static/pdfjs/images/cursor-editorFreeText.svg new file mode 100644 index 000000000..42ba1f6aa --- /dev/null +++ b/src/main/resources/static/pdfjs/images/cursor-editorFreeText.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/cursor-editorInk.svg b/src/main/resources/static/pdfjs/images/cursor-editorInk.svg new file mode 100644 index 000000000..249f4634a --- /dev/null +++ b/src/main/resources/static/pdfjs/images/cursor-editorInk.svg @@ -0,0 +1,6 @@ + + + + diff --git a/src/main/resources/static/pdfjs/images/findbarButton-next.svg b/src/main/resources/static/pdfjs/images/findbarButton-next.svg new file mode 100644 index 000000000..dba19fe33 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/findbarButton-next.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/findbarButton-previous.svg b/src/main/resources/static/pdfjs/images/findbarButton-previous.svg new file mode 100644 index 000000000..341370598 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/findbarButton-previous.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/gv-toolbarButton-download.svg b/src/main/resources/static/pdfjs/images/gv-toolbarButton-download.svg new file mode 100644 index 000000000..0e82606b6 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/gv-toolbarButton-download.svg @@ -0,0 +1,5 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/gv-toolbarButton-openinapp.svg b/src/main/resources/static/pdfjs/images/gv-toolbarButton-openinapp.svg new file mode 100644 index 000000000..1aa278f21 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/gv-toolbarButton-openinapp.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/main/resources/static/pdfjs/images/loading-dark.svg b/src/main/resources/static/pdfjs/images/loading-dark.svg new file mode 100644 index 000000000..cec39a877 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/loading-dark.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/pdfjs/images/loading-icon.gif b/src/main/resources/static/pdfjs/images/loading-icon.gif new file mode 100644 index 000000000..1c72ebb55 Binary files /dev/null and b/src/main/resources/static/pdfjs/images/loading-icon.gif differ diff --git a/src/main/resources/static/pdfjs/images/loading.svg b/src/main/resources/static/pdfjs/images/loading.svg new file mode 100644 index 000000000..d63eaf01d --- /dev/null +++ b/src/main/resources/static/pdfjs/images/loading.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-documentProperties.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-documentProperties.svg new file mode 100644 index 000000000..2fc1915e6 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-documentProperties.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-firstPage.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-firstPage.svg new file mode 100644 index 000000000..42fb45eb0 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-firstPage.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-handTool.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-handTool.svg new file mode 100644 index 000000000..a67b3c501 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-handTool.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-lastPage.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-lastPage.svg new file mode 100644 index 000000000..ab9a4dea3 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-lastPage.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-rotateCcw.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-rotateCcw.svg new file mode 100644 index 000000000..0cf4058b4 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-rotateCcw.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-rotateCw.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-rotateCw.svg new file mode 100644 index 000000000..243f809f5 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-rotateCw.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-scrollHorizontal.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-scrollHorizontal.svg new file mode 100644 index 000000000..955cae027 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-scrollHorizontal.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-scrollPage.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-scrollPage.svg new file mode 100644 index 000000000..4f4762eaf --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-scrollPage.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-scrollVertical.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-scrollVertical.svg new file mode 100644 index 000000000..8713d497b --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-scrollVertical.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-scrollWrapped.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-scrollWrapped.svg new file mode 100644 index 000000000..162db0b20 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-scrollWrapped.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-selectTool.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-selectTool.svg new file mode 100644 index 000000000..1f3f22ce8 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-selectTool.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-spreadEven.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-spreadEven.svg new file mode 100644 index 000000000..c51c427d4 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-spreadEven.svg @@ -0,0 +1,5 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-spreadNone.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-spreadNone.svg new file mode 100644 index 000000000..e768bf949 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-spreadNone.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/secondaryToolbarButton-spreadOdd.svg b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-spreadOdd.svg new file mode 100644 index 000000000..1788cae10 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/secondaryToolbarButton-spreadOdd.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolBarButton-home.svg b/src/main/resources/static/pdfjs/images/toolBarButton-home.svg new file mode 100644 index 000000000..5184bc11d --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolBarButton-home.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-bookmark.svg b/src/main/resources/static/pdfjs/images/toolbarButton-bookmark.svg new file mode 100644 index 000000000..e87111782 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-bookmark.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-currentOutlineItem.svg b/src/main/resources/static/pdfjs/images/toolbarButton-currentOutlineItem.svg new file mode 100644 index 000000000..cfdb8f696 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-currentOutlineItem.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-download.svg b/src/main/resources/static/pdfjs/images/toolbarButton-download.svg new file mode 100644 index 000000000..57a847d2c --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-download.svg @@ -0,0 +1,6 @@ + + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-editorFreeText.svg b/src/main/resources/static/pdfjs/images/toolbarButton-editorFreeText.svg new file mode 100644 index 000000000..247409dcb --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-editorFreeText.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-editorInk.svg b/src/main/resources/static/pdfjs/images/toolbarButton-editorInk.svg new file mode 100644 index 000000000..7586ebcd2 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-editorInk.svg @@ -0,0 +1,6 @@ + + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-editorStamp.svg b/src/main/resources/static/pdfjs/images/toolbarButton-editorStamp.svg new file mode 100644 index 000000000..81b958194 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-editorStamp.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-menuArrow.svg b/src/main/resources/static/pdfjs/images/toolbarButton-menuArrow.svg new file mode 100644 index 000000000..a9a1c68a8 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-menuArrow.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-openFile.svg b/src/main/resources/static/pdfjs/images/toolbarButton-openFile.svg new file mode 100644 index 000000000..946baf649 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-openFile.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-pageDown.svg b/src/main/resources/static/pdfjs/images/toolbarButton-pageDown.svg new file mode 100644 index 000000000..2de1fbdc1 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-pageDown.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-pageUp.svg b/src/main/resources/static/pdfjs/images/toolbarButton-pageUp.svg new file mode 100644 index 000000000..bcc315d7a --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-pageUp.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-presentationMode.svg b/src/main/resources/static/pdfjs/images/toolbarButton-presentationMode.svg new file mode 100644 index 000000000..57a7bb38a --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-presentationMode.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-print.svg b/src/main/resources/static/pdfjs/images/toolbarButton-print.svg new file mode 100644 index 000000000..a20be2532 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-print.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-search.svg b/src/main/resources/static/pdfjs/images/toolbarButton-search.svg new file mode 100644 index 000000000..d213e1b96 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-search.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-secondaryToolbarToggle.svg b/src/main/resources/static/pdfjs/images/toolbarButton-secondaryToolbarToggle.svg new file mode 100644 index 000000000..93cbadf0c --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-secondaryToolbarToggle.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-sidebarToggle.svg b/src/main/resources/static/pdfjs/images/toolbarButton-sidebarToggle.svg new file mode 100644 index 000000000..03a2399fe --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-sidebarToggle.svg @@ -0,0 +1,5 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-viewAttachments.svg b/src/main/resources/static/pdfjs/images/toolbarButton-viewAttachments.svg new file mode 100644 index 000000000..9e8250951 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-viewAttachments.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-viewLayers.svg b/src/main/resources/static/pdfjs/images/toolbarButton-viewLayers.svg new file mode 100644 index 000000000..817e4e00a --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-viewLayers.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-viewOutline.svg b/src/main/resources/static/pdfjs/images/toolbarButton-viewOutline.svg new file mode 100644 index 000000000..8a031fc53 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-viewOutline.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-viewThumbnail.svg b/src/main/resources/static/pdfjs/images/toolbarButton-viewThumbnail.svg new file mode 100644 index 000000000..b34f5c9bc --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-viewThumbnail.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-zoomIn.svg b/src/main/resources/static/pdfjs/images/toolbarButton-zoomIn.svg new file mode 100644 index 000000000..595e0d59b --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-zoomIn.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/toolbarButton-zoomOut.svg b/src/main/resources/static/pdfjs/images/toolbarButton-zoomOut.svg new file mode 100644 index 000000000..fe55e30a0 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/toolbarButton-zoomOut.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/main/resources/static/pdfjs/images/treeitem-collapsed.svg b/src/main/resources/static/pdfjs/images/treeitem-collapsed.svg new file mode 100644 index 000000000..084d133f6 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/treeitem-collapsed.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/main/resources/static/pdfjs/images/treeitem-expanded.svg b/src/main/resources/static/pdfjs/images/treeitem-expanded.svg new file mode 100644 index 000000000..ca2dba2f6 --- /dev/null +++ b/src/main/resources/static/pdfjs/images/treeitem-expanded.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/main/resources/static/pdfjs/js/viewer.js b/src/main/resources/static/pdfjs/js/viewer.js new file mode 100644 index 000000000..f533f24be --- /dev/null +++ b/src/main/resources/static/pdfjs/js/viewer.js @@ -0,0 +1,14902 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2023 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/******/ +(() => { // webpackBootstrap + /******/ + "use strict"; + /******/ + var __webpack_modules__ = ([ + /* 0 */, + /* 1 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.GenericCom = void 0; + var _app = __webpack_require__(2); + var _preferences = __webpack_require__(42); + var _download_manager = __webpack_require__(43); + var _genericl10n = __webpack_require__(44); + var _generic_scripting = __webpack_require__(46); + ; + const GenericCom = {}; + exports.GenericCom = GenericCom; + + class GenericPreferences extends _preferences.BasePreferences { + async _writeToStorage(prefObj) { + localStorage.setItem("pdfjs.preferences", JSON.stringify(prefObj)); + } + + async _readFromStorage(prefObj) { + return JSON.parse(localStorage.getItem("pdfjs.preferences")); + } + } + + class GenericExternalServices extends _app.DefaultExternalServices { + static createDownloadManager() { + return new _download_manager.DownloadManager(); + } + + static createPreferences() { + return new GenericPreferences(); + } + + static createL10n({ + locale = "en-US" + }) { + return new _genericl10n.GenericL10n(locale); + } + + static createScripting({ + sandboxBundleSrc + }) { + return new _generic_scripting.GenericScripting(sandboxBundleSrc); + } + } + + _app.PDFViewerApplication.externalServices = GenericExternalServices; + + /***/ + }), + /* 2 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFViewerApplication = exports.PDFPrintServiceFactory = exports.DefaultExternalServices = void 0; + var _ui_utils = __webpack_require__(3); + var _pdfjsLib = __webpack_require__(4); + var _app_options = __webpack_require__(5); + var _event_utils = __webpack_require__(6); + var _pdf_link_service = __webpack_require__(7); + var _webAlt_text_manager = __webpack_require__(8); + var _webAnnotation_editor_params = __webpack_require__(9); + var _overlay_manager = __webpack_require__(10); + var _password_prompt = __webpack_require__(11); + var _webPdf_attachment_viewer = __webpack_require__(12); + var _webPdf_cursor_tools = __webpack_require__(14); + var _webPdf_document_properties = __webpack_require__(16); + var _webPdf_find_bar = __webpack_require__(17); + var _pdf_find_controller = __webpack_require__(18); + var _pdf_history = __webpack_require__(20); + var _webPdf_layer_viewer = __webpack_require__(21); + var _webPdf_outline_viewer = __webpack_require__(22); + var _webPdf_presentation_mode = __webpack_require__(23); + var _pdf_rendering_queue = __webpack_require__(24); + var _pdf_scripting_manager = __webpack_require__(25); + var _webPdf_sidebar = __webpack_require__(26); + var _webPdf_thumbnail_viewer = __webpack_require__(27); + var _pdf_viewer = __webpack_require__(29); + var _webSecondary_toolbar = __webpack_require__(39); + var _webToolbar = __webpack_require__(40); + var _view_history = __webpack_require__(41); + const FORCE_PAGES_LOADED_TIMEOUT = 10000; + const WHEEL_ZOOM_DISABLED_TIMEOUT = 1000; + const ViewOnLoad = { + UNKNOWN: -1, + PREVIOUS: 0, + INITIAL: 1 + }; + const ViewerCssTheme = { + AUTOMATIC: 0, + LIGHT: 1, + DARK: 2 + }; + + class DefaultExternalServices { + constructor() { + throw new Error("Cannot initialize DefaultExternalServices."); + } + + static updateFindControlState(data) { + } + + static updateFindMatchesCount(data) { + } + + static initPassiveLoading(callbacks) { + } + + static reportTelemetry(data) { + } + + static createDownloadManager() { + throw new Error("Not implemented: createDownloadManager"); + } + + static createPreferences() { + throw new Error("Not implemented: createPreferences"); + } + + static createL10n(options) { + throw new Error("Not implemented: createL10n"); + } + + static createScripting(options) { + throw new Error("Not implemented: createScripting"); + } + + static get supportsPinchToZoom() { + return (0, _pdfjsLib.shadow)(this, "supportsPinchToZoom", true); + } + + static get supportsIntegratedFind() { + return (0, _pdfjsLib.shadow)(this, "supportsIntegratedFind", false); + } + + static get supportsDocumentFonts() { + return (0, _pdfjsLib.shadow)(this, "supportsDocumentFonts", true); + } + + static get supportedMouseWheelZoomModifierKeys() { + return (0, _pdfjsLib.shadow)(this, "supportedMouseWheelZoomModifierKeys", { + ctrlKey: true, + metaKey: true + }); + } + + static get isInAutomation() { + return (0, _pdfjsLib.shadow)(this, "isInAutomation", false); + } + + static updateEditorStates(data) { + throw new Error("Not implemented: updateEditorStates"); + } + + static get canvasMaxAreaInBytes() { + return (0, _pdfjsLib.shadow)(this, "canvasMaxAreaInBytes", -1); + } + + static getNimbusExperimentData() { + return (0, _pdfjsLib.shadow)(this, "getNimbusExperimentData", Promise.resolve(null)); + } + } + + exports.DefaultExternalServices = DefaultExternalServices; + const PDFViewerApplication = { + initialBookmark: document.location.hash.substring(1), + _initializedCapability: new _pdfjsLib.PromiseCapability(), + appConfig: null, + pdfDocument: null, + pdfLoadingTask: null, + printService: null, + pdfViewer: null, + pdfThumbnailViewer: null, + pdfRenderingQueue: null, + pdfPresentationMode: null, + pdfDocumentProperties: null, + pdfLinkService: null, + pdfHistory: null, + pdfSidebar: null, + pdfOutlineViewer: null, + pdfAttachmentViewer: null, + pdfLayerViewer: null, + pdfCursorTools: null, + pdfScriptingManager: null, + store: null, + downloadManager: null, + overlayManager: null, + preferences: null, + toolbar: null, + secondaryToolbar: null, + eventBus: null, + l10n: null, + annotationEditorParams: null, + isInitialViewSet: false, + downloadComplete: false, + isViewerEmbedded: window.parent !== window, + url: "", + baseUrl: "", + _downloadUrl: "", + externalServices: DefaultExternalServices, + _boundEvents: Object.create(null), + documentInfo: null, + metadata: null, + _contentDispositionFilename: null, + _contentLength: null, + _saveInProgress: false, + _wheelUnusedTicks: 0, + _wheelUnusedFactor: 1, + _touchUnusedTicks: 0, + _touchUnusedFactor: 1, + _PDFBug: null, + _hasAnnotationEditors: false, + _title: document.title, + _printAnnotationStoragePromise: null, + _touchInfo: null, + _isCtrlKeyDown: false, + _nimbusDataPromise: null, + async initialize(appConfig) { + this.preferences = this.externalServices.createPreferences(); + this.appConfig = appConfig; + await this._initializeOptions(); + this._forceCssTheme(); + await this._initializeL10n(); + if (this.isViewerEmbedded && _app_options.AppOptions.get("externalLinkTarget") === _pdf_link_service.LinkTarget.NONE) { + _app_options.AppOptions.set("externalLinkTarget", _pdf_link_service.LinkTarget.TOP); + } + await this._initializeViewerComponents(); + this.bindEvents(); + this.bindWindowEvents(); + const appContainer = appConfig.appContainer || document.documentElement; + this.l10n.translate(appContainer).then(() => { + this.eventBus.dispatch("localized", { + source: this + }); + }); + this._initializedCapability.resolve(); + }, + async _initializeOptions() { + if (_app_options.AppOptions.get("disablePreferences")) { + if (_app_options.AppOptions.get("pdfBugEnabled")) { + await this._parseHashParams(); + } + return; + } + if (_app_options.AppOptions._hasUserOptions()) { + console.warn("_initializeOptions: The Preferences may override manually set AppOptions; " + 'please use the "disablePreferences"-option in order to prevent that.'); + } + try { + _app_options.AppOptions.setAll(await this.preferences.getAll()); + } catch (reason) { + console.error(`_initializeOptions: "${reason.message}".`); + } + if (_app_options.AppOptions.get("pdfBugEnabled")) { + await this._parseHashParams(); + } + }, + async _parseHashParams() { + const hash = document.location.hash.substring(1); + if (!hash) { + return; + } + const { + mainContainer, + viewerContainer + } = this.appConfig, + params = (0, _ui_utils.parseQueryString)(hash); + if (params.get("disableworker") === "true") { + try { + await loadFakeWorker(); + } catch (ex) { + console.error(`_parseHashParams: "${ex.message}".`); + } + } + if (params.has("disablerange")) { + _app_options.AppOptions.set("disableRange", params.get("disablerange") === "true"); + } + if (params.has("disablestream")) { + _app_options.AppOptions.set("disableStream", params.get("disablestream") === "true"); + } + if (params.has("disableautofetch")) { + _app_options.AppOptions.set("disableAutoFetch", params.get("disableautofetch") === "true"); + } + if (params.has("disablefontface")) { + _app_options.AppOptions.set("disableFontFace", params.get("disablefontface") === "true"); + } + if (params.has("disablehistory")) { + _app_options.AppOptions.set("disableHistory", params.get("disablehistory") === "true"); + } + if (params.has("verbosity")) { + _app_options.AppOptions.set("verbosity", params.get("verbosity") | 0); + } + if (params.has("textlayer")) { + switch (params.get("textlayer")) { + case "off": + _app_options.AppOptions.set("textLayerMode", _ui_utils.TextLayerMode.DISABLE); + break; + case "visible": + case "shadow": + case "hover": + viewerContainer.classList.add(`textLayer-${params.get("textlayer")}`); + try { + await loadPDFBug(this); + this._PDFBug.loadCSS(); + } catch (ex) { + console.error(`_parseHashParams: "${ex.message}".`); + } + break; + } + } + if (params.has("pdfbug")) { + _app_options.AppOptions.set("pdfBug", true); + _app_options.AppOptions.set("fontExtraProperties", true); + const enabled = params.get("pdfbug").split(","); + try { + await loadPDFBug(this); + this._PDFBug.init(mainContainer, enabled); + } catch (ex) { + console.error(`_parseHashParams: "${ex.message}".`); + } + } + if (params.has("locale")) { + _app_options.AppOptions.set("locale", params.get("locale")); + } + }, + async _initializeL10n() { + this.l10n = this.externalServices.createL10n({ + locale: _app_options.AppOptions.get("locale") + }); + const dir = await this.l10n.getDirection(); + document.getElementsByTagName("html")[0].dir = dir; + }, + _forceCssTheme() { + const cssTheme = _app_options.AppOptions.get("viewerCssTheme"); + if (cssTheme === ViewerCssTheme.AUTOMATIC || !Object.values(ViewerCssTheme).includes(cssTheme)) { + return; + } + try { + const styleSheet = document.styleSheets[0]; + const cssRules = styleSheet?.cssRules || []; + for (let i = 0, ii = cssRules.length; i < ii; i++) { + const rule = cssRules[i]; + if (rule instanceof CSSMediaRule && rule.media?.[0] === "(prefers-color-scheme: dark)") { + if (cssTheme === ViewerCssTheme.LIGHT) { + styleSheet.deleteRule(i); + return; + } + const darkRules = /^@media \(prefers-color-scheme: dark\) {\n\s*([\w\s-.,:;/\\{}()]+)\n}$/.exec(rule.cssText); + if (darkRules?.[1]) { + styleSheet.deleteRule(i); + styleSheet.insertRule(darkRules[1], i); + } + return; + } + } + } catch (reason) { + console.error(`_forceCssTheme: "${reason?.message}".`); + } + }, + async _initializeViewerComponents() { + const { + appConfig, + externalServices, + l10n + } = this; + const eventBus = externalServices.isInAutomation ? new _event_utils.AutomationEventBus() : new _event_utils.EventBus(); + this.eventBus = eventBus; + this.overlayManager = new _overlay_manager.OverlayManager(); + const pdfRenderingQueue = new _pdf_rendering_queue.PDFRenderingQueue(); + pdfRenderingQueue.onIdle = this._cleanup.bind(this); + this.pdfRenderingQueue = pdfRenderingQueue; + const pdfLinkService = new _pdf_link_service.PDFLinkService({ + eventBus, + externalLinkTarget: _app_options.AppOptions.get("externalLinkTarget"), + externalLinkRel: _app_options.AppOptions.get("externalLinkRel"), + ignoreDestinationZoom: _app_options.AppOptions.get("ignoreDestinationZoom") + }); + this.pdfLinkService = pdfLinkService; + const downloadManager = externalServices.createDownloadManager(); + this.downloadManager = downloadManager; + const findController = new _pdf_find_controller.PDFFindController({ + linkService: pdfLinkService, + eventBus, + updateMatchesCountOnProgress: true + }); + this.findController = findController; + const pdfScriptingManager = new _pdf_scripting_manager.PDFScriptingManager({ + eventBus, + sandboxBundleSrc: _app_options.AppOptions.get("sandboxBundleSrc"), + externalServices, + docProperties: this._scriptingDocProperties.bind(this) + }); + this.pdfScriptingManager = pdfScriptingManager; + const container = appConfig.mainContainer, + viewer = appConfig.viewerContainer; + const annotationEditorMode = _app_options.AppOptions.get("annotationEditorMode"); + const isOffscreenCanvasSupported = _app_options.AppOptions.get("isOffscreenCanvasSupported") && _pdfjsLib.FeatureTest.isOffscreenCanvasSupported; + const pageColors = _app_options.AppOptions.get("forcePageColors") || window.matchMedia("(forced-colors: active)").matches ? { + background: _app_options.AppOptions.get("pageColorsBackground"), + foreground: _app_options.AppOptions.get("pageColorsForeground") + } : null; + const altTextManager = appConfig.altTextDialog ? new _webAlt_text_manager.AltTextManager(appConfig.altTextDialog, container, this.overlayManager, eventBus) : null; + const pdfViewer = new _pdf_viewer.PDFViewer({ + container, + viewer, + eventBus, + renderingQueue: pdfRenderingQueue, + linkService: pdfLinkService, + downloadManager, + altTextManager, + findController, + scriptingManager: _app_options.AppOptions.get("enableScripting") && pdfScriptingManager, + l10n, + textLayerMode: _app_options.AppOptions.get("textLayerMode"), + annotationMode: _app_options.AppOptions.get("annotationMode"), + annotationEditorMode, + imageResourcesPath: _app_options.AppOptions.get("imageResourcesPath"), + enablePrintAutoRotate: _app_options.AppOptions.get("enablePrintAutoRotate"), + isOffscreenCanvasSupported, + maxCanvasPixels: _app_options.AppOptions.get("maxCanvasPixels"), + enablePermissions: _app_options.AppOptions.get("enablePermissions"), + pageColors + }); + this.pdfViewer = pdfViewer; + pdfRenderingQueue.setViewer(pdfViewer); + pdfLinkService.setViewer(pdfViewer); + pdfScriptingManager.setViewer(pdfViewer); + if (appConfig.sidebar?.thumbnailView) { + this.pdfThumbnailViewer = new _webPdf_thumbnail_viewer.PDFThumbnailViewer({ + container: appConfig.sidebar.thumbnailView, + eventBus, + renderingQueue: pdfRenderingQueue, + linkService: pdfLinkService, + l10n, + pageColors + }); + pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); + } + if (!this.isViewerEmbedded && !_app_options.AppOptions.get("disableHistory")) { + this.pdfHistory = new _pdf_history.PDFHistory({ + linkService: pdfLinkService, + eventBus + }); + pdfLinkService.setHistory(this.pdfHistory); + } + if (!this.supportsIntegratedFind && appConfig.findBar) { + this.findBar = new _webPdf_find_bar.PDFFindBar(appConfig.findBar, eventBus, l10n); + } + if (appConfig.annotationEditorParams) { + if (annotationEditorMode !== _pdfjsLib.AnnotationEditorType.DISABLE) { + if (_app_options.AppOptions.get("enableStampEditor") && isOffscreenCanvasSupported) { + appConfig.toolbar?.editorStampButton?.classList.remove("hidden"); + } + this.annotationEditorParams = new _webAnnotation_editor_params.AnnotationEditorParams(appConfig.annotationEditorParams, eventBus); + } else { + for (const id of ["editorModeButtons", "editorModeSeparator"]) { + document.getElementById(id)?.classList.add("hidden"); + } + } + } + if (appConfig.documentProperties) { + this.pdfDocumentProperties = new _webPdf_document_properties.PDFDocumentProperties(appConfig.documentProperties, this.overlayManager, eventBus, l10n, () => this._docFilename); + } + if (appConfig.secondaryToolbar?.cursorHandToolButton) { + this.pdfCursorTools = new _webPdf_cursor_tools.PDFCursorTools({ + container, + eventBus, + cursorToolOnLoad: _app_options.AppOptions.get("cursorToolOnLoad") + }); + } + if (appConfig.toolbar) { + this.toolbar = new _webToolbar.Toolbar(appConfig.toolbar, eventBus, l10n); + } + if (appConfig.secondaryToolbar) { + this.secondaryToolbar = new _webSecondary_toolbar.SecondaryToolbar(appConfig.secondaryToolbar, eventBus); + } + if (this.supportsFullscreen && appConfig.secondaryToolbar?.presentationModeButton) { + this.pdfPresentationMode = new _webPdf_presentation_mode.PDFPresentationMode({ + container, + pdfViewer, + eventBus + }); + } + if (appConfig.passwordOverlay) { + this.passwordPrompt = new _password_prompt.PasswordPrompt(appConfig.passwordOverlay, this.overlayManager, l10n, this.isViewerEmbedded); + } + if (appConfig.sidebar?.outlineView) { + this.pdfOutlineViewer = new _webPdf_outline_viewer.PDFOutlineViewer({ + container: appConfig.sidebar.outlineView, + eventBus, + linkService: pdfLinkService, + downloadManager + }); + } + if (appConfig.sidebar?.attachmentsView) { + this.pdfAttachmentViewer = new _webPdf_attachment_viewer.PDFAttachmentViewer({ + container: appConfig.sidebar.attachmentsView, + eventBus, + downloadManager + }); + } + if (appConfig.sidebar?.layersView) { + this.pdfLayerViewer = new _webPdf_layer_viewer.PDFLayerViewer({ + container: appConfig.sidebar.layersView, + eventBus, + l10n + }); + } + if (appConfig.sidebar) { + this.pdfSidebar = new _webPdf_sidebar.PDFSidebar({ + elements: appConfig.sidebar, + eventBus, + l10n + }); + this.pdfSidebar.onToggled = this.forceRendering.bind(this); + this.pdfSidebar.onUpdateThumbnails = () => { + for (const pageView of pdfViewer.getCachedPageViews()) { + if (pageView.renderingState === _ui_utils.RenderingStates.FINISHED) { + this.pdfThumbnailViewer.getThumbnail(pageView.id - 1)?.setImage(pageView); + } + } + this.pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber); + }; + } + }, + async run(config) { + await this.initialize(config); + const { + appConfig, + eventBus + } = this; + let file; + const queryString = document.location.search.substring(1); + const params = (0, _ui_utils.parseQueryString)(queryString); + file = params.get("file") ?? _app_options.AppOptions.get("defaultUrl"); + validateFileURL(file); + const fileInput = appConfig.openFileInput; + fileInput.value = null; + fileInput.addEventListener("change", function (evt) { + const { + files + } = evt.target; + if (!files || files.length === 0) { + return; + } + eventBus.dispatch("fileinputchange", { + source: this, + fileInput: evt.target + }); + }); + appConfig.mainContainer.addEventListener("dragover", function (evt) { + evt.preventDefault(); + evt.dataTransfer.dropEffect = evt.dataTransfer.effectAllowed === "copy" ? "copy" : "move"; + }); + appConfig.mainContainer.addEventListener("drop", function (evt) { + evt.preventDefault(); + const { + files + } = evt.dataTransfer; + if (!files || files.length === 0) { + return; + } + eventBus.dispatch("fileinputchange", { + source: this, + fileInput: evt.dataTransfer + }); + }); + if (!this.supportsDocumentFonts) { + _app_options.AppOptions.set("disableFontFace", true); + this.l10n.get("web_fonts_disabled").then(msg => { + console.warn(msg); + }); + } + if (!this.supportsPrinting) { + appConfig.toolbar?.print?.classList.add("hidden"); + appConfig.secondaryToolbar?.printButton.classList.add("hidden"); + } + if (!this.supportsFullscreen) { + appConfig.secondaryToolbar?.presentationModeButton.classList.add("hidden"); + } + if (this.supportsIntegratedFind) { + appConfig.toolbar?.viewFind?.classList.add("hidden"); + } + appConfig.mainContainer.addEventListener("transitionend", function (evt) { + if (evt.target === this) { + eventBus.dispatch("resize", { + source: this + }); + } + }, true); + if (file) { + this.open({ + url: file + }); + } else { + this._hideViewBookmark(); + } + }, + get initialized() { + return this._initializedCapability.settled; + }, + get initializedPromise() { + return this._initializedCapability.promise; + }, + zoomIn(steps, scaleFactor) { + if (this.pdfViewer.isInPresentationMode) { + return; + } + this.pdfViewer.increaseScale({ + drawingDelay: _app_options.AppOptions.get("defaultZoomDelay"), + steps, + scaleFactor + }); + }, + zoomOut(steps, scaleFactor) { + if (this.pdfViewer.isInPresentationMode) { + return; + } + this.pdfViewer.decreaseScale({ + drawingDelay: _app_options.AppOptions.get("defaultZoomDelay"), + steps, + scaleFactor + }); + }, + zoomReset() { + if (this.pdfViewer.isInPresentationMode) { + return; + } + this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE; + }, + get pagesCount() { + return this.pdfDocument ? this.pdfDocument.numPages : 0; + }, + get page() { + return this.pdfViewer.currentPageNumber; + }, + set page(val) { + this.pdfViewer.currentPageNumber = val; + }, + get supportsPrinting() { + return PDFPrintServiceFactory.instance.supportsPrinting; + }, + get supportsFullscreen() { + return (0, _pdfjsLib.shadow)(this, "supportsFullscreen", document.fullscreenEnabled); + }, + get supportsPinchToZoom() { + return this.externalServices.supportsPinchToZoom; + }, + get supportsIntegratedFind() { + return this.externalServices.supportsIntegratedFind; + }, + get supportsDocumentFonts() { + return this.externalServices.supportsDocumentFonts; + }, + get loadingBar() { + const barElement = document.getElementById("loadingBar"); + const bar = barElement ? new _ui_utils.ProgressBar(barElement) : null; + return (0, _pdfjsLib.shadow)(this, "loadingBar", bar); + }, + get supportedMouseWheelZoomModifierKeys() { + return this.externalServices.supportedMouseWheelZoomModifierKeys; + }, + initPassiveLoading(file) { + throw new Error("Not implemented: initPassiveLoading"); + }, + setTitleUsingUrl(url = "", downloadUrl = null) { + this.url = url; + this.baseUrl = url.split("#")[0]; + if (downloadUrl) { + this._downloadUrl = downloadUrl === url ? this.baseUrl : downloadUrl.split("#")[0]; + } + if ((0, _pdfjsLib.isDataScheme)(url)) { + this._hideViewBookmark(); + } + let title = (0, _pdfjsLib.getPdfFilenameFromUrl)(url, ""); + if (!title) { + try { + title = decodeURIComponent((0, _pdfjsLib.getFilenameFromUrl)(url)) || url; + } catch { + title = url; + } + } + this.setTitle(title); + }, + setTitle(title = this._title) { + this._title = title; + if (this.isViewerEmbedded) { + return; + } + const editorIndicator = this._hasAnnotationEditors && !this.pdfRenderingQueue.printing; + document.title = `${editorIndicator ? "* " : ""}${title}`; + }, + get _docFilename() { + return this._contentDispositionFilename || (0, _pdfjsLib.getPdfFilenameFromUrl)(this.url); + }, + _hideViewBookmark() { + const { + secondaryToolbar + } = this.appConfig; + secondaryToolbar?.viewBookmarkButton.classList.add("hidden"); + if (secondaryToolbar?.presentationModeButton.classList.contains("hidden")) { + document.getElementById("viewBookmarkSeparator")?.classList.add("hidden"); + } + }, + async close() { + this._unblockDocumentLoadEvent(); + this._hideViewBookmark(); + if (!this.pdfLoadingTask) { + return; + } + if (this.pdfDocument?.annotationStorage.size > 0 && this._annotationStorageModified) { + try { + await this.save(); + } catch { + } + } + const promises = []; + promises.push(this.pdfLoadingTask.destroy()); + this.pdfLoadingTask = null; + if (this.pdfDocument) { + this.pdfDocument = null; + this.pdfThumbnailViewer?.setDocument(null); + this.pdfViewer.setDocument(null); + this.pdfLinkService.setDocument(null); + this.pdfDocumentProperties?.setDocument(null); + } + this.pdfLinkService.externalLinkEnabled = true; + this.store = null; + this.isInitialViewSet = false; + this.downloadComplete = false; + this.url = ""; + this.baseUrl = ""; + this._downloadUrl = ""; + this.documentInfo = null; + this.metadata = null; + this._contentDispositionFilename = null; + this._contentLength = null; + this._saveInProgress = false; + this._hasAnnotationEditors = false; + promises.push(this.pdfScriptingManager.destroyPromise, this.passwordPrompt.close()); + this.setTitle(); + this.pdfSidebar?.reset(); + this.pdfOutlineViewer?.reset(); + this.pdfAttachmentViewer?.reset(); + this.pdfLayerViewer?.reset(); + this.pdfHistory?.reset(); + this.findBar?.reset(); + this.toolbar?.reset(); + this.secondaryToolbar?.reset(); + this._PDFBug?.cleanup(); + await Promise.all(promises); + }, + async open(args) { + let deprecatedArgs = false; + if (typeof args === "string") { + args = { + url: args + }; + deprecatedArgs = true; + } else if (args?.byteLength) { + args = { + data: args + }; + deprecatedArgs = true; + } + if (deprecatedArgs) { + console.error("The `PDFViewerApplication.open` signature was updated, please use an object instead."); + } + if (this.pdfLoadingTask) { + await this.close(); + } + const workerParams = _app_options.AppOptions.getAll(_app_options.OptionKind.WORKER); + Object.assign(_pdfjsLib.GlobalWorkerOptions, workerParams); + if (args.url) { + this.setTitleUsingUrl(args.originalUrl || args.url, args.url); + } + const apiParams = _app_options.AppOptions.getAll(_app_options.OptionKind.API); + const params = { + canvasMaxAreaInBytes: this.externalServices.canvasMaxAreaInBytes, + ...apiParams, + ...args + }; + const loadingTask = (0, _pdfjsLib.getDocument)(params); + this.pdfLoadingTask = loadingTask; + loadingTask.onPassword = (updateCallback, reason) => { + if (this.isViewerEmbedded) { + this._unblockDocumentLoadEvent(); + } + this.pdfLinkService.externalLinkEnabled = false; + this.passwordPrompt.setUpdateCallback(updateCallback, reason); + this.passwordPrompt.open(); + }; + loadingTask.onProgress = ({ + loaded, + total + }) => { + this.progress(loaded / total); + }; + return loadingTask.promise.then(pdfDocument => { + this.load(pdfDocument); + }, reason => { + if (loadingTask !== this.pdfLoadingTask) { + return undefined; + } + let key = "loading_error"; + if (reason instanceof _pdfjsLib.InvalidPDFException) { + key = "invalid_file_error"; + } else if (reason instanceof _pdfjsLib.MissingPDFException) { + key = "missing_file_error"; + } else if (reason instanceof _pdfjsLib.UnexpectedResponseException) { + key = "unexpected_response_error"; + } + return this.l10n.get(key).then(msg => { + this._documentError(msg, { + message: reason?.message + }); + throw reason; + }); + }); + }, + _ensureDownloadComplete() { + if (this.pdfDocument && this.downloadComplete) { + return; + } + throw new Error("PDF document not downloaded."); + }, + async download(options = {}) { + const url = this._downloadUrl, + filename = this._docFilename; + try { + this._ensureDownloadComplete(); + const data = await this.pdfDocument.getData(); + const blob = new Blob([data], { + type: "application/pdf" + }); + await this.downloadManager.download(blob, url, filename, options); + } catch { + await this.downloadManager.downloadUrl(url, filename, options); + } + }, + async save(options = {}) { + if (this._saveInProgress) { + return; + } + this._saveInProgress = true; + await this.pdfScriptingManager.dispatchWillSave(); + const url = this._downloadUrl, + filename = this._docFilename; + try { + this._ensureDownloadComplete(); + const data = await this.pdfDocument.saveDocument(); + const blob = new Blob([data], { + type: "application/pdf" + }); + await this.downloadManager.download(blob, url, filename, options); + } catch (reason) { + console.error(`Error when saving the document: ${reason.message}`); + await this.download(options); + } finally { + await this.pdfScriptingManager.dispatchDidSave(); + this._saveInProgress = false; + } + if (this._hasAnnotationEditors) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { + type: "save" + } + }); + } + }, + downloadOrSave(options = {}) { + if (this.pdfDocument?.annotationStorage.size > 0) { + this.save(options); + } else { + this.download(options); + } + }, + openInExternalApp() { + this.downloadOrSave({ + openInExternalApp: true + }); + }, + _documentError(message, moreInfo = null) { + this._unblockDocumentLoadEvent(); + this._otherError(message, moreInfo); + this.eventBus.dispatch("documenterror", { + source: this, + message, + reason: moreInfo?.message ?? null + }); + }, + _otherError(message, moreInfo = null) { + const moreInfoText = [`PDF.js v${_pdfjsLib.version || "?"} (build: ${_pdfjsLib.build || "?"})`]; + if (moreInfo) { + moreInfoText.push(`Message: ${moreInfo.message}`); + if (moreInfo.stack) { + moreInfoText.push(`Stack: ${moreInfo.stack}`); + } else { + if (moreInfo.filename) { + moreInfoText.push(`File: ${moreInfo.filename}`); + } + if (moreInfo.lineNumber) { + moreInfoText.push(`Line: ${moreInfo.lineNumber}`); + } + } + } + console.error(`${message}\n\n${moreInfoText.join("\n")}`); + }, + progress(level) { + if (!this.loadingBar || this.downloadComplete) { + return; + } + const percent = Math.round(level * 100); + if (percent <= this.loadingBar.percent) { + return; + } + this.loadingBar.percent = percent; + if (this.pdfDocument?.loadingParams.disableAutoFetch ?? _app_options.AppOptions.get("disableAutoFetch")) { + this.loadingBar.setDisableAutoFetch(); + } + }, + load(pdfDocument) { + this.pdfDocument = pdfDocument; + pdfDocument.getDownloadInfo().then(({ + length + }) => { + this._contentLength = length; + this.downloadComplete = true; + this.loadingBar?.hide(); + firstPagePromise.then(() => { + this.eventBus.dispatch("documentloaded", { + source: this + }); + }); + }); + const pageLayoutPromise = pdfDocument.getPageLayout().catch(() => { + }); + const pageModePromise = pdfDocument.getPageMode().catch(() => { + }); + const openActionPromise = pdfDocument.getOpenAction().catch(() => { + }); + this.toolbar?.setPagesCount(pdfDocument.numPages, false); + this.secondaryToolbar?.setPagesCount(pdfDocument.numPages); + this.pdfLinkService.setDocument(pdfDocument); + this.pdfDocumentProperties?.setDocument(pdfDocument); + const pdfViewer = this.pdfViewer; + pdfViewer.setDocument(pdfDocument); + const { + firstPagePromise, + onePageRendered, + pagesPromise + } = pdfViewer; + this.pdfThumbnailViewer?.setDocument(pdfDocument); + const storedPromise = (this.store = new _view_history.ViewHistory(pdfDocument.fingerprints[0])).getMultiple({ + page: null, + zoom: _ui_utils.DEFAULT_SCALE_VALUE, + scrollLeft: "0", + scrollTop: "0", + rotation: null, + sidebarView: _ui_utils.SidebarView.UNKNOWN, + scrollMode: _ui_utils.ScrollMode.UNKNOWN, + spreadMode: _ui_utils.SpreadMode.UNKNOWN + }).catch(() => { + }); + firstPagePromise.then(pdfPage => { + this.loadingBar?.setWidth(this.appConfig.viewerContainer); + this._initializeAnnotationStorageCallbacks(pdfDocument); + Promise.all([_ui_utils.animationStarted, storedPromise, pageLayoutPromise, pageModePromise, openActionPromise]).then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => { + const viewOnLoad = _app_options.AppOptions.get("viewOnLoad"); + this._initializePdfHistory({ + fingerprint: pdfDocument.fingerprints[0], + viewOnLoad, + initialDest: openAction?.dest + }); + const initialBookmark = this.initialBookmark; + const zoom = _app_options.AppOptions.get("defaultZoomValue"); + let hash = zoom ? `zoom=${zoom}` : null; + let rotation = null; + let sidebarView = _app_options.AppOptions.get("sidebarViewOnLoad"); + let scrollMode = _app_options.AppOptions.get("scrollModeOnLoad"); + let spreadMode = _app_options.AppOptions.get("spreadModeOnLoad"); + if (stored?.page && viewOnLoad !== ViewOnLoad.INITIAL) { + hash = `page=${stored.page}&zoom=${zoom || stored.zoom},` + `${stored.scrollLeft},${stored.scrollTop}`; + rotation = parseInt(stored.rotation, 10); + if (sidebarView === _ui_utils.SidebarView.UNKNOWN) { + sidebarView = stored.sidebarView | 0; + } + if (scrollMode === _ui_utils.ScrollMode.UNKNOWN) { + scrollMode = stored.scrollMode | 0; + } + if (spreadMode === _ui_utils.SpreadMode.UNKNOWN) { + spreadMode = stored.spreadMode | 0; + } + } + if (pageMode && sidebarView === _ui_utils.SidebarView.UNKNOWN) { + sidebarView = (0, _ui_utils.apiPageModeToSidebarView)(pageMode); + } + if (pageLayout && scrollMode === _ui_utils.ScrollMode.UNKNOWN && spreadMode === _ui_utils.SpreadMode.UNKNOWN) { + const modes = (0, _ui_utils.apiPageLayoutToViewerModes)(pageLayout); + spreadMode = modes.spreadMode; + } + this.setInitialView(hash, { + rotation, + sidebarView, + scrollMode, + spreadMode + }); + this.eventBus.dispatch("documentinit", { + source: this + }); + if (!this.isViewerEmbedded) { + pdfViewer.focus(); + } + await Promise.race([pagesPromise, new Promise(resolve => { + setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT); + })]); + if (!initialBookmark && !hash) { + return; + } + if (pdfViewer.hasEqualPageSizes) { + return; + } + this.initialBookmark = initialBookmark; + pdfViewer.currentScaleValue = pdfViewer.currentScaleValue; + this.setInitialView(hash); + }).catch(() => { + this.setInitialView(); + }).then(function () { + pdfViewer.update(); + }); + }); + pagesPromise.then(() => { + this._unblockDocumentLoadEvent(); + this._initializeAutoPrint(pdfDocument, openActionPromise); + }, reason => { + this.l10n.get("loading_error").then(msg => { + this._documentError(msg, { + message: reason?.message + }); + }); + }); + onePageRendered.then(data => { + this.externalServices.reportTelemetry({ + type: "pageInfo", + timestamp: data.timestamp + }); + if (this.pdfOutlineViewer) { + pdfDocument.getOutline().then(outline => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfOutlineViewer.render({ + outline, + pdfDocument + }); + }); + } + if (this.pdfAttachmentViewer) { + pdfDocument.getAttachments().then(attachments => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfAttachmentViewer.render({ + attachments + }); + }); + } + if (this.pdfLayerViewer) { + pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfLayerViewer.render({ + optionalContentConfig, + pdfDocument + }); + }); + } + }); + this._initializePageLabels(pdfDocument); + this._initializeMetadata(pdfDocument); + }, + async _scriptingDocProperties(pdfDocument) { + if (!this.documentInfo) { + await new Promise(resolve => { + this.eventBus._on("metadataloaded", resolve, { + once: true + }); + }); + if (pdfDocument !== this.pdfDocument) { + return null; + } + } + if (!this._contentLength) { + await new Promise(resolve => { + this.eventBus._on("documentloaded", resolve, { + once: true + }); + }); + if (pdfDocument !== this.pdfDocument) { + return null; + } + } + return { + ...this.documentInfo, + baseURL: this.baseUrl, + filesize: this._contentLength, + filename: this._docFilename, + metadata: this.metadata?.getRaw(), + authors: this.metadata?.get("dc:creator"), + numPages: this.pagesCount, + URL: this.url + }; + }, + async _initializeAutoPrint(pdfDocument, openActionPromise) { + const [openAction, jsActions] = await Promise.all([openActionPromise, this.pdfViewer.enableScripting ? null : pdfDocument.getJSActions()]); + if (pdfDocument !== this.pdfDocument) { + return; + } + let triggerAutoPrint = openAction?.action === "Print"; + if (jsActions) { + console.warn("Warning: JavaScript support is not enabled"); + for (const name in jsActions) { + if (triggerAutoPrint) { + break; + } + switch (name) { + case "WillClose": + case "WillSave": + case "DidSave": + case "WillPrint": + case "DidPrint": + continue; + } + triggerAutoPrint = jsActions[name].some(js => _ui_utils.AutoPrintRegExp.test(js)); + } + } + if (triggerAutoPrint) { + this.triggerPrinting(); + } + }, + async _initializeMetadata(pdfDocument) { + const { + info, + metadata, + contentDispositionFilename, + contentLength + } = await pdfDocument.getMetadata(); + if (pdfDocument !== this.pdfDocument) { + return; + } + this.documentInfo = info; + this.metadata = metadata; + this._contentDispositionFilename ??= contentDispositionFilename; + this._contentLength ??= contentLength; + console.log(`PDF ${pdfDocument.fingerprints[0]} [${info.PDFFormatVersion} ` + `${(info.Producer || "-").trim()} / ${(info.Creator || "-").trim()}] ` + `(PDF.js: ${_pdfjsLib.version || "?"} [${_pdfjsLib.build || "?"}])`); + let pdfTitle = info.Title; + const metadataTitle = metadata?.get("dc:title"); + if (metadataTitle) { + if (metadataTitle !== "Untitled" && !/[\uFFF0-\uFFFF]/g.test(metadataTitle)) { + pdfTitle = metadataTitle; + } + } + if (pdfTitle) { + this.setTitle(`${pdfTitle} - ${this._contentDispositionFilename || this._title}`); + } else if (this._contentDispositionFilename) { + this.setTitle(this._contentDispositionFilename); + } + if (info.IsXFAPresent && !info.IsAcroFormPresent && !pdfDocument.isPureXfa) { + if (pdfDocument.loadingParams.enableXfa) { + console.warn("Warning: XFA Foreground documents are not supported"); + } else { + console.warn("Warning: XFA support is not enabled"); + } + } else if ((info.IsAcroFormPresent || info.IsXFAPresent) && !this.pdfViewer.renderForms) { + console.warn("Warning: Interactive form support is not enabled"); + } + if (info.IsSignaturesPresent) { + console.warn("Warning: Digital signatures validation is not supported"); + } + this.eventBus.dispatch("metadataloaded", { + source: this + }); + }, + async _initializePageLabels(pdfDocument) { + const labels = await pdfDocument.getPageLabels(); + if (pdfDocument !== this.pdfDocument) { + return; + } + if (!labels || _app_options.AppOptions.get("disablePageLabels")) { + return; + } + const numLabels = labels.length; + let standardLabels = 0, + emptyLabels = 0; + for (let i = 0; i < numLabels; i++) { + const label = labels[i]; + if (label === (i + 1).toString()) { + standardLabels++; + } else if (label === "") { + emptyLabels++; + } else { + break; + } + } + if (standardLabels >= numLabels || emptyLabels >= numLabels) { + return; + } + const { + pdfViewer, + pdfThumbnailViewer, + toolbar + } = this; + pdfViewer.setPageLabels(labels); + pdfThumbnailViewer?.setPageLabels(labels); + toolbar?.setPagesCount(numLabels, true); + toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); + }, + _initializePdfHistory({ + fingerprint, + viewOnLoad, + initialDest = null + }) { + if (!this.pdfHistory) { + return; + } + this.pdfHistory.initialize({ + fingerprint, + resetHistory: viewOnLoad === ViewOnLoad.INITIAL, + updateUrl: _app_options.AppOptions.get("historyUpdateUrl") + }); + if (this.pdfHistory.initialBookmark) { + this.initialBookmark = this.pdfHistory.initialBookmark; + this.initialRotation = this.pdfHistory.initialRotation; + } + if (initialDest && !this.initialBookmark && viewOnLoad === ViewOnLoad.UNKNOWN) { + this.initialBookmark = JSON.stringify(initialDest); + this.pdfHistory.push({ + explicitDest: initialDest, + pageNumber: null + }); + } + }, + _initializeAnnotationStorageCallbacks(pdfDocument) { + if (pdfDocument !== this.pdfDocument) { + return; + } + const { + annotationStorage + } = pdfDocument; + annotationStorage.onSetModified = () => { + window.addEventListener("beforeunload", beforeUnload); + this._annotationStorageModified = true; + }; + annotationStorage.onResetModified = () => { + window.removeEventListener("beforeunload", beforeUnload); + delete this._annotationStorageModified; + }; + annotationStorage.onAnnotationEditor = typeStr => { + this._hasAnnotationEditors = !!typeStr; + this.setTitle(); + if (typeStr) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { + type: typeStr + } + }); + } + }; + }, + setInitialView(storedHash, { + rotation, + sidebarView, + scrollMode, + spreadMode + } = {}) { + const setRotation = angle => { + if ((0, _ui_utils.isValidRotation)(angle)) { + this.pdfViewer.pagesRotation = angle; + } + }; + const setViewerModes = (scroll, spread) => { + if ((0, _ui_utils.isValidScrollMode)(scroll)) { + this.pdfViewer.scrollMode = scroll; + } + if ((0, _ui_utils.isValidSpreadMode)(spread)) { + this.pdfViewer.spreadMode = spread; + } + }; + this.isInitialViewSet = true; + this.pdfSidebar?.setInitialView(sidebarView); + setViewerModes(scrollMode, spreadMode); + if (this.initialBookmark) { + setRotation(this.initialRotation); + delete this.initialRotation; + this.pdfLinkService.setHash(this.initialBookmark); + this.initialBookmark = null; + } else if (storedHash) { + setRotation(rotation); + this.pdfLinkService.setHash(storedHash); + } + this.toolbar?.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel); + this.secondaryToolbar?.setPageNumber(this.pdfViewer.currentPageNumber); + if (!this.pdfViewer.currentScaleValue) { + this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE; + } + }, + _cleanup() { + if (!this.pdfDocument) { + return; + } + this.pdfViewer.cleanup(); + this.pdfThumbnailViewer?.cleanup(); + this.pdfDocument.cleanup(); + }, + forceRendering() { + this.pdfRenderingQueue.printing = !!this.printService; + this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar?.visibleView === _ui_utils.SidebarView.THUMBS; + this.pdfRenderingQueue.renderHighestPriority(); + }, + beforePrint() { + this._printAnnotationStoragePromise = this.pdfScriptingManager.dispatchWillPrint().catch(() => { + }).then(() => { + return this.pdfDocument?.annotationStorage.print; + }); + if (this.printService) { + return; + } + if (!this.supportsPrinting) { + this.l10n.get("printing_not_supported").then(msg => { + this._otherError(msg); + }); + return; + } + if (!this.pdfViewer.pageViewsReady) { + this.l10n.get("printing_not_ready").then(msg => { + window.alert(msg); + }); + return; + } + const pagesOverview = this.pdfViewer.getPagesOverview(); + const printContainer = this.appConfig.printContainer; + const printResolution = _app_options.AppOptions.get("printResolution"); + const optionalContentConfigPromise = this.pdfViewer.optionalContentConfigPromise; + const printService = PDFPrintServiceFactory.instance.createPrintService(this.pdfDocument, pagesOverview, printContainer, printResolution, optionalContentConfigPromise, this._printAnnotationStoragePromise, this.l10n); + this.printService = printService; + this.forceRendering(); + this.setTitle(); + printService.layout(); + if (this._hasAnnotationEditors) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { + type: "print" + } + }); + } + }, + afterPrint() { + if (this._printAnnotationStoragePromise) { + this._printAnnotationStoragePromise.then(() => { + this.pdfScriptingManager.dispatchDidPrint(); + }); + this._printAnnotationStoragePromise = null; + } + if (this.printService) { + this.printService.destroy(); + this.printService = null; + this.pdfDocument?.annotationStorage.resetModified(); + } + this.forceRendering(); + this.setTitle(); + }, + rotatePages(delta) { + this.pdfViewer.pagesRotation += delta; + }, + requestPresentationMode() { + this.pdfPresentationMode?.request(); + }, + triggerPrinting() { + if (!this.supportsPrinting) { + return; + } + window.print(); + }, + bindEvents() { + const { + eventBus, + _boundEvents + } = this; + _boundEvents.beforePrint = this.beforePrint.bind(this); + _boundEvents.afterPrint = this.afterPrint.bind(this); + eventBus._on("resize", webViewerResize); + eventBus._on("hashchange", webViewerHashchange); + eventBus._on("beforeprint", _boundEvents.beforePrint); + eventBus._on("afterprint", _boundEvents.afterPrint); + eventBus._on("pagerender", webViewerPageRender); + eventBus._on("pagerendered", webViewerPageRendered); + eventBus._on("updateviewarea", webViewerUpdateViewarea); + eventBus._on("pagechanging", webViewerPageChanging); + eventBus._on("scalechanging", webViewerScaleChanging); + eventBus._on("rotationchanging", webViewerRotationChanging); + eventBus._on("sidebarviewchanged", webViewerSidebarViewChanged); + eventBus._on("pagemode", webViewerPageMode); + eventBus._on("namedaction", webViewerNamedAction); + eventBus._on("presentationmodechanged", webViewerPresentationModeChanged); + eventBus._on("presentationmode", webViewerPresentationMode); + eventBus._on("switchannotationeditormode", webViewerSwitchAnnotationEditorMode); + eventBus._on("switchannotationeditorparams", webViewerSwitchAnnotationEditorParams); + eventBus._on("print", webViewerPrint); + eventBus._on("download", webViewerDownload); + eventBus._on("openinexternalapp", webViewerOpenInExternalApp); + eventBus._on("firstpage", webViewerFirstPage); + eventBus._on("lastpage", webViewerLastPage); + eventBus._on("nextpage", webViewerNextPage); + eventBus._on("previouspage", webViewerPreviousPage); + eventBus._on("zoomin", webViewerZoomIn); + eventBus._on("zoomout", webViewerZoomOut); + eventBus._on("zoomreset", webViewerZoomReset); + eventBus._on("pagenumberchanged", webViewerPageNumberChanged); + eventBus._on("scalechanged", webViewerScaleChanged); + eventBus._on("rotatecw", webViewerRotateCw); + eventBus._on("rotateccw", webViewerRotateCcw); + eventBus._on("optionalcontentconfig", webViewerOptionalContentConfig); + eventBus._on("switchscrollmode", webViewerSwitchScrollMode); + eventBus._on("scrollmodechanged", webViewerScrollModeChanged); + eventBus._on("switchspreadmode", webViewerSwitchSpreadMode); + eventBus._on("spreadmodechanged", webViewerSpreadModeChanged); + eventBus._on("documentproperties", webViewerDocumentProperties); + eventBus._on("findfromurlhash", webViewerFindFromUrlHash); + eventBus._on("updatefindmatchescount", webViewerUpdateFindMatchesCount); + eventBus._on("updatefindcontrolstate", webViewerUpdateFindControlState); + if (_app_options.AppOptions.get("pdfBug")) { + _boundEvents.reportPageStatsPDFBug = reportPageStatsPDFBug; + eventBus._on("pagerendered", _boundEvents.reportPageStatsPDFBug); + eventBus._on("pagechanging", _boundEvents.reportPageStatsPDFBug); + } + eventBus._on("fileinputchange", webViewerFileInputChange); + eventBus._on("openfile", webViewerOpenFile); + }, + bindWindowEvents() { + const { + eventBus, + _boundEvents + } = this; + + function addWindowResolutionChange(evt = null) { + if (evt) { + webViewerResolutionChange(evt); + } + const mediaQueryList = window.matchMedia(`(resolution: ${window.devicePixelRatio || 1}dppx)`); + mediaQueryList.addEventListener("change", addWindowResolutionChange, { + once: true + }); + _boundEvents.removeWindowResolutionChange ||= function () { + mediaQueryList.removeEventListener("change", addWindowResolutionChange); + _boundEvents.removeWindowResolutionChange = null; + }; + } + + addWindowResolutionChange(); + _boundEvents.windowResize = () => { + eventBus.dispatch("resize", { + source: window + }); + }; + _boundEvents.windowHashChange = () => { + eventBus.dispatch("hashchange", { + source: window, + hash: document.location.hash.substring(1) + }); + }; + _boundEvents.windowBeforePrint = () => { + eventBus.dispatch("beforeprint", { + source: window + }); + }; + _boundEvents.windowAfterPrint = () => { + eventBus.dispatch("afterprint", { + source: window + }); + }; + _boundEvents.windowUpdateFromSandbox = event => { + eventBus.dispatch("updatefromsandbox", { + source: window, + detail: event.detail + }); + }; + window.addEventListener("visibilitychange", webViewerVisibilityChange); + window.addEventListener("wheel", webViewerWheel, { + passive: false + }); + window.addEventListener("touchstart", webViewerTouchStart, { + passive: false + }); + window.addEventListener("touchmove", webViewerTouchMove, { + passive: false + }); + window.addEventListener("touchend", webViewerTouchEnd, { + passive: false + }); + window.addEventListener("click", webViewerClick); + window.addEventListener("keydown", webViewerKeyDown); + window.addEventListener("keyup", webViewerKeyUp); + window.addEventListener("resize", _boundEvents.windowResize); + window.addEventListener("hashchange", _boundEvents.windowHashChange); + window.addEventListener("beforeprint", _boundEvents.windowBeforePrint); + window.addEventListener("afterprint", _boundEvents.windowAfterPrint); + window.addEventListener("updatefromsandbox", _boundEvents.windowUpdateFromSandbox); + }, + unbindEvents() { + const { + eventBus, + _boundEvents + } = this; + eventBus._off("resize", webViewerResize); + eventBus._off("hashchange", webViewerHashchange); + eventBus._off("beforeprint", _boundEvents.beforePrint); + eventBus._off("afterprint", _boundEvents.afterPrint); + eventBus._off("pagerender", webViewerPageRender); + eventBus._off("pagerendered", webViewerPageRendered); + eventBus._off("updateviewarea", webViewerUpdateViewarea); + eventBus._off("pagechanging", webViewerPageChanging); + eventBus._off("scalechanging", webViewerScaleChanging); + eventBus._off("rotationchanging", webViewerRotationChanging); + eventBus._off("sidebarviewchanged", webViewerSidebarViewChanged); + eventBus._off("pagemode", webViewerPageMode); + eventBus._off("namedaction", webViewerNamedAction); + eventBus._off("presentationmodechanged", webViewerPresentationModeChanged); + eventBus._off("presentationmode", webViewerPresentationMode); + eventBus._off("print", webViewerPrint); + eventBus._off("download", webViewerDownload); + eventBus._off("openinexternalapp", webViewerOpenInExternalApp); + eventBus._off("firstpage", webViewerFirstPage); + eventBus._off("lastpage", webViewerLastPage); + eventBus._off("nextpage", webViewerNextPage); + eventBus._off("previouspage", webViewerPreviousPage); + eventBus._off("zoomin", webViewerZoomIn); + eventBus._off("zoomout", webViewerZoomOut); + eventBus._off("zoomreset", webViewerZoomReset); + eventBus._off("pagenumberchanged", webViewerPageNumberChanged); + eventBus._off("scalechanged", webViewerScaleChanged); + eventBus._off("rotatecw", webViewerRotateCw); + eventBus._off("rotateccw", webViewerRotateCcw); + eventBus._off("optionalcontentconfig", webViewerOptionalContentConfig); + eventBus._off("switchscrollmode", webViewerSwitchScrollMode); + eventBus._off("scrollmodechanged", webViewerScrollModeChanged); + eventBus._off("switchspreadmode", webViewerSwitchSpreadMode); + eventBus._off("spreadmodechanged", webViewerSpreadModeChanged); + eventBus._off("documentproperties", webViewerDocumentProperties); + eventBus._off("findfromurlhash", webViewerFindFromUrlHash); + eventBus._off("updatefindmatchescount", webViewerUpdateFindMatchesCount); + eventBus._off("updatefindcontrolstate", webViewerUpdateFindControlState); + if (_boundEvents.reportPageStatsPDFBug) { + eventBus._off("pagerendered", _boundEvents.reportPageStatsPDFBug); + eventBus._off("pagechanging", _boundEvents.reportPageStatsPDFBug); + _boundEvents.reportPageStatsPDFBug = null; + } + eventBus._off("fileinputchange", webViewerFileInputChange); + eventBus._off("openfile", webViewerOpenFile); + _boundEvents.beforePrint = null; + _boundEvents.afterPrint = null; + }, + unbindWindowEvents() { + const { + _boundEvents + } = this; + window.removeEventListener("visibilitychange", webViewerVisibilityChange); + window.removeEventListener("wheel", webViewerWheel, { + passive: false + }); + window.removeEventListener("touchstart", webViewerTouchStart, { + passive: false + }); + window.removeEventListener("touchmove", webViewerTouchMove, { + passive: false + }); + window.removeEventListener("touchend", webViewerTouchEnd, { + passive: false + }); + window.removeEventListener("click", webViewerClick); + window.removeEventListener("keydown", webViewerKeyDown); + window.removeEventListener("keyup", webViewerKeyUp); + window.removeEventListener("resize", _boundEvents.windowResize); + window.removeEventListener("hashchange", _boundEvents.windowHashChange); + window.removeEventListener("beforeprint", _boundEvents.windowBeforePrint); + window.removeEventListener("afterprint", _boundEvents.windowAfterPrint); + window.removeEventListener("updatefromsandbox", _boundEvents.windowUpdateFromSandbox); + _boundEvents.removeWindowResolutionChange?.(); + _boundEvents.windowResize = null; + _boundEvents.windowHashChange = null; + _boundEvents.windowBeforePrint = null; + _boundEvents.windowAfterPrint = null; + _boundEvents.windowUpdateFromSandbox = null; + }, + _accumulateTicks(ticks, prop) { + if (this[prop] > 0 && ticks < 0 || this[prop] < 0 && ticks > 0) { + this[prop] = 0; + } + this[prop] += ticks; + const wholeTicks = Math.trunc(this[prop]); + this[prop] -= wholeTicks; + return wholeTicks; + }, + _accumulateFactor(previousScale, factor, prop) { + if (factor === 1) { + return 1; + } + if (this[prop] > 1 && factor < 1 || this[prop] < 1 && factor > 1) { + this[prop] = 1; + } + const newFactor = Math.floor(previousScale * factor * this[prop] * 100) / (100 * previousScale); + this[prop] = factor / newFactor; + return newFactor; + }, + _centerAtPos(previousScale, x, y) { + const { + pdfViewer + } = this; + const scaleDiff = pdfViewer.currentScale / previousScale - 1; + if (scaleDiff !== 0) { + const [top, left] = pdfViewer.containerTopLeft; + pdfViewer.container.scrollLeft += (x - left) * scaleDiff; + pdfViewer.container.scrollTop += (y - top) * scaleDiff; + } + }, + _unblockDocumentLoadEvent() { + document.blockUnblockOnload?.(false); + this._unblockDocumentLoadEvent = () => { + }; + }, + get scriptingReady() { + return this.pdfScriptingManager.ready; + } + }; + exports.PDFViewerApplication = PDFViewerApplication; + { + const HOSTED_VIEWER_ORIGINS = ["null", "http://mozilla.github.io", "https://mozilla.github.io"]; + var validateFileURL = function (file) { + if (!file) { + return; + } + try { + const viewerOrigin = new URL(window.location.href).origin || "null"; + if (HOSTED_VIEWER_ORIGINS.includes(viewerOrigin)) { + return; + } + const fileOrigin = new URL(file, window.location.href).origin; + if (fileOrigin !== viewerOrigin) { + throw new Error("file origin does not match viewer's"); + } + } catch (ex) { + PDFViewerApplication.l10n.get("loading_error").then(msg => { + PDFViewerApplication._documentError(msg, { + message: ex?.message + }); + }); + throw ex; + } + }; + } + + async function loadFakeWorker() { + _pdfjsLib.GlobalWorkerOptions.workerSrc ||= _app_options.AppOptions.get("workerSrc"); + await (0, _pdfjsLib.loadScript)(_pdfjsLib.PDFWorker.workerSrc); + } + + async function loadPDFBug(self) { + const { + debuggerScriptPath + } = self.appConfig; + const { + PDFBug + } = await import(debuggerScriptPath); + self._PDFBug = PDFBug; + } + + function reportPageStatsPDFBug({ + pageNumber + }) { + if (!globalThis.Stats?.enabled) { + return; + } + const pageView = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1); + globalThis.Stats.add(pageNumber, pageView?.pdfPage?.stats); + } + + function webViewerPageRender({ + pageNumber + }) { + if (pageNumber === PDFViewerApplication.page) { + PDFViewerApplication.toolbar?.updateLoadingIndicatorState(true); + } + } + + function webViewerPageRendered({ + pageNumber, + error + }) { + if (pageNumber === PDFViewerApplication.page) { + PDFViewerApplication.toolbar?.updateLoadingIndicatorState(false); + } + if (PDFViewerApplication.pdfSidebar?.visibleView === _ui_utils.SidebarView.THUMBS) { + const pageView = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1); + const thumbnailView = PDFViewerApplication.pdfThumbnailViewer?.getThumbnail(pageNumber - 1); + if (pageView) { + thumbnailView?.setImage(pageView); + } + } + if (error) { + PDFViewerApplication.l10n.get("rendering_error").then(msg => { + PDFViewerApplication._otherError(msg, error); + }); + } + } + + function webViewerPageMode({ + mode + }) { + let view; + switch (mode) { + case "thumbs": + view = _ui_utils.SidebarView.THUMBS; + break; + case "bookmarks": + case "outline": + view = _ui_utils.SidebarView.OUTLINE; + break; + case "attachments": + view = _ui_utils.SidebarView.ATTACHMENTS; + break; + case "layers": + view = _ui_utils.SidebarView.LAYERS; + break; + case "none": + view = _ui_utils.SidebarView.NONE; + break; + default: + console.error('Invalid "pagemode" hash parameter: ' + mode); + return; + } + PDFViewerApplication.pdfSidebar?.switchView(view, true); + } + + function webViewerNamedAction(evt) { + switch (evt.action) { + case "GoToPage": + PDFViewerApplication.appConfig.toolbar?.pageNumber.select(); + break; + case "Find": + if (!PDFViewerApplication.supportsIntegratedFind) { + PDFViewerApplication?.findBar.toggle(); + } + break; + case "Print": + PDFViewerApplication.triggerPrinting(); + break; + case "SaveAs": + PDFViewerApplication.downloadOrSave(); + break; + } + } + + function webViewerPresentationModeChanged(evt) { + PDFViewerApplication.pdfViewer.presentationModeState = evt.state; + } + + function webViewerSidebarViewChanged({ + view + }) { + PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled = view === _ui_utils.SidebarView.THUMBS; + if (PDFViewerApplication.isInitialViewSet) { + PDFViewerApplication.store?.set("sidebarView", view).catch(() => { + }); + } + } + + function webViewerUpdateViewarea({ + location + }) { + if (PDFViewerApplication.isInitialViewSet) { + PDFViewerApplication.store?.setMultiple({ + page: location.pageNumber, + zoom: location.scale, + scrollLeft: location.left, + scrollTop: location.top, + rotation: location.rotation + }).catch(() => { + }); + } + if (PDFViewerApplication.appConfig.secondaryToolbar) { + const href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams); + PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href = href; + } + } + + function webViewerScrollModeChanged(evt) { + if (PDFViewerApplication.isInitialViewSet && !PDFViewerApplication.pdfViewer.isInPresentationMode) { + PDFViewerApplication.store?.set("scrollMode", evt.mode).catch(() => { + }); + } + } + + function webViewerSpreadModeChanged(evt) { + if (PDFViewerApplication.isInitialViewSet && !PDFViewerApplication.pdfViewer.isInPresentationMode) { + PDFViewerApplication.store?.set("spreadMode", evt.mode).catch(() => { + }); + } + } + + function webViewerResize() { + const { + pdfDocument, + pdfViewer, + pdfRenderingQueue + } = PDFViewerApplication; + if (pdfRenderingQueue.printing && window.matchMedia("print").matches) { + return; + } + if (!pdfDocument) { + return; + } + const currentScaleValue = pdfViewer.currentScaleValue; + if (currentScaleValue === "auto" || currentScaleValue === "page-fit" || currentScaleValue === "page-width") { + pdfViewer.currentScaleValue = currentScaleValue; + } + pdfViewer.update(); + } + + function webViewerHashchange(evt) { + const hash = evt.hash; + if (!hash) { + return; + } + if (!PDFViewerApplication.isInitialViewSet) { + PDFViewerApplication.initialBookmark = hash; + } else if (!PDFViewerApplication.pdfHistory?.popStateInProgress) { + PDFViewerApplication.pdfLinkService.setHash(hash); + } + } + + { + var webViewerFileInputChange = function (evt) { + if (PDFViewerApplication.pdfViewer?.isInPresentationMode) { + return; + } + const file = evt.fileInput.files[0]; + PDFViewerApplication.open({ + url: URL.createObjectURL(file), + originalUrl: file.name + }); + }; + var webViewerOpenFile = function (evt) { + const fileInput = PDFViewerApplication.appConfig.openFileInput; + fileInput.click(); + }; + } + + function webViewerPresentationMode() { + PDFViewerApplication.requestPresentationMode(); + } + + function webViewerSwitchAnnotationEditorMode(evt) { + PDFViewerApplication.pdfViewer.annotationEditorMode = evt; + } + + function webViewerSwitchAnnotationEditorParams(evt) { + PDFViewerApplication.pdfViewer.annotationEditorParams = evt; + } + + function webViewerPrint() { + PDFViewerApplication.triggerPrinting(); + } + + function webViewerDownload() { + PDFViewerApplication.downloadOrSave(); + } + + function webViewerOpenInExternalApp() { + PDFViewerApplication.openInExternalApp(); + } + + function webViewerFirstPage() { + PDFViewerApplication.page = 1; + } + + function webViewerLastPage() { + PDFViewerApplication.page = PDFViewerApplication.pagesCount; + } + + function webViewerNextPage() { + PDFViewerApplication.pdfViewer.nextPage(); + } + + function webViewerPreviousPage() { + PDFViewerApplication.pdfViewer.previousPage(); + } + + function webViewerZoomIn() { + PDFViewerApplication.zoomIn(); + } + + function webViewerZoomOut() { + PDFViewerApplication.zoomOut(); + } + + function webViewerZoomReset() { + PDFViewerApplication.zoomReset(); + } + + function webViewerPageNumberChanged(evt) { + const pdfViewer = PDFViewerApplication.pdfViewer; + if (evt.value !== "") { + PDFViewerApplication.pdfLinkService.goToPage(evt.value); + } + if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) { + PDFViewerApplication.toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); + } + } + + function webViewerScaleChanged(evt) { + PDFViewerApplication.pdfViewer.currentScaleValue = evt.value; + } + + function webViewerRotateCw() { + PDFViewerApplication.rotatePages(90); + } + + function webViewerRotateCcw() { + PDFViewerApplication.rotatePages(-90); + } + + function webViewerOptionalContentConfig(evt) { + PDFViewerApplication.pdfViewer.optionalContentConfigPromise = evt.promise; + } + + function webViewerSwitchScrollMode(evt) { + PDFViewerApplication.pdfViewer.scrollMode = evt.mode; + } + + function webViewerSwitchSpreadMode(evt) { + PDFViewerApplication.pdfViewer.spreadMode = evt.mode; + } + + function webViewerDocumentProperties() { + PDFViewerApplication.pdfDocumentProperties?.open(); + } + + function webViewerFindFromUrlHash(evt) { + PDFViewerApplication.eventBus.dispatch("find", { + source: evt.source, + type: "", + query: evt.query, + caseSensitive: false, + entireWord: false, + highlightAll: true, + findPrevious: false, + matchDiacritics: true + }); + } + + function webViewerUpdateFindMatchesCount({ + matchesCount + }) { + if (PDFViewerApplication.supportsIntegratedFind) { + PDFViewerApplication.externalServices.updateFindMatchesCount(matchesCount); + } else { + PDFViewerApplication.findBar.updateResultsCount(matchesCount); + } + } + + function webViewerUpdateFindControlState({ + state, + previous, + matchesCount, + rawQuery + }) { + if (PDFViewerApplication.supportsIntegratedFind) { + PDFViewerApplication.externalServices.updateFindControlState({ + result: state, + findPrevious: previous, + matchesCount, + rawQuery + }); + } else { + PDFViewerApplication.findBar?.updateUIState(state, previous, matchesCount); + } + } + + function webViewerScaleChanging(evt) { + PDFViewerApplication.toolbar?.setPageScale(evt.presetValue, evt.scale); + PDFViewerApplication.pdfViewer.update(); + } + + function webViewerRotationChanging(evt) { + if (PDFViewerApplication.pdfThumbnailViewer) { + PDFViewerApplication.pdfThumbnailViewer.pagesRotation = evt.pagesRotation; + } + PDFViewerApplication.forceRendering(); + PDFViewerApplication.pdfViewer.currentPageNumber = evt.pageNumber; + } + + function webViewerPageChanging({ + pageNumber, + pageLabel + }) { + PDFViewerApplication.toolbar?.setPageNumber(pageNumber, pageLabel); + PDFViewerApplication.secondaryToolbar?.setPageNumber(pageNumber); + if (PDFViewerApplication.pdfSidebar?.visibleView === _ui_utils.SidebarView.THUMBS) { + PDFViewerApplication.pdfThumbnailViewer?.scrollThumbnailIntoView(pageNumber); + } + const currentPage = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1); + PDFViewerApplication.toolbar?.updateLoadingIndicatorState(currentPage?.renderingState === _ui_utils.RenderingStates.RUNNING); + } + + function webViewerResolutionChange(evt) { + PDFViewerApplication.pdfViewer.refresh(); + } + + function webViewerVisibilityChange(evt) { + if (document.visibilityState === "visible") { + setZoomDisabledTimeout(); + } + } + + let zoomDisabledTimeout = null; + + function setZoomDisabledTimeout() { + if (zoomDisabledTimeout) { + clearTimeout(zoomDisabledTimeout); + } + zoomDisabledTimeout = setTimeout(function () { + zoomDisabledTimeout = null; + }, WHEEL_ZOOM_DISABLED_TIMEOUT); + } + + function webViewerWheel(evt) { + const { + pdfViewer, + supportedMouseWheelZoomModifierKeys, + supportsPinchToZoom + } = PDFViewerApplication; + if (pdfViewer.isInPresentationMode) { + return; + } + const deltaMode = evt.deltaMode; + let scaleFactor = Math.exp(-evt.deltaY / 100); + const isBuiltInMac = false; + const isPinchToZoom = evt.ctrlKey && !PDFViewerApplication._isCtrlKeyDown && deltaMode === WheelEvent.DOM_DELTA_PIXEL && evt.deltaX === 0 && (Math.abs(scaleFactor - 1) < 0.05 || isBuiltInMac) && evt.deltaZ === 0; + if (isPinchToZoom || evt.ctrlKey && supportedMouseWheelZoomModifierKeys.ctrlKey || evt.metaKey && supportedMouseWheelZoomModifierKeys.metaKey) { + evt.preventDefault(); + if (zoomDisabledTimeout || document.visibilityState === "hidden" || PDFViewerApplication.overlayManager.active) { + return; + } + const previousScale = pdfViewer.currentScale; + if (isPinchToZoom && supportsPinchToZoom) { + scaleFactor = PDFViewerApplication._accumulateFactor(previousScale, scaleFactor, "_wheelUnusedFactor"); + if (scaleFactor < 1) { + PDFViewerApplication.zoomOut(null, scaleFactor); + } else if (scaleFactor > 1) { + PDFViewerApplication.zoomIn(null, scaleFactor); + } else { + return; + } + } else { + const delta = (0, _ui_utils.normalizeWheelEventDirection)(evt); + let ticks = 0; + if (deltaMode === WheelEvent.DOM_DELTA_LINE || deltaMode === WheelEvent.DOM_DELTA_PAGE) { + if (Math.abs(delta) >= 1) { + ticks = Math.sign(delta); + } else { + ticks = PDFViewerApplication._accumulateTicks(delta, "_wheelUnusedTicks"); + } + } else { + const PIXELS_PER_LINE_SCALE = 30; + ticks = PDFViewerApplication._accumulateTicks(delta / PIXELS_PER_LINE_SCALE, "_wheelUnusedTicks"); + } + if (ticks < 0) { + PDFViewerApplication.zoomOut(-ticks); + } else if (ticks > 0) { + PDFViewerApplication.zoomIn(ticks); + } else { + return; + } + } + PDFViewerApplication._centerAtPos(previousScale, evt.clientX, evt.clientY); + } else { + setZoomDisabledTimeout(); + } + } + + function webViewerTouchStart(evt) { + if (PDFViewerApplication.pdfViewer.isInPresentationMode || evt.touches.length < 2) { + return; + } + evt.preventDefault(); + if (evt.touches.length !== 2 || PDFViewerApplication.overlayManager.active) { + PDFViewerApplication._touchInfo = null; + return; + } + let [touch0, touch1] = evt.touches; + if (touch0.identifier > touch1.identifier) { + [touch0, touch1] = [touch1, touch0]; + } + PDFViewerApplication._touchInfo = { + touch0X: touch0.pageX, + touch0Y: touch0.pageY, + touch1X: touch1.pageX, + touch1Y: touch1.pageY + }; + } + + function webViewerTouchMove(evt) { + if (!PDFViewerApplication._touchInfo || evt.touches.length !== 2) { + return; + } + const { + pdfViewer, + _touchInfo, + supportsPinchToZoom + } = PDFViewerApplication; + let [touch0, touch1] = evt.touches; + if (touch0.identifier > touch1.identifier) { + [touch0, touch1] = [touch1, touch0]; + } + const { + pageX: page0X, + pageY: page0Y + } = touch0; + const { + pageX: page1X, + pageY: page1Y + } = touch1; + const { + touch0X: pTouch0X, + touch0Y: pTouch0Y, + touch1X: pTouch1X, + touch1Y: pTouch1Y + } = _touchInfo; + if (Math.abs(pTouch0X - page0X) <= 1 && Math.abs(pTouch0Y - page0Y) <= 1 && Math.abs(pTouch1X - page1X) <= 1 && Math.abs(pTouch1Y - page1Y) <= 1) { + return; + } + _touchInfo.touch0X = page0X; + _touchInfo.touch0Y = page0Y; + _touchInfo.touch1X = page1X; + _touchInfo.touch1Y = page1Y; + if (pTouch0X === page0X && pTouch0Y === page0Y) { + const v1X = pTouch1X - page0X; + const v1Y = pTouch1Y - page0Y; + const v2X = page1X - page0X; + const v2Y = page1Y - page0Y; + const det = v1X * v2Y - v1Y * v2X; + if (Math.abs(det) > 0.02 * Math.hypot(v1X, v1Y) * Math.hypot(v2X, v2Y)) { + return; + } + } else if (pTouch1X === page1X && pTouch1Y === page1Y) { + const v1X = pTouch0X - page1X; + const v1Y = pTouch0Y - page1Y; + const v2X = page0X - page1X; + const v2Y = page0Y - page1Y; + const det = v1X * v2Y - v1Y * v2X; + if (Math.abs(det) > 0.02 * Math.hypot(v1X, v1Y) * Math.hypot(v2X, v2Y)) { + return; + } + } else { + const diff0X = page0X - pTouch0X; + const diff1X = page1X - pTouch1X; + const diff0Y = page0Y - pTouch0Y; + const diff1Y = page1Y - pTouch1Y; + const dotProduct = diff0X * diff1X + diff0Y * diff1Y; + if (dotProduct >= 0) { + return; + } + } + evt.preventDefault(); + const distance = Math.hypot(page0X - page1X, page0Y - page1Y) || 1; + const pDistance = Math.hypot(pTouch0X - pTouch1X, pTouch0Y - pTouch1Y) || 1; + const previousScale = pdfViewer.currentScale; + if (supportsPinchToZoom) { + const newScaleFactor = PDFViewerApplication._accumulateFactor(previousScale, distance / pDistance, "_touchUnusedFactor"); + if (newScaleFactor < 1) { + PDFViewerApplication.zoomOut(null, newScaleFactor); + } else if (newScaleFactor > 1) { + PDFViewerApplication.zoomIn(null, newScaleFactor); + } else { + return; + } + } else { + const PIXELS_PER_LINE_SCALE = 30; + const ticks = PDFViewerApplication._accumulateTicks((distance - pDistance) / PIXELS_PER_LINE_SCALE, "_touchUnusedTicks"); + if (ticks < 0) { + PDFViewerApplication.zoomOut(-ticks); + } else if (ticks > 0) { + PDFViewerApplication.zoomIn(ticks); + } else { + return; + } + } + PDFViewerApplication._centerAtPos(previousScale, (page0X + page1X) / 2, (page0Y + page1Y) / 2); + } + + function webViewerTouchEnd(evt) { + if (!PDFViewerApplication._touchInfo) { + return; + } + evt.preventDefault(); + PDFViewerApplication._touchInfo = null; + PDFViewerApplication._touchUnusedTicks = 0; + PDFViewerApplication._touchUnusedFactor = 1; + } + + function webViewerClick(evt) { + if (!PDFViewerApplication.secondaryToolbar?.isOpen) { + return; + } + const appConfig = PDFViewerApplication.appConfig; + if (PDFViewerApplication.pdfViewer.containsElement(evt.target) || appConfig.toolbar?.container.contains(evt.target) && evt.target !== appConfig.secondaryToolbar?.toggleButton) { + PDFViewerApplication.secondaryToolbar.close(); + } + } + + function webViewerKeyUp(evt) { + if (evt.key === "Control") { + PDFViewerApplication._isCtrlKeyDown = false; + } + } + + function webViewerKeyDown(evt) { + PDFViewerApplication._isCtrlKeyDown = evt.key === "Control"; + if (PDFViewerApplication.overlayManager.active) { + return; + } + const { + eventBus, + pdfViewer + } = PDFViewerApplication; + const isViewerInPresentationMode = pdfViewer.isInPresentationMode; + let handled = false, + ensureViewerFocused = false; + const cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0); + if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) { + switch (evt.keyCode) { + case 70: + if (!PDFViewerApplication.supportsIntegratedFind && !evt.shiftKey) { + PDFViewerApplication.findBar?.open(); + handled = true; + } + break; + case 71: + if (!PDFViewerApplication.supportsIntegratedFind) { + const { + state + } = PDFViewerApplication.findController; + if (state) { + const newState = { + source: window, + type: "again", + findPrevious: cmd === 5 || cmd === 12 + }; + eventBus.dispatch("find", { + ...state, + ...newState + }); + } + handled = true; + } + break; + case 61: + case 107: + case 187: + case 171: + PDFViewerApplication.zoomIn(); + handled = true; + break; + case 173: + case 109: + case 189: + PDFViewerApplication.zoomOut(); + handled = true; + break; + case 48: + case 96: + if (!isViewerInPresentationMode) { + setTimeout(function () { + PDFViewerApplication.zoomReset(); + }); + handled = false; + } + break; + case 38: + if (isViewerInPresentationMode || PDFViewerApplication.page > 1) { + PDFViewerApplication.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 40: + if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) { + PDFViewerApplication.page = PDFViewerApplication.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + } + } + if (cmd === 1 || cmd === 8) { + switch (evt.keyCode) { + case 83: + eventBus.dispatch("download", { + source: window + }); + handled = true; + break; + case 79: { + eventBus.dispatch("openfile", { + source: window + }); + handled = true; + } + break; + } + } + if (cmd === 3 || cmd === 10) { + switch (evt.keyCode) { + case 80: + PDFViewerApplication.requestPresentationMode(); + handled = true; + PDFViewerApplication.externalServices.reportTelemetry({ + type: "buttons", + data: { + id: "presentationModeKeyboard" + } + }); + break; + case 71: + if (PDFViewerApplication.appConfig.toolbar) { + PDFViewerApplication.appConfig.toolbar.pageNumber.select(); + handled = true; + } + break; + } + } + if (handled) { + if (ensureViewerFocused && !isViewerInPresentationMode) { + pdfViewer.focus(); + } + evt.preventDefault(); + return; + } + const curElement = (0, _ui_utils.getActiveOrFocusedElement)(); + const curElementTagName = curElement?.tagName.toUpperCase(); + if (curElementTagName === "INPUT" || curElementTagName === "TEXTAREA" || curElementTagName === "SELECT" || curElement?.isContentEditable) { + if (evt.keyCode !== 27) { + return; + } + } + if (cmd === 0) { + let turnPage = 0, + turnOnlyIfPageFit = false; + switch (evt.keyCode) { + case 38: + case 33: + if (pdfViewer.isVerticalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + turnPage = -1; + break; + case 8: + if (!isViewerInPresentationMode) { + turnOnlyIfPageFit = true; + } + turnPage = -1; + break; + case 37: + if (pdfViewer.isHorizontalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + case 75: + case 80: + turnPage = -1; + break; + case 27: + if (PDFViewerApplication.secondaryToolbar?.isOpen) { + PDFViewerApplication.secondaryToolbar.close(); + handled = true; + } + if (!PDFViewerApplication.supportsIntegratedFind && PDFViewerApplication.findBar?.opened) { + PDFViewerApplication.findBar.close(); + handled = true; + } + break; + case 40: + case 34: + if (pdfViewer.isVerticalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + turnPage = 1; + break; + case 13: + case 32: + if (!isViewerInPresentationMode) { + turnOnlyIfPageFit = true; + } + turnPage = 1; + break; + case 39: + if (pdfViewer.isHorizontalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + case 74: + case 78: + turnPage = 1; + break; + case 36: + if (isViewerInPresentationMode || PDFViewerApplication.page > 1) { + PDFViewerApplication.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 35: + if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) { + PDFViewerApplication.page = PDFViewerApplication.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + case 83: + PDFViewerApplication.pdfCursorTools?.switchTool(_ui_utils.CursorTool.SELECT); + break; + case 72: + PDFViewerApplication.pdfCursorTools?.switchTool(_ui_utils.CursorTool.HAND); + break; + case 82: + PDFViewerApplication.rotatePages(90); + break; + case 115: + PDFViewerApplication.pdfSidebar?.toggle(); + break; + } + if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === "page-fit")) { + if (turnPage > 0) { + pdfViewer.nextPage(); + } else { + pdfViewer.previousPage(); + } + handled = true; + } + } + if (cmd === 4) { + switch (evt.keyCode) { + case 13: + case 32: + if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== "page-fit") { + break; + } + pdfViewer.previousPage(); + handled = true; + break; + case 82: + PDFViewerApplication.rotatePages(-90); + break; + } + } + if (!handled && !isViewerInPresentationMode) { + if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== "BUTTON") { + ensureViewerFocused = true; + } + } + if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) { + pdfViewer.focus(); + } + if (handled) { + evt.preventDefault(); + } + } + + function beforeUnload(evt) { + evt.preventDefault(); + evt.returnValue = ""; + return false; + } + + function webViewerAnnotationEditorStatesChanged(data) { + PDFViewerApplication.externalServices.updateEditorStates(data); + } + + function webViewerReportTelemetry({ + details + }) { + PDFViewerApplication.externalServices.reportTelemetry(details); + } + + const PDFPrintServiceFactory = { + instance: { + supportsPrinting: false, + createPrintService() { + throw new Error("Not implemented: createPrintService"); + } + } + }; + exports.PDFPrintServiceFactory = PDFPrintServiceFactory; + + /***/ + }), + /* 3 */ + /***/ ((__unused_webpack_module, exports) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.animationStarted = exports.VERTICAL_PADDING = exports.UNKNOWN_SCALE = exports.TextLayerMode = exports.SpreadMode = exports.SidebarView = exports.ScrollMode = exports.SCROLLBAR_PADDING = exports.RenderingStates = exports.ProgressBar = exports.PresentationModeState = exports.OutputScale = exports.MIN_SCALE = exports.MAX_SCALE = exports.MAX_AUTO_SCALE = exports.DEFAULT_SCALE_VALUE = exports.DEFAULT_SCALE_DELTA = exports.DEFAULT_SCALE = exports.CursorTool = exports.AutoPrintRegExp = void 0; + exports.apiPageLayoutToViewerModes = apiPageLayoutToViewerModes; + exports.apiPageModeToSidebarView = apiPageModeToSidebarView; + exports.approximateFraction = approximateFraction; + exports.backtrackBeforeAllVisibleElements = backtrackBeforeAllVisibleElements; + exports.binarySearchFirstItem = binarySearchFirstItem; + exports.docStyle = void 0; + exports.getActiveOrFocusedElement = getActiveOrFocusedElement; + exports.getPageSizeInches = getPageSizeInches; + exports.getVisibleElements = getVisibleElements; + exports.isPortraitOrientation = isPortraitOrientation; + exports.isValidRotation = isValidRotation; + exports.isValidScrollMode = isValidScrollMode; + exports.isValidSpreadMode = isValidSpreadMode; + exports.normalizeWheelEventDelta = normalizeWheelEventDelta; + exports.normalizeWheelEventDirection = normalizeWheelEventDirection; + exports.parseQueryString = parseQueryString; + exports.removeNullCharacters = removeNullCharacters; + exports.roundToDivide = roundToDivide; + exports.scrollIntoView = scrollIntoView; + exports.toggleCheckedBtn = toggleCheckedBtn; + exports.toggleExpandedBtn = toggleExpandedBtn; + exports.watchScroll = watchScroll; + const DEFAULT_SCALE_VALUE = "auto"; + exports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE; + const DEFAULT_SCALE = 1.0; + exports.DEFAULT_SCALE = DEFAULT_SCALE; + const DEFAULT_SCALE_DELTA = 1.1; + exports.DEFAULT_SCALE_DELTA = DEFAULT_SCALE_DELTA; + const MIN_SCALE = 0.1; + exports.MIN_SCALE = MIN_SCALE; + const MAX_SCALE = 10.0; + exports.MAX_SCALE = MAX_SCALE; + const UNKNOWN_SCALE = 0; + exports.UNKNOWN_SCALE = UNKNOWN_SCALE; + const MAX_AUTO_SCALE = 1.25; + exports.MAX_AUTO_SCALE = MAX_AUTO_SCALE; + const SCROLLBAR_PADDING = 40; + exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING; + const VERTICAL_PADDING = 5; + exports.VERTICAL_PADDING = VERTICAL_PADDING; + const RenderingStates = { + INITIAL: 0, + RUNNING: 1, + PAUSED: 2, + FINISHED: 3 + }; + exports.RenderingStates = RenderingStates; + const PresentationModeState = { + UNKNOWN: 0, + NORMAL: 1, + CHANGING: 2, + FULLSCREEN: 3 + }; + exports.PresentationModeState = PresentationModeState; + const SidebarView = { + UNKNOWN: -1, + NONE: 0, + THUMBS: 1, + OUTLINE: 2, + ATTACHMENTS: 3, + LAYERS: 4 + }; + exports.SidebarView = SidebarView; + const TextLayerMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_PERMISSIONS: 2 + }; + exports.TextLayerMode = TextLayerMode; + const ScrollMode = { + UNKNOWN: -1, + VERTICAL: 0, + HORIZONTAL: 1, + WRAPPED: 2, + PAGE: 3 + }; + exports.ScrollMode = ScrollMode; + const SpreadMode = { + UNKNOWN: -1, + NONE: 0, + ODD: 1, + EVEN: 2 + }; + exports.SpreadMode = SpreadMode; + const CursorTool = { + SELECT: 0, + HAND: 1, + ZOOM: 2 + }; + exports.CursorTool = CursorTool; + const AutoPrintRegExp = /\bprint\s*\(/; + exports.AutoPrintRegExp = AutoPrintRegExp; + + class OutputScale { + constructor() { + const pixelRatio = window.devicePixelRatio || 1; + this.sx = pixelRatio; + this.sy = pixelRatio; + } + + get scaled() { + return this.sx !== 1 || this.sy !== 1; + } + } + + exports.OutputScale = OutputScale; + + function scrollIntoView(element, spot, scrollMatches = false) { + let parent = element.offsetParent; + if (!parent) { + console.error("offsetParent is not set -- cannot scroll"); + return; + } + let offsetY = element.offsetTop + element.clientTop; + let offsetX = element.offsetLeft + element.clientLeft; + while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || scrollMatches && (parent.classList.contains("markedContent") || getComputedStyle(parent).overflow === "hidden")) { + offsetY += parent.offsetTop; + offsetX += parent.offsetLeft; + parent = parent.offsetParent; + if (!parent) { + return; + } + } + if (spot) { + if (spot.top !== undefined) { + offsetY += spot.top; + } + if (spot.left !== undefined) { + offsetX += spot.left; + parent.scrollLeft = offsetX; + } + } + parent.scrollTop = offsetY; + } + + function watchScroll(viewAreaElement, callback) { + const debounceScroll = function (evt) { + if (rAF) { + return; + } + rAF = window.requestAnimationFrame(function viewAreaElementScrolled() { + rAF = null; + const currentX = viewAreaElement.scrollLeft; + const lastX = state.lastX; + if (currentX !== lastX) { + state.right = currentX > lastX; + } + state.lastX = currentX; + const currentY = viewAreaElement.scrollTop; + const lastY = state.lastY; + if (currentY !== lastY) { + state.down = currentY > lastY; + } + state.lastY = currentY; + callback(state); + }); + }; + const state = { + right: true, + down: true, + lastX: viewAreaElement.scrollLeft, + lastY: viewAreaElement.scrollTop, + _eventHandler: debounceScroll + }; + let rAF = null; + viewAreaElement.addEventListener("scroll", debounceScroll, true); + return state; + } + + function parseQueryString(query) { + const params = new Map(); + for (const [key, value] of new URLSearchParams(query)) { + params.set(key.toLowerCase(), value); + } + return params; + } + + const InvisibleCharactersRegExp = /[\x01-\x1F]/g; + + function removeNullCharacters(str, replaceInvisible = false) { + if (typeof str !== "string") { + console.error(`The argument must be a string.`); + return str; + } + if (replaceInvisible) { + str = str.replaceAll(InvisibleCharactersRegExp, " "); + } + return str.replaceAll("\x00", ""); + } + + function binarySearchFirstItem(items, condition, start = 0) { + let minIndex = start; + let maxIndex = items.length - 1; + if (maxIndex < 0 || !condition(items[maxIndex])) { + return items.length; + } + if (condition(items[minIndex])) { + return minIndex; + } + while (minIndex < maxIndex) { + const currentIndex = minIndex + maxIndex >> 1; + const currentItem = items[currentIndex]; + if (condition(currentItem)) { + maxIndex = currentIndex; + } else { + minIndex = currentIndex + 1; + } + } + return minIndex; + } + + function approximateFraction(x) { + if (Math.floor(x) === x) { + return [x, 1]; + } + const xinv = 1 / x; + const limit = 8; + if (xinv > limit) { + return [1, limit]; + } else if (Math.floor(xinv) === xinv) { + return [1, xinv]; + } + const x_ = x > 1 ? xinv : x; + let a = 0, + b = 1, + c = 1, + d = 1; + while (true) { + const p = a + c, + q = b + d; + if (q > limit) { + break; + } + if (x_ <= p / q) { + c = p; + d = q; + } else { + a = p; + b = q; + } + } + let result; + if (x_ - a / b < c / d - x_) { + result = x_ === x ? [a, b] : [b, a]; + } else { + result = x_ === x ? [c, d] : [d, c]; + } + return result; + } + + function roundToDivide(x, div) { + const r = x % div; + return r === 0 ? x : Math.round(x - r + div); + } + + function getPageSizeInches({ + view, + userUnit, + rotate + }) { + const [x1, y1, x2, y2] = view; + const changeOrientation = rotate % 180 !== 0; + const width = (x2 - x1) / 72 * userUnit; + const height = (y2 - y1) / 72 * userUnit; + return { + width: changeOrientation ? height : width, + height: changeOrientation ? width : height + }; + } + + function backtrackBeforeAllVisibleElements(index, views, top) { + if (index < 2) { + return index; + } + let elt = views[index].div; + let pageTop = elt.offsetTop + elt.clientTop; + if (pageTop >= top) { + elt = views[index - 1].div; + pageTop = elt.offsetTop + elt.clientTop; + } + for (let i = index - 2; i >= 0; --i) { + elt = views[i].div; + if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) { + break; + } + index = i; + } + return index; + } + + function getVisibleElements({ + scrollEl, + views, + sortByVisibility = false, + horizontal = false, + rtl = false + }) { + const top = scrollEl.scrollTop, + bottom = top + scrollEl.clientHeight; + const left = scrollEl.scrollLeft, + right = left + scrollEl.clientWidth; + + function isElementBottomAfterViewTop(view) { + const element = view.div; + const elementBottom = element.offsetTop + element.clientTop + element.clientHeight; + return elementBottom > top; + } + + function isElementNextAfterViewHorizontally(view) { + const element = view.div; + const elementLeft = element.offsetLeft + element.clientLeft; + const elementRight = elementLeft + element.clientWidth; + return rtl ? elementLeft < right : elementRight > left; + } + + const visible = [], + ids = new Set(), + numViews = views.length; + let firstVisibleElementInd = binarySearchFirstItem(views, horizontal ? isElementNextAfterViewHorizontally : isElementBottomAfterViewTop); + if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) { + firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top); + } + let lastEdge = horizontal ? right : -1; + for (let i = firstVisibleElementInd; i < numViews; i++) { + const view = views[i], + element = view.div; + const currentWidth = element.offsetLeft + element.clientLeft; + const currentHeight = element.offsetTop + element.clientTop; + const viewWidth = element.clientWidth, + viewHeight = element.clientHeight; + const viewRight = currentWidth + viewWidth; + const viewBottom = currentHeight + viewHeight; + if (lastEdge === -1) { + if (viewBottom >= bottom) { + lastEdge = viewBottom; + } + } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) { + break; + } + if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) { + continue; + } + const hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom); + const hiddenWidth = Math.max(0, left - currentWidth) + Math.max(0, viewRight - right); + const fractionHeight = (viewHeight - hiddenHeight) / viewHeight, + fractionWidth = (viewWidth - hiddenWidth) / viewWidth; + const percent = fractionHeight * fractionWidth * 100 | 0; + visible.push({ + id: view.id, + x: currentWidth, + y: currentHeight, + view, + percent, + widthPercent: fractionWidth * 100 | 0 + }); + ids.add(view.id); + } + const first = visible[0], + last = visible.at(-1); + if (sortByVisibility) { + visible.sort(function (a, b) { + const pc = a.percent - b.percent; + if (Math.abs(pc) > 0.001) { + return -pc; + } + return a.id - b.id; + }); + } + return { + first, + last, + views: visible, + ids + }; + } + + function normalizeWheelEventDirection(evt) { + let delta = Math.hypot(evt.deltaX, evt.deltaY); + const angle = Math.atan2(evt.deltaY, evt.deltaX); + if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) { + delta = -delta; + } + return delta; + } + + function normalizeWheelEventDelta(evt) { + const deltaMode = evt.deltaMode; + let delta = normalizeWheelEventDirection(evt); + const MOUSE_PIXELS_PER_LINE = 30; + const MOUSE_LINES_PER_PAGE = 30; + if (deltaMode === WheelEvent.DOM_DELTA_PIXEL) { + delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE; + } else if (deltaMode === WheelEvent.DOM_DELTA_LINE) { + delta /= MOUSE_LINES_PER_PAGE; + } + return delta; + } + + function isValidRotation(angle) { + return Number.isInteger(angle) && angle % 90 === 0; + } + + function isValidScrollMode(mode) { + return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN; + } + + function isValidSpreadMode(mode) { + return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN; + } + + function isPortraitOrientation(size) { + return size.width <= size.height; + } + + const animationStarted = new Promise(function (resolve) { + window.requestAnimationFrame(resolve); + }); + exports.animationStarted = animationStarted; + const docStyle = document.documentElement.style; + exports.docStyle = docStyle; + + function clamp(v, min, max) { + return Math.min(Math.max(v, min), max); + } + + class ProgressBar { + #classList = null; + #disableAutoFetchTimeout = null; + #percent = 0; + #style = null; + #visible = true; + + constructor(bar) { + this.#classList = bar.classList; + this.#style = bar.style; + } + + get percent() { + return this.#percent; + } + + set percent(val) { + this.#percent = clamp(val, 0, 100); + if (isNaN(val)) { + this.#classList.add("indeterminate"); + return; + } + this.#classList.remove("indeterminate"); + this.#style.setProperty("--progressBar-percent", `${this.#percent}%`); + } + + setWidth(viewer) { + if (!viewer) { + return; + } + const container = viewer.parentNode; + const scrollbarWidth = container.offsetWidth - viewer.offsetWidth; + if (scrollbarWidth > 0) { + this.#style.setProperty("--progressBar-end-offset", `${scrollbarWidth}px`); + } + } + + setDisableAutoFetch(delay = 5000) { + if (isNaN(this.#percent)) { + return; + } + if (this.#disableAutoFetchTimeout) { + clearTimeout(this.#disableAutoFetchTimeout); + } + this.show(); + this.#disableAutoFetchTimeout = setTimeout(() => { + this.#disableAutoFetchTimeout = null; + this.hide(); + }, delay); + } + + hide() { + if (!this.#visible) { + return; + } + this.#visible = false; + this.#classList.add("hidden"); + } + + show() { + if (this.#visible) { + return; + } + this.#visible = true; + this.#classList.remove("hidden"); + } + } + + exports.ProgressBar = ProgressBar; + + function getActiveOrFocusedElement() { + let curRoot = document; + let curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); + while (curActiveOrFocused?.shadowRoot) { + curRoot = curActiveOrFocused.shadowRoot; + curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); + } + return curActiveOrFocused; + } + + function apiPageLayoutToViewerModes(layout) { + let scrollMode = ScrollMode.VERTICAL, + spreadMode = SpreadMode.NONE; + switch (layout) { + case "SinglePage": + scrollMode = ScrollMode.PAGE; + break; + case "OneColumn": + break; + case "TwoPageLeft": + scrollMode = ScrollMode.PAGE; + case "TwoColumnLeft": + spreadMode = SpreadMode.ODD; + break; + case "TwoPageRight": + scrollMode = ScrollMode.PAGE; + case "TwoColumnRight": + spreadMode = SpreadMode.EVEN; + break; + } + return { + scrollMode, + spreadMode + }; + } + + function apiPageModeToSidebarView(mode) { + switch (mode) { + case "UseNone": + return SidebarView.NONE; + case "UseThumbs": + return SidebarView.THUMBS; + case "UseOutlines": + return SidebarView.OUTLINE; + case "UseAttachments": + return SidebarView.ATTACHMENTS; + case "UseOC": + return SidebarView.LAYERS; + } + return SidebarView.NONE; + } + + function toggleCheckedBtn(button, toggle, view = null) { + button.classList.toggle("toggled", toggle); + button.setAttribute("aria-checked", toggle); + view?.classList.toggle("hidden", !toggle); + } + + function toggleExpandedBtn(button, toggle, view = null) { + button.classList.toggle("toggled", toggle); + button.setAttribute("aria-expanded", toggle); + view?.classList.toggle("hidden", !toggle); + } + + /***/ + }), + /* 4 */ + /***/ ((module) => { + + + module.exports = globalThis.pdfjsLib; + + /***/ + }), + /* 5 */ + /***/ ((__unused_webpack_module, exports) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.compatibilityParams = exports.OptionKind = exports.AppOptions = void 0; + const compatibilityParams = Object.create(null); + exports.compatibilityParams = compatibilityParams; + { + const userAgent = navigator.userAgent || ""; + const platform = navigator.platform || ""; + const maxTouchPoints = navigator.maxTouchPoints || 1; + const isAndroid = /Android/.test(userAgent); + const isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === "MacIntel" && maxTouchPoints > 1; + (function checkCanvasSizeLimitation() { + if (isIOS || isAndroid) { + compatibilityParams.maxCanvasPixels = 5242880; + } + })(); + } + const OptionKind = { + VIEWER: 0x02, + API: 0x04, + WORKER: 0x08, + PREFERENCE: 0x80 + }; + exports.OptionKind = OptionKind; + const defaultOptions = { + annotationEditorMode: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + annotationMode: { + value: 2, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + cursorToolOnLoad: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + defaultZoomDelay: { + value: 400, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + defaultZoomValue: { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + disableHistory: { + value: false, + kind: OptionKind.VIEWER + }, + disablePageLabels: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enablePermissions: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enablePrintAutoRotate: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableScripting: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableStampEditor: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + externalLinkRel: { + value: "noopener noreferrer nofollow", + kind: OptionKind.VIEWER + }, + externalLinkTarget: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + historyUpdateUrl: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + ignoreDestinationZoom: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + imageResourcesPath: { + value: "./images/", + kind: OptionKind.VIEWER + }, + maxCanvasPixels: { + value: 16777216, + kind: OptionKind.VIEWER + }, + forcePageColors: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pageColorsBackground: { + value: "Canvas", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pageColorsForeground: { + value: "CanvasText", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pdfBugEnabled: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + printResolution: { + value: 150, + kind: OptionKind.VIEWER + }, + sidebarViewOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + scrollModeOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + spreadModeOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + textLayerMode: { + value: 1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + viewerCssTheme: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + viewOnLoad: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + cMapPacked: { + value: true, + kind: OptionKind.API + }, + cMapUrl: { + value: "../web/cmaps/", + kind: OptionKind.API + }, + disableAutoFetch: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableFontFace: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableRange: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableStream: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + docBaseUrl: { + value: "", + kind: OptionKind.API + }, + enableXfa: { + value: true, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + fontExtraProperties: { + value: false, + kind: OptionKind.API + }, + isEvalSupported: { + value: true, + kind: OptionKind.API + }, + isOffscreenCanvasSupported: { + value: true, + kind: OptionKind.API + }, + maxImageSize: { + value: -1, + kind: OptionKind.API + }, + pdfBug: { + value: false, + kind: OptionKind.API + }, + standardFontDataUrl: { + value: "../web/standard_fonts/", + kind: OptionKind.API + }, + verbosity: { + value: 1, + kind: OptionKind.API + }, + workerPort: { + value: null, + kind: OptionKind.WORKER + }, + workerSrc: { + value: "/pdfjs/pdf.worker.js", + kind: OptionKind.WORKER + } + }; + { + defaultOptions.defaultUrl = { + value: "/pdfjs/example/Welcome.pdf", + kind: OptionKind.VIEWER + }; + defaultOptions.disablePreferences = { + value: false, + kind: OptionKind.VIEWER + }; + defaultOptions.locale = { + value: navigator.language || "en-US", + kind: OptionKind.VIEWER + }; + defaultOptions.sandboxBundleSrc = { + value: "../build/pdf.sandbox.js", + kind: OptionKind.VIEWER + }; + } + const userOptions = Object.create(null); + + class AppOptions { + constructor() { + throw new Error("Cannot initialize AppOptions."); + } + + static get(name) { + const userOption = userOptions[name]; + if (userOption !== undefined) { + return userOption; + } + const defaultOption = defaultOptions[name]; + if (defaultOption !== undefined) { + return compatibilityParams[name] ?? defaultOption.value; + } + return undefined; + } + + static getAll(kind = null) { + const options = Object.create(null); + for (const name in defaultOptions) { + const defaultOption = defaultOptions[name]; + if (kind) { + if ((kind & defaultOption.kind) === 0) { + continue; + } + if (kind === OptionKind.PREFERENCE) { + const value = defaultOption.value, + valueType = typeof value; + if (valueType === "boolean" || valueType === "string" || valueType === "number" && Number.isInteger(value)) { + options[name] = value; + continue; + } + throw new Error(`Invalid type for preference: ${name}`); + } + } + const userOption = userOptions[name]; + options[name] = userOption !== undefined ? userOption : compatibilityParams[name] ?? defaultOption.value; + } + return options; + } + + static set(name, value) { + userOptions[name] = value; + } + + static setAll(options) { + for (const name in options) { + userOptions[name] = options[name]; + } + } + + static remove(name) { + delete userOptions[name]; + } + } + + exports.AppOptions = AppOptions; + { + AppOptions._hasUserOptions = function () { + return Object.keys(userOptions).length > 0; + }; + } + + /***/ + }), + /* 6 */ + /***/ ((__unused_webpack_module, exports) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.WaitOnType = exports.EventBus = exports.AutomationEventBus = void 0; + exports.waitOnEventOrTimeout = waitOnEventOrTimeout; + const WaitOnType = { + EVENT: "event", + TIMEOUT: "timeout" + }; + exports.WaitOnType = WaitOnType; + + function waitOnEventOrTimeout({ + target, + name, + delay = 0 + }) { + return new Promise(function (resolve, reject) { + if (typeof target !== "object" || !(name && typeof name === "string") || !(Number.isInteger(delay) && delay >= 0)) { + throw new Error("waitOnEventOrTimeout - invalid parameters."); + } + + function handler(type) { + if (target instanceof EventBus) { + target._off(name, eventHandler); + } else { + target.removeEventListener(name, eventHandler); + } + if (timeout) { + clearTimeout(timeout); + } + resolve(type); + } + + const eventHandler = handler.bind(null, WaitOnType.EVENT); + if (target instanceof EventBus) { + target._on(name, eventHandler); + } else { + target.addEventListener(name, eventHandler); + } + const timeoutHandler = handler.bind(null, WaitOnType.TIMEOUT); + const timeout = setTimeout(timeoutHandler, delay); + }); + } + + class EventBus { + #listeners = Object.create(null); + + on(eventName, listener, options = null) { + this._on(eventName, listener, { + external: true, + once: options?.once + }); + } + + off(eventName, listener, options = null) { + this._off(eventName, listener, { + external: true, + once: options?.once + }); + } + + dispatch(eventName, data) { + const eventListeners = this.#listeners[eventName]; + if (!eventListeners || eventListeners.length === 0) { + return; + } + let externalListeners; + for (const { + listener, + external, + once + } of eventListeners.slice(0)) { + if (once) { + this._off(eventName, listener); + } + if (external) { + (externalListeners ||= []).push(listener); + continue; + } + listener(data); + } + if (externalListeners) { + for (const listener of externalListeners) { + listener(data); + } + externalListeners = null; + } + } + + _on(eventName, listener, options = null) { + const eventListeners = this.#listeners[eventName] ||= []; + eventListeners.push({ + listener, + external: options?.external === true, + once: options?.once === true + }); + } + + _off(eventName, listener, options = null) { + const eventListeners = this.#listeners[eventName]; + if (!eventListeners) { + return; + } + for (let i = 0, ii = eventListeners.length; i < ii; i++) { + if (eventListeners[i].listener === listener) { + eventListeners.splice(i, 1); + return; + } + } + } + } + + exports.EventBus = EventBus; + + class AutomationEventBus extends EventBus { + dispatch(eventName, data) { + throw new Error("Not implemented: AutomationEventBus.dispatch"); + } + } + + exports.AutomationEventBus = AutomationEventBus; + + /***/ + }), + /* 7 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.SimpleLinkService = exports.PDFLinkService = exports.LinkTarget = void 0; + var _ui_utils = __webpack_require__(3); + const DEFAULT_LINK_REL = "noopener noreferrer nofollow"; + const LinkTarget = { + NONE: 0, + SELF: 1, + BLANK: 2, + PARENT: 3, + TOP: 4 + }; + exports.LinkTarget = LinkTarget; + + function addLinkAttributes(link, { + url, + target, + rel, + enabled = true + } = {}) { + if (!url || typeof url !== "string") { + throw new Error('A valid "url" parameter must provided.'); + } + if (enabled) { + link.href = link.title = url; + } else { + link.href = ""; + link.title = `Disabled: ${url}`; + link.onclick = () => { + return false; + }; + } + let targetStr = ""; + switch (target) { + case LinkTarget.NONE: + break; + case LinkTarget.SELF: + targetStr = "_self"; + break; + case LinkTarget.BLANK: + targetStr = "_blank"; + break; + case LinkTarget.PARENT: + targetStr = "_parent"; + break; + case LinkTarget.TOP: + targetStr = "_top"; + break; + } + link.target = targetStr; + link.rel = typeof rel === "string" ? rel : DEFAULT_LINK_REL; + } + + class PDFLinkService { + #pagesRefCache = new Map(); + + constructor({ + eventBus, + externalLinkTarget = null, + externalLinkRel = null, + ignoreDestinationZoom = false + } = {}) { + this.eventBus = eventBus; + this.externalLinkTarget = externalLinkTarget; + this.externalLinkRel = externalLinkRel; + this.externalLinkEnabled = true; + this._ignoreDestinationZoom = ignoreDestinationZoom; + this.baseUrl = null; + this.pdfDocument = null; + this.pdfViewer = null; + this.pdfHistory = null; + } + + setDocument(pdfDocument, baseUrl = null) { + this.baseUrl = baseUrl; + this.pdfDocument = pdfDocument; + this.#pagesRefCache.clear(); + } + + setViewer(pdfViewer) { + this.pdfViewer = pdfViewer; + } + + setHistory(pdfHistory) { + this.pdfHistory = pdfHistory; + } + + get pagesCount() { + return this.pdfDocument ? this.pdfDocument.numPages : 0; + } + + get page() { + return this.pdfViewer.currentPageNumber; + } + + set page(value) { + this.pdfViewer.currentPageNumber = value; + } + + get rotation() { + return this.pdfViewer.pagesRotation; + } + + set rotation(value) { + this.pdfViewer.pagesRotation = value; + } + + get isInPresentationMode() { + return this.pdfViewer.isInPresentationMode; + } + + #goToDestinationHelper(rawDest, namedDest = null, explicitDest) { + const destRef = explicitDest[0]; + let pageNumber; + if (typeof destRef === "object" && destRef !== null) { + pageNumber = this._cachedPageNumber(destRef); + if (!pageNumber) { + this.pdfDocument.getPageIndex(destRef).then(pageIndex => { + this.cachePageRef(pageIndex + 1, destRef); + this.#goToDestinationHelper(rawDest, namedDest, explicitDest); + }).catch(() => { + console.error(`PDFLinkService.#goToDestinationHelper: "${destRef}" is not ` + `a valid page reference, for dest="${rawDest}".`); + }); + return; + } + } else if (Number.isInteger(destRef)) { + pageNumber = destRef + 1; + } else { + console.error(`PDFLinkService.#goToDestinationHelper: "${destRef}" is not ` + `a valid destination reference, for dest="${rawDest}".`); + return; + } + if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) { + console.error(`PDFLinkService.#goToDestinationHelper: "${pageNumber}" is not ` + `a valid page number, for dest="${rawDest}".`); + return; + } + if (this.pdfHistory) { + this.pdfHistory.pushCurrentPosition(); + this.pdfHistory.push({ + namedDest, + explicitDest, + pageNumber + }); + } + this.pdfViewer.scrollPageIntoView({ + pageNumber, + destArray: explicitDest, + ignoreDestinationZoom: this._ignoreDestinationZoom + }); + } + + async goToDestination(dest) { + if (!this.pdfDocument) { + return; + } + let namedDest, explicitDest; + if (typeof dest === "string") { + namedDest = dest; + explicitDest = await this.pdfDocument.getDestination(dest); + } else { + namedDest = null; + explicitDest = await dest; + } + if (!Array.isArray(explicitDest)) { + console.error(`PDFLinkService.goToDestination: "${explicitDest}" is not ` + `a valid destination array, for dest="${dest}".`); + return; + } + this.#goToDestinationHelper(dest, namedDest, explicitDest); + } + + goToPage(val) { + if (!this.pdfDocument) { + return; + } + const pageNumber = typeof val === "string" && this.pdfViewer.pageLabelToPageNumber(val) || val | 0; + if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) { + console.error(`PDFLinkService.goToPage: "${val}" is not a valid page.`); + return; + } + if (this.pdfHistory) { + this.pdfHistory.pushCurrentPosition(); + this.pdfHistory.pushPage(pageNumber); + } + this.pdfViewer.scrollPageIntoView({ + pageNumber + }); + } + + addLinkAttributes(link, url, newWindow = false) { + addLinkAttributes(link, { + url, + target: newWindow ? LinkTarget.BLANK : this.externalLinkTarget, + rel: this.externalLinkRel, + enabled: this.externalLinkEnabled + }); + } + + getDestinationHash(dest) { + if (typeof dest === "string") { + if (dest.length > 0) { + return this.getAnchorUrl("#" + escape(dest)); + } + } else if (Array.isArray(dest)) { + const str = JSON.stringify(dest); + if (str.length > 0) { + return this.getAnchorUrl("#" + escape(str)); + } + } + return this.getAnchorUrl(""); + } + + getAnchorUrl(anchor) { + return this.baseUrl ? this.baseUrl + anchor : anchor; + } + + setHash(hash) { + if (!this.pdfDocument) { + return; + } + let pageNumber, dest; + if (hash.includes("=")) { + const params = (0, _ui_utils.parseQueryString)(hash); + if (params.has("search")) { + const query = params.get("search").replaceAll('"', ""), + phrase = params.get("phrase") === "true"; + this.eventBus.dispatch("findfromurlhash", { + source: this, + query: phrase ? query : query.match(/\S+/g) + }); + } + if (params.has("page")) { + pageNumber = params.get("page") | 0 || 1; + } + if (params.has("zoom")) { + const zoomArgs = params.get("zoom").split(","); + const zoomArg = zoomArgs[0]; + const zoomArgNumber = parseFloat(zoomArg); + if (!zoomArg.includes("Fit")) { + dest = [null, { + name: "XYZ" + }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg]; + } else if (zoomArg === "Fit" || zoomArg === "FitB") { + dest = [null, { + name: zoomArg + }]; + } else if (zoomArg === "FitH" || zoomArg === "FitBH" || zoomArg === "FitV" || zoomArg === "FitBV") { + dest = [null, { + name: zoomArg + }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null]; + } else if (zoomArg === "FitR") { + if (zoomArgs.length !== 5) { + console.error('PDFLinkService.setHash: Not enough parameters for "FitR".'); + } else { + dest = [null, { + name: zoomArg + }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0]; + } + } else { + console.error(`PDFLinkService.setHash: "${zoomArg}" is not a valid zoom value.`); + } + } + if (dest) { + this.pdfViewer.scrollPageIntoView({ + pageNumber: pageNumber || this.page, + destArray: dest, + allowNegativeOffset: true + }); + } else if (pageNumber) { + this.page = pageNumber; + } + if (params.has("pagemode")) { + this.eventBus.dispatch("pagemode", { + source: this, + mode: params.get("pagemode") + }); + } + if (params.has("nameddest")) { + this.goToDestination(params.get("nameddest")); + } + } else { + dest = unescape(hash); + try { + dest = JSON.parse(dest); + if (!Array.isArray(dest)) { + dest = dest.toString(); + } + } catch { + } + if (typeof dest === "string" || PDFLinkService.#isValidExplicitDestination(dest)) { + this.goToDestination(dest); + return; + } + console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not a valid destination.`); + } + } + + executeNamedAction(action) { + switch (action) { + case "GoBack": + this.pdfHistory?.back(); + break; + case "GoForward": + this.pdfHistory?.forward(); + break; + case "NextPage": + this.pdfViewer.nextPage(); + break; + case "PrevPage": + this.pdfViewer.previousPage(); + break; + case "LastPage": + this.page = this.pagesCount; + break; + case "FirstPage": + this.page = 1; + break; + default: + break; + } + this.eventBus.dispatch("namedaction", { + source: this, + action + }); + } + + async executeSetOCGState(action) { + const pdfDocument = this.pdfDocument; + const optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise; + if (pdfDocument !== this.pdfDocument) { + return; + } + let operator; + for (const elem of action.state) { + switch (elem) { + case "ON": + case "OFF": + case "Toggle": + operator = elem; + continue; + } + switch (operator) { + case "ON": + optionalContentConfig.setVisibility(elem, true); + break; + case "OFF": + optionalContentConfig.setVisibility(elem, false); + break; + case "Toggle": + const group = optionalContentConfig.getGroup(elem); + if (group) { + optionalContentConfig.setVisibility(elem, !group.visible); + } + break; + } + } + this.pdfViewer.optionalContentConfigPromise = Promise.resolve(optionalContentConfig); + } + + cachePageRef(pageNum, pageRef) { + if (!pageRef) { + return; + } + const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`; + this.#pagesRefCache.set(refStr, pageNum); + } + + _cachedPageNumber(pageRef) { + if (!pageRef) { + return null; + } + const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`; + return this.#pagesRefCache.get(refStr) || null; + } + + static #isValidExplicitDestination(dest) { + if (!Array.isArray(dest)) { + return false; + } + const destLength = dest.length; + if (destLength < 2) { + return false; + } + const page = dest[0]; + if (!(typeof page === "object" && Number.isInteger(page.num) && Number.isInteger(page.gen)) && !(Number.isInteger(page) && page >= 0)) { + return false; + } + const zoom = dest[1]; + if (!(typeof zoom === "object" && typeof zoom.name === "string")) { + return false; + } + let allowNull = true; + switch (zoom.name) { + case "XYZ": + if (destLength !== 5) { + return false; + } + break; + case "Fit": + case "FitB": + return destLength === 2; + case "FitH": + case "FitBH": + case "FitV": + case "FitBV": + if (destLength !== 3) { + return false; + } + break; + case "FitR": + if (destLength !== 6) { + return false; + } + allowNull = false; + break; + default: + return false; + } + for (let i = 2; i < destLength; i++) { + const param = dest[i]; + if (!(typeof param === "number" || allowNull && param === null)) { + return false; + } + } + return true; + } + } + + exports.PDFLinkService = PDFLinkService; + + class SimpleLinkService { + constructor() { + this.externalLinkEnabled = true; + } + + get pagesCount() { + return 0; + } + + get page() { + return 0; + } + + set page(value) { + } + + get rotation() { + return 0; + } + + set rotation(value) { + } + + get isInPresentationMode() { + return false; + } + + async goToDestination(dest) { + } + + goToPage(val) { + } + + addLinkAttributes(link, url, newWindow = false) { + addLinkAttributes(link, { + url, + enabled: this.externalLinkEnabled + }); + } + + getDestinationHash(dest) { + return "#"; + } + + getAnchorUrl(hash) { + return "#"; + } + + setHash(hash) { + } + + executeNamedAction(action) { + } + + executeSetOCGState(action) { + } + + cachePageRef(pageNum, pageRef) { + } + } + + exports.SimpleLinkService = SimpleLinkService; + + /***/ + }), + /* 8 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.AltTextManager = void 0; + var _pdfjsLib = __webpack_require__(4); + + class AltTextManager { + #boundUpdateUIState = this.#updateUIState.bind(this); + #boundSetPosition = this.#setPosition.bind(this); + #boundOnClick = this.#onClick.bind(this); + #currentEditor = null; + #cancelButton; + #dialog; + #eventBus; + #hasUsedPointer = false; + #optionDescription; + #optionDecorative; + #overlayManager; + #saveButton; + #textarea; + #uiManager; + #previousAltText = null; + #svgElement = null; + #rectElement = null; + #container; + #telemetryData = null; + + constructor({ + dialog, + optionDescription, + optionDecorative, + textarea, + cancelButton, + saveButton + }, container, overlayManager, eventBus) { + this.#dialog = dialog; + this.#optionDescription = optionDescription; + this.#optionDecorative = optionDecorative; + this.#textarea = textarea; + this.#cancelButton = cancelButton; + this.#saveButton = saveButton; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + this.#container = container; + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", event => { + if (event.target !== this.#textarea) { + event.preventDefault(); + } + }); + cancelButton.addEventListener("click", this.#finish.bind(this)); + saveButton.addEventListener("click", this.#save.bind(this)); + optionDescription.addEventListener("change", this.#boundUpdateUIState); + optionDecorative.addEventListener("change", this.#boundUpdateUIState); + this.#overlayManager.register(dialog); + } + + get _elements() { + return (0, _pdfjsLib.shadow)(this, "_elements", [this.#optionDescription, this.#optionDecorative, this.#textarea, this.#saveButton, this.#cancelButton]); + } + + #createSVGElement() { + if (this.#svgElement) { + return; + } + const svgFactory = new _pdfjsLib.DOMSVGFactory(); + const svg = this.#svgElement = svgFactory.createElement("svg"); + svg.setAttribute("width", "0"); + svg.setAttribute("height", "0"); + const defs = svgFactory.createElement("defs"); + svg.append(defs); + const mask = svgFactory.createElement("mask"); + defs.append(mask); + mask.setAttribute("id", "alttext-manager-mask"); + mask.setAttribute("maskContentUnits", "objectBoundingBox"); + let rect = svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("fill", "white"); + rect.setAttribute("width", "1"); + rect.setAttribute("height", "1"); + rect.setAttribute("x", "0"); + rect.setAttribute("y", "0"); + rect = this.#rectElement = svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("fill", "black"); + this.#dialog.append(svg); + } + + async editAltText(uiManager, editor) { + if (this.#currentEditor || !editor) { + return; + } + this.#createSVGElement(); + this.#hasUsedPointer = false; + for (const element of this._elements) { + element.addEventListener("click", this.#boundOnClick); + } + const { + altText, + decorative + } = editor.altTextData; + if (decorative === true) { + this.#optionDecorative.checked = true; + this.#optionDescription.checked = false; + } else { + this.#optionDecorative.checked = false; + this.#optionDescription.checked = true; + } + this.#previousAltText = this.#textarea.value = altText?.trim() || ""; + this.#updateUIState(); + this.#currentEditor = editor; + this.#uiManager = uiManager; + this.#uiManager.removeEditListeners(); + this.#eventBus._on("resize", this.#boundSetPosition); + try { + await this.#overlayManager.open(this.#dialog); + this.#setPosition(); + } catch (ex) { + this.#close(); + throw ex; + } + } + + #setPosition() { + if (!this.#currentEditor) { + return; + } + const dialog = this.#dialog; + const { + style + } = dialog; + const { + x: containerX, + y: containerY, + width: containerW, + height: containerH + } = this.#container.getBoundingClientRect(); + const { + innerWidth: windowW, + innerHeight: windowH + } = window; + const { + width: dialogW, + height: dialogH + } = dialog.getBoundingClientRect(); + const { + x, + y, + width, + height + } = this.#currentEditor.getClientDimensions(); + const MARGIN = 10; + const isLTR = this.#uiManager.direction === "ltr"; + const xs = Math.max(x, containerX); + const xe = Math.min(x + width, containerX + containerW); + const ys = Math.max(y, containerY); + const ye = Math.min(y + height, containerY + containerH); + this.#rectElement.setAttribute("width", `${(xe - xs) / windowW}`); + this.#rectElement.setAttribute("height", `${(ye - ys) / windowH}`); + this.#rectElement.setAttribute("x", `${xs / windowW}`); + this.#rectElement.setAttribute("y", `${ys / windowH}`); + let left = null; + let top = Math.max(y, 0); + top += Math.min(windowH - (top + dialogH), 0); + if (isLTR) { + if (x + width + MARGIN + dialogW < windowW) { + left = x + width + MARGIN; + } else if (x > dialogW + MARGIN) { + left = x - dialogW - MARGIN; + } + } else if (x > dialogW + MARGIN) { + left = x - dialogW - MARGIN; + } else if (x + width + MARGIN + dialogW < windowW) { + left = x + width + MARGIN; + } + if (left === null) { + top = null; + left = Math.max(x, 0); + left += Math.min(windowW - (left + dialogW), 0); + if (y > dialogH + MARGIN) { + top = y - dialogH - MARGIN; + } else if (y + height + MARGIN + dialogH < windowH) { + top = y + height + MARGIN; + } + } + if (top !== null) { + dialog.classList.add("positioned"); + if (isLTR) { + style.left = `${left}px`; + } else { + style.right = `${windowW - left - dialogW}px`; + } + style.top = `${top}px`; + } else { + dialog.classList.remove("positioned"); + style.left = ""; + style.top = ""; + } + } + + #finish() { + if (this.#overlayManager.active === this.#dialog) { + this.#overlayManager.close(this.#dialog); + } + } + + #close() { + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + subtype: this.#currentEditor.editorType, + data: this.#telemetryData || { + action: "alt_text_cancel", + alt_text_keyboard: !this.#hasUsedPointer + } + } + }); + this.#telemetryData = null; + this.#removeOnClickListeners(); + this.#uiManager?.addEditListeners(); + this.#eventBus._off("resize", this.#boundSetPosition); + this.#currentEditor = null; + this.#uiManager = null; + } + + #updateUIState() { + this.#textarea.disabled = this.#optionDecorative.checked; + } + + #save() { + const altText = this.#textarea.value.trim(); + const decorative = this.#optionDecorative.checked; + this.#currentEditor.altTextData = { + altText, + decorative + }; + this.#telemetryData = { + action: "alt_text_save", + alt_text_description: !!altText, + alt_text_edit: !!this.#previousAltText && this.#previousAltText !== altText, + alt_text_decorative: decorative, + alt_text_keyboard: !this.#hasUsedPointer + }; + this.#finish(); + } + + #onClick(evt) { + if (evt.detail === 0) { + return; + } + this.#hasUsedPointer = true; + this.#removeOnClickListeners(); + } + + #removeOnClickListeners() { + for (const element of this._elements) { + element.removeEventListener("click", this.#boundOnClick); + } + } + + destroy() { + this.#uiManager = null; + this.#finish(); + this.#svgElement?.remove(); + this.#svgElement = this.#rectElement = null; + } + } + + exports.AltTextManager = AltTextManager; + + /***/ + }), + /* 9 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.AnnotationEditorParams = void 0; + var _pdfjsLib = __webpack_require__(4); + + class AnnotationEditorParams { + constructor(options, eventBus) { + this.eventBus = eventBus; + this.#bindListeners(options); + } + + #bindListeners({ + editorFreeTextFontSize, + editorFreeTextColor, + editorInkColor, + editorInkThickness, + editorInkOpacity, + editorStampAddImage + }) { + const dispatchEvent = (typeStr, value) => { + this.eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: _pdfjsLib.AnnotationEditorParamsType[typeStr], + value + }); + }; + editorFreeTextFontSize.addEventListener("input", function () { + dispatchEvent("FREETEXT_SIZE", this.valueAsNumber); + }); + editorFreeTextColor.addEventListener("input", function () { + dispatchEvent("FREETEXT_COLOR", this.value); + }); + editorInkColor.addEventListener("input", function () { + dispatchEvent("INK_COLOR", this.value); + }); + editorInkThickness.addEventListener("input", function () { + dispatchEvent("INK_THICKNESS", this.valueAsNumber); + }); + editorInkOpacity.addEventListener("input", function () { + dispatchEvent("INK_OPACITY", this.valueAsNumber); + }); + editorStampAddImage.addEventListener("click", () => { + dispatchEvent("CREATE"); + }); + this.eventBus._on("annotationeditorparamschanged", evt => { + for (const [type, value] of evt.details) { + switch (type) { + case _pdfjsLib.AnnotationEditorParamsType.FREETEXT_SIZE: + editorFreeTextFontSize.value = value; + break; + case _pdfjsLib.AnnotationEditorParamsType.FREETEXT_COLOR: + editorFreeTextColor.value = value; + break; + case _pdfjsLib.AnnotationEditorParamsType.INK_COLOR: + editorInkColor.value = value; + break; + case _pdfjsLib.AnnotationEditorParamsType.INK_THICKNESS: + editorInkThickness.value = value; + break; + case _pdfjsLib.AnnotationEditorParamsType.INK_OPACITY: + editorInkOpacity.value = value; + break; + } + } + }); + } + } + + exports.AnnotationEditorParams = AnnotationEditorParams; + + /***/ + }), + /* 10 */ + /***/ ((__unused_webpack_module, exports) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.OverlayManager = void 0; + + class OverlayManager { + #overlays = new WeakMap(); + #active = null; + get active() { + return this.#active; + } + + async register(dialog, canForceClose = false) { + if (typeof dialog !== "object") { + throw new Error("Not enough parameters."); + } else if (this.#overlays.has(dialog)) { + throw new Error("The overlay is already registered."); + } + this.#overlays.set(dialog, { + canForceClose + }); + dialog.addEventListener("cancel", evt => { + this.#active = null; + }); + } + + async open(dialog) { + if (!this.#overlays.has(dialog)) { + throw new Error("The overlay does not exist."); + } else if (this.#active) { + if (this.#active === dialog) { + throw new Error("The overlay is already active."); + } else if (this.#overlays.get(dialog).canForceClose) { + await this.close(); + } else { + throw new Error("Another overlay is currently active."); + } + } + this.#active = dialog; + dialog.showModal(); + } + + async close(dialog = this.#active) { + if (!this.#overlays.has(dialog)) { + throw new Error("The overlay does not exist."); + } else if (!this.#active) { + throw new Error("The overlay is currently not active."); + } else if (this.#active !== dialog) { + throw new Error("Another overlay is currently active."); + } + dialog.close(); + this.#active = null; + } + } + + exports.OverlayManager = OverlayManager; + + /***/ + }), + /* 11 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PasswordPrompt = void 0; + var _pdfjsLib = __webpack_require__(4); + + class PasswordPrompt { + #activeCapability = null; + #updateCallback = null; + #reason = null; + + constructor(options, overlayManager, l10n, isViewerEmbedded = false) { + this.dialog = options.dialog; + this.label = options.label; + this.input = options.input; + this.submitButton = options.submitButton; + this.cancelButton = options.cancelButton; + this.overlayManager = overlayManager; + this.l10n = l10n; + this._isViewerEmbedded = isViewerEmbedded; + this.submitButton.addEventListener("click", this.#verify.bind(this)); + this.cancelButton.addEventListener("click", this.close.bind(this)); + this.input.addEventListener("keydown", e => { + if (e.keyCode === 13) { + this.#verify(); + } + }); + this.overlayManager.register(this.dialog, true); + this.dialog.addEventListener("close", this.#cancel.bind(this)); + } + + async open() { + if (this.#activeCapability) { + await this.#activeCapability.promise; + } + this.#activeCapability = new _pdfjsLib.PromiseCapability(); + try { + await this.overlayManager.open(this.dialog); + } catch (ex) { + this.#activeCapability.resolve(); + throw ex; + } + const passwordIncorrect = this.#reason === _pdfjsLib.PasswordResponses.INCORRECT_PASSWORD; + if (!this._isViewerEmbedded || passwordIncorrect) { + this.input.focus(); + } + this.label.textContent = await this.l10n.get(`password_${passwordIncorrect ? "invalid" : "label"}`); + } + + async close() { + if (this.overlayManager.active === this.dialog) { + this.overlayManager.close(this.dialog); + } + } + + #verify() { + const password = this.input.value; + if (password?.length > 0) { + this.#invokeCallback(password); + } + } + + #cancel() { + this.#invokeCallback(new Error("PasswordPrompt cancelled.")); + this.#activeCapability.resolve(); + } + + #invokeCallback(password) { + if (!this.#updateCallback) { + return; + } + this.close(); + this.input.value = ""; + this.#updateCallback(password); + this.#updateCallback = null; + } + + async setUpdateCallback(updateCallback, reason) { + if (this.#activeCapability) { + await this.#activeCapability.promise; + } + this.#updateCallback = updateCallback; + this.#reason = reason; + } + } + + exports.PasswordPrompt = PasswordPrompt; + + /***/ + }), + /* 12 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFAttachmentViewer = void 0; + var _pdfjsLib = __webpack_require__(4); + var _base_tree_viewer = __webpack_require__(13); + var _event_utils = __webpack_require__(6); + + class PDFAttachmentViewer extends _base_tree_viewer.BaseTreeViewer { + constructor(options) { + super(options); + this.downloadManager = options.downloadManager; + this.eventBus._on("fileattachmentannotation", this.#appendAttachment.bind(this)); + } + + reset(keepRenderedCapability = false) { + super.reset(); + this._attachments = null; + if (!keepRenderedCapability) { + this._renderedCapability = new _pdfjsLib.PromiseCapability(); + } + this._pendingDispatchEvent = false; + } + + async _dispatchEvent(attachmentsCount) { + this._renderedCapability.resolve(); + if (attachmentsCount === 0 && !this._pendingDispatchEvent) { + this._pendingDispatchEvent = true; + await (0, _event_utils.waitOnEventOrTimeout)({ + target: this.eventBus, + name: "annotationlayerrendered", + delay: 1000 + }); + if (!this._pendingDispatchEvent) { + return; + } + } + this._pendingDispatchEvent = false; + this.eventBus.dispatch("attachmentsloaded", { + source: this, + attachmentsCount + }); + } + + _bindLink(element, { + content, + filename + }) { + element.onclick = () => { + this.downloadManager.openOrDownloadData(element, content, filename); + return false; + }; + } + + render({ + attachments, + keepRenderedCapability = false + }) { + if (this._attachments) { + this.reset(keepRenderedCapability); + } + this._attachments = attachments || null; + if (!attachments) { + this._dispatchEvent(0); + return; + } + const fragment = document.createDocumentFragment(); + let attachmentsCount = 0; + for (const name in attachments) { + const item = attachments[name]; + const content = item.content, + filename = (0, _pdfjsLib.getFilenameFromUrl)(item.filename, true); + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + this._bindLink(element, { + content, + filename + }); + element.textContent = this._normalizeTextContent(filename); + div.append(element); + fragment.append(div); + attachmentsCount++; + } + this._finishRendering(fragment, attachmentsCount); + } + + #appendAttachment({ + filename, + content + }) { + const renderedPromise = this._renderedCapability.promise; + renderedPromise.then(() => { + if (renderedPromise !== this._renderedCapability.promise) { + return; + } + const attachments = this._attachments || Object.create(null); + for (const name in attachments) { + if (filename === name) { + return; + } + } + attachments[filename] = { + filename, + content + }; + this.render({ + attachments, + keepRenderedCapability: true + }); + }); + } + } + + exports.PDFAttachmentViewer = PDFAttachmentViewer; + + /***/ + }), + /* 13 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.BaseTreeViewer = void 0; + var _ui_utils = __webpack_require__(3); + const TREEITEM_OFFSET_TOP = -100; + const TREEITEM_SELECTED_CLASS = "selected"; + + class BaseTreeViewer { + constructor(options) { + if (this.constructor === BaseTreeViewer) { + throw new Error("Cannot initialize BaseTreeViewer."); + } + this.container = options.container; + this.eventBus = options.eventBus; + this.reset(); + } + + reset() { + this._pdfDocument = null; + this._lastToggleIsShow = true; + this._currentTreeItem = null; + this.container.textContent = ""; + this.container.classList.remove("treeWithDeepNesting"); + } + + _dispatchEvent(count) { + throw new Error("Not implemented: _dispatchEvent"); + } + + _bindLink(element, params) { + throw new Error("Not implemented: _bindLink"); + } + + _normalizeTextContent(str) { + return (0, _ui_utils.removeNullCharacters)(str, true) || "\u2013"; + } + + _addToggleButton(div, hidden = false) { + const toggler = document.createElement("div"); + toggler.className = "treeItemToggler"; + if (hidden) { + toggler.classList.add("treeItemsHidden"); + } + toggler.onclick = evt => { + evt.stopPropagation(); + toggler.classList.toggle("treeItemsHidden"); + if (evt.shiftKey) { + const shouldShowAll = !toggler.classList.contains("treeItemsHidden"); + this._toggleTreeItem(div, shouldShowAll); + } + }; + div.prepend(toggler); + } + + _toggleTreeItem(root, show = false) { + this._lastToggleIsShow = show; + for (const toggler of root.querySelectorAll(".treeItemToggler")) { + toggler.classList.toggle("treeItemsHidden", !show); + } + } + + _toggleAllTreeItems() { + this._toggleTreeItem(this.container, !this._lastToggleIsShow); + } + + _finishRendering(fragment, count, hasAnyNesting = false) { + if (hasAnyNesting) { + this.container.classList.add("treeWithDeepNesting"); + this._lastToggleIsShow = !fragment.querySelector(".treeItemsHidden"); + } + this.container.append(fragment); + this._dispatchEvent(count); + } + + render(params) { + throw new Error("Not implemented: render"); + } + + _updateCurrentTreeItem(treeItem = null) { + if (this._currentTreeItem) { + this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS); + this._currentTreeItem = null; + } + if (treeItem) { + treeItem.classList.add(TREEITEM_SELECTED_CLASS); + this._currentTreeItem = treeItem; + } + } + + _scrollToCurrentTreeItem(treeItem) { + if (!treeItem) { + return; + } + let currentNode = treeItem.parentNode; + while (currentNode && currentNode !== this.container) { + if (currentNode.classList.contains("treeItem")) { + const toggler = currentNode.firstElementChild; + toggler?.classList.remove("treeItemsHidden"); + } + currentNode = currentNode.parentNode; + } + this._updateCurrentTreeItem(treeItem); + this.container.scrollTo(treeItem.offsetLeft, treeItem.offsetTop + TREEITEM_OFFSET_TOP); + } + } + + exports.BaseTreeViewer = BaseTreeViewer; + + /***/ + }), + /* 14 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFCursorTools = void 0; + var _pdfjsLib = __webpack_require__(4); + var _ui_utils = __webpack_require__(3); + var _grab_to_pan = __webpack_require__(15); + + class PDFCursorTools { + #active = _ui_utils.CursorTool.SELECT; + #prevActive = null; + + constructor({ + container, + eventBus, + cursorToolOnLoad = _ui_utils.CursorTool.SELECT + }) { + this.container = container; + this.eventBus = eventBus; + this.#addEventListeners(); + Promise.resolve().then(() => { + this.switchTool(cursorToolOnLoad); + }); + } + + get activeTool() { + return this.#active; + } + + switchTool(tool) { + if (this.#prevActive !== null) { + return; + } + if (tool === this.#active) { + return; + } + const disableActiveTool = () => { + switch (this.#active) { + case _ui_utils.CursorTool.SELECT: + break; + case _ui_utils.CursorTool.HAND: + this._handTool.deactivate(); + break; + case _ui_utils.CursorTool.ZOOM: + } + }; + switch (tool) { + case _ui_utils.CursorTool.SELECT: + disableActiveTool(); + break; + case _ui_utils.CursorTool.HAND: + disableActiveTool(); + this._handTool.activate(); + break; + case _ui_utils.CursorTool.ZOOM: + default: + console.error(`switchTool: "${tool}" is an unsupported value.`); + return; + } + this.#active = tool; + this.eventBus.dispatch("cursortoolchanged", { + source: this, + tool + }); + } + + #addEventListeners() { + this.eventBus._on("switchcursortool", evt => { + this.switchTool(evt.tool); + }); + let annotationEditorMode = _pdfjsLib.AnnotationEditorType.NONE, + presentationModeState = _ui_utils.PresentationModeState.NORMAL; + const disableActive = () => { + const prevActive = this.#active; + this.switchTool(_ui_utils.CursorTool.SELECT); + this.#prevActive ??= prevActive; + }; + const enableActive = () => { + const prevActive = this.#prevActive; + if (prevActive !== null && annotationEditorMode === _pdfjsLib.AnnotationEditorType.NONE && presentationModeState === _ui_utils.PresentationModeState.NORMAL) { + this.#prevActive = null; + this.switchTool(prevActive); + } + }; + this.eventBus._on("secondarytoolbarreset", evt => { + if (this.#prevActive !== null) { + annotationEditorMode = _pdfjsLib.AnnotationEditorType.NONE; + presentationModeState = _ui_utils.PresentationModeState.NORMAL; + enableActive(); + } + }); + this.eventBus._on("annotationeditormodechanged", ({ + mode + }) => { + annotationEditorMode = mode; + if (mode === _pdfjsLib.AnnotationEditorType.NONE) { + enableActive(); + } else { + disableActive(); + } + }); + this.eventBus._on("presentationmodechanged", ({ + state + }) => { + presentationModeState = state; + if (state === _ui_utils.PresentationModeState.NORMAL) { + enableActive(); + } else if (state === _ui_utils.PresentationModeState.FULLSCREEN) { + disableActive(); + } + }); + } + + get _handTool() { + return (0, _pdfjsLib.shadow)(this, "_handTool", new _grab_to_pan.GrabToPan({ + element: this.container + })); + } + } + + exports.PDFCursorTools = PDFCursorTools; + + /***/ + }), + /* 15 */ + /***/ ((__unused_webpack_module, exports) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.GrabToPan = void 0; + const CSS_CLASS_GRAB = "grab-to-pan-grab"; + + class GrabToPan { + constructor({ + element + }) { + this.element = element; + this.document = element.ownerDocument; + this.activate = this.activate.bind(this); + this.deactivate = this.deactivate.bind(this); + this.toggle = this.toggle.bind(this); + this._onMouseDown = this.#onMouseDown.bind(this); + this._onMouseMove = this.#onMouseMove.bind(this); + this._endPan = this.#endPan.bind(this); + const overlay = this.overlay = document.createElement("div"); + overlay.className = "grab-to-pan-grabbing"; + } + + activate() { + if (!this.active) { + this.active = true; + this.element.addEventListener("mousedown", this._onMouseDown, true); + this.element.classList.add(CSS_CLASS_GRAB); + } + } + + deactivate() { + if (this.active) { + this.active = false; + this.element.removeEventListener("mousedown", this._onMouseDown, true); + this._endPan(); + this.element.classList.remove(CSS_CLASS_GRAB); + } + } + + toggle() { + if (this.active) { + this.deactivate(); + } else { + this.activate(); + } + } + + ignoreTarget(node) { + return node.matches("a[href], a[href] *, input, textarea, button, button *, select, option"); + } + + #onMouseDown(event) { + if (event.button !== 0 || this.ignoreTarget(event.target)) { + return; + } + if (event.originalTarget) { + try { + event.originalTarget.tagName; + } catch { + return; + } + } + this.scrollLeftStart = this.element.scrollLeft; + this.scrollTopStart = this.element.scrollTop; + this.clientXStart = event.clientX; + this.clientYStart = event.clientY; + this.document.addEventListener("mousemove", this._onMouseMove, true); + this.document.addEventListener("mouseup", this._endPan, true); + this.element.addEventListener("scroll", this._endPan, true); + event.preventDefault(); + event.stopPropagation(); + const focusedElement = document.activeElement; + if (focusedElement && !focusedElement.contains(event.target)) { + focusedElement.blur(); + } + } + + #onMouseMove(event) { + this.element.removeEventListener("scroll", this._endPan, true); + if (!(event.buttons & 1)) { + this._endPan(); + return; + } + const xDiff = event.clientX - this.clientXStart; + const yDiff = event.clientY - this.clientYStart; + this.element.scrollTo({ + top: this.scrollTopStart - yDiff, + left: this.scrollLeftStart - xDiff, + behavior: "instant" + }); + if (!this.overlay.parentNode) { + document.body.append(this.overlay); + } + } + + #endPan() { + this.element.removeEventListener("scroll", this._endPan, true); + this.document.removeEventListener("mousemove", this._onMouseMove, true); + this.document.removeEventListener("mouseup", this._endPan, true); + this.overlay.remove(); + } + } + + exports.GrabToPan = GrabToPan; + + /***/ + }), + /* 16 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFDocumentProperties = void 0; + var _ui_utils = __webpack_require__(3); + var _pdfjsLib = __webpack_require__(4); + const DEFAULT_FIELD_CONTENT = "-"; + const NON_METRIC_LOCALES = ["en-us", "en-lr", "my"]; + const US_PAGE_NAMES = { + "8.5x11": "Letter", + "8.5x14": "Legal" + }; + const METRIC_PAGE_NAMES = { + "297x420": "A3", + "210x297": "A4" + }; + + function getPageName(size, isPortrait, pageNames) { + const width = isPortrait ? size.width : size.height; + const height = isPortrait ? size.height : size.width; + return pageNames[`${width}x${height}`]; + } + + class PDFDocumentProperties { + #fieldData = null; + + constructor({ + dialog, + fields, + closeButton + }, overlayManager, eventBus, l10n, fileNameLookup) { + this.dialog = dialog; + this.fields = fields; + this.overlayManager = overlayManager; + this.l10n = l10n; + this._fileNameLookup = fileNameLookup; + this.#reset(); + closeButton.addEventListener("click", this.close.bind(this)); + this.overlayManager.register(this.dialog); + eventBus._on("pagechanging", evt => { + this._currentPageNumber = evt.pageNumber; + }); + eventBus._on("rotationchanging", evt => { + this._pagesRotation = evt.pagesRotation; + }); + this._isNonMetricLocale = true; + l10n.getLanguage().then(locale => { + this._isNonMetricLocale = NON_METRIC_LOCALES.includes(locale); + }); + } + + async open() { + await Promise.all([this.overlayManager.open(this.dialog), this._dataAvailableCapability.promise]); + const currentPageNumber = this._currentPageNumber; + const pagesRotation = this._pagesRotation; + if (this.#fieldData && currentPageNumber === this.#fieldData._currentPageNumber && pagesRotation === this.#fieldData._pagesRotation) { + this.#updateUI(); + return; + } + const { + info, + contentLength + } = await this.pdfDocument.getMetadata(); + const [fileName, fileSize, creationDate, modificationDate, pageSize, isLinearized] = await Promise.all([this._fileNameLookup(), this.#parseFileSize(contentLength), this.#parseDate(info.CreationDate), this.#parseDate(info.ModDate), this.pdfDocument.getPage(currentPageNumber).then(pdfPage => { + return this.#parsePageSize((0, _ui_utils.getPageSizeInches)(pdfPage), pagesRotation); + }), this.#parseLinearization(info.IsLinearized)]); + this.#fieldData = Object.freeze({ + fileName, + fileSize, + title: info.Title, + author: info.Author, + subject: info.Subject, + keywords: info.Keywords, + creationDate, + modificationDate, + creator: info.Creator, + producer: info.Producer, + version: info.PDFFormatVersion, + pageCount: this.pdfDocument.numPages, + pageSize, + linearized: isLinearized, + _currentPageNumber: currentPageNumber, + _pagesRotation: pagesRotation + }); + this.#updateUI(); + const { + length + } = await this.pdfDocument.getDownloadInfo(); + if (contentLength === length) { + return; + } + const data = Object.assign(Object.create(null), this.#fieldData); + data.fileSize = await this.#parseFileSize(length); + this.#fieldData = Object.freeze(data); + this.#updateUI(); + } + + async close() { + this.overlayManager.close(this.dialog); + } + + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.#reset(); + this.#updateUI(true); + } + if (!pdfDocument) { + return; + } + this.pdfDocument = pdfDocument; + this._dataAvailableCapability.resolve(); + } + + #reset() { + this.pdfDocument = null; + this.#fieldData = null; + this._dataAvailableCapability = new _pdfjsLib.PromiseCapability(); + this._currentPageNumber = 1; + this._pagesRotation = 0; + } + + #updateUI(reset = false) { + if (reset || !this.#fieldData) { + for (const id in this.fields) { + this.fields[id].textContent = DEFAULT_FIELD_CONTENT; + } + return; + } + if (this.overlayManager.active !== this.dialog) { + return; + } + for (const id in this.fields) { + const content = this.#fieldData[id]; + this.fields[id].textContent = content || content === 0 ? content : DEFAULT_FIELD_CONTENT; + } + } + + async #parseFileSize(fileSize = 0) { + const kb = fileSize / 1024, + mb = kb / 1024; + if (!kb) { + return undefined; + } + return this.l10n.get(`document_properties_${mb >= 1 ? "mb" : "kb"}`, { + size_mb: mb >= 1 && (+mb.toPrecision(3)).toLocaleString(), + size_kb: mb < 1 && (+kb.toPrecision(3)).toLocaleString(), + size_b: fileSize.toLocaleString() + }); + } + + async #parsePageSize(pageSizeInches, pagesRotation) { + if (!pageSizeInches) { + return undefined; + } + if (pagesRotation % 180 !== 0) { + pageSizeInches = { + width: pageSizeInches.height, + height: pageSizeInches.width + }; + } + const isPortrait = (0, _ui_utils.isPortraitOrientation)(pageSizeInches); + let sizeInches = { + width: Math.round(pageSizeInches.width * 100) / 100, + height: Math.round(pageSizeInches.height * 100) / 100 + }; + let sizeMillimeters = { + width: Math.round(pageSizeInches.width * 25.4 * 10) / 10, + height: Math.round(pageSizeInches.height * 25.4 * 10) / 10 + }; + let rawName = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES); + if (!rawName && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) { + const exactMillimeters = { + width: pageSizeInches.width * 25.4, + height: pageSizeInches.height * 25.4 + }; + const intMillimeters = { + width: Math.round(sizeMillimeters.width), + height: Math.round(sizeMillimeters.height) + }; + if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) { + rawName = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES); + if (rawName) { + sizeInches = { + width: Math.round(intMillimeters.width / 25.4 * 100) / 100, + height: Math.round(intMillimeters.height / 25.4 * 100) / 100 + }; + sizeMillimeters = intMillimeters; + } + } + } + const [{ + width, + height + }, unit, name, orientation] = await Promise.all([this._isNonMetricLocale ? sizeInches : sizeMillimeters, this.l10n.get(`document_properties_page_size_unit_${this._isNonMetricLocale ? "inches" : "millimeters"}`), rawName && this.l10n.get(`document_properties_page_size_name_${rawName.toLowerCase()}`), this.l10n.get(`document_properties_page_size_orientation_${isPortrait ? "portrait" : "landscape"}`)]); + return this.l10n.get(`document_properties_page_size_dimension_${name ? "name_" : ""}string`, { + width: width.toLocaleString(), + height: height.toLocaleString(), + unit, + name, + orientation + }); + } + + async #parseDate(inputDate) { + const dateObject = _pdfjsLib.PDFDateString.toDateObject(inputDate); + if (!dateObject) { + return undefined; + } + return this.l10n.get("document_properties_date_string", { + date: dateObject.toLocaleDateString(), + time: dateObject.toLocaleTimeString() + }); + } + + #parseLinearization(isLinearized) { + return this.l10n.get(`document_properties_linearized_${isLinearized ? "yes" : "no"}`); + } + } + + exports.PDFDocumentProperties = PDFDocumentProperties; + + /***/ + }), + /* 17 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFFindBar = void 0; + var _pdf_find_controller = __webpack_require__(18); + var _ui_utils = __webpack_require__(3); + const MATCHES_COUNT_LIMIT = 1000; + + class PDFFindBar { + constructor(options, eventBus, l10n) { + this.opened = false; + this.bar = options.bar; + this.toggleButton = options.toggleButton; + this.findField = options.findField; + this.highlightAll = options.highlightAllCheckbox; + this.caseSensitive = options.caseSensitiveCheckbox; + this.matchDiacritics = options.matchDiacriticsCheckbox; + this.entireWord = options.entireWordCheckbox; + this.findMsg = options.findMsg; + this.findResultsCount = options.findResultsCount; + this.findPreviousButton = options.findPreviousButton; + this.findNextButton = options.findNextButton; + this.eventBus = eventBus; + this.l10n = l10n; + this.toggleButton.addEventListener("click", () => { + this.toggle(); + }); + this.findField.addEventListener("input", () => { + this.dispatchEvent(""); + }); + this.bar.addEventListener("keydown", e => { + switch (e.keyCode) { + case 13: + if (e.target === this.findField) { + this.dispatchEvent("again", e.shiftKey); + } + break; + case 27: + this.close(); + break; + } + }); + this.findPreviousButton.addEventListener("click", () => { + this.dispatchEvent("again", true); + }); + this.findNextButton.addEventListener("click", () => { + this.dispatchEvent("again", false); + }); + this.highlightAll.addEventListener("click", () => { + this.dispatchEvent("highlightallchange"); + }); + this.caseSensitive.addEventListener("click", () => { + this.dispatchEvent("casesensitivitychange"); + }); + this.entireWord.addEventListener("click", () => { + this.dispatchEvent("entirewordchange"); + }); + this.matchDiacritics.addEventListener("click", () => { + this.dispatchEvent("diacriticmatchingchange"); + }); + this.eventBus._on("resize", this.#adjustWidth.bind(this)); + } + + reset() { + this.updateUIState(); + } + + dispatchEvent(type, findPrev = false) { + this.eventBus.dispatch("find", { + source: this, + type, + query: this.findField.value, + caseSensitive: this.caseSensitive.checked, + entireWord: this.entireWord.checked, + highlightAll: this.highlightAll.checked, + findPrevious: findPrev, + matchDiacritics: this.matchDiacritics.checked + }); + } + + updateUIState(state, previous, matchesCount) { + let findMsg = Promise.resolve(""); + let status = ""; + switch (state) { + case _pdf_find_controller.FindState.FOUND: + break; + case _pdf_find_controller.FindState.PENDING: + status = "pending"; + break; + case _pdf_find_controller.FindState.NOT_FOUND: + findMsg = this.l10n.get("find_not_found"); + status = "notFound"; + break; + case _pdf_find_controller.FindState.WRAPPED: + findMsg = this.l10n.get(`find_reached_${previous ? "top" : "bottom"}`); + break; + } + this.findField.setAttribute("data-status", status); + this.findField.setAttribute("aria-invalid", state === _pdf_find_controller.FindState.NOT_FOUND); + findMsg.then(msg => { + this.findMsg.setAttribute("data-status", status); + this.findMsg.textContent = msg; + this.#adjustWidth(); + }); + this.updateResultsCount(matchesCount); + } + + updateResultsCount({ + current = 0, + total = 0 + } = {}) { + const limit = MATCHES_COUNT_LIMIT; + let matchCountMsg = Promise.resolve(""); + if (total > 0) { + if (total > limit) { + let key = "find_match_count_limit"; + matchCountMsg = this.l10n.get(key, { + limit + }); + } else { + let key = "find_match_count"; + matchCountMsg = this.l10n.get(key, { + current, + total + }); + } + } + matchCountMsg.then(msg => { + this.findResultsCount.textContent = msg; + this.#adjustWidth(); + }); + } + + open() { + if (!this.opened) { + this.opened = true; + (0, _ui_utils.toggleExpandedBtn)(this.toggleButton, true, this.bar); + } + this.findField.select(); + this.findField.focus(); + this.#adjustWidth(); + } + + close() { + if (!this.opened) { + return; + } + this.opened = false; + (0, _ui_utils.toggleExpandedBtn)(this.toggleButton, false, this.bar); + this.eventBus.dispatch("findbarclose", { + source: this + }); + } + + toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } + + #adjustWidth() { + if (!this.opened) { + return; + } + this.bar.classList.remove("wrapContainers"); + const findbarHeight = this.bar.clientHeight; + const inputContainerHeight = this.bar.firstElementChild.clientHeight; + if (findbarHeight > inputContainerHeight) { + this.bar.classList.add("wrapContainers"); + } + } + } + + exports.PDFFindBar = PDFFindBar; + + /***/ + }), + /* 18 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFFindController = exports.FindState = void 0; + var _ui_utils = __webpack_require__(3); + var _pdf_find_utils = __webpack_require__(19); + var _pdfjsLib = __webpack_require__(4); + const FindState = { + FOUND: 0, + NOT_FOUND: 1, + WRAPPED: 2, + PENDING: 3 + }; + exports.FindState = FindState; + const FIND_TIMEOUT = 250; + const MATCH_SCROLL_OFFSET_TOP = -50; + const MATCH_SCROLL_OFFSET_LEFT = -400; + const CHARACTERS_TO_NORMALIZE = { + "\u2010": "-", + "\u2018": "'", + "\u2019": "'", + "\u201A": "'", + "\u201B": "'", + "\u201C": '"', + "\u201D": '"', + "\u201E": '"', + "\u201F": '"', + "\u00BC": "1/4", + "\u00BD": "1/2", + "\u00BE": "3/4" + }; + const DIACRITICS_EXCEPTION = new Set([0x3099, 0x309a, 0x094d, 0x09cd, 0x0a4d, 0x0acd, 0x0b4d, 0x0bcd, 0x0c4d, 0x0ccd, 0x0d3b, 0x0d3c, 0x0d4d, 0x0dca, 0x0e3a, 0x0eba, 0x0f84, 0x1039, 0x103a, 0x1714, 0x1734, 0x17d2, 0x1a60, 0x1b44, 0x1baa, 0x1bab, 0x1bf2, 0x1bf3, 0x2d7f, 0xa806, 0xa82c, 0xa8c4, 0xa953, 0xa9c0, 0xaaf6, 0xabed, 0x0c56, 0x0f71, 0x0f72, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f80, 0x0f74]); + let DIACRITICS_EXCEPTION_STR; + const DIACRITICS_REG_EXP = /\p{M}+/gu; + const SPECIAL_CHARS_REG_EXP = /([.*+?^${}()|[\]\\])|(\p{P})|(\s+)|(\p{M})|(\p{L})/gu; + const NOT_DIACRITIC_FROM_END_REG_EXP = /([^\p{M}])\p{M}*$/u; + const NOT_DIACRITIC_FROM_START_REG_EXP = /^\p{M}*([^\p{M}])/u; + const SYLLABLES_REG_EXP = /[\uAC00-\uD7AF\uFA6C\uFACF-\uFAD1\uFAD5-\uFAD7]+/g; + const SYLLABLES_LENGTHS = new Map(); + const FIRST_CHAR_SYLLABLES_REG_EXP = "[\\u1100-\\u1112\\ud7a4-\\ud7af\\ud84a\\ud84c\\ud850\\ud854\\ud857\\ud85f]"; + const NFKC_CHARS_TO_NORMALIZE = new Map(); + let noSyllablesRegExp = null; + let withSyllablesRegExp = null; + + function normalize(text) { + const syllablePositions = []; + let m; + while ((m = SYLLABLES_REG_EXP.exec(text)) !== null) { + let { + index + } = m; + for (const char of m[0]) { + let len = SYLLABLES_LENGTHS.get(char); + if (!len) { + len = char.normalize("NFD").length; + SYLLABLES_LENGTHS.set(char, len); + } + syllablePositions.push([len, index++]); + } + } + let normalizationRegex; + if (syllablePositions.length === 0 && noSyllablesRegExp) { + normalizationRegex = noSyllablesRegExp; + } else if (syllablePositions.length > 0 && withSyllablesRegExp) { + normalizationRegex = withSyllablesRegExp; + } else { + const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(""); + const toNormalizeWithNFKC = (0, _pdf_find_utils.getNormalizeWithNFKC)(); + const CJK = "(?:\\p{Ideographic}|[\u3040-\u30FF])"; + const HKDiacritics = "(?:\u3099|\u309A)"; + const regexp = `([${replace}])|([${toNormalizeWithNFKC}])|(${HKDiacritics}\\n)|(\\p{M}+(?:-\\n)?)|(\\S-\\n)|(${CJK}\\n)|(\\n)`; + if (syllablePositions.length === 0) { + normalizationRegex = noSyllablesRegExp = new RegExp(regexp + "|(\\u0000)", "gum"); + } else { + normalizationRegex = withSyllablesRegExp = new RegExp(regexp + `|(${FIRST_CHAR_SYLLABLES_REG_EXP})`, "gum"); + } + } + const rawDiacriticsPositions = []; + while ((m = DIACRITICS_REG_EXP.exec(text)) !== null) { + rawDiacriticsPositions.push([m[0].length, m.index]); + } + let normalized = text.normalize("NFD"); + const positions = [[0, 0]]; + let rawDiacriticsIndex = 0; + let syllableIndex = 0; + let shift = 0; + let shiftOrigin = 0; + let eol = 0; + let hasDiacritics = false; + normalized = normalized.replace(normalizationRegex, (match, p1, p2, p3, p4, p5, p6, p7, p8, i) => { + i -= shiftOrigin; + if (p1) { + const replacement = CHARACTERS_TO_NORMALIZE[p1]; + const jj = replacement.length; + for (let j = 1; j < jj; j++) { + positions.push([i - shift + j, shift - j]); + } + shift -= jj - 1; + return replacement; + } + if (p2) { + let replacement = NFKC_CHARS_TO_NORMALIZE.get(p2); + if (!replacement) { + replacement = p2.normalize("NFKC"); + NFKC_CHARS_TO_NORMALIZE.set(p2, replacement); + } + const jj = replacement.length; + for (let j = 1; j < jj; j++) { + positions.push([i - shift + j, shift - j]); + } + shift -= jj - 1; + return replacement; + } + if (p3) { + hasDiacritics = true; + if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) { + ++rawDiacriticsIndex; + } else { + positions.push([i - 1 - shift + 1, shift - 1]); + shift -= 1; + shiftOrigin += 1; + } + positions.push([i - shift + 1, shift]); + shiftOrigin += 1; + eol += 1; + return p3.charAt(0); + } + if (p4) { + const hasTrailingDashEOL = p4.endsWith("\n"); + const len = hasTrailingDashEOL ? p4.length - 2 : p4.length; + hasDiacritics = true; + let jj = len; + if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) { + jj -= rawDiacriticsPositions[rawDiacriticsIndex][0]; + ++rawDiacriticsIndex; + } + for (let j = 1; j <= jj; j++) { + positions.push([i - 1 - shift + j, shift - j]); + } + shift -= jj; + shiftOrigin += jj; + if (hasTrailingDashEOL) { + i += len - 1; + positions.push([i - shift + 1, 1 + shift]); + shift += 1; + shiftOrigin += 1; + eol += 1; + return p4.slice(0, len); + } + return p4; + } + if (p5) { + const len = p5.length - 2; + positions.push([i - shift + len, 1 + shift]); + shift += 1; + shiftOrigin += 1; + eol += 1; + return p5.slice(0, -2); + } + if (p6) { + const len = p6.length - 1; + positions.push([i - shift + len, shift]); + shiftOrigin += 1; + eol += 1; + return p6.slice(0, -1); + } + if (p7) { + positions.push([i - shift + 1, shift - 1]); + shift -= 1; + shiftOrigin += 1; + eol += 1; + return " "; + } + if (i + eol === syllablePositions[syllableIndex]?.[1]) { + const newCharLen = syllablePositions[syllableIndex][0] - 1; + ++syllableIndex; + for (let j = 1; j <= newCharLen; j++) { + positions.push([i - (shift - j), shift - j]); + } + shift -= newCharLen; + shiftOrigin += newCharLen; + } + return p8; + }); + positions.push([normalized.length, shift]); + return [normalized, positions, hasDiacritics]; + } + + function getOriginalIndex(diffs, pos, len) { + if (!diffs) { + return [pos, len]; + } + const start = pos; + const end = pos + len - 1; + let i = (0, _ui_utils.binarySearchFirstItem)(diffs, x => x[0] >= start); + if (diffs[i][0] > start) { + --i; + } + let j = (0, _ui_utils.binarySearchFirstItem)(diffs, x => x[0] >= end, i); + if (diffs[j][0] > end) { + --j; + } + const oldStart = start + diffs[i][1]; + const oldEnd = end + diffs[j][1]; + const oldLen = oldEnd + 1 - oldStart; + return [oldStart, oldLen]; + } + + class PDFFindController { + #state = null; + #updateMatchesCountOnProgress = true; + #visitedPagesCount = 0; + + constructor({ + linkService, + eventBus, + updateMatchesCountOnProgress = true + }) { + this._linkService = linkService; + this._eventBus = eventBus; + this.#updateMatchesCountOnProgress = updateMatchesCountOnProgress; + this.onIsPageVisible = null; + this.#reset(); + eventBus._on("find", this.#onFind.bind(this)); + eventBus._on("findbarclose", this.#onFindBarClose.bind(this)); + } + + get highlightMatches() { + return this._highlightMatches; + } + + get pageMatches() { + return this._pageMatches; + } + + get pageMatchesLength() { + return this._pageMatchesLength; + } + + get selected() { + return this._selected; + } + + get state() { + return this.#state; + } + + setDocument(pdfDocument) { + if (this._pdfDocument) { + this.#reset(); + } + if (!pdfDocument) { + return; + } + this._pdfDocument = pdfDocument; + this._firstPageCapability.resolve(); + } + + #onFind(state) { + if (!state) { + return; + } + if (state.phraseSearch === false) { + console.error("The `phraseSearch`-parameter was removed, please provide " + "an Array of strings in the `query`-parameter instead."); + if (typeof state.query === "string") { + state.query = state.query.match(/\S+/g); + } + } + const pdfDocument = this._pdfDocument; + const { + type + } = state; + if (this.#state === null || this.#shouldDirtyMatch(state)) { + this._dirtyMatch = true; + } + this.#state = state; + if (type !== "highlightallchange") { + this.#updateUIState(FindState.PENDING); + } + this._firstPageCapability.promise.then(() => { + if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) { + return; + } + this.#extractText(); + const findbarClosed = !this._highlightMatches; + const pendingTimeout = !!this._findTimeout; + if (this._findTimeout) { + clearTimeout(this._findTimeout); + this._findTimeout = null; + } + if (!type) { + this._findTimeout = setTimeout(() => { + this.#nextMatch(); + this._findTimeout = null; + }, FIND_TIMEOUT); + } else if (this._dirtyMatch) { + this.#nextMatch(); + } else if (type === "again") { + this.#nextMatch(); + if (findbarClosed && this.#state.highlightAll) { + this.#updateAllPages(); + } + } else if (type === "highlightallchange") { + if (pendingTimeout) { + this.#nextMatch(); + } else { + this._highlightMatches = true; + } + this.#updateAllPages(); + } else { + this.#nextMatch(); + } + }); + } + + scrollMatchIntoView({ + element = null, + selectedLeft = 0, + pageIndex = -1, + matchIndex = -1 + }) { + if (!this._scrollMatches || !element) { + return; + } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) { + return; + } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) { + return; + } + this._scrollMatches = false; + const spot = { + top: MATCH_SCROLL_OFFSET_TOP, + left: selectedLeft + MATCH_SCROLL_OFFSET_LEFT + }; + (0, _ui_utils.scrollIntoView)(element, spot, true); + } + + #reset() { + this._highlightMatches = false; + this._scrollMatches = false; + this._pdfDocument = null; + this._pageMatches = []; + this._pageMatchesLength = []; + this.#visitedPagesCount = 0; + this.#state = null; + this._selected = { + pageIdx: -1, + matchIdx: -1 + }; + this._offset = { + pageIdx: null, + matchIdx: null, + wrapped: false + }; + this._extractTextPromises = []; + this._pageContents = []; + this._pageDiffs = []; + this._hasDiacritics = []; + this._matchesCountTotal = 0; + this._pagesToSearch = null; + this._pendingFindMatches = new Set(); + this._resumePageIdx = null; + this._dirtyMatch = false; + clearTimeout(this._findTimeout); + this._findTimeout = null; + this._firstPageCapability = new _pdfjsLib.PromiseCapability(); + } + + get #query() { + const { + query + } = this.#state; + if (typeof query === "string") { + if (query !== this._rawQuery) { + this._rawQuery = query; + [this._normalizedQuery] = normalize(query); + } + return this._normalizedQuery; + } + return (query || []).filter(q => !!q).map(q => normalize(q)[0]); + } + + #shouldDirtyMatch(state) { + const newQuery = state.query, + prevQuery = this.#state.query; + const newType = typeof newQuery, + prevType = typeof prevQuery; + if (newType !== prevType) { + return true; + } + if (newType === "string") { + if (newQuery !== prevQuery) { + return true; + } + } else if (JSON.stringify(newQuery) !== JSON.stringify(prevQuery)) { + return true; + } + switch (state.type) { + case "again": + const pageNumber = this._selected.pageIdx + 1; + const linkService = this._linkService; + return pageNumber >= 1 && pageNumber <= linkService.pagesCount && pageNumber !== linkService.page && !(this.onIsPageVisible?.(pageNumber) ?? true); + case "highlightallchange": + return false; + } + return true; + } + + #isEntireWord(content, startIdx, length) { + let match = content.slice(0, startIdx).match(NOT_DIACRITIC_FROM_END_REG_EXP); + if (match) { + const first = content.charCodeAt(startIdx); + const limit = match[1].charCodeAt(0); + if ((0, _pdf_find_utils.getCharacterType)(first) === (0, _pdf_find_utils.getCharacterType)(limit)) { + return false; + } + } + match = content.slice(startIdx + length).match(NOT_DIACRITIC_FROM_START_REG_EXP); + if (match) { + const last = content.charCodeAt(startIdx + length - 1); + const limit = match[1].charCodeAt(0); + if ((0, _pdf_find_utils.getCharacterType)(last) === (0, _pdf_find_utils.getCharacterType)(limit)) { + return false; + } + } + return true; + } + + #calculateRegExpMatch(query, entireWord, pageIndex, pageContent) { + const matches = this._pageMatches[pageIndex] = []; + const matchesLength = this._pageMatchesLength[pageIndex] = []; + if (!query) { + return; + } + const diffs = this._pageDiffs[pageIndex]; + let match; + while ((match = query.exec(pageContent)) !== null) { + if (entireWord && !this.#isEntireWord(pageContent, match.index, match[0].length)) { + continue; + } + const [matchPos, matchLen] = getOriginalIndex(diffs, match.index, match[0].length); + if (matchLen) { + matches.push(matchPos); + matchesLength.push(matchLen); + } + } + } + + #convertToRegExpString(query, hasDiacritics) { + const { + matchDiacritics + } = this.#state; + let isUnicode = false; + query = query.replaceAll(SPECIAL_CHARS_REG_EXP, (match, p1, p2, p3, p4, p5) => { + if (p1) { + return `[ ]*\\${p1}[ ]*`; + } + if (p2) { + return `[ ]*${p2}[ ]*`; + } + if (p3) { + return "[ ]+"; + } + if (matchDiacritics) { + return p4 || p5; + } + if (p4) { + return DIACRITICS_EXCEPTION.has(p4.charCodeAt(0)) ? p4 : ""; + } + if (hasDiacritics) { + isUnicode = true; + return `${p5}\\p{M}*`; + } + return p5; + }); + const trailingSpaces = "[ ]*"; + if (query.endsWith(trailingSpaces)) { + query = query.slice(0, query.length - trailingSpaces.length); + } + if (matchDiacritics) { + if (hasDiacritics) { + DIACRITICS_EXCEPTION_STR ||= String.fromCharCode(...DIACRITICS_EXCEPTION); + isUnicode = true; + query = `${query}(?=[${DIACRITICS_EXCEPTION_STR}]|[^\\p{M}]|$)`; + } + } + return [isUnicode, query]; + } + + #calculateMatch(pageIndex) { + let query = this.#query; + if (query.length === 0) { + return; + } + const { + caseSensitive, + entireWord + } = this.#state; + const pageContent = this._pageContents[pageIndex]; + const hasDiacritics = this._hasDiacritics[pageIndex]; + let isUnicode = false; + if (typeof query === "string") { + [isUnicode, query] = this.#convertToRegExpString(query, hasDiacritics); + } else { + query = query.sort().reverse().map(q => { + const [isUnicodePart, queryPart] = this.#convertToRegExpString(q, hasDiacritics); + isUnicode ||= isUnicodePart; + return `(${queryPart})`; + }).join("|"); + } + const flags = `g${isUnicode ? "u" : ""}${caseSensitive ? "" : "i"}`; + query = query ? new RegExp(query, flags) : null; + this.#calculateRegExpMatch(query, entireWord, pageIndex, pageContent); + if (this.#state.highlightAll) { + this.#updatePage(pageIndex); + } + if (this._resumePageIdx === pageIndex) { + this._resumePageIdx = null; + this.#nextPageMatch(); + } + const pageMatchesCount = this._pageMatches[pageIndex].length; + this._matchesCountTotal += pageMatchesCount; + if (this.#updateMatchesCountOnProgress) { + if (pageMatchesCount > 0) { + this.#updateUIResultsCount(); + } + } else if (++this.#visitedPagesCount === this._linkService.pagesCount) { + this.#updateUIResultsCount(); + } + } + + #extractText() { + if (this._extractTextPromises.length > 0) { + return; + } + let promise = Promise.resolve(); + const textOptions = { + disableNormalization: true + }; + for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) { + const extractTextCapability = new _pdfjsLib.PromiseCapability(); + this._extractTextPromises[i] = extractTextCapability.promise; + promise = promise.then(() => { + return this._pdfDocument.getPage(i + 1).then(pdfPage => { + return pdfPage.getTextContent(textOptions); + }).then(textContent => { + const strBuf = []; + for (const textItem of textContent.items) { + strBuf.push(textItem.str); + if (textItem.hasEOL) { + strBuf.push("\n"); + } + } + [this._pageContents[i], this._pageDiffs[i], this._hasDiacritics[i]] = normalize(strBuf.join("")); + extractTextCapability.resolve(); + }, reason => { + console.error(`Unable to get text content for page ${i + 1}`, reason); + this._pageContents[i] = ""; + this._pageDiffs[i] = null; + this._hasDiacritics[i] = false; + extractTextCapability.resolve(); + }); + }); + } + } + + #updatePage(index) { + if (this._scrollMatches && this._selected.pageIdx === index) { + this._linkService.page = index + 1; + } + this._eventBus.dispatch("updatetextlayermatches", { + source: this, + pageIndex: index + }); + } + + #updateAllPages() { + this._eventBus.dispatch("updatetextlayermatches", { + source: this, + pageIndex: -1 + }); + } + + #nextMatch() { + const previous = this.#state.findPrevious; + const currentPageIndex = this._linkService.page - 1; + const numPages = this._linkService.pagesCount; + this._highlightMatches = true; + if (this._dirtyMatch) { + this._dirtyMatch = false; + this._selected.pageIdx = this._selected.matchIdx = -1; + this._offset.pageIdx = currentPageIndex; + this._offset.matchIdx = null; + this._offset.wrapped = false; + this._resumePageIdx = null; + this._pageMatches.length = 0; + this._pageMatchesLength.length = 0; + this.#visitedPagesCount = 0; + this._matchesCountTotal = 0; + this.#updateAllPages(); + for (let i = 0; i < numPages; i++) { + if (this._pendingFindMatches.has(i)) { + continue; + } + this._pendingFindMatches.add(i); + this._extractTextPromises[i].then(() => { + this._pendingFindMatches.delete(i); + this.#calculateMatch(i); + }); + } + } + const query = this.#query; + if (query.length === 0) { + this.#updateUIState(FindState.FOUND); + return; + } + if (this._resumePageIdx) { + return; + } + const offset = this._offset; + this._pagesToSearch = numPages; + if (offset.matchIdx !== null) { + const numPageMatches = this._pageMatches[offset.pageIdx].length; + if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) { + offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1; + this.#updateMatch(true); + return; + } + this.#advanceOffsetPage(previous); + } + this.#nextPageMatch(); + } + + #matchesReady(matches) { + const offset = this._offset; + const numMatches = matches.length; + const previous = this.#state.findPrevious; + if (numMatches) { + offset.matchIdx = previous ? numMatches - 1 : 0; + this.#updateMatch(true); + return true; + } + this.#advanceOffsetPage(previous); + if (offset.wrapped) { + offset.matchIdx = null; + if (this._pagesToSearch < 0) { + this.#updateMatch(false); + return true; + } + } + return false; + } + + #nextPageMatch() { + if (this._resumePageIdx !== null) { + console.error("There can only be one pending page."); + } + let matches = null; + do { + const pageIdx = this._offset.pageIdx; + matches = this._pageMatches[pageIdx]; + if (!matches) { + this._resumePageIdx = pageIdx; + break; + } + } while (!this.#matchesReady(matches)); + } + + #advanceOffsetPage(previous) { + const offset = this._offset; + const numPages = this._linkService.pagesCount; + offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1; + offset.matchIdx = null; + this._pagesToSearch--; + if (offset.pageIdx >= numPages || offset.pageIdx < 0) { + offset.pageIdx = previous ? numPages - 1 : 0; + offset.wrapped = true; + } + } + + #updateMatch(found = false) { + let state = FindState.NOT_FOUND; + const wrapped = this._offset.wrapped; + this._offset.wrapped = false; + if (found) { + const previousPage = this._selected.pageIdx; + this._selected.pageIdx = this._offset.pageIdx; + this._selected.matchIdx = this._offset.matchIdx; + state = wrapped ? FindState.WRAPPED : FindState.FOUND; + if (previousPage !== -1 && previousPage !== this._selected.pageIdx) { + this.#updatePage(previousPage); + } + } + this.#updateUIState(state, this.#state.findPrevious); + if (this._selected.pageIdx !== -1) { + this._scrollMatches = true; + this.#updatePage(this._selected.pageIdx); + } + } + + #onFindBarClose(evt) { + const pdfDocument = this._pdfDocument; + this._firstPageCapability.promise.then(() => { + if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) { + return; + } + if (this._findTimeout) { + clearTimeout(this._findTimeout); + this._findTimeout = null; + } + if (this._resumePageIdx) { + this._resumePageIdx = null; + this._dirtyMatch = true; + } + this.#updateUIState(FindState.FOUND); + this._highlightMatches = false; + this.#updateAllPages(); + }); + } + + #requestMatchesCount() { + const { + pageIdx, + matchIdx + } = this._selected; + let current = 0, + total = this._matchesCountTotal; + if (matchIdx !== -1) { + for (let i = 0; i < pageIdx; i++) { + current += this._pageMatches[i]?.length || 0; + } + current += matchIdx + 1; + } + if (current < 1 || current > total) { + current = total = 0; + } + return { + current, + total + }; + } + + #updateUIResultsCount() { + this._eventBus.dispatch("updatefindmatchescount", { + source: this, + matchesCount: this.#requestMatchesCount() + }); + } + + #updateUIState(state, previous = false) { + if (!this.#updateMatchesCountOnProgress && (this.#visitedPagesCount !== this._linkService.pagesCount || state === FindState.PENDING)) { + return; + } + this._eventBus.dispatch("updatefindcontrolstate", { + source: this, + state, + previous, + matchesCount: this.#requestMatchesCount(), + rawQuery: this.#state?.query ?? null + }); + } + } + + exports.PDFFindController = PDFFindController; + + /***/ + }), + /* 19 */ + /***/ ((__unused_webpack_module, exports) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.CharacterType = void 0; + exports.getCharacterType = getCharacterType; + exports.getNormalizeWithNFKC = getNormalizeWithNFKC; + const CharacterType = { + SPACE: 0, + ALPHA_LETTER: 1, + PUNCT: 2, + HAN_LETTER: 3, + KATAKANA_LETTER: 4, + HIRAGANA_LETTER: 5, + HALFWIDTH_KATAKANA_LETTER: 6, + THAI_LETTER: 7 + }; + exports.CharacterType = CharacterType; + + function isAlphabeticalScript(charCode) { + return charCode < 0x2e80; + } + + function isAscii(charCode) { + return (charCode & 0xff80) === 0; + } + + function isAsciiAlpha(charCode) { + return charCode >= 0x61 && charCode <= 0x7a || charCode >= 0x41 && charCode <= 0x5a; + } + + function isAsciiDigit(charCode) { + return charCode >= 0x30 && charCode <= 0x39; + } + + function isAsciiSpace(charCode) { + return charCode === 0x20 || charCode === 0x09 || charCode === 0x0d || charCode === 0x0a; + } + + function isHan(charCode) { + return charCode >= 0x3400 && charCode <= 0x9fff || charCode >= 0xf900 && charCode <= 0xfaff; + } + + function isKatakana(charCode) { + return charCode >= 0x30a0 && charCode <= 0x30ff; + } + + function isHiragana(charCode) { + return charCode >= 0x3040 && charCode <= 0x309f; + } + + function isHalfwidthKatakana(charCode) { + return charCode >= 0xff60 && charCode <= 0xff9f; + } + + function isThai(charCode) { + return (charCode & 0xff80) === 0x0e00; + } + + function getCharacterType(charCode) { + if (isAlphabeticalScript(charCode)) { + if (isAscii(charCode)) { + if (isAsciiSpace(charCode)) { + return CharacterType.SPACE; + } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5f) { + return CharacterType.ALPHA_LETTER; + } + return CharacterType.PUNCT; + } else if (isThai(charCode)) { + return CharacterType.THAI_LETTER; + } else if (charCode === 0xa0) { + return CharacterType.SPACE; + } + return CharacterType.ALPHA_LETTER; + } + if (isHan(charCode)) { + return CharacterType.HAN_LETTER; + } else if (isKatakana(charCode)) { + return CharacterType.KATAKANA_LETTER; + } else if (isHiragana(charCode)) { + return CharacterType.HIRAGANA_LETTER; + } else if (isHalfwidthKatakana(charCode)) { + return CharacterType.HALFWIDTH_KATAKANA_LETTER; + } + return CharacterType.ALPHA_LETTER; + } + + let NormalizeWithNFKC; + + function getNormalizeWithNFKC() { + NormalizeWithNFKC ||= ` ¨ª¯²-µ¸-º¼-¾IJ-ijĿ-ŀʼnſDŽ-njDZ-dzʰ-ʸ˘-˝ˠ-ˤʹͺ;΄-΅·ϐ-ϖϰ-ϲϴ-ϵϹևٵ-ٸक़-य़ড়-ঢ়য়ਲ਼ਸ਼ਖ਼-ਜ਼ਫ਼ଡ଼-ଢ଼ำຳໜ-ໝ༌གྷཌྷདྷབྷཛྷཀྵჼᴬ-ᴮᴰ-ᴺᴼ-ᵍᵏ-ᵪᵸᶛ-ᶿẚ-ẛάέήίόύώΆ᾽-῁ΈΉ῍-῏ΐΊ῝-῟ΰΎ῭-`ΌΏ´-῾ - ‑‗․-… ″-‴‶-‷‼‾⁇-⁉⁗ ⁰-ⁱ⁴-₎ₐ-ₜ₨℀-℃℅-ℇ℉-ℓℕ-№ℙ-ℝ℠-™ℤΩℨK-ℭℯ-ℱℳ-ℹ℻-⅀ⅅ-ⅉ⅐-ⅿ↉∬-∭∯-∰〈-〉①-⓪⨌⩴-⩶⫝̸ⱼ-ⱽⵯ⺟⻳⼀-⿕ 〶〸-〺゛-゜ゟヿㄱ-ㆎ㆒-㆟㈀-㈞㈠-㉇㉐-㉾㊀-㏿ꚜ-ꚝꝰꟲ-ꟴꟸ-ꟹꭜ-ꭟꭩ豈-嗀塚晴凞-羽蘒諸逸-都飯-舘並-龎ff-stﬓ-ﬗיִײַ-זּטּ-לּמּנּ-סּףּ-פּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-﷼︐-︙︰-﹄﹇-﹒﹔-﹦﹨-﹫ﹰ-ﹲﹴﹶ-ﻼ!-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ¢-₩`; + return NormalizeWithNFKC; + } + + /***/ + }), + /* 20 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFHistory = void 0; + exports.isDestArraysEqual = isDestArraysEqual; + exports.isDestHashesEqual = isDestHashesEqual; + var _ui_utils = __webpack_require__(3); + var _event_utils = __webpack_require__(6); + const HASH_CHANGE_TIMEOUT = 1000; + const POSITION_UPDATED_THRESHOLD = 50; + const UPDATE_VIEWAREA_TIMEOUT = 1000; + + function getCurrentHash() { + return document.location.hash; + } + + class PDFHistory { + constructor({ + linkService, + eventBus + }) { + this.linkService = linkService; + this.eventBus = eventBus; + this._initialized = false; + this._fingerprint = ""; + this.reset(); + this._boundEvents = null; + this.eventBus._on("pagesinit", () => { + this._isPagesLoaded = false; + this.eventBus._on("pagesloaded", evt => { + this._isPagesLoaded = !!evt.pagesCount; + }, { + once: true + }); + }); + } + + initialize({ + fingerprint, + resetHistory = false, + updateUrl = false + }) { + if (!fingerprint || typeof fingerprint !== "string") { + console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.'); + return; + } + if (this._initialized) { + this.reset(); + } + const reInitialized = this._fingerprint !== "" && this._fingerprint !== fingerprint; + this._fingerprint = fingerprint; + this._updateUrl = updateUrl === true; + this._initialized = true; + this._bindEvents(); + const state = window.history.state; + this._popStateInProgress = false; + this._blockHashChange = 0; + this._currentHash = getCurrentHash(); + this._numPositionUpdates = 0; + this._uid = this._maxUid = 0; + this._destination = null; + this._position = null; + if (!this._isValidState(state, true) || resetHistory) { + const { + hash, + page, + rotation + } = this._parseCurrentHash(true); + if (!hash || reInitialized || resetHistory) { + this._pushOrReplaceState(null, true); + return; + } + this._pushOrReplaceState({ + hash, + page, + rotation + }, true); + return; + } + const destination = state.destination; + this._updateInternalState(destination, state.uid, true); + if (destination.rotation !== undefined) { + this._initialRotation = destination.rotation; + } + if (destination.dest) { + this._initialBookmark = JSON.stringify(destination.dest); + this._destination.page = null; + } else if (destination.hash) { + this._initialBookmark = destination.hash; + } else if (destination.page) { + this._initialBookmark = `page=${destination.page}`; + } + } + + reset() { + if (this._initialized) { + this._pageHide(); + this._initialized = false; + this._unbindEvents(); + } + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + this._initialBookmark = null; + this._initialRotation = null; + } + + push({ + namedDest = null, + explicitDest, + pageNumber + }) { + if (!this._initialized) { + return; + } + if (namedDest && typeof namedDest !== "string") { + console.error("PDFHistory.push: " + `"${namedDest}" is not a valid namedDest parameter.`); + return; + } else if (!Array.isArray(explicitDest)) { + console.error("PDFHistory.push: " + `"${explicitDest}" is not a valid explicitDest parameter.`); + return; + } else if (!this._isValidPage(pageNumber)) { + if (pageNumber !== null || this._destination) { + console.error("PDFHistory.push: " + `"${pageNumber}" is not a valid pageNumber parameter.`); + return; + } + } + const hash = namedDest || JSON.stringify(explicitDest); + if (!hash) { + return; + } + let forceReplace = false; + if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || isDestArraysEqual(this._destination.dest, explicitDest))) { + if (this._destination.page) { + return; + } + forceReplace = true; + } + if (this._popStateInProgress && !forceReplace) { + return; + } + this._pushOrReplaceState({ + dest: explicitDest, + hash, + page: pageNumber, + rotation: this.linkService.rotation + }, forceReplace); + if (!this._popStateInProgress) { + this._popStateInProgress = true; + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + } + + pushPage(pageNumber) { + if (!this._initialized) { + return; + } + if (!this._isValidPage(pageNumber)) { + console.error(`PDFHistory.pushPage: "${pageNumber}" is not a valid page number.`); + return; + } + if (this._destination?.page === pageNumber) { + return; + } + if (this._popStateInProgress) { + return; + } + this._pushOrReplaceState({ + dest: null, + hash: `page=${pageNumber}`, + page: pageNumber, + rotation: this.linkService.rotation + }); + if (!this._popStateInProgress) { + this._popStateInProgress = true; + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + } + + pushCurrentPosition() { + if (!this._initialized || this._popStateInProgress) { + return; + } + this._tryPushCurrentPosition(); + } + + back() { + if (!this._initialized || this._popStateInProgress) { + return; + } + const state = window.history.state; + if (this._isValidState(state) && state.uid > 0) { + window.history.back(); + } + } + + forward() { + if (!this._initialized || this._popStateInProgress) { + return; + } + const state = window.history.state; + if (this._isValidState(state) && state.uid < this._maxUid) { + window.history.forward(); + } + } + + get popStateInProgress() { + return this._initialized && (this._popStateInProgress || this._blockHashChange > 0); + } + + get initialBookmark() { + return this._initialized ? this._initialBookmark : null; + } + + get initialRotation() { + return this._initialized ? this._initialRotation : null; + } + + _pushOrReplaceState(destination, forceReplace = false) { + const shouldReplace = forceReplace || !this._destination; + const newState = { + fingerprint: this._fingerprint, + uid: shouldReplace ? this._uid : this._uid + 1, + destination + }; + this._updateInternalState(destination, newState.uid); + let newUrl; + if (this._updateUrl && destination?.hash) { + const baseUrl = document.location.href.split("#")[0]; + if (!baseUrl.startsWith("file://")) { + newUrl = `${baseUrl}#${destination.hash}`; + } + } + if (shouldReplace) { + window.history.replaceState(newState, "", newUrl); + } else { + window.history.pushState(newState, "", newUrl); + } + } + + _tryPushCurrentPosition(temporary = false) { + if (!this._position) { + return; + } + let position = this._position; + if (temporary) { + position = Object.assign(Object.create(null), this._position); + position.temporary = true; + } + if (!this._destination) { + this._pushOrReplaceState(position); + return; + } + if (this._destination.temporary) { + this._pushOrReplaceState(position, true); + return; + } + if (this._destination.hash === position.hash) { + return; + } + if (!this._destination.page && (POSITION_UPDATED_THRESHOLD <= 0 || this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)) { + return; + } + let forceReplace = false; + if (this._destination.page >= position.first && this._destination.page <= position.page) { + if (this._destination.dest !== undefined || !this._destination.first) { + return; + } + forceReplace = true; + } + this._pushOrReplaceState(position, forceReplace); + } + + _isValidPage(val) { + return Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount; + } + + _isValidState(state, checkReload = false) { + if (!state) { + return false; + } + if (state.fingerprint !== this._fingerprint) { + if (checkReload) { + if (typeof state.fingerprint !== "string" || state.fingerprint.length !== this._fingerprint.length) { + return false; + } + const [perfEntry] = performance.getEntriesByType("navigation"); + if (perfEntry?.type !== "reload") { + return false; + } + } else { + return false; + } + } + if (!Number.isInteger(state.uid) || state.uid < 0) { + return false; + } + if (state.destination === null || typeof state.destination !== "object") { + return false; + } + return true; + } + + _updateInternalState(destination, uid, removeTemporary = false) { + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + if (removeTemporary && destination?.temporary) { + delete destination.temporary; + } + this._destination = destination; + this._uid = uid; + this._maxUid = Math.max(this._maxUid, uid); + this._numPositionUpdates = 0; + } + + _parseCurrentHash(checkNameddest = false) { + const hash = unescape(getCurrentHash()).substring(1); + const params = (0, _ui_utils.parseQueryString)(hash); + const nameddest = params.get("nameddest") || ""; + let page = params.get("page") | 0; + if (!this._isValidPage(page) || checkNameddest && nameddest.length > 0) { + page = null; + } + return { + hash, + page, + rotation: this.linkService.rotation + }; + } + + _updateViewarea({ + location + }) { + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + this._position = { + hash: location.pdfOpenParams.substring(1), + page: this.linkService.page, + first: location.pageNumber, + rotation: location.rotation + }; + if (this._popStateInProgress) { + return; + } + if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded && this._destination && !this._destination.page) { + this._numPositionUpdates++; + } + if (UPDATE_VIEWAREA_TIMEOUT > 0) { + this._updateViewareaTimeout = setTimeout(() => { + if (!this._popStateInProgress) { + this._tryPushCurrentPosition(true); + } + this._updateViewareaTimeout = null; + }, UPDATE_VIEWAREA_TIMEOUT); + } + } + + _popState({ + state + }) { + const newHash = getCurrentHash(), + hashChanged = this._currentHash !== newHash; + this._currentHash = newHash; + if (!state) { + this._uid++; + const { + hash, + page, + rotation + } = this._parseCurrentHash(); + this._pushOrReplaceState({ + hash, + page, + rotation + }, true); + return; + } + if (!this._isValidState(state)) { + return; + } + this._popStateInProgress = true; + if (hashChanged) { + this._blockHashChange++; + (0, _event_utils.waitOnEventOrTimeout)({ + target: window, + name: "hashchange", + delay: HASH_CHANGE_TIMEOUT + }).then(() => { + this._blockHashChange--; + }); + } + const destination = state.destination; + this._updateInternalState(destination, state.uid, true); + if ((0, _ui_utils.isValidRotation)(destination.rotation)) { + this.linkService.rotation = destination.rotation; + } + if (destination.dest) { + this.linkService.goToDestination(destination.dest); + } else if (destination.hash) { + this.linkService.setHash(destination.hash); + } else if (destination.page) { + this.linkService.page = destination.page; + } + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + + _pageHide() { + if (!this._destination || this._destination.temporary) { + this._tryPushCurrentPosition(); + } + } + + _bindEvents() { + if (this._boundEvents) { + return; + } + this._boundEvents = { + updateViewarea: this._updateViewarea.bind(this), + popState: this._popState.bind(this), + pageHide: this._pageHide.bind(this) + }; + this.eventBus._on("updateviewarea", this._boundEvents.updateViewarea); + window.addEventListener("popstate", this._boundEvents.popState); + window.addEventListener("pagehide", this._boundEvents.pageHide); + } + + _unbindEvents() { + if (!this._boundEvents) { + return; + } + this.eventBus._off("updateviewarea", this._boundEvents.updateViewarea); + window.removeEventListener("popstate", this._boundEvents.popState); + window.removeEventListener("pagehide", this._boundEvents.pageHide); + this._boundEvents = null; + } + } + + exports.PDFHistory = PDFHistory; + + function isDestHashesEqual(destHash, pushHash) { + if (typeof destHash !== "string" || typeof pushHash !== "string") { + return false; + } + if (destHash === pushHash) { + return true; + } + const nameddest = (0, _ui_utils.parseQueryString)(destHash).get("nameddest"); + if (nameddest === pushHash) { + return true; + } + return false; + } + + function isDestArraysEqual(firstDest, secondDest) { + function isEntryEqual(first, second) { + if (typeof first !== typeof second) { + return false; + } + if (Array.isArray(first) || Array.isArray(second)) { + return false; + } + if (first !== null && typeof first === "object" && second !== null) { + if (Object.keys(first).length !== Object.keys(second).length) { + return false; + } + for (const key in first) { + if (!isEntryEqual(first[key], second[key])) { + return false; + } + } + return true; + } + return first === second || Number.isNaN(first) && Number.isNaN(second); + } + + if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) { + return false; + } + if (firstDest.length !== secondDest.length) { + return false; + } + for (let i = 0, ii = firstDest.length; i < ii; i++) { + if (!isEntryEqual(firstDest[i], secondDest[i])) { + return false; + } + } + return true; + } + + /***/ + }), + /* 21 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFLayerViewer = void 0; + var _base_tree_viewer = __webpack_require__(13); + + class PDFLayerViewer extends _base_tree_viewer.BaseTreeViewer { + constructor(options) { + super(options); + this.l10n = options.l10n; + this.eventBus._on("optionalcontentconfigchanged", evt => { + this.#updateLayers(evt.promise); + }); + this.eventBus._on("resetlayers", () => { + this.#updateLayers(); + }); + this.eventBus._on("togglelayerstree", this._toggleAllTreeItems.bind(this)); + } + + reset() { + super.reset(); + this._optionalContentConfig = null; + this._optionalContentHash = null; + } + + _dispatchEvent(layersCount) { + this.eventBus.dispatch("layersloaded", { + source: this, + layersCount + }); + } + + _bindLink(element, { + groupId, + input + }) { + const setVisibility = () => { + this._optionalContentConfig.setVisibility(groupId, input.checked); + this._optionalContentHash = this._optionalContentConfig.getHash(); + this.eventBus.dispatch("optionalcontentconfig", { + source: this, + promise: Promise.resolve(this._optionalContentConfig) + }); + }; + element.onclick = evt => { + if (evt.target === input) { + setVisibility(); + return true; + } else if (evt.target !== element) { + return true; + } + input.checked = !input.checked; + setVisibility(); + return false; + }; + } + + async _setNestedName(element, { + name = null + }) { + if (typeof name === "string") { + element.textContent = this._normalizeTextContent(name); + return; + } + element.textContent = await this.l10n.get("additional_layers"); + element.style.fontStyle = "italic"; + } + + _addToggleButton(div, { + name = null + }) { + super._addToggleButton(div, name === null); + } + + _toggleAllTreeItems() { + if (!this._optionalContentConfig) { + return; + } + super._toggleAllTreeItems(); + } + + render({ + optionalContentConfig, + pdfDocument + }) { + if (this._optionalContentConfig) { + this.reset(); + } + this._optionalContentConfig = optionalContentConfig || null; + this._pdfDocument = pdfDocument || null; + const groups = optionalContentConfig?.getOrder(); + if (!groups) { + this._dispatchEvent(0); + return; + } + this._optionalContentHash = optionalContentConfig.getHash(); + const fragment = document.createDocumentFragment(), + queue = [{ + parent: fragment, + groups + }]; + let layersCount = 0, + hasAnyNesting = false; + while (queue.length > 0) { + const levelData = queue.shift(); + for (const groupId of levelData.groups) { + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + div.append(element); + if (typeof groupId === "object") { + hasAnyNesting = true; + this._addToggleButton(div, groupId); + this._setNestedName(element, groupId); + const itemsDiv = document.createElement("div"); + itemsDiv.className = "treeItems"; + div.append(itemsDiv); + queue.push({ + parent: itemsDiv, + groups: groupId.order + }); + } else { + const group = optionalContentConfig.getGroup(groupId); + const input = document.createElement("input"); + this._bindLink(element, { + groupId, + input + }); + input.type = "checkbox"; + input.checked = group.visible; + const label = document.createElement("label"); + label.textContent = this._normalizeTextContent(group.name); + label.append(input); + element.append(label); + layersCount++; + } + levelData.parent.append(div); + } + } + this._finishRendering(fragment, layersCount, hasAnyNesting); + } + + async #updateLayers(promise = null) { + if (!this._optionalContentConfig) { + return; + } + const pdfDocument = this._pdfDocument; + const optionalContentConfig = await (promise || pdfDocument.getOptionalContentConfig()); + if (pdfDocument !== this._pdfDocument) { + return; + } + if (promise) { + if (optionalContentConfig.getHash() === this._optionalContentHash) { + return; + } + } else { + this.eventBus.dispatch("optionalcontentconfig", { + source: this, + promise: Promise.resolve(optionalContentConfig) + }); + } + this.render({ + optionalContentConfig, + pdfDocument: this._pdfDocument + }); + } + } + + exports.PDFLayerViewer = PDFLayerViewer; + + /***/ + }), + /* 22 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFOutlineViewer = void 0; + var _base_tree_viewer = __webpack_require__(13); + var _pdfjsLib = __webpack_require__(4); + var _ui_utils = __webpack_require__(3); + + class PDFOutlineViewer extends _base_tree_viewer.BaseTreeViewer { + constructor(options) { + super(options); + this.linkService = options.linkService; + this.downloadManager = options.downloadManager; + this.eventBus._on("toggleoutlinetree", this._toggleAllTreeItems.bind(this)); + this.eventBus._on("currentoutlineitem", this._currentOutlineItem.bind(this)); + this.eventBus._on("pagechanging", evt => { + this._currentPageNumber = evt.pageNumber; + }); + this.eventBus._on("pagesloaded", evt => { + this._isPagesLoaded = !!evt.pagesCount; + if (this._currentOutlineItemCapability && !this._currentOutlineItemCapability.settled) { + this._currentOutlineItemCapability.resolve(this._isPagesLoaded); + } + }); + this.eventBus._on("sidebarviewchanged", evt => { + this._sidebarView = evt.view; + }); + } + + reset() { + super.reset(); + this._outline = null; + this._pageNumberToDestHashCapability = null; + this._currentPageNumber = 1; + this._isPagesLoaded = null; + if (this._currentOutlineItemCapability && !this._currentOutlineItemCapability.settled) { + this._currentOutlineItemCapability.resolve(false); + } + this._currentOutlineItemCapability = null; + } + + _dispatchEvent(outlineCount) { + this._currentOutlineItemCapability = new _pdfjsLib.PromiseCapability(); + if (outlineCount === 0 || this._pdfDocument?.loadingParams.disableAutoFetch) { + this._currentOutlineItemCapability.resolve(false); + } else if (this._isPagesLoaded !== null) { + this._currentOutlineItemCapability.resolve(this._isPagesLoaded); + } + this.eventBus.dispatch("outlineloaded", { + source: this, + outlineCount, + currentOutlineItemPromise: this._currentOutlineItemCapability.promise + }); + } + + _bindLink(element, { + url, + newWindow, + action, + attachment, + dest, + setOCGState + }) { + const { + linkService + } = this; + if (url) { + linkService.addLinkAttributes(element, url, newWindow); + return; + } + if (action) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + linkService.executeNamedAction(action); + return false; + }; + return; + } + if (attachment) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + this.downloadManager.openOrDownloadData(element, attachment.content, attachment.filename); + return false; + }; + return; + } + if (setOCGState) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + linkService.executeSetOCGState(setOCGState); + return false; + }; + return; + } + element.href = linkService.getDestinationHash(dest); + element.onclick = evt => { + this._updateCurrentTreeItem(evt.target.parentNode); + if (dest) { + linkService.goToDestination(dest); + } + return false; + }; + } + + _setStyles(element, { + bold, + italic + }) { + if (bold) { + element.style.fontWeight = "bold"; + } + if (italic) { + element.style.fontStyle = "italic"; + } + } + + _addToggleButton(div, { + count, + items + }) { + let hidden = false; + if (count < 0) { + let totalCount = items.length; + if (totalCount > 0) { + const queue = [...items]; + while (queue.length > 0) { + const { + count: nestedCount, + items: nestedItems + } = queue.shift(); + if (nestedCount > 0 && nestedItems.length > 0) { + totalCount += nestedItems.length; + queue.push(...nestedItems); + } + } + } + if (Math.abs(count) === totalCount) { + hidden = true; + } + } + super._addToggleButton(div, hidden); + } + + _toggleAllTreeItems() { + if (!this._outline) { + return; + } + super._toggleAllTreeItems(); + } + + render({ + outline, + pdfDocument + }) { + if (this._outline) { + this.reset(); + } + this._outline = outline || null; + this._pdfDocument = pdfDocument || null; + if (!outline) { + this._dispatchEvent(0); + return; + } + const fragment = document.createDocumentFragment(); + const queue = [{ + parent: fragment, + items: outline + }]; + let outlineCount = 0, + hasAnyNesting = false; + while (queue.length > 0) { + const levelData = queue.shift(); + for (const item of levelData.items) { + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + this._bindLink(element, item); + this._setStyles(element, item); + element.textContent = this._normalizeTextContent(item.title); + div.append(element); + if (item.items.length > 0) { + hasAnyNesting = true; + this._addToggleButton(div, item); + const itemsDiv = document.createElement("div"); + itemsDiv.className = "treeItems"; + div.append(itemsDiv); + queue.push({ + parent: itemsDiv, + items: item.items + }); + } + levelData.parent.append(div); + outlineCount++; + } + } + this._finishRendering(fragment, outlineCount, hasAnyNesting); + } + + async _currentOutlineItem() { + if (!this._isPagesLoaded) { + throw new Error("_currentOutlineItem: All pages have not been loaded."); + } + if (!this._outline || !this._pdfDocument) { + return; + } + const pageNumberToDestHash = await this._getPageNumberToDestHash(this._pdfDocument); + if (!pageNumberToDestHash) { + return; + } + this._updateCurrentTreeItem(null); + if (this._sidebarView !== _ui_utils.SidebarView.OUTLINE) { + return; + } + for (let i = this._currentPageNumber; i > 0; i--) { + const destHash = pageNumberToDestHash.get(i); + if (!destHash) { + continue; + } + const linkElement = this.container.querySelector(`a[href="${destHash}"]`); + if (!linkElement) { + continue; + } + this._scrollToCurrentTreeItem(linkElement.parentNode); + break; + } + } + + async _getPageNumberToDestHash(pdfDocument) { + if (this._pageNumberToDestHashCapability) { + return this._pageNumberToDestHashCapability.promise; + } + this._pageNumberToDestHashCapability = new _pdfjsLib.PromiseCapability(); + const pageNumberToDestHash = new Map(), + pageNumberNesting = new Map(); + const queue = [{ + nesting: 0, + items: this._outline + }]; + while (queue.length > 0) { + const levelData = queue.shift(), + currentNesting = levelData.nesting; + for (const { + dest, + items + } of levelData.items) { + let explicitDest, pageNumber; + if (typeof dest === "string") { + explicitDest = await pdfDocument.getDestination(dest); + if (pdfDocument !== this._pdfDocument) { + return null; + } + } else { + explicitDest = dest; + } + if (Array.isArray(explicitDest)) { + const [destRef] = explicitDest; + if (typeof destRef === "object" && destRef !== null) { + pageNumber = this.linkService._cachedPageNumber(destRef); + if (!pageNumber) { + try { + pageNumber = (await pdfDocument.getPageIndex(destRef)) + 1; + if (pdfDocument !== this._pdfDocument) { + return null; + } + this.linkService.cachePageRef(pageNumber, destRef); + } catch { + } + } + } else if (Number.isInteger(destRef)) { + pageNumber = destRef + 1; + } + if (Number.isInteger(pageNumber) && (!pageNumberToDestHash.has(pageNumber) || currentNesting > pageNumberNesting.get(pageNumber))) { + const destHash = this.linkService.getDestinationHash(dest); + pageNumberToDestHash.set(pageNumber, destHash); + pageNumberNesting.set(pageNumber, currentNesting); + } + } + if (items.length > 0) { + queue.push({ + nesting: currentNesting + 1, + items + }); + } + } + } + this._pageNumberToDestHashCapability.resolve(pageNumberToDestHash.size > 0 ? pageNumberToDestHash : null); + return this._pageNumberToDestHashCapability.promise; + } + } + + exports.PDFOutlineViewer = PDFOutlineViewer; + + /***/ + }), + /* 23 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFPresentationMode = void 0; + var _ui_utils = __webpack_require__(3); + var _pdfjsLib = __webpack_require__(4); + const DELAY_BEFORE_HIDING_CONTROLS = 3000; + const ACTIVE_SELECTOR = "pdfPresentationMode"; + const CONTROLS_SELECTOR = "pdfPresentationModeControls"; + const MOUSE_SCROLL_COOLDOWN_TIME = 50; + const PAGE_SWITCH_THRESHOLD = 0.1; + const SWIPE_MIN_DISTANCE_THRESHOLD = 50; + const SWIPE_ANGLE_THRESHOLD = Math.PI / 6; + + class PDFPresentationMode { + #state = _ui_utils.PresentationModeState.UNKNOWN; + #args = null; + + constructor({ + container, + pdfViewer, + eventBus + }) { + this.container = container; + this.pdfViewer = pdfViewer; + this.eventBus = eventBus; + this.contextMenuOpen = false; + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + this.touchSwipeState = null; + } + + async request() { + const { + container, + pdfViewer + } = this; + if (this.active || !pdfViewer.pagesCount || !container.requestFullscreen) { + return false; + } + this.#addFullscreenChangeListeners(); + this.#notifyStateChange(_ui_utils.PresentationModeState.CHANGING); + const promise = container.requestFullscreen(); + this.#args = { + pageNumber: pdfViewer.currentPageNumber, + scaleValue: pdfViewer.currentScaleValue, + scrollMode: pdfViewer.scrollMode, + spreadMode: null, + annotationEditorMode: null + }; + if (pdfViewer.spreadMode !== _ui_utils.SpreadMode.NONE && !(pdfViewer.pageViewsReady && pdfViewer.hasEqualPageSizes)) { + console.warn("Ignoring Spread modes when entering PresentationMode, " + "since the document may contain varying page sizes."); + this.#args.spreadMode = pdfViewer.spreadMode; + } + if (pdfViewer.annotationEditorMode !== _pdfjsLib.AnnotationEditorType.DISABLE) { + this.#args.annotationEditorMode = pdfViewer.annotationEditorMode; + } + try { + await promise; + pdfViewer.focus(); + return true; + } catch { + this.#removeFullscreenChangeListeners(); + this.#notifyStateChange(_ui_utils.PresentationModeState.NORMAL); + } + return false; + } + + get active() { + return this.#state === _ui_utils.PresentationModeState.CHANGING || this.#state === _ui_utils.PresentationModeState.FULLSCREEN; + } + + #mouseWheel(evt) { + if (!this.active) { + return; + } + evt.preventDefault(); + const delta = (0, _ui_utils.normalizeWheelEventDelta)(evt); + const currentTime = Date.now(); + const storedTime = this.mouseScrollTimeStamp; + if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) { + return; + } + if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) { + this.#resetMouseScrollState(); + } + this.mouseScrollDelta += delta; + if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) { + const totalDelta = this.mouseScrollDelta; + this.#resetMouseScrollState(); + const success = totalDelta > 0 ? this.pdfViewer.previousPage() : this.pdfViewer.nextPage(); + if (success) { + this.mouseScrollTimeStamp = currentTime; + } + } + } + + #notifyStateChange(state) { + this.#state = state; + this.eventBus.dispatch("presentationmodechanged", { + source: this, + state + }); + } + + #enter() { + this.#notifyStateChange(_ui_utils.PresentationModeState.FULLSCREEN); + this.container.classList.add(ACTIVE_SELECTOR); + setTimeout(() => { + this.pdfViewer.scrollMode = _ui_utils.ScrollMode.PAGE; + if (this.#args.spreadMode !== null) { + this.pdfViewer.spreadMode = _ui_utils.SpreadMode.NONE; + } + this.pdfViewer.currentPageNumber = this.#args.pageNumber; + this.pdfViewer.currentScaleValue = "page-fit"; + if (this.#args.annotationEditorMode !== null) { + this.pdfViewer.annotationEditorMode = { + mode: _pdfjsLib.AnnotationEditorType.NONE + }; + } + }, 0); + this.#addWindowListeners(); + this.#showControls(); + this.contextMenuOpen = false; + window.getSelection().removeAllRanges(); + } + + #exit() { + const pageNumber = this.pdfViewer.currentPageNumber; + this.container.classList.remove(ACTIVE_SELECTOR); + setTimeout(() => { + this.#removeFullscreenChangeListeners(); + this.#notifyStateChange(_ui_utils.PresentationModeState.NORMAL); + this.pdfViewer.scrollMode = this.#args.scrollMode; + if (this.#args.spreadMode !== null) { + this.pdfViewer.spreadMode = this.#args.spreadMode; + } + this.pdfViewer.currentScaleValue = this.#args.scaleValue; + this.pdfViewer.currentPageNumber = pageNumber; + if (this.#args.annotationEditorMode !== null) { + this.pdfViewer.annotationEditorMode = { + mode: this.#args.annotationEditorMode + }; + } + this.#args = null; + }, 0); + this.#removeWindowListeners(); + this.#hideControls(); + this.#resetMouseScrollState(); + this.contextMenuOpen = false; + } + + #mouseDown(evt) { + if (this.contextMenuOpen) { + this.contextMenuOpen = false; + evt.preventDefault(); + return; + } + if (evt.button !== 0) { + return; + } + if (evt.target.href && evt.target.parentNode?.hasAttribute("data-internal-link")) { + return; + } + evt.preventDefault(); + if (evt.shiftKey) { + this.pdfViewer.previousPage(); + } else { + this.pdfViewer.nextPage(); + } + } + + #contextMenu() { + this.contextMenuOpen = true; + } + + #showControls() { + if (this.controlsTimeout) { + clearTimeout(this.controlsTimeout); + } else { + this.container.classList.add(CONTROLS_SELECTOR); + } + this.controlsTimeout = setTimeout(() => { + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + }, DELAY_BEFORE_HIDING_CONTROLS); + } + + #hideControls() { + if (!this.controlsTimeout) { + return; + } + clearTimeout(this.controlsTimeout); + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + } + + #resetMouseScrollState() { + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + } + + #touchSwipe(evt) { + if (!this.active) { + return; + } + if (evt.touches.length > 1) { + this.touchSwipeState = null; + return; + } + switch (evt.type) { + case "touchstart": + this.touchSwipeState = { + startX: evt.touches[0].pageX, + startY: evt.touches[0].pageY, + endX: evt.touches[0].pageX, + endY: evt.touches[0].pageY + }; + break; + case "touchmove": + if (this.touchSwipeState === null) { + return; + } + this.touchSwipeState.endX = evt.touches[0].pageX; + this.touchSwipeState.endY = evt.touches[0].pageY; + evt.preventDefault(); + break; + case "touchend": + if (this.touchSwipeState === null) { + return; + } + let delta = 0; + const dx = this.touchSwipeState.endX - this.touchSwipeState.startX; + const dy = this.touchSwipeState.endY - this.touchSwipeState.startY; + const absAngle = Math.abs(Math.atan2(dy, dx)); + if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) { + delta = dx; + } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) { + delta = dy; + } + if (delta > 0) { + this.pdfViewer.previousPage(); + } else if (delta < 0) { + this.pdfViewer.nextPage(); + } + break; + } + } + + #addWindowListeners() { + this.showControlsBind = this.#showControls.bind(this); + this.mouseDownBind = this.#mouseDown.bind(this); + this.mouseWheelBind = this.#mouseWheel.bind(this); + this.resetMouseScrollStateBind = this.#resetMouseScrollState.bind(this); + this.contextMenuBind = this.#contextMenu.bind(this); + this.touchSwipeBind = this.#touchSwipe.bind(this); + window.addEventListener("mousemove", this.showControlsBind); + window.addEventListener("mousedown", this.mouseDownBind); + window.addEventListener("wheel", this.mouseWheelBind, { + passive: false + }); + window.addEventListener("keydown", this.resetMouseScrollStateBind); + window.addEventListener("contextmenu", this.contextMenuBind); + window.addEventListener("touchstart", this.touchSwipeBind); + window.addEventListener("touchmove", this.touchSwipeBind); + window.addEventListener("touchend", this.touchSwipeBind); + } + + #removeWindowListeners() { + window.removeEventListener("mousemove", this.showControlsBind); + window.removeEventListener("mousedown", this.mouseDownBind); + window.removeEventListener("wheel", this.mouseWheelBind, { + passive: false + }); + window.removeEventListener("keydown", this.resetMouseScrollStateBind); + window.removeEventListener("contextmenu", this.contextMenuBind); + window.removeEventListener("touchstart", this.touchSwipeBind); + window.removeEventListener("touchmove", this.touchSwipeBind); + window.removeEventListener("touchend", this.touchSwipeBind); + delete this.showControlsBind; + delete this.mouseDownBind; + delete this.mouseWheelBind; + delete this.resetMouseScrollStateBind; + delete this.contextMenuBind; + delete this.touchSwipeBind; + } + + #fullscreenChange() { + if (document.fullscreenElement) { + this.#enter(); + } else { + this.#exit(); + } + } + + #addFullscreenChangeListeners() { + this.fullscreenChangeBind = this.#fullscreenChange.bind(this); + window.addEventListener("fullscreenchange", this.fullscreenChangeBind); + } + + #removeFullscreenChangeListeners() { + window.removeEventListener("fullscreenchange", this.fullscreenChangeBind); + delete this.fullscreenChangeBind; + } + } + + exports.PDFPresentationMode = PDFPresentationMode; + + /***/ + }), + /* 24 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFRenderingQueue = void 0; + var _pdfjsLib = __webpack_require__(4); + var _ui_utils = __webpack_require__(3); + const CLEANUP_TIMEOUT = 30000; + + class PDFRenderingQueue { + constructor() { + this.pdfViewer = null; + this.pdfThumbnailViewer = null; + this.onIdle = null; + this.highestPriorityPage = null; + this.idleTimeout = null; + this.printing = false; + this.isThumbnailViewEnabled = false; + Object.defineProperty(this, "hasViewer", { + value: () => !!this.pdfViewer + }); + } + + setViewer(pdfViewer) { + this.pdfViewer = pdfViewer; + } + + setThumbnailViewer(pdfThumbnailViewer) { + this.pdfThumbnailViewer = pdfThumbnailViewer; + } + + isHighestPriority(view) { + return this.highestPriorityPage === view.renderingId; + } + + renderHighestPriority(currentlyVisiblePages) { + if (this.idleTimeout) { + clearTimeout(this.idleTimeout); + this.idleTimeout = null; + } + if (this.pdfViewer.forceRendering(currentlyVisiblePages)) { + return; + } + if (this.isThumbnailViewEnabled && this.pdfThumbnailViewer?.forceRendering()) { + return; + } + if (this.printing) { + return; + } + if (this.onIdle) { + this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT); + } + } + + getHighestPriority(visible, views, scrolledDown, preRenderExtra = false) { + const visibleViews = visible.views, + numVisible = visibleViews.length; + if (numVisible === 0) { + return null; + } + for (let i = 0; i < numVisible; i++) { + const view = visibleViews[i].view; + if (!this.isViewFinished(view)) { + return view; + } + } + const firstId = visible.first.id, + lastId = visible.last.id; + if (lastId - firstId + 1 > numVisible) { + const visibleIds = visible.ids; + for (let i = 1, ii = lastId - firstId; i < ii; i++) { + const holeId = scrolledDown ? firstId + i : lastId - i; + if (visibleIds.has(holeId)) { + continue; + } + const holeView = views[holeId - 1]; + if (!this.isViewFinished(holeView)) { + return holeView; + } + } + } + let preRenderIndex = scrolledDown ? lastId : firstId - 2; + let preRenderView = views[preRenderIndex]; + if (preRenderView && !this.isViewFinished(preRenderView)) { + return preRenderView; + } + if (preRenderExtra) { + preRenderIndex += scrolledDown ? 1 : -1; + preRenderView = views[preRenderIndex]; + if (preRenderView && !this.isViewFinished(preRenderView)) { + return preRenderView; + } + } + return null; + } + + isViewFinished(view) { + return view.renderingState === _ui_utils.RenderingStates.FINISHED; + } + + renderView(view) { + switch (view.renderingState) { + case _ui_utils.RenderingStates.FINISHED: + return false; + case _ui_utils.RenderingStates.PAUSED: + this.highestPriorityPage = view.renderingId; + view.resume(); + break; + case _ui_utils.RenderingStates.RUNNING: + this.highestPriorityPage = view.renderingId; + break; + case _ui_utils.RenderingStates.INITIAL: + this.highestPriorityPage = view.renderingId; + view.draw().finally(() => { + this.renderHighestPriority(); + }).catch(reason => { + if (reason instanceof _pdfjsLib.RenderingCancelledException) { + return; + } + console.error(`renderView: "${reason}"`); + }); + break; + } + return true; + } + } + + exports.PDFRenderingQueue = PDFRenderingQueue; + + /***/ + }), + /* 25 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFScriptingManager = void 0; + var _ui_utils = __webpack_require__(3); + var _pdfjsLib = __webpack_require__(4); + + class PDFScriptingManager { + #closeCapability = null; + #destroyCapability = null; + #docProperties = null; + #eventBus = null; + #externalServices = null; + #pdfDocument = null; + #pdfViewer = null; + #ready = false; + #sandboxBundleSrc = null; + #scripting = null; + #willPrintCapability = null; + + constructor({ + eventBus, + sandboxBundleSrc = null, + externalServices = null, + docProperties = null + }) { + this.#eventBus = eventBus; + this.#sandboxBundleSrc = sandboxBundleSrc; + this.#externalServices = externalServices; + this.#docProperties = docProperties; + } + + setViewer(pdfViewer) { + this.#pdfViewer = pdfViewer; + } + + async setDocument(pdfDocument) { + if (this.#pdfDocument) { + await this.#destroyScripting(); + } + this.#pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const [objects, calculationOrder, docActions] = await Promise.all([pdfDocument.getFieldObjects(), pdfDocument.getCalculationOrderIds(), pdfDocument.getJSActions()]); + if (!objects && !docActions) { + await this.#destroyScripting(); + return; + } + if (pdfDocument !== this.#pdfDocument) { + return; + } + try { + this.#scripting = this.#initScripting(); + } catch (error) { + console.error(`setDocument: "${error.message}".`); + await this.#destroyScripting(); + return; + } + this._internalEvents.set("updatefromsandbox", event => { + if (event?.source === window) { + this.#updateFromSandbox(event.detail); + } + }); + this._internalEvents.set("dispatcheventinsandbox", event => { + this.#scripting?.dispatchEventInSandbox(event.detail); + }); + this._internalEvents.set("pagechanging", ({ + pageNumber, + previous + }) => { + if (pageNumber === previous) { + return; + } + this.#dispatchPageClose(previous); + this.#dispatchPageOpen(pageNumber); + }); + this._internalEvents.set("pagerendered", ({ + pageNumber + }) => { + if (!this._pageOpenPending.has(pageNumber)) { + return; + } + if (pageNumber !== this.#pdfViewer.currentPageNumber) { + return; + } + this.#dispatchPageOpen(pageNumber); + }); + this._internalEvents.set("pagesdestroy", async () => { + await this.#dispatchPageClose(this.#pdfViewer.currentPageNumber); + await this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "WillClose" + }); + this.#closeCapability?.resolve(); + }); + for (const [name, listener] of this._internalEvents) { + this.#eventBus._on(name, listener); + } + try { + const docProperties = await this.#docProperties(pdfDocument); + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting.createSandbox({ + objects, + calculationOrder, + appInfo: { + platform: navigator.platform, + language: navigator.language + }, + docInfo: { + ...docProperties, + actions: docActions + } + }); + this.#eventBus.dispatch("sandboxcreated", { + source: this + }); + } catch (error) { + console.error(`setDocument: "${error.message}".`); + await this.#destroyScripting(); + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "Open" + }); + await this.#dispatchPageOpen(this.#pdfViewer.currentPageNumber, true); + Promise.resolve().then(() => { + if (pdfDocument === this.#pdfDocument) { + this.#ready = true; + } + }); + } + + async dispatchWillSave() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "WillSave" + }); + } + + async dispatchDidSave() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "DidSave" + }); + } + + async dispatchWillPrint() { + if (!this.#scripting) { + return; + } + await this.#willPrintCapability?.promise; + this.#willPrintCapability = new _pdfjsLib.PromiseCapability(); + try { + await this.#scripting.dispatchEventInSandbox({ + id: "doc", + name: "WillPrint" + }); + } catch (ex) { + this.#willPrintCapability.resolve(); + this.#willPrintCapability = null; + throw ex; + } + await this.#willPrintCapability.promise; + } + + async dispatchDidPrint() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "DidPrint" + }); + } + + get destroyPromise() { + return this.#destroyCapability?.promise || null; + } + + get ready() { + return this.#ready; + } + + get _internalEvents() { + return (0, _pdfjsLib.shadow)(this, "_internalEvents", new Map()); + } + + get _pageOpenPending() { + return (0, _pdfjsLib.shadow)(this, "_pageOpenPending", new Set()); + } + + get _visitedPages() { + return (0, _pdfjsLib.shadow)(this, "_visitedPages", new Map()); + } + + async #updateFromSandbox(detail) { + const pdfViewer = this.#pdfViewer; + const isInPresentationMode = pdfViewer.isInPresentationMode || pdfViewer.isChangingPresentationMode; + const { + id, + siblings, + command, + value + } = detail; + if (!id) { + switch (command) { + case "clear": + console.clear(); + break; + case "error": + console.error(value); + break; + case "layout": + if (!isInPresentationMode) { + const modes = (0, _ui_utils.apiPageLayoutToViewerModes)(value); + pdfViewer.spreadMode = modes.spreadMode; + } + break; + case "page-num": + pdfViewer.currentPageNumber = value + 1; + break; + case "print": + await pdfViewer.pagesPromise; + this.#eventBus.dispatch("print", { + source: this + }); + break; + case "println": + console.log(value); + break; + case "zoom": + if (!isInPresentationMode) { + pdfViewer.currentScaleValue = value; + } + break; + case "SaveAs": + this.#eventBus.dispatch("download", { + source: this + }); + break; + case "FirstPage": + pdfViewer.currentPageNumber = 1; + break; + case "LastPage": + pdfViewer.currentPageNumber = pdfViewer.pagesCount; + break; + case "NextPage": + pdfViewer.nextPage(); + break; + case "PrevPage": + pdfViewer.previousPage(); + break; + case "ZoomViewIn": + if (!isInPresentationMode) { + pdfViewer.increaseScale(); + } + break; + case "ZoomViewOut": + if (!isInPresentationMode) { + pdfViewer.decreaseScale(); + } + break; + case "WillPrintFinished": + this.#willPrintCapability?.resolve(); + this.#willPrintCapability = null; + break; + } + return; + } + if (isInPresentationMode && detail.focus) { + return; + } + delete detail.id; + delete detail.siblings; + const ids = siblings ? [id, ...siblings] : [id]; + for (const elementId of ids) { + const element = document.querySelector(`[data-element-id="${elementId}"]`); + if (element) { + element.dispatchEvent(new CustomEvent("updatefromsandbox", { + detail + })); + } else { + this.#pdfDocument?.annotationStorage.setValue(elementId, detail); + } + } + } + + async #dispatchPageOpen(pageNumber, initialize = false) { + const pdfDocument = this.#pdfDocument, + visitedPages = this._visitedPages; + if (initialize) { + this.#closeCapability = new _pdfjsLib.PromiseCapability(); + } + if (!this.#closeCapability) { + return; + } + const pageView = this.#pdfViewer.getPageView(pageNumber - 1); + if (pageView?.renderingState !== _ui_utils.RenderingStates.FINISHED) { + this._pageOpenPending.add(pageNumber); + return; + } + this._pageOpenPending.delete(pageNumber); + const actionsPromise = (async () => { + const actions = await (!visitedPages.has(pageNumber) ? pageView.pdfPage?.getJSActions() : null); + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "page", + name: "PageOpen", + pageNumber, + actions + }); + })(); + visitedPages.set(pageNumber, actionsPromise); + } + + async #dispatchPageClose(pageNumber) { + const pdfDocument = this.#pdfDocument, + visitedPages = this._visitedPages; + if (!this.#closeCapability) { + return; + } + if (this._pageOpenPending.has(pageNumber)) { + return; + } + const actionsPromise = visitedPages.get(pageNumber); + if (!actionsPromise) { + return; + } + visitedPages.set(pageNumber, null); + await actionsPromise; + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "page", + name: "PageClose", + pageNumber + }); + } + + #initScripting() { + this.#destroyCapability = new _pdfjsLib.PromiseCapability(); + if (this.#scripting) { + throw new Error("#initScripting: Scripting already exists."); + } + return this.#externalServices.createScripting({ + sandboxBundleSrc: this.#sandboxBundleSrc + }); + } + + async #destroyScripting() { + if (!this.#scripting) { + this.#pdfDocument = null; + this.#destroyCapability?.resolve(); + return; + } + if (this.#closeCapability) { + await Promise.race([this.#closeCapability.promise, new Promise(resolve => { + setTimeout(resolve, 1000); + })]).catch(() => { + }); + this.#closeCapability = null; + } + this.#pdfDocument = null; + try { + await this.#scripting.destroySandbox(); + } catch { + } + this.#willPrintCapability?.reject(new Error("Scripting destroyed.")); + this.#willPrintCapability = null; + for (const [name, listener] of this._internalEvents) { + this.#eventBus._off(name, listener); + } + this._internalEvents.clear(); + this._pageOpenPending.clear(); + this._visitedPages.clear(); + this.#scripting = null; + this.#ready = false; + this.#destroyCapability?.resolve(); + } + } + + exports.PDFScriptingManager = PDFScriptingManager; + + /***/ + }), + /* 26 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFSidebar = void 0; + var _ui_utils = __webpack_require__(3); + const SIDEBAR_WIDTH_VAR = "--sidebar-width"; + const SIDEBAR_MIN_WIDTH = 200; + const SIDEBAR_RESIZING_CLASS = "sidebarResizing"; + const UI_NOTIFICATION_CLASS = "pdfSidebarNotification"; + + class PDFSidebar { + #isRTL = false; + #mouseMoveBound = this.#mouseMove.bind(this); + #mouseUpBound = this.#mouseUp.bind(this); + #outerContainerWidth = null; + #width = null; + + constructor({ + elements, + eventBus, + l10n + }) { + this.isOpen = false; + this.active = _ui_utils.SidebarView.THUMBS; + this.isInitialViewSet = false; + this.isInitialEventDispatched = false; + this.onToggled = null; + this.onUpdateThumbnails = null; + this.outerContainer = elements.outerContainer; + this.sidebarContainer = elements.sidebarContainer; + this.toggleButton = elements.toggleButton; + this.resizer = elements.resizer; + this.thumbnailButton = elements.thumbnailButton; + this.outlineButton = elements.outlineButton; + this.attachmentsButton = elements.attachmentsButton; + this.layersButton = elements.layersButton; + this.thumbnailView = elements.thumbnailView; + this.outlineView = elements.outlineView; + this.attachmentsView = elements.attachmentsView; + this.layersView = elements.layersView; + this._outlineOptionsContainer = elements.outlineOptionsContainer; + this._currentOutlineItemButton = elements.currentOutlineItemButton; + this.eventBus = eventBus; + this.l10n = l10n; + l10n.getDirection().then(dir => { + this.#isRTL = dir === "rtl"; + }); + this.#addEventListeners(); + } + + reset() { + this.isInitialViewSet = false; + this.isInitialEventDispatched = false; + this.#hideUINotification(true); + this.switchView(_ui_utils.SidebarView.THUMBS); + this.outlineButton.disabled = false; + this.attachmentsButton.disabled = false; + this.layersButton.disabled = false; + this._currentOutlineItemButton.disabled = true; + } + + get visibleView() { + return this.isOpen ? this.active : _ui_utils.SidebarView.NONE; + } + + setInitialView(view = _ui_utils.SidebarView.NONE) { + if (this.isInitialViewSet) { + return; + } + this.isInitialViewSet = true; + if (view === _ui_utils.SidebarView.NONE || view === _ui_utils.SidebarView.UNKNOWN) { + this.#dispatchEvent(); + return; + } + this.switchView(view, true); + if (!this.isInitialEventDispatched) { + this.#dispatchEvent(); + } + } + + switchView(view, forceOpen = false) { + const isViewChanged = view !== this.active; + let forceRendering = false; + switch (view) { + case _ui_utils.SidebarView.NONE: + if (this.isOpen) { + this.close(); + } + return; + case _ui_utils.SidebarView.THUMBS: + if (this.isOpen && isViewChanged) { + forceRendering = true; + } + break; + case _ui_utils.SidebarView.OUTLINE: + if (this.outlineButton.disabled) { + return; + } + break; + case _ui_utils.SidebarView.ATTACHMENTS: + if (this.attachmentsButton.disabled) { + return; + } + break; + case _ui_utils.SidebarView.LAYERS: + if (this.layersButton.disabled) { + return; + } + break; + default: + console.error(`PDFSidebar.switchView: "${view}" is not a valid view.`); + return; + } + this.active = view; + (0, _ui_utils.toggleCheckedBtn)(this.thumbnailButton, view === _ui_utils.SidebarView.THUMBS, this.thumbnailView); + (0, _ui_utils.toggleCheckedBtn)(this.outlineButton, view === _ui_utils.SidebarView.OUTLINE, this.outlineView); + (0, _ui_utils.toggleCheckedBtn)(this.attachmentsButton, view === _ui_utils.SidebarView.ATTACHMENTS, this.attachmentsView); + (0, _ui_utils.toggleCheckedBtn)(this.layersButton, view === _ui_utils.SidebarView.LAYERS, this.layersView); + this._outlineOptionsContainer.classList.toggle("hidden", view !== _ui_utils.SidebarView.OUTLINE); + if (forceOpen && !this.isOpen) { + this.open(); + return; + } + if (forceRendering) { + this.onUpdateThumbnails(); + this.onToggled(); + } + if (isViewChanged) { + this.#dispatchEvent(); + } + } + + open() { + if (this.isOpen) { + return; + } + this.isOpen = true; + (0, _ui_utils.toggleExpandedBtn)(this.toggleButton, true); + this.outerContainer.classList.add("sidebarMoving", "sidebarOpen"); + if (this.active === _ui_utils.SidebarView.THUMBS) { + this.onUpdateThumbnails(); + } + this.onToggled(); + this.#dispatchEvent(); + this.#hideUINotification(); + } + + close() { + if (!this.isOpen) { + return; + } + this.isOpen = false; + (0, _ui_utils.toggleExpandedBtn)(this.toggleButton, false); + this.outerContainer.classList.add("sidebarMoving"); + this.outerContainer.classList.remove("sidebarOpen"); + this.onToggled(); + this.#dispatchEvent(); + } + + toggle() { + if (this.isOpen) { + this.close(); + } else { + this.open(); + } + } + + #dispatchEvent() { + if (this.isInitialViewSet) { + this.isInitialEventDispatched ||= true; + } + this.eventBus.dispatch("sidebarviewchanged", { + source: this, + view: this.visibleView + }); + } + + #showUINotification() { + this.toggleButton.setAttribute("data-l10n-id", "toggle_sidebar_notification2"); + this.l10n.translate(this.toggleButton); + if (!this.isOpen) { + this.toggleButton.classList.add(UI_NOTIFICATION_CLASS); + } + } + + #hideUINotification(reset = false) { + if (this.isOpen || reset) { + this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS); + } + if (reset) { + this.toggleButton.setAttribute("data-l10n-id", "toggle_sidebar"); + this.l10n.translate(this.toggleButton); + } + } + + #addEventListeners() { + this.sidebarContainer.addEventListener("transitionend", evt => { + if (evt.target === this.sidebarContainer) { + this.outerContainer.classList.remove("sidebarMoving"); + } + }); + this.toggleButton.addEventListener("click", () => { + this.toggle(); + }); + this.thumbnailButton.addEventListener("click", () => { + this.switchView(_ui_utils.SidebarView.THUMBS); + }); + this.outlineButton.addEventListener("click", () => { + this.switchView(_ui_utils.SidebarView.OUTLINE); + }); + this.outlineButton.addEventListener("dblclick", () => { + this.eventBus.dispatch("toggleoutlinetree", { + source: this + }); + }); + this.attachmentsButton.addEventListener("click", () => { + this.switchView(_ui_utils.SidebarView.ATTACHMENTS); + }); + this.layersButton.addEventListener("click", () => { + this.switchView(_ui_utils.SidebarView.LAYERS); + }); + this.layersButton.addEventListener("dblclick", () => { + this.eventBus.dispatch("resetlayers", { + source: this + }); + }); + this._currentOutlineItemButton.addEventListener("click", () => { + this.eventBus.dispatch("currentoutlineitem", { + source: this + }); + }); + const onTreeLoaded = (count, button, view) => { + button.disabled = !count; + if (count) { + this.#showUINotification(); + } else if (this.active === view) { + this.switchView(_ui_utils.SidebarView.THUMBS); + } + }; + this.eventBus._on("outlineloaded", evt => { + onTreeLoaded(evt.outlineCount, this.outlineButton, _ui_utils.SidebarView.OUTLINE); + evt.currentOutlineItemPromise.then(enabled => { + if (!this.isInitialViewSet) { + return; + } + this._currentOutlineItemButton.disabled = !enabled; + }); + }); + this.eventBus._on("attachmentsloaded", evt => { + onTreeLoaded(evt.attachmentsCount, this.attachmentsButton, _ui_utils.SidebarView.ATTACHMENTS); + }); + this.eventBus._on("layersloaded", evt => { + onTreeLoaded(evt.layersCount, this.layersButton, _ui_utils.SidebarView.LAYERS); + }); + this.eventBus._on("presentationmodechanged", evt => { + if (evt.state === _ui_utils.PresentationModeState.NORMAL && this.visibleView === _ui_utils.SidebarView.THUMBS) { + this.onUpdateThumbnails(); + } + }); + this.resizer.addEventListener("mousedown", evt => { + if (evt.button !== 0) { + return; + } + this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); + window.addEventListener("mousemove", this.#mouseMoveBound); + window.addEventListener("mouseup", this.#mouseUpBound); + }); + this.eventBus._on("resize", evt => { + if (evt.source !== window) { + return; + } + this.#outerContainerWidth = null; + if (!this.#width) { + return; + } + if (!this.isOpen) { + this.#updateWidth(this.#width); + return; + } + this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); + const updated = this.#updateWidth(this.#width); + Promise.resolve().then(() => { + this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); + if (updated) { + this.eventBus.dispatch("resize", { + source: this + }); + } + }); + }); + } + + get outerContainerWidth() { + return this.#outerContainerWidth ||= this.outerContainer.clientWidth; + } + + #updateWidth(width = 0) { + const maxWidth = Math.floor(this.outerContainerWidth / 2); + if (width > maxWidth) { + width = maxWidth; + } + if (width < SIDEBAR_MIN_WIDTH) { + width = SIDEBAR_MIN_WIDTH; + } + if (width === this.#width) { + return false; + } + this.#width = width; + _ui_utils.docStyle.setProperty(SIDEBAR_WIDTH_VAR, `${width}px`); + return true; + } + + #mouseMove(evt) { + let width = evt.clientX; + if (this.#isRTL) { + width = this.outerContainerWidth - width; + } + this.#updateWidth(width); + } + + #mouseUp(evt) { + this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); + this.eventBus.dispatch("resize", { + source: this + }); + window.removeEventListener("mousemove", this.#mouseMoveBound); + window.removeEventListener("mouseup", this.#mouseUpBound); + } + } + + exports.PDFSidebar = PDFSidebar; + + /***/ + }), + /* 27 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFThumbnailViewer = void 0; + var _ui_utils = __webpack_require__(3); + var _pdf_thumbnail_view = __webpack_require__(28); + const THUMBNAIL_SCROLL_MARGIN = -19; + const THUMBNAIL_SELECTED_CLASS = "selected"; + + class PDFThumbnailViewer { + constructor({ + container, + eventBus, + linkService, + renderingQueue, + l10n, + pageColors + }) { + this.container = container; + this.eventBus = eventBus; + this.linkService = linkService; + this.renderingQueue = renderingQueue; + this.l10n = l10n; + this.pageColors = pageColors || null; + this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdated.bind(this)); + this._resetView(); + } + + _scrollUpdated() { + this.renderingQueue.renderHighestPriority(); + } + + getThumbnail(index) { + return this._thumbnails[index]; + } + + _getVisibleThumbs() { + return (0, _ui_utils.getVisibleElements)({ + scrollEl: this.container, + views: this._thumbnails + }); + } + + scrollThumbnailIntoView(pageNumber) { + if (!this.pdfDocument) { + return; + } + const thumbnailView = this._thumbnails[pageNumber - 1]; + if (!thumbnailView) { + console.error('scrollThumbnailIntoView: Invalid "pageNumber" parameter.'); + return; + } + if (pageNumber !== this._currentPageNumber) { + const prevThumbnailView = this._thumbnails[this._currentPageNumber - 1]; + prevThumbnailView.div.classList.remove(THUMBNAIL_SELECTED_CLASS); + thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS); + } + const { + first, + last, + views + } = this._getVisibleThumbs(); + if (views.length > 0) { + let shouldScroll = false; + if (pageNumber <= first.id || pageNumber >= last.id) { + shouldScroll = true; + } else { + for (const { + id, + percent + } of views) { + if (id !== pageNumber) { + continue; + } + shouldScroll = percent < 100; + break; + } + } + if (shouldScroll) { + (0, _ui_utils.scrollIntoView)(thumbnailView.div, { + top: THUMBNAIL_SCROLL_MARGIN + }); + } + } + this._currentPageNumber = pageNumber; + } + + get pagesRotation() { + return this._pagesRotation; + } + + set pagesRotation(rotation) { + if (!(0, _ui_utils.isValidRotation)(rotation)) { + throw new Error("Invalid thumbnails rotation angle."); + } + if (!this.pdfDocument) { + return; + } + if (this._pagesRotation === rotation) { + return; + } + this._pagesRotation = rotation; + const updateArgs = { + rotation + }; + for (const thumbnail of this._thumbnails) { + thumbnail.update(updateArgs); + } + } + + cleanup() { + for (const thumbnail of this._thumbnails) { + if (thumbnail.renderingState !== _ui_utils.RenderingStates.FINISHED) { + thumbnail.reset(); + } + } + _pdf_thumbnail_view.TempImageFactory.destroyCanvas(); + } + + _resetView() { + this._thumbnails = []; + this._currentPageNumber = 1; + this._pageLabels = null; + this._pagesRotation = 0; + this.container.textContent = ""; + } + + setDocument(pdfDocument) { + if (this.pdfDocument) { + this._cancelRendering(); + this._resetView(); + } + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const firstPagePromise = pdfDocument.getPage(1); + const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig(); + firstPagePromise.then(firstPdfPage => { + const pagesCount = pdfDocument.numPages; + const viewport = firstPdfPage.getViewport({ + scale: 1 + }); + for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { + const thumbnail = new _pdf_thumbnail_view.PDFThumbnailView({ + container: this.container, + eventBus: this.eventBus, + id: pageNum, + defaultViewport: viewport.clone(), + optionalContentConfigPromise, + linkService: this.linkService, + renderingQueue: this.renderingQueue, + l10n: this.l10n, + pageColors: this.pageColors + }); + this._thumbnails.push(thumbnail); + } + this._thumbnails[0]?.setPdfPage(firstPdfPage); + const thumbnailView = this._thumbnails[this._currentPageNumber - 1]; + thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS); + }).catch(reason => { + console.error("Unable to initialize thumbnail viewer", reason); + }); + } + + _cancelRendering() { + for (const thumbnail of this._thumbnails) { + thumbnail.cancelRendering(); + } + } + + setPageLabels(labels) { + if (!this.pdfDocument) { + return; + } + if (!labels) { + this._pageLabels = null; + } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) { + this._pageLabels = null; + console.error("PDFThumbnailViewer_setPageLabels: Invalid page labels."); + } else { + this._pageLabels = labels; + } + for (let i = 0, ii = this._thumbnails.length; i < ii; i++) { + this._thumbnails[i].setPageLabel(this._pageLabels?.[i] ?? null); + } + } + + async #ensurePdfPageLoaded(thumbView) { + if (thumbView.pdfPage) { + return thumbView.pdfPage; + } + try { + const pdfPage = await this.pdfDocument.getPage(thumbView.id); + if (!thumbView.pdfPage) { + thumbView.setPdfPage(pdfPage); + } + return pdfPage; + } catch (reason) { + console.error("Unable to get page for thumb view", reason); + return null; + } + } + + #getScrollAhead(visible) { + if (visible.first?.id === 1) { + return true; + } else if (visible.last?.id === this._thumbnails.length) { + return false; + } + return this.scroll.down; + } + + forceRendering() { + const visibleThumbs = this._getVisibleThumbs(); + const scrollAhead = this.#getScrollAhead(visibleThumbs); + const thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, scrollAhead); + if (thumbView) { + this.#ensurePdfPageLoaded(thumbView).then(() => { + this.renderingQueue.renderView(thumbView); + }); + return true; + } + return false; + } + } + + exports.PDFThumbnailViewer = PDFThumbnailViewer; + + /***/ + }), + /* 28 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.TempImageFactory = exports.PDFThumbnailView = void 0; + var _ui_utils = __webpack_require__(3); + var _pdfjsLib = __webpack_require__(4); + const DRAW_UPSCALE_FACTOR = 2; + const MAX_NUM_SCALING_STEPS = 3; + const THUMBNAIL_WIDTH = 98; + + class TempImageFactory { + static #tempCanvas = null; + + static getCanvas(width, height) { + const tempCanvas = this.#tempCanvas ||= document.createElement("canvas"); + tempCanvas.width = width; + tempCanvas.height = height; + const ctx = tempCanvas.getContext("2d", { + alpha: false + }); + ctx.save(); + ctx.fillStyle = "rgb(255, 255, 255)"; + ctx.fillRect(0, 0, width, height); + ctx.restore(); + return [tempCanvas, tempCanvas.getContext("2d")]; + } + + static destroyCanvas() { + const tempCanvas = this.#tempCanvas; + if (tempCanvas) { + tempCanvas.width = 0; + tempCanvas.height = 0; + } + this.#tempCanvas = null; + } + } + + exports.TempImageFactory = TempImageFactory; + + class PDFThumbnailView { + constructor({ + container, + eventBus, + id, + defaultViewport, + optionalContentConfigPromise, + linkService, + renderingQueue, + l10n, + pageColors + }) { + this.id = id; + this.renderingId = "thumbnail" + id; + this.pageLabel = null; + this.pdfPage = null; + this.rotation = 0; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this._optionalContentConfigPromise = optionalContentConfigPromise || null; + this.pageColors = pageColors || null; + this.eventBus = eventBus; + this.linkService = linkService; + this.renderingQueue = renderingQueue; + this.renderTask = null; + this.renderingState = _ui_utils.RenderingStates.INITIAL; + this.resume = null; + this.l10n = l10n; + const anchor = document.createElement("a"); + anchor.href = linkService.getAnchorUrl("#page=" + id); + this._thumbPageTitle.then(msg => { + anchor.title = msg; + }); + anchor.onclick = function () { + linkService.goToPage(id); + return false; + }; + this.anchor = anchor; + const div = document.createElement("div"); + div.className = "thumbnail"; + div.setAttribute("data-page-number", this.id); + this.div = div; + this.#updateDims(); + const img = document.createElement("div"); + img.className = "thumbnailImage"; + this._placeholderImg = img; + div.append(img); + anchor.append(div); + container.append(anchor); + } + + #updateDims() { + const { + width, + height + } = this.viewport; + const ratio = width / height; + this.canvasWidth = THUMBNAIL_WIDTH; + this.canvasHeight = this.canvasWidth / ratio | 0; + this.scale = this.canvasWidth / width; + const { + style + } = this.div; + style.setProperty("--thumbnail-width", `${this.canvasWidth}px`); + style.setProperty("--thumbnail-height", `${this.canvasHeight}px`); + } + + setPdfPage(pdfPage) { + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport({ + scale: 1, + rotation: totalRotation + }); + this.reset(); + } + + reset() { + this.cancelRendering(); + this.renderingState = _ui_utils.RenderingStates.INITIAL; + this.div.removeAttribute("data-loaded"); + this.image?.replaceWith(this._placeholderImg); + this.#updateDims(); + if (this.image) { + this.image.removeAttribute("src"); + delete this.image; + } + } + + update({ + rotation = null + }) { + if (typeof rotation === "number") { + this.rotation = rotation; + } + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: 1, + rotation: totalRotation + }); + this.reset(); + } + + cancelRendering() { + if (this.renderTask) { + this.renderTask.cancel(); + this.renderTask = null; + } + this.resume = null; + } + + _getPageDrawContext(upscaleFactor = 1) { + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d", { + alpha: false + }); + const outputScale = new _ui_utils.OutputScale(); + canvas.width = upscaleFactor * this.canvasWidth * outputScale.sx | 0; + canvas.height = upscaleFactor * this.canvasHeight * outputScale.sy | 0; + const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; + return { + ctx, + canvas, + transform + }; + } + + _convertCanvasToImage(canvas) { + if (this.renderingState !== _ui_utils.RenderingStates.FINISHED) { + throw new Error("_convertCanvasToImage: Rendering has not finished."); + } + const reducedCanvas = this._reduceImage(canvas); + const image = document.createElement("img"); + image.className = "thumbnailImage"; + this._thumbPageCanvas.then(msg => { + image.setAttribute("aria-label", msg); + }); + image.src = reducedCanvas.toDataURL(); + this.image = image; + this.div.setAttribute("data-loaded", true); + this._placeholderImg.replaceWith(image); + reducedCanvas.width = 0; + reducedCanvas.height = 0; + } + + async #finishRenderTask(renderTask, canvas, error = null) { + if (renderTask === this.renderTask) { + this.renderTask = null; + } + if (error instanceof _pdfjsLib.RenderingCancelledException) { + return; + } + this.renderingState = _ui_utils.RenderingStates.FINISHED; + this._convertCanvasToImage(canvas); + if (error) { + throw error; + } + } + + async draw() { + if (this.renderingState !== _ui_utils.RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + return undefined; + } + const { + pdfPage + } = this; + if (!pdfPage) { + this.renderingState = _ui_utils.RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = _ui_utils.RenderingStates.RUNNING; + const { + ctx, + canvas, + transform + } = this._getPageDrawContext(DRAW_UPSCALE_FACTOR); + const drawViewport = this.viewport.clone({ + scale: DRAW_UPSCALE_FACTOR * this.scale + }); + const renderContinueCallback = cont => { + if (!this.renderingQueue.isHighestPriority(this)) { + this.renderingState = _ui_utils.RenderingStates.PAUSED; + this.resume = () => { + this.renderingState = _ui_utils.RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + const renderContext = { + canvasContext: ctx, + transform, + viewport: drawViewport, + optionalContentConfigPromise: this._optionalContentConfigPromise, + pageColors: this.pageColors + }; + const renderTask = this.renderTask = pdfPage.render(renderContext); + renderTask.onContinue = renderContinueCallback; + const resultPromise = renderTask.promise.then(() => this.#finishRenderTask(renderTask, canvas), error => this.#finishRenderTask(renderTask, canvas, error)); + resultPromise.finally(() => { + canvas.width = 0; + canvas.height = 0; + this.eventBus.dispatch("thumbnailrendered", { + source: this, + pageNumber: this.id, + pdfPage: this.pdfPage + }); + }); + return resultPromise; + } + + setImage(pageView) { + if (this.renderingState !== _ui_utils.RenderingStates.INITIAL) { + return; + } + const { + thumbnailCanvas: canvas, + pdfPage, + scale + } = pageView; + if (!canvas) { + return; + } + if (!this.pdfPage) { + this.setPdfPage(pdfPage); + } + if (scale < this.scale) { + return; + } + this.renderingState = _ui_utils.RenderingStates.FINISHED; + this._convertCanvasToImage(canvas); + } + + _reduceImage(img) { + const { + ctx, + canvas + } = this._getPageDrawContext(); + if (img.width <= 2 * canvas.width) { + ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height); + return canvas; + } + let reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS; + let reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS; + const [reducedImage, reducedImageCtx] = TempImageFactory.getCanvas(reducedWidth, reducedHeight); + while (reducedWidth > img.width || reducedHeight > img.height) { + reducedWidth >>= 1; + reducedHeight >>= 1; + } + reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight); + while (reducedWidth > 2 * canvas.width) { + reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1); + reducedWidth >>= 1; + reducedHeight >>= 1; + } + ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height); + return canvas; + } + + get _thumbPageTitle() { + return this.l10n.get("thumb_page_title", { + page: this.pageLabel ?? this.id + }); + } + + get _thumbPageCanvas() { + return this.l10n.get("thumb_page_canvas", { + page: this.pageLabel ?? this.id + }); + } + + setPageLabel(label) { + this.pageLabel = typeof label === "string" ? label : null; + this._thumbPageTitle.then(msg => { + this.anchor.title = msg; + }); + if (this.renderingState !== _ui_utils.RenderingStates.FINISHED) { + return; + } + this._thumbPageCanvas.then(msg => { + this.image?.setAttribute("aria-label", msg); + }); + } + } + + exports.PDFThumbnailView = PDFThumbnailView; + + /***/ + }), + /* 29 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PagesCountLimit = exports.PDFViewer = exports.PDFPageViewBuffer = void 0; + var _pdfjsLib = __webpack_require__(4); + var _ui_utils = __webpack_require__(3); + var _l10n_utils = __webpack_require__(30); + var _pdf_page_view = __webpack_require__(31); + var _pdf_rendering_queue = __webpack_require__(24); + var _pdf_link_service = __webpack_require__(7); + const DEFAULT_CACHE_SIZE = 10; + const PagesCountLimit = { + FORCE_SCROLL_MODE_PAGE: 15000, + FORCE_LAZY_PAGE_INIT: 7500, + PAUSE_EAGER_PAGE_INIT: 250 + }; + exports.PagesCountLimit = PagesCountLimit; + + function isValidAnnotationEditorMode(mode) { + return Object.values(_pdfjsLib.AnnotationEditorType).includes(mode) && mode !== _pdfjsLib.AnnotationEditorType.DISABLE; + } + + class PDFPageViewBuffer { + #buf = new Set(); + #size = 0; + + constructor(size) { + this.#size = size; + } + + push(view) { + const buf = this.#buf; + if (buf.has(view)) { + buf.delete(view); + } + buf.add(view); + if (buf.size > this.#size) { + this.#destroyFirstView(); + } + } + + resize(newSize, idsToKeep = null) { + this.#size = newSize; + const buf = this.#buf; + if (idsToKeep) { + const ii = buf.size; + let i = 1; + for (const view of buf) { + if (idsToKeep.has(view.id)) { + buf.delete(view); + buf.add(view); + } + if (++i > ii) { + break; + } + } + } + while (buf.size > this.#size) { + this.#destroyFirstView(); + } + } + + has(view) { + return this.#buf.has(view); + } + + [Symbol.iterator]() { + return this.#buf.keys(); + } + + #destroyFirstView() { + const firstView = this.#buf.keys().next().value; + firstView?.destroy(); + this.#buf.delete(firstView); + } + } + + exports.PDFPageViewBuffer = PDFPageViewBuffer; + + class PDFViewer { + #buffer = null; + #altTextManager = null; + #annotationEditorMode = _pdfjsLib.AnnotationEditorType.NONE; + #annotationEditorUIManager = null; + #annotationMode = _pdfjsLib.AnnotationMode.ENABLE_FORMS; + #containerTopLeft = null; + #copyCallbackBound = null; + #enablePermissions = false; + #getAllTextInProgress = false; + #hiddenCopyElement = null; + #interruptCopyCondition = false; + #previousContainerHeight = 0; + #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this)); + #scrollModePageState = null; + #onVisibilityChange = null; + #scaleTimeoutId = null; + #textLayerMode = _ui_utils.TextLayerMode.ENABLE; + + constructor(options) { + const viewerVersion = '3.11.174'; + if (_pdfjsLib.version !== viewerVersion) { + throw new Error(`The API version "${_pdfjsLib.version}" does not match the Viewer version "${viewerVersion}".`); + } + this.container = options.container; + this.viewer = options.viewer || options.container.firstElementChild; + if (this.container?.tagName !== "DIV" || this.viewer?.tagName !== "DIV") { + throw new Error("Invalid `container` and/or `viewer` option."); + } + if (this.container.offsetParent && getComputedStyle(this.container).position !== "absolute") { + throw new Error("The `container` must be absolutely positioned."); + } + this.#resizeObserver.observe(this.container); + this.eventBus = options.eventBus; + this.linkService = options.linkService || new _pdf_link_service.SimpleLinkService(); + this.downloadManager = options.downloadManager || null; + this.findController = options.findController || null; + this.#altTextManager = options.altTextManager || null; + if (this.findController) { + this.findController.onIsPageVisible = pageNumber => this._getVisiblePages().ids.has(pageNumber); + } + this._scriptingManager = options.scriptingManager || null; + this.#textLayerMode = options.textLayerMode ?? _ui_utils.TextLayerMode.ENABLE; + this.#annotationMode = options.annotationMode ?? _pdfjsLib.AnnotationMode.ENABLE_FORMS; + this.#annotationEditorMode = options.annotationEditorMode ?? _pdfjsLib.AnnotationEditorType.NONE; + this.imageResourcesPath = options.imageResourcesPath || ""; + this.enablePrintAutoRotate = options.enablePrintAutoRotate || false; + this.removePageBorders = options.removePageBorders || false; + if (options.useOnlyCssZoom) { + console.error("useOnlyCssZoom was removed, please use `maxCanvasPixels = 0` instead."); + options.maxCanvasPixels = 0; + } + this.isOffscreenCanvasSupported = options.isOffscreenCanvasSupported ?? true; + this.maxCanvasPixels = options.maxCanvasPixels; + this.l10n = options.l10n || _l10n_utils.NullL10n; + this.#enablePermissions = options.enablePermissions || false; + this.pageColors = options.pageColors || null; + this.defaultRenderingQueue = !options.renderingQueue; + if (this.defaultRenderingQueue) { + this.renderingQueue = new _pdf_rendering_queue.PDFRenderingQueue(); + this.renderingQueue.setViewer(this); + } else { + this.renderingQueue = options.renderingQueue; + } + this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdate.bind(this)); + this.presentationModeState = _ui_utils.PresentationModeState.UNKNOWN; + this._onBeforeDraw = this._onAfterDraw = null; + this._resetView(); + if (this.removePageBorders) { + this.viewer.classList.add("removePageBorders"); + } + this.#updateContainerHeightCss(); + this.eventBus._on("thumbnailrendered", ({ + pageNumber, + pdfPage + }) => { + const pageView = this._pages[pageNumber - 1]; + if (!this.#buffer.has(pageView)) { + pdfPage?.cleanup(); + } + }); + } + + get pagesCount() { + return this._pages.length; + } + + getPageView(index) { + return this._pages[index]; + } + + getCachedPageViews() { + return new Set(this.#buffer); + } + + get pageViewsReady() { + return this._pagesCapability.settled && this._pages.every(pageView => pageView?.pdfPage); + } + + get renderForms() { + return this.#annotationMode === _pdfjsLib.AnnotationMode.ENABLE_FORMS; + } + + get enableScripting() { + return !!this._scriptingManager; + } + + get currentPageNumber() { + return this._currentPageNumber; + } + + set currentPageNumber(val) { + if (!Number.isInteger(val)) { + throw new Error("Invalid page number."); + } + if (!this.pdfDocument) { + return; + } + if (!this._setCurrentPageNumber(val, true)) { + console.error(`currentPageNumber: "${val}" is not a valid page.`); + } + } + + _setCurrentPageNumber(val, resetCurrentPageView = false) { + if (this._currentPageNumber === val) { + if (resetCurrentPageView) { + this.#resetCurrentPageView(); + } + return true; + } + if (!(0 < val && val <= this.pagesCount)) { + return false; + } + const previous = this._currentPageNumber; + this._currentPageNumber = val; + this.eventBus.dispatch("pagechanging", { + source: this, + pageNumber: val, + pageLabel: this._pageLabels?.[val - 1] ?? null, + previous + }); + if (resetCurrentPageView) { + this.#resetCurrentPageView(); + } + return true; + } + + get currentPageLabel() { + return this._pageLabels?.[this._currentPageNumber - 1] ?? null; + } + + set currentPageLabel(val) { + if (!this.pdfDocument) { + return; + } + let page = val | 0; + if (this._pageLabels) { + const i = this._pageLabels.indexOf(val); + if (i >= 0) { + page = i + 1; + } + } + if (!this._setCurrentPageNumber(page, true)) { + console.error(`currentPageLabel: "${val}" is not a valid page.`); + } + } + + get currentScale() { + return this._currentScale !== _ui_utils.UNKNOWN_SCALE ? this._currentScale : _ui_utils.DEFAULT_SCALE; + } + + set currentScale(val) { + if (isNaN(val)) { + throw new Error("Invalid numeric scale."); + } + if (!this.pdfDocument) { + return; + } + this.#setScale(val, { + noScroll: false + }); + } + + get currentScaleValue() { + return this._currentScaleValue; + } + + set currentScaleValue(val) { + if (!this.pdfDocument) { + return; + } + this.#setScale(val, { + noScroll: false + }); + } + + get pagesRotation() { + return this._pagesRotation; + } + + set pagesRotation(rotation) { + if (!(0, _ui_utils.isValidRotation)(rotation)) { + throw new Error("Invalid pages rotation angle."); + } + if (!this.pdfDocument) { + return; + } + rotation %= 360; + if (rotation < 0) { + rotation += 360; + } + if (this._pagesRotation === rotation) { + return; + } + this._pagesRotation = rotation; + const pageNumber = this._currentPageNumber; + this.refresh(true, { + rotation + }); + if (this._currentScaleValue) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this.eventBus.dispatch("rotationchanging", { + source: this, + pagesRotation: rotation, + pageNumber + }); + if (this.defaultRenderingQueue) { + this.update(); + } + } + + get firstPagePromise() { + return this.pdfDocument ? this._firstPageCapability.promise : null; + } + + get onePageRendered() { + return this.pdfDocument ? this._onePageRenderedCapability.promise : null; + } + + get pagesPromise() { + return this.pdfDocument ? this._pagesCapability.promise : null; + } + + #layerProperties() { + const self = this; + return { + get annotationEditorUIManager() { + return self.#annotationEditorUIManager; + }, + get annotationStorage() { + return self.pdfDocument?.annotationStorage; + }, + get downloadManager() { + return self.downloadManager; + }, + get enableScripting() { + return !!self._scriptingManager; + }, + get fieldObjectsPromise() { + return self.pdfDocument?.getFieldObjects(); + }, + get findController() { + return self.findController; + }, + get hasJSActionsPromise() { + return self.pdfDocument?.hasJSActions(); + }, + get linkService() { + return self.linkService; + } + }; + } + + #initializePermissions(permissions) { + const params = { + annotationEditorMode: this.#annotationEditorMode, + annotationMode: this.#annotationMode, + textLayerMode: this.#textLayerMode + }; + if (!permissions) { + return params; + } + if (!permissions.includes(_pdfjsLib.PermissionFlag.COPY) && this.#textLayerMode === _ui_utils.TextLayerMode.ENABLE) { + params.textLayerMode = _ui_utils.TextLayerMode.ENABLE_PERMISSIONS; + } + if (!permissions.includes(_pdfjsLib.PermissionFlag.MODIFY_CONTENTS)) { + params.annotationEditorMode = _pdfjsLib.AnnotationEditorType.DISABLE; + } + if (!permissions.includes(_pdfjsLib.PermissionFlag.MODIFY_ANNOTATIONS) && !permissions.includes(_pdfjsLib.PermissionFlag.FILL_INTERACTIVE_FORMS) && this.#annotationMode === _pdfjsLib.AnnotationMode.ENABLE_FORMS) { + params.annotationMode = _pdfjsLib.AnnotationMode.ENABLE; + } + return params; + } + + #onePageRenderedOrForceFetch() { + if (document.visibilityState === "hidden" || !this.container.offsetParent || this._getVisiblePages().views.length === 0) { + return Promise.resolve(); + } + const visibilityChangePromise = new Promise(resolve => { + this.#onVisibilityChange = () => { + if (document.visibilityState !== "hidden") { + return; + } + resolve(); + document.removeEventListener("visibilitychange", this.#onVisibilityChange); + this.#onVisibilityChange = null; + }; + document.addEventListener("visibilitychange", this.#onVisibilityChange); + }); + return Promise.race([this._onePageRenderedCapability.promise, visibilityChangePromise]); + } + + async getAllText() { + const texts = []; + const buffer = []; + for (let pageNum = 1, pagesCount = this.pdfDocument.numPages; pageNum <= pagesCount; ++pageNum) { + if (this.#interruptCopyCondition) { + return null; + } + buffer.length = 0; + const page = await this.pdfDocument.getPage(pageNum); + const { + items + } = await page.getTextContent(); + for (const item of items) { + if (item.str) { + buffer.push(item.str); + } + if (item.hasEOL) { + buffer.push("\n"); + } + } + texts.push((0, _ui_utils.removeNullCharacters)(buffer.join(""))); + } + return texts.join("\n"); + } + + #copyCallback(textLayerMode, event) { + const selection = document.getSelection(); + const { + focusNode, + anchorNode + } = selection; + if (anchorNode && focusNode && selection.containsNode(this.#hiddenCopyElement)) { + if (this.#getAllTextInProgress || textLayerMode === _ui_utils.TextLayerMode.ENABLE_PERMISSIONS) { + event.preventDefault(); + event.stopPropagation(); + return; + } + this.#getAllTextInProgress = true; + const savedCursor = this.container.style.cursor; + this.container.style.cursor = "wait"; + const interruptCopy = ev => this.#interruptCopyCondition = ev.key === "Escape"; + window.addEventListener("keydown", interruptCopy); + this.getAllText().then(async text => { + if (text !== null) { + await navigator.clipboard.writeText(text); + } + }).catch(reason => { + console.warn(`Something goes wrong when extracting the text: ${reason.message}`); + }).finally(() => { + this.#getAllTextInProgress = false; + this.#interruptCopyCondition = false; + window.removeEventListener("keydown", interruptCopy); + this.container.style.cursor = savedCursor; + }); + event.preventDefault(); + event.stopPropagation(); + } + } + + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.eventBus.dispatch("pagesdestroy", { + source: this + }); + this._cancelRendering(); + this._resetView(); + this.findController?.setDocument(null); + this._scriptingManager?.setDocument(null); + if (this.#annotationEditorUIManager) { + this.#annotationEditorUIManager.destroy(); + this.#annotationEditorUIManager = null; + } + } + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const pagesCount = pdfDocument.numPages; + const firstPagePromise = pdfDocument.getPage(1); + const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig(); + const permissionsPromise = this.#enablePermissions ? pdfDocument.getPermissions() : Promise.resolve(); + if (pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) { + console.warn("Forcing PAGE-scrolling for performance reasons, given the length of the document."); + const mode = this._scrollMode = _ui_utils.ScrollMode.PAGE; + this.eventBus.dispatch("scrollmodechanged", { + source: this, + mode + }); + } + this._pagesCapability.promise.then(() => { + this.eventBus.dispatch("pagesloaded", { + source: this, + pagesCount + }); + }, () => { + }); + this._onBeforeDraw = evt => { + const pageView = this._pages[evt.pageNumber - 1]; + if (!pageView) { + return; + } + this.#buffer.push(pageView); + }; + this.eventBus._on("pagerender", this._onBeforeDraw); + this._onAfterDraw = evt => { + if (evt.cssTransform || this._onePageRenderedCapability.settled) { + return; + } + this._onePageRenderedCapability.resolve({ + timestamp: evt.timestamp + }); + this.eventBus._off("pagerendered", this._onAfterDraw); + this._onAfterDraw = null; + if (this.#onVisibilityChange) { + document.removeEventListener("visibilitychange", this.#onVisibilityChange); + this.#onVisibilityChange = null; + } + }; + this.eventBus._on("pagerendered", this._onAfterDraw); + Promise.all([firstPagePromise, permissionsPromise]).then(([firstPdfPage, permissions]) => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this._firstPageCapability.resolve(firstPdfPage); + this._optionalContentConfigPromise = optionalContentConfigPromise; + const { + annotationEditorMode, + annotationMode, + textLayerMode + } = this.#initializePermissions(permissions); + if (textLayerMode !== _ui_utils.TextLayerMode.DISABLE) { + const element = this.#hiddenCopyElement = document.createElement("div"); + element.id = "hiddenCopyElement"; + this.viewer.before(element); + } + if (annotationEditorMode !== _pdfjsLib.AnnotationEditorType.DISABLE) { + const mode = annotationEditorMode; + if (pdfDocument.isPureXfa) { + console.warn("Warning: XFA-editing is not implemented."); + } else if (isValidAnnotationEditorMode(mode)) { + this.#annotationEditorUIManager = new _pdfjsLib.AnnotationEditorUIManager(this.container, this.viewer, this.#altTextManager, this.eventBus, pdfDocument, this.pageColors); + if (mode !== _pdfjsLib.AnnotationEditorType.NONE) { + this.#annotationEditorUIManager.updateMode(mode); + } + } else { + console.error(`Invalid AnnotationEditor mode: ${mode}`); + } + } + const layerProperties = this.#layerProperties.bind(this); + const viewerElement = this._scrollMode === _ui_utils.ScrollMode.PAGE ? null : this.viewer; + const scale = this.currentScale; + const viewport = firstPdfPage.getViewport({ + scale: scale * _pdfjsLib.PixelsPerInch.PDF_TO_CSS_UNITS + }); + this.viewer.style.setProperty("--scale-factor", viewport.scale); + if (this.pageColors?.foreground === "CanvasText" || this.pageColors?.background === "Canvas") { + this.viewer.style.setProperty("--hcm-highligh-filter", pdfDocument.filterFactory.addHighlightHCMFilter("CanvasText", "Canvas", "HighlightText", "Highlight")); + } + for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { + const pageView = new _pdf_page_view.PDFPageView({ + container: viewerElement, + eventBus: this.eventBus, + id: pageNum, + scale, + defaultViewport: viewport.clone(), + optionalContentConfigPromise, + renderingQueue: this.renderingQueue, + textLayerMode, + annotationMode, + imageResourcesPath: this.imageResourcesPath, + isOffscreenCanvasSupported: this.isOffscreenCanvasSupported, + maxCanvasPixels: this.maxCanvasPixels, + pageColors: this.pageColors, + l10n: this.l10n, + layerProperties + }); + this._pages.push(pageView); + } + const firstPageView = this._pages[0]; + if (firstPageView) { + firstPageView.setPdfPage(firstPdfPage); + this.linkService.cachePageRef(1, firstPdfPage.ref); + } + if (this._scrollMode === _ui_utils.ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else if (this._spreadMode !== _ui_utils.SpreadMode.NONE) { + this._updateSpreadMode(); + } + this.#onePageRenderedOrForceFetch().then(async () => { + this.findController?.setDocument(pdfDocument); + this._scriptingManager?.setDocument(pdfDocument); + if (this.#hiddenCopyElement) { + this.#copyCallbackBound = this.#copyCallback.bind(this, textLayerMode); + document.addEventListener("copy", this.#copyCallbackBound); + } + if (this.#annotationEditorUIManager) { + this.eventBus.dispatch("annotationeditormodechanged", { + source: this, + mode: this.#annotationEditorMode + }); + } + if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > PagesCountLimit.FORCE_LAZY_PAGE_INIT) { + this._pagesCapability.resolve(); + return; + } + let getPagesLeft = pagesCount - 1; + if (getPagesLeft <= 0) { + this._pagesCapability.resolve(); + return; + } + for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) { + const promise = pdfDocument.getPage(pageNum).then(pdfPage => { + const pageView = this._pages[pageNum - 1]; + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } + this.linkService.cachePageRef(pageNum, pdfPage.ref); + if (--getPagesLeft === 0) { + this._pagesCapability.resolve(); + } + }, reason => { + console.error(`Unable to get page ${pageNum} to initialize viewer`, reason); + if (--getPagesLeft === 0) { + this._pagesCapability.resolve(); + } + }); + if (pageNum % PagesCountLimit.PAUSE_EAGER_PAGE_INIT === 0) { + await promise; + } + } + }); + this.eventBus.dispatch("pagesinit", { + source: this + }); + pdfDocument.getMetadata().then(({ + info + }) => { + if (pdfDocument !== this.pdfDocument) { + return; + } + if (info.Language) { + this.viewer.lang = info.Language; + } + }); + if (this.defaultRenderingQueue) { + this.update(); + } + }).catch(reason => { + console.error("Unable to initialize viewer", reason); + this._pagesCapability.reject(reason); + }); + } + + setPageLabels(labels) { + if (!this.pdfDocument) { + return; + } + if (!labels) { + this._pageLabels = null; + } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) { + this._pageLabels = null; + console.error(`setPageLabels: Invalid page labels.`); + } else { + this._pageLabels = labels; + } + for (let i = 0, ii = this._pages.length; i < ii; i++) { + this._pages[i].setPageLabel(this._pageLabels?.[i] ?? null); + } + } + + _resetView() { + this._pages = []; + this._currentPageNumber = 1; + this._currentScale = _ui_utils.UNKNOWN_SCALE; + this._currentScaleValue = null; + this._pageLabels = null; + this.#buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE); + this._location = null; + this._pagesRotation = 0; + this._optionalContentConfigPromise = null; + this._firstPageCapability = new _pdfjsLib.PromiseCapability(); + this._onePageRenderedCapability = new _pdfjsLib.PromiseCapability(); + this._pagesCapability = new _pdfjsLib.PromiseCapability(); + this._scrollMode = _ui_utils.ScrollMode.VERTICAL; + this._previousScrollMode = _ui_utils.ScrollMode.UNKNOWN; + this._spreadMode = _ui_utils.SpreadMode.NONE; + this.#scrollModePageState = { + previousPageNumber: 1, + scrollDown: true, + pages: [] + }; + if (this._onBeforeDraw) { + this.eventBus._off("pagerender", this._onBeforeDraw); + this._onBeforeDraw = null; + } + if (this._onAfterDraw) { + this.eventBus._off("pagerendered", this._onAfterDraw); + this._onAfterDraw = null; + } + if (this.#onVisibilityChange) { + document.removeEventListener("visibilitychange", this.#onVisibilityChange); + this.#onVisibilityChange = null; + } + this.viewer.textContent = ""; + this._updateScrollMode(); + this.viewer.removeAttribute("lang"); + if (this.#hiddenCopyElement) { + document.removeEventListener("copy", this.#copyCallbackBound); + this.#copyCallbackBound = null; + this.#hiddenCopyElement.remove(); + this.#hiddenCopyElement = null; + } + } + + #ensurePageViewVisible() { + if (this._scrollMode !== _ui_utils.ScrollMode.PAGE) { + throw new Error("#ensurePageViewVisible: Invalid scrollMode value."); + } + const pageNumber = this._currentPageNumber, + state = this.#scrollModePageState, + viewer = this.viewer; + viewer.textContent = ""; + state.pages.length = 0; + if (this._spreadMode === _ui_utils.SpreadMode.NONE && !this.isInPresentationMode) { + const pageView = this._pages[pageNumber - 1]; + viewer.append(pageView.div); + state.pages.push(pageView); + } else { + const pageIndexSet = new Set(), + parity = this._spreadMode - 1; + if (parity === -1) { + pageIndexSet.add(pageNumber - 1); + } else if (pageNumber % 2 !== parity) { + pageIndexSet.add(pageNumber - 1); + pageIndexSet.add(pageNumber); + } else { + pageIndexSet.add(pageNumber - 2); + pageIndexSet.add(pageNumber - 1); + } + const spread = document.createElement("div"); + spread.className = "spread"; + if (this.isInPresentationMode) { + const dummyPage = document.createElement("div"); + dummyPage.className = "dummyPage"; + spread.append(dummyPage); + } + for (const i of pageIndexSet) { + const pageView = this._pages[i]; + if (!pageView) { + continue; + } + spread.append(pageView.div); + state.pages.push(pageView); + } + viewer.append(spread); + } + state.scrollDown = pageNumber >= state.previousPageNumber; + state.previousPageNumber = pageNumber; + } + + _scrollUpdate() { + if (this.pagesCount === 0) { + return; + } + this.update(); + } + + #scrollIntoView(pageView, pageSpot = null) { + const { + div, + id + } = pageView; + if (this._currentPageNumber !== id) { + this._setCurrentPageNumber(id); + } + if (this._scrollMode === _ui_utils.ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + this.update(); + } + if (!pageSpot && !this.isInPresentationMode) { + const left = div.offsetLeft + div.clientLeft, + right = left + div.clientWidth; + const { + scrollLeft, + clientWidth + } = this.container; + if (this._scrollMode === _ui_utils.ScrollMode.HORIZONTAL || left < scrollLeft || right > scrollLeft + clientWidth) { + pageSpot = { + left: 0, + top: 0 + }; + } + } + (0, _ui_utils.scrollIntoView)(div, pageSpot); + if (!this._currentScaleValue && this._location) { + this._location = null; + } + } + + #isSameScale(newScale) { + return newScale === this._currentScale || Math.abs(newScale - this._currentScale) < 1e-15; + } + + #setScaleUpdatePages(newScale, newValue, { + noScroll = false, + preset = false, + drawingDelay = -1 + }) { + this._currentScaleValue = newValue.toString(); + if (this.#isSameScale(newScale)) { + if (preset) { + this.eventBus.dispatch("scalechanging", { + source: this, + scale: newScale, + presetValue: newValue + }); + } + return; + } + this.viewer.style.setProperty("--scale-factor", newScale * _pdfjsLib.PixelsPerInch.PDF_TO_CSS_UNITS); + const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000; + this.refresh(true, { + scale: newScale, + drawingDelay: postponeDrawing ? drawingDelay : -1 + }); + if (postponeDrawing) { + this.#scaleTimeoutId = setTimeout(() => { + this.#scaleTimeoutId = null; + this.refresh(); + }, drawingDelay); + } + this._currentScale = newScale; + if (!noScroll) { + let page = this._currentPageNumber, + dest; + if (this._location && !(this.isInPresentationMode || this.isChangingPresentationMode)) { + page = this._location.pageNumber; + dest = [null, { + name: "XYZ" + }, this._location.left, this._location.top, null]; + } + this.scrollPageIntoView({ + pageNumber: page, + destArray: dest, + allowNegativeOffset: true + }); + } + this.eventBus.dispatch("scalechanging", { + source: this, + scale: newScale, + presetValue: preset ? newValue : undefined + }); + if (this.defaultRenderingQueue) { + this.update(); + } + } + + get #pageWidthScaleFactor() { + if (this._spreadMode !== _ui_utils.SpreadMode.NONE && this._scrollMode !== _ui_utils.ScrollMode.HORIZONTAL) { + return 2; + } + return 1; + } + + #setScale(value, options) { + let scale = parseFloat(value); + if (scale > 0) { + options.preset = false; + this.#setScaleUpdatePages(scale, value, options); + } else { + const currentPage = this._pages[this._currentPageNumber - 1]; + if (!currentPage) { + return; + } + let hPadding = _ui_utils.SCROLLBAR_PADDING, + vPadding = _ui_utils.VERTICAL_PADDING; + if (this.isInPresentationMode) { + hPadding = vPadding = 4; + if (this._spreadMode !== _ui_utils.SpreadMode.NONE) { + hPadding *= 2; + } + } else if (this.removePageBorders) { + hPadding = vPadding = 0; + } else if (this._scrollMode === _ui_utils.ScrollMode.HORIZONTAL) { + [hPadding, vPadding] = [vPadding, hPadding]; + } + const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale / this.#pageWidthScaleFactor; + const pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale; + switch (value) { + case "page-actual": + scale = 1; + break; + case "page-width": + scale = pageWidthScale; + break; + case "page-height": + scale = pageHeightScale; + break; + case "page-fit": + scale = Math.min(pageWidthScale, pageHeightScale); + break; + case "auto": + const horizontalScale = (0, _ui_utils.isPortraitOrientation)(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale); + scale = Math.min(_ui_utils.MAX_AUTO_SCALE, horizontalScale); + break; + default: + console.error(`#setScale: "${value}" is an unknown zoom value.`); + return; + } + options.preset = true; + this.#setScaleUpdatePages(scale, value, options); + } + } + + #resetCurrentPageView() { + const pageView = this._pages[this._currentPageNumber - 1]; + if (this.isInPresentationMode) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this.#scrollIntoView(pageView); + } + + pageLabelToPageNumber(label) { + if (!this._pageLabels) { + return null; + } + const i = this._pageLabels.indexOf(label); + if (i < 0) { + return null; + } + return i + 1; + } + + scrollPageIntoView({ + pageNumber, + destArray = null, + allowNegativeOffset = false, + ignoreDestinationZoom = false + }) { + if (!this.pdfDocument) { + return; + } + const pageView = Number.isInteger(pageNumber) && this._pages[pageNumber - 1]; + if (!pageView) { + console.error(`scrollPageIntoView: "${pageNumber}" is not a valid pageNumber parameter.`); + return; + } + if (this.isInPresentationMode || !destArray) { + this._setCurrentPageNumber(pageNumber, true); + return; + } + let x = 0, + y = 0; + let width = 0, + height = 0, + widthScale, + heightScale; + const changeOrientation = pageView.rotation % 180 !== 0; + const pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / _pdfjsLib.PixelsPerInch.PDF_TO_CSS_UNITS; + const pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / _pdfjsLib.PixelsPerInch.PDF_TO_CSS_UNITS; + let scale = 0; + switch (destArray[1].name) { + case "XYZ": + x = destArray[2]; + y = destArray[3]; + scale = destArray[4]; + x = x !== null ? x : 0; + y = y !== null ? y : pageHeight; + break; + case "Fit": + case "FitB": + scale = "page-fit"; + break; + case "FitH": + case "FitBH": + y = destArray[2]; + scale = "page-width"; + if (y === null && this._location) { + x = this._location.left; + y = this._location.top; + } else if (typeof y !== "number" || y < 0) { + y = pageHeight; + } + break; + case "FitV": + case "FitBV": + x = destArray[2]; + width = pageWidth; + height = pageHeight; + scale = "page-height"; + break; + case "FitR": + x = destArray[2]; + y = destArray[3]; + width = destArray[4] - x; + height = destArray[5] - y; + let hPadding = _ui_utils.SCROLLBAR_PADDING, + vPadding = _ui_utils.VERTICAL_PADDING; + if (this.removePageBorders) { + hPadding = vPadding = 0; + } + widthScale = (this.container.clientWidth - hPadding) / width / _pdfjsLib.PixelsPerInch.PDF_TO_CSS_UNITS; + heightScale = (this.container.clientHeight - vPadding) / height / _pdfjsLib.PixelsPerInch.PDF_TO_CSS_UNITS; + scale = Math.min(Math.abs(widthScale), Math.abs(heightScale)); + break; + default: + console.error(`scrollPageIntoView: "${destArray[1].name}" is not a valid destination type.`); + return; + } + if (!ignoreDestinationZoom) { + if (scale && scale !== this._currentScale) { + this.currentScaleValue = scale; + } else if (this._currentScale === _ui_utils.UNKNOWN_SCALE) { + this.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE; + } + } + if (scale === "page-fit" && !destArray[4]) { + this.#scrollIntoView(pageView); + return; + } + const boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)]; + let left = Math.min(boundingRect[0][0], boundingRect[1][0]); + let top = Math.min(boundingRect[0][1], boundingRect[1][1]); + if (!allowNegativeOffset) { + left = Math.max(left, 0); + top = Math.max(top, 0); + } + this.#scrollIntoView(pageView, { + left, + top + }); + } + + _updateLocation(firstPage) { + const currentScale = this._currentScale; + const currentScaleValue = this._currentScaleValue; + const normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue; + const pageNumber = firstPage.id; + const currentPageView = this._pages[pageNumber - 1]; + const container = this.container; + const topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y); + const intLeft = Math.round(topLeft[0]); + const intTop = Math.round(topLeft[1]); + let pdfOpenParams = `#page=${pageNumber}`; + if (!this.isInPresentationMode) { + pdfOpenParams += `&zoom=${normalizedScaleValue},${intLeft},${intTop}`; + } + this._location = { + pageNumber, + scale: normalizedScaleValue, + top: intTop, + left: intLeft, + rotation: this._pagesRotation, + pdfOpenParams + }; + } + + update() { + const visible = this._getVisiblePages(); + const visiblePages = visible.views, + numVisiblePages = visiblePages.length; + if (numVisiblePages === 0) { + return; + } + const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1); + this.#buffer.resize(newCacheSize, visible.ids); + this.renderingQueue.renderHighestPriority(visible); + const isSimpleLayout = this._spreadMode === _ui_utils.SpreadMode.NONE && (this._scrollMode === _ui_utils.ScrollMode.PAGE || this._scrollMode === _ui_utils.ScrollMode.VERTICAL); + const currentId = this._currentPageNumber; + let stillFullyVisible = false; + for (const page of visiblePages) { + if (page.percent < 100) { + break; + } + if (page.id === currentId && isSimpleLayout) { + stillFullyVisible = true; + break; + } + } + this._setCurrentPageNumber(stillFullyVisible ? currentId : visiblePages[0].id); + this._updateLocation(visible.first); + this.eventBus.dispatch("updateviewarea", { + source: this, + location: this._location + }); + } + + containsElement(element) { + return this.container.contains(element); + } + + focus() { + this.container.focus(); + } + + get _isContainerRtl() { + return getComputedStyle(this.container).direction === "rtl"; + } + + get isInPresentationMode() { + return this.presentationModeState === _ui_utils.PresentationModeState.FULLSCREEN; + } + + get isChangingPresentationMode() { + return this.presentationModeState === _ui_utils.PresentationModeState.CHANGING; + } + + get isHorizontalScrollbarEnabled() { + return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth; + } + + get isVerticalScrollbarEnabled() { + return this.isInPresentationMode ? false : this.container.scrollHeight > this.container.clientHeight; + } + + _getVisiblePages() { + const views = this._scrollMode === _ui_utils.ScrollMode.PAGE ? this.#scrollModePageState.pages : this._pages, + horizontal = this._scrollMode === _ui_utils.ScrollMode.HORIZONTAL, + rtl = horizontal && this._isContainerRtl; + return (0, _ui_utils.getVisibleElements)({ + scrollEl: this.container, + views, + sortByVisibility: true, + horizontal, + rtl + }); + } + + cleanup() { + for (const pageView of this._pages) { + if (pageView.renderingState !== _ui_utils.RenderingStates.FINISHED) { + pageView.reset(); + } + } + } + + _cancelRendering() { + for (const pageView of this._pages) { + pageView.cancelRendering(); + } + } + + async #ensurePdfPageLoaded(pageView) { + if (pageView.pdfPage) { + return pageView.pdfPage; + } + try { + const pdfPage = await this.pdfDocument.getPage(pageView.id); + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } + if (!this.linkService._cachedPageNumber?.(pdfPage.ref)) { + this.linkService.cachePageRef(pageView.id, pdfPage.ref); + } + return pdfPage; + } catch (reason) { + console.error("Unable to get page for page view", reason); + return null; + } + } + + #getScrollAhead(visible) { + if (visible.first?.id === 1) { + return true; + } else if (visible.last?.id === this.pagesCount) { + return false; + } + switch (this._scrollMode) { + case _ui_utils.ScrollMode.PAGE: + return this.#scrollModePageState.scrollDown; + case _ui_utils.ScrollMode.HORIZONTAL: + return this.scroll.right; + } + return this.scroll.down; + } + + forceRendering(currentlyVisiblePages) { + const visiblePages = currentlyVisiblePages || this._getVisiblePages(); + const scrollAhead = this.#getScrollAhead(visiblePages); + const preRenderExtra = this._spreadMode !== _ui_utils.SpreadMode.NONE && this._scrollMode !== _ui_utils.ScrollMode.HORIZONTAL; + const pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead, preRenderExtra); + if (pageView) { + this.#ensurePdfPageLoaded(pageView).then(() => { + this.renderingQueue.renderView(pageView); + }); + return true; + } + return false; + } + + get hasEqualPageSizes() { + const firstPageView = this._pages[0]; + for (let i = 1, ii = this._pages.length; i < ii; ++i) { + const pageView = this._pages[i]; + if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) { + return false; + } + } + return true; + } + + getPagesOverview() { + let initialOrientation; + return this._pages.map(pageView => { + const viewport = pageView.pdfPage.getViewport({ + scale: 1 + }); + const orientation = (0, _ui_utils.isPortraitOrientation)(viewport); + if (initialOrientation === undefined) { + initialOrientation = orientation; + } else if (this.enablePrintAutoRotate && orientation !== initialOrientation) { + return { + width: viewport.height, + height: viewport.width, + rotation: (viewport.rotation - 90) % 360 + }; + } + return { + width: viewport.width, + height: viewport.height, + rotation: viewport.rotation + }; + }); + } + + get optionalContentConfigPromise() { + if (!this.pdfDocument) { + return Promise.resolve(null); + } + if (!this._optionalContentConfigPromise) { + console.error("optionalContentConfigPromise: Not initialized yet."); + return this.pdfDocument.getOptionalContentConfig(); + } + return this._optionalContentConfigPromise; + } + + set optionalContentConfigPromise(promise) { + if (!(promise instanceof Promise)) { + throw new Error(`Invalid optionalContentConfigPromise: ${promise}`); + } + if (!this.pdfDocument) { + return; + } + if (!this._optionalContentConfigPromise) { + return; + } + this._optionalContentConfigPromise = promise; + this.refresh(false, { + optionalContentConfigPromise: promise + }); + this.eventBus.dispatch("optionalcontentconfigchanged", { + source: this, + promise + }); + } + + get scrollMode() { + return this._scrollMode; + } + + set scrollMode(mode) { + if (this._scrollMode === mode) { + return; + } + if (!(0, _ui_utils.isValidScrollMode)(mode)) { + throw new Error(`Invalid scroll mode: ${mode}`); + } + if (this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) { + return; + } + this._previousScrollMode = this._scrollMode; + this._scrollMode = mode; + this.eventBus.dispatch("scrollmodechanged", { + source: this, + mode + }); + this._updateScrollMode(this._currentPageNumber); + } + + _updateScrollMode(pageNumber = null) { + const scrollMode = this._scrollMode, + viewer = this.viewer; + viewer.classList.toggle("scrollHorizontal", scrollMode === _ui_utils.ScrollMode.HORIZONTAL); + viewer.classList.toggle("scrollWrapped", scrollMode === _ui_utils.ScrollMode.WRAPPED); + if (!this.pdfDocument || !pageNumber) { + return; + } + if (scrollMode === _ui_utils.ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else if (this._previousScrollMode === _ui_utils.ScrollMode.PAGE) { + this._updateSpreadMode(); + } + if (this._currentScaleValue && isNaN(this._currentScaleValue)) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this._setCurrentPageNumber(pageNumber, true); + this.update(); + } + + get spreadMode() { + return this._spreadMode; + } + + set spreadMode(mode) { + if (this._spreadMode === mode) { + return; + } + if (!(0, _ui_utils.isValidSpreadMode)(mode)) { + throw new Error(`Invalid spread mode: ${mode}`); + } + this._spreadMode = mode; + this.eventBus.dispatch("spreadmodechanged", { + source: this, + mode + }); + this._updateSpreadMode(this._currentPageNumber); + } + + _updateSpreadMode(pageNumber = null) { + if (!this.pdfDocument) { + return; + } + const viewer = this.viewer, + pages = this._pages; + if (this._scrollMode === _ui_utils.ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else { + viewer.textContent = ""; + if (this._spreadMode === _ui_utils.SpreadMode.NONE) { + for (const pageView of this._pages) { + viewer.append(pageView.div); + } + } else { + const parity = this._spreadMode - 1; + let spread = null; + for (let i = 0, ii = pages.length; i < ii; ++i) { + if (spread === null) { + spread = document.createElement("div"); + spread.className = "spread"; + viewer.append(spread); + } else if (i % 2 === parity) { + spread = spread.cloneNode(false); + viewer.append(spread); + } + spread.append(pages[i].div); + } + } + } + if (!pageNumber) { + return; + } + if (this._currentScaleValue && isNaN(this._currentScaleValue)) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this._setCurrentPageNumber(pageNumber, true); + this.update(); + } + + _getPageAdvance(currentPageNumber, previous = false) { + switch (this._scrollMode) { + case _ui_utils.ScrollMode.WRAPPED: { + const { + views + } = this._getVisiblePages(), + pageLayout = new Map(); + for (const { + id, + y, + percent, + widthPercent + } of views) { + if (percent === 0 || widthPercent < 100) { + continue; + } + let yArray = pageLayout.get(y); + if (!yArray) { + pageLayout.set(y, yArray ||= []); + } + yArray.push(id); + } + for (const yArray of pageLayout.values()) { + const currentIndex = yArray.indexOf(currentPageNumber); + if (currentIndex === -1) { + continue; + } + const numPages = yArray.length; + if (numPages === 1) { + break; + } + if (previous) { + for (let i = currentIndex - 1, ii = 0; i >= ii; i--) { + const currentId = yArray[i], + expectedId = yArray[i + 1] - 1; + if (currentId < expectedId) { + return currentPageNumber - expectedId; + } + } + } else { + for (let i = currentIndex + 1, ii = numPages; i < ii; i++) { + const currentId = yArray[i], + expectedId = yArray[i - 1] + 1; + if (currentId > expectedId) { + return expectedId - currentPageNumber; + } + } + } + if (previous) { + const firstId = yArray[0]; + if (firstId < currentPageNumber) { + return currentPageNumber - firstId + 1; + } + } else { + const lastId = yArray[numPages - 1]; + if (lastId > currentPageNumber) { + return lastId - currentPageNumber + 1; + } + } + break; + } + break; + } + case _ui_utils.ScrollMode.HORIZONTAL: { + break; + } + case _ui_utils.ScrollMode.PAGE: + case _ui_utils.ScrollMode.VERTICAL: { + if (this._spreadMode === _ui_utils.SpreadMode.NONE) { + break; + } + const parity = this._spreadMode - 1; + if (previous && currentPageNumber % 2 !== parity) { + break; + } else if (!previous && currentPageNumber % 2 === parity) { + break; + } + const { + views + } = this._getVisiblePages(), + expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1; + for (const { + id, + percent, + widthPercent + } of views) { + if (id !== expectedId) { + continue; + } + if (percent > 0 && widthPercent === 100) { + return 2; + } + break; + } + break; + } + } + return 1; + } + + nextPage() { + const currentPageNumber = this._currentPageNumber, + pagesCount = this.pagesCount; + if (currentPageNumber >= pagesCount) { + return false; + } + const advance = this._getPageAdvance(currentPageNumber, false) || 1; + this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount); + return true; + } + + previousPage() { + const currentPageNumber = this._currentPageNumber; + if (currentPageNumber <= 1) { + return false; + } + const advance = this._getPageAdvance(currentPageNumber, true) || 1; + this.currentPageNumber = Math.max(currentPageNumber - advance, 1); + return true; + } + + increaseScale({ + drawingDelay, + scaleFactor, + steps + } = {}) { + if (!this.pdfDocument) { + return; + } + let newScale = this._currentScale; + if (scaleFactor > 1) { + newScale = Math.round(newScale * scaleFactor * 100) / 100; + } else { + steps ??= 1; + do { + newScale = Math.ceil((newScale * _ui_utils.DEFAULT_SCALE_DELTA).toFixed(2) * 10) / 10; + } while (--steps > 0 && newScale < _ui_utils.MAX_SCALE); + } + this.#setScale(Math.min(_ui_utils.MAX_SCALE, newScale), { + noScroll: false, + drawingDelay + }); + } + + decreaseScale({ + drawingDelay, + scaleFactor, + steps + } = {}) { + if (!this.pdfDocument) { + return; + } + let newScale = this._currentScale; + if (scaleFactor > 0 && scaleFactor < 1) { + newScale = Math.round(newScale * scaleFactor * 100) / 100; + } else { + steps ??= 1; + do { + newScale = Math.floor((newScale / _ui_utils.DEFAULT_SCALE_DELTA).toFixed(2) * 10) / 10; + } while (--steps > 0 && newScale > _ui_utils.MIN_SCALE); + } + this.#setScale(Math.max(_ui_utils.MIN_SCALE, newScale), { + noScroll: false, + drawingDelay + }); + } + + #updateContainerHeightCss(height = this.container.clientHeight) { + if (height !== this.#previousContainerHeight) { + this.#previousContainerHeight = height; + _ui_utils.docStyle.setProperty("--viewer-container-height", `${height}px`); + } + } + + #resizeObserverCallback(entries) { + for (const entry of entries) { + if (entry.target === this.container) { + this.#updateContainerHeightCss(Math.floor(entry.borderBoxSize[0].blockSize)); + this.#containerTopLeft = null; + break; + } + } + } + + get containerTopLeft() { + return this.#containerTopLeft ||= [this.container.offsetTop, this.container.offsetLeft]; + } + + get annotationEditorMode() { + return this.#annotationEditorUIManager ? this.#annotationEditorMode : _pdfjsLib.AnnotationEditorType.DISABLE; + } + + set annotationEditorMode({ + mode, + editId = null + }) { + if (!this.#annotationEditorUIManager) { + throw new Error(`The AnnotationEditor is not enabled.`); + } + if (this.#annotationEditorMode === mode) { + return; + } + if (!isValidAnnotationEditorMode(mode)) { + throw new Error(`Invalid AnnotationEditor mode: ${mode}`); + } + if (!this.pdfDocument) { + return; + } + this.#annotationEditorMode = mode; + this.eventBus.dispatch("annotationeditormodechanged", { + source: this, + mode + }); + this.#annotationEditorUIManager.updateMode(mode, editId); + } + + set annotationEditorParams({ + type, + value + }) { + if (!this.#annotationEditorUIManager) { + throw new Error(`The AnnotationEditor is not enabled.`); + } + this.#annotationEditorUIManager.updateParams(type, value); + } + + refresh(noUpdate = false, updateArgs = Object.create(null)) { + if (!this.pdfDocument) { + return; + } + for (const pageView of this._pages) { + pageView.update(updateArgs); + } + if (this.#scaleTimeoutId !== null) { + clearTimeout(this.#scaleTimeoutId); + this.#scaleTimeoutId = null; + } + if (!noUpdate) { + this.update(); + } + } + } + + exports.PDFViewer = PDFViewer; + + /***/ + }), + /* 30 */ + /***/ ((__unused_webpack_module, exports) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.NullL10n = void 0; + exports.getL10nFallback = getL10nFallback; + const DEFAULT_L10N_STRINGS = { + of_pages: "of {{pagesCount}}", + page_of_pages: "({{pageNumber}} of {{pagesCount}})", + document_properties_kb: "{{size_kb}} KB ({{size_b}} bytes)", + document_properties_mb: "{{size_mb}} MB ({{size_b}} bytes)", + document_properties_date_string: "{{date}}, {{time}}", + document_properties_page_size_unit_inches: "in", + document_properties_page_size_unit_millimeters: "mm", + document_properties_page_size_orientation_portrait: "portrait", + document_properties_page_size_orientation_landscape: "landscape", + document_properties_page_size_name_a3: "A3", + document_properties_page_size_name_a4: "A4", + document_properties_page_size_name_letter: "Letter", + document_properties_page_size_name_legal: "Legal", + document_properties_page_size_dimension_string: "{{width}} × {{height}} {{unit}} ({{orientation}})", + document_properties_page_size_dimension_name_string: "{{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})", + document_properties_linearized_yes: "Yes", + document_properties_linearized_no: "No", + additional_layers: "Additional Layers", + page_landmark: "Page {{page}}", + thumb_page_title: "Page {{page}}", + thumb_page_canvas: "Thumbnail of Page {{page}}", + find_reached_top: "Reached top of document, continued from bottom", + find_reached_bottom: "Reached end of document, continued from top", + "find_match_count[one]": "{{current}} of {{total}} match", + "find_match_count[other]": "{{current}} of {{total}} matches", + "find_match_count_limit[one]": "More than {{limit}} match", + "find_match_count_limit[other]": "More than {{limit}} matches", + find_not_found: "Phrase not found", + page_scale_width: "Page Width", + page_scale_fit: "Page Fit", + page_scale_auto: "Automatic Zoom", + page_scale_actual: "Actual Size", + page_scale_percent: "{{scale}}%", + loading_error: "An error occurred while loading the PDF.", + invalid_file_error: "Invalid or corrupted PDF file.", + missing_file_error: "Missing PDF file.", + unexpected_response_error: "Unexpected server response.", + rendering_error: "An error occurred while rendering the page.", + annotation_date_string: "{{date}}, {{time}}", + printing_not_supported: "Warning: Printing is not fully supported by this browser.", + printing_not_ready: "Warning: The PDF is not fully loaded for printing.", + web_fonts_disabled: "Web fonts are disabled: unable to use embedded PDF fonts.", + free_text2_default_content: "Start typing…", + editor_free_text2_aria_label: "Text Editor", + editor_ink2_aria_label: "Draw Editor", + editor_ink_canvas_aria_label: "User-created image", + editor_alt_text_button_label: "Alt text", + editor_alt_text_edit_button_label: "Edit alt text", + editor_alt_text_decorative_tooltip: "Marked as decorative" + }; + { + DEFAULT_L10N_STRINGS.print_progress_percent = "{{progress}}%"; + } + + function getL10nFallback(key, args) { + switch (key) { + case "find_match_count": + key = `find_match_count[${args.total === 1 ? "one" : "other"}]`; + break; + case "find_match_count_limit": + key = `find_match_count_limit[${args.limit === 1 ? "one" : "other"}]`; + break; + } + return DEFAULT_L10N_STRINGS[key] || ""; + } + + function formatL10nValue(text, args) { + if (!args) { + return text; + } + return text.replaceAll(/\{\{\s*(\w+)\s*\}\}/g, (all, name) => { + return name in args ? args[name] : "{{" + name + "}}"; + }); + } + + const NullL10n = { + async getLanguage() { + return "en-us"; + }, + async getDirection() { + return "ltr"; + }, + async get(key, args = null, fallback = getL10nFallback(key, args)) { + return formatL10nValue(fallback, args); + }, + async translate(element) { + } + }; + exports.NullL10n = NullL10n; + + /***/ + }), + /* 31 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFPageView = void 0; + var _pdfjsLib = __webpack_require__(4); + var _ui_utils = __webpack_require__(3); + var _annotation_editor_layer_builder = __webpack_require__(32); + var _annotation_layer_builder = __webpack_require__(33); + var _app_options = __webpack_require__(5); + var _l10n_utils = __webpack_require__(30); + var _pdf_link_service = __webpack_require__(7); + var _struct_tree_layer_builder = __webpack_require__(34); + var _text_accessibility = __webpack_require__(35); + var _text_highlighter = __webpack_require__(36); + var _text_layer_builder = __webpack_require__(37); + var _xfa_layer_builder = __webpack_require__(38); + const MAX_CANVAS_PIXELS = _app_options.compatibilityParams.maxCanvasPixels || 16777216; + const DEFAULT_LAYER_PROPERTIES = () => { + return null; + }; + + class PDFPageView { + #annotationMode = _pdfjsLib.AnnotationMode.ENABLE_FORMS; + #hasRestrictedScaling = false; + #layerProperties = null; + #loadingId = null; + #previousRotation = null; + #renderError = null; + #renderingState = _ui_utils.RenderingStates.INITIAL; + #textLayerMode = _ui_utils.TextLayerMode.ENABLE; + #useThumbnailCanvas = { + directDrawing: true, + initialOptionalContent: true, + regularAnnotations: true + }; + #viewportMap = new WeakMap(); + + constructor(options) { + const container = options.container; + const defaultViewport = options.defaultViewport; + this.id = options.id; + this.renderingId = "page" + this.id; + this.#layerProperties = options.layerProperties || DEFAULT_LAYER_PROPERTIES; + this.pdfPage = null; + this.pageLabel = null; + this.rotation = 0; + this.scale = options.scale || _ui_utils.DEFAULT_SCALE; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this._optionalContentConfigPromise = options.optionalContentConfigPromise || null; + this.#textLayerMode = options.textLayerMode ?? _ui_utils.TextLayerMode.ENABLE; + this.#annotationMode = options.annotationMode ?? _pdfjsLib.AnnotationMode.ENABLE_FORMS; + this.imageResourcesPath = options.imageResourcesPath || ""; + this.isOffscreenCanvasSupported = options.isOffscreenCanvasSupported ?? true; + this.maxCanvasPixels = options.maxCanvasPixels ?? MAX_CANVAS_PIXELS; + this.pageColors = options.pageColors || null; + this.eventBus = options.eventBus; + this.renderingQueue = options.renderingQueue; + this.l10n = options.l10n || _l10n_utils.NullL10n; + this.renderTask = null; + this.resume = null; + this._isStandalone = !this.renderingQueue?.hasViewer(); + this._container = container; + if (options.useOnlyCssZoom) { + console.error("useOnlyCssZoom was removed, please use `maxCanvasPixels = 0` instead."); + this.maxCanvasPixels = 0; + } + this._annotationCanvasMap = null; + this.annotationLayer = null; + this.annotationEditorLayer = null; + this.textLayer = null; + this.zoomLayer = null; + this.xfaLayer = null; + this.structTreeLayer = null; + const div = document.createElement("div"); + div.className = "page"; + div.setAttribute("data-page-number", this.id); + div.setAttribute("role", "region"); + this.l10n.get("page_landmark", { + page: this.id + }).then(msg => { + div.setAttribute("aria-label", msg); + }); + this.div = div; + this.#setDimensions(); + container?.append(div); + if (this._isStandalone) { + container?.style.setProperty("--scale-factor", this.scale * _pdfjsLib.PixelsPerInch.PDF_TO_CSS_UNITS); + const { + optionalContentConfigPromise + } = options; + if (optionalContentConfigPromise) { + optionalContentConfigPromise.then(optionalContentConfig => { + if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { + return; + } + this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; + }); + } + } + } + + get renderingState() { + return this.#renderingState; + } + + set renderingState(state) { + if (state === this.#renderingState) { + return; + } + this.#renderingState = state; + if (this.#loadingId) { + clearTimeout(this.#loadingId); + this.#loadingId = null; + } + switch (state) { + case _ui_utils.RenderingStates.PAUSED: + this.div.classList.remove("loading"); + break; + case _ui_utils.RenderingStates.RUNNING: + this.div.classList.add("loadingIcon"); + this.#loadingId = setTimeout(() => { + this.div.classList.add("loading"); + this.#loadingId = null; + }, 0); + break; + case _ui_utils.RenderingStates.INITIAL: + case _ui_utils.RenderingStates.FINISHED: + this.div.classList.remove("loadingIcon", "loading"); + break; + } + } + + #setDimensions() { + const { + viewport + } = this; + if (this.pdfPage) { + if (this.#previousRotation === viewport.rotation) { + return; + } + this.#previousRotation = viewport.rotation; + } + (0, _pdfjsLib.setLayerDimensions)(this.div, viewport, true, false); + } + + setPdfPage(pdfPage) { + if (this._isStandalone && (this.pageColors?.foreground === "CanvasText" || this.pageColors?.background === "Canvas")) { + this._container?.style.setProperty("--hcm-highligh-filter", pdfPage.filterFactory.addHighlightHCMFilter("CanvasText", "Canvas", "HighlightText", "Highlight")); + } + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport({ + scale: this.scale * _pdfjsLib.PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: totalRotation + }); + this.#setDimensions(); + this.reset(); + } + + destroy() { + this.reset(); + this.pdfPage?.cleanup(); + } + + get _textHighlighter() { + return (0, _pdfjsLib.shadow)(this, "_textHighlighter", new _text_highlighter.TextHighlighter({ + pageIndex: this.id - 1, + eventBus: this.eventBus, + findController: this.#layerProperties().findController + })); + } + + async #renderAnnotationLayer() { + let error = null; + try { + await this.annotationLayer.render(this.viewport, "display"); + } catch (ex) { + console.error(`#renderAnnotationLayer: "${ex}".`); + error = ex; + } finally { + this.eventBus.dispatch("annotationlayerrendered", { + source: this, + pageNumber: this.id, + error + }); + } + } + + async #renderAnnotationEditorLayer() { + let error = null; + try { + await this.annotationEditorLayer.render(this.viewport, "display"); + } catch (ex) { + console.error(`#renderAnnotationEditorLayer: "${ex}".`); + error = ex; + } finally { + this.eventBus.dispatch("annotationeditorlayerrendered", { + source: this, + pageNumber: this.id, + error + }); + } + } + + async #renderXfaLayer() { + let error = null; + try { + const result = await this.xfaLayer.render(this.viewport, "display"); + if (result?.textDivs && this._textHighlighter) { + this.#buildXfaTextContentItems(result.textDivs); + } + } catch (ex) { + console.error(`#renderXfaLayer: "${ex}".`); + error = ex; + } finally { + this.eventBus.dispatch("xfalayerrendered", { + source: this, + pageNumber: this.id, + error + }); + } + } + + async #renderTextLayer() { + const { + pdfPage, + textLayer, + viewport + } = this; + if (!textLayer) { + return; + } + let error = null; + try { + if (!textLayer.renderingDone) { + const readableStream = pdfPage.streamTextContent({ + includeMarkedContent: true, + disableNormalization: true + }); + textLayer.setTextContentSource(readableStream); + } + await textLayer.render(viewport); + } catch (ex) { + if (ex instanceof _pdfjsLib.AbortException) { + return; + } + console.error(`#renderTextLayer: "${ex}".`); + error = ex; + } + this.eventBus.dispatch("textlayerrendered", { + source: this, + pageNumber: this.id, + numTextDivs: textLayer.numTextDivs, + error + }); + this.#renderStructTreeLayer(); + } + + async #renderStructTreeLayer() { + if (!this.textLayer) { + return; + } + this.structTreeLayer ||= new _struct_tree_layer_builder.StructTreeLayerBuilder(); + const tree = await (!this.structTreeLayer.renderingDone ? this.pdfPage.getStructTree() : null); + const treeDom = this.structTreeLayer?.render(tree); + if (treeDom) { + this.canvas?.append(treeDom); + } + this.structTreeLayer?.show(); + } + + async #buildXfaTextContentItems(textDivs) { + const text = await this.pdfPage.getTextContent(); + const items = []; + for (const item of text.items) { + items.push(item.str); + } + this._textHighlighter.setTextMapping(textDivs, items); + this._textHighlighter.enable(); + } + + _resetZoomLayer(removeFromDOM = false) { + if (!this.zoomLayer) { + return; + } + const zoomLayerCanvas = this.zoomLayer.firstChild; + this.#viewportMap.delete(zoomLayerCanvas); + zoomLayerCanvas.width = 0; + zoomLayerCanvas.height = 0; + if (removeFromDOM) { + this.zoomLayer.remove(); + } + this.zoomLayer = null; + } + + reset({ + keepZoomLayer = false, + keepAnnotationLayer = false, + keepAnnotationEditorLayer = false, + keepXfaLayer = false, + keepTextLayer = false + } = {}) { + this.cancelRendering({ + keepAnnotationLayer, + keepAnnotationEditorLayer, + keepXfaLayer, + keepTextLayer + }); + this.renderingState = _ui_utils.RenderingStates.INITIAL; + const div = this.div; + const childNodes = div.childNodes, + zoomLayerNode = keepZoomLayer && this.zoomLayer || null, + annotationLayerNode = keepAnnotationLayer && this.annotationLayer?.div || null, + annotationEditorLayerNode = keepAnnotationEditorLayer && this.annotationEditorLayer?.div || null, + xfaLayerNode = keepXfaLayer && this.xfaLayer?.div || null, + textLayerNode = keepTextLayer && this.textLayer?.div || null; + for (let i = childNodes.length - 1; i >= 0; i--) { + const node = childNodes[i]; + switch (node) { + case zoomLayerNode: + case annotationLayerNode: + case annotationEditorLayerNode: + case xfaLayerNode: + case textLayerNode: + continue; + } + node.remove(); + } + div.removeAttribute("data-loaded"); + if (annotationLayerNode) { + this.annotationLayer.hide(); + } + if (annotationEditorLayerNode) { + this.annotationEditorLayer.hide(); + } + if (xfaLayerNode) { + this.xfaLayer.hide(); + } + if (textLayerNode) { + this.textLayer.hide(); + } + this.structTreeLayer?.hide(); + if (!zoomLayerNode) { + if (this.canvas) { + this.#viewportMap.delete(this.canvas); + this.canvas.width = 0; + this.canvas.height = 0; + delete this.canvas; + } + this._resetZoomLayer(); + } + } + + update({ + scale = 0, + rotation = null, + optionalContentConfigPromise = null, + drawingDelay = -1 + }) { + this.scale = scale || this.scale; + if (typeof rotation === "number") { + this.rotation = rotation; + } + if (optionalContentConfigPromise instanceof Promise) { + this._optionalContentConfigPromise = optionalContentConfigPromise; + optionalContentConfigPromise.then(optionalContentConfig => { + if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { + return; + } + this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; + }); + } + this.#useThumbnailCanvas.directDrawing = true; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: this.scale * _pdfjsLib.PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: totalRotation + }); + this.#setDimensions(); + if (this._isStandalone) { + this._container?.style.setProperty("--scale-factor", this.viewport.scale); + } + if (this.canvas) { + let onlyCssZoom = false; + if (this.#hasRestrictedScaling) { + if (this.maxCanvasPixels === 0) { + onlyCssZoom = true; + } else if (this.maxCanvasPixels > 0) { + const { + width, + height + } = this.viewport; + const { + sx, + sy + } = this.outputScale; + onlyCssZoom = (Math.floor(width) * sx | 0) * (Math.floor(height) * sy | 0) > this.maxCanvasPixels; + } + } + const postponeDrawing = !onlyCssZoom && drawingDelay >= 0 && drawingDelay < 1000; + if (postponeDrawing || onlyCssZoom) { + if (postponeDrawing && this.renderingState !== _ui_utils.RenderingStates.FINISHED) { + this.cancelRendering({ + keepZoomLayer: true, + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + cancelExtraDelay: drawingDelay + }); + this.renderingState = _ui_utils.RenderingStates.FINISHED; + this.#useThumbnailCanvas.directDrawing = false; + } + this.cssTransform({ + target: this.canvas, + redrawAnnotationLayer: true, + redrawAnnotationEditorLayer: true, + redrawXfaLayer: true, + redrawTextLayer: !postponeDrawing, + hideTextLayer: postponeDrawing + }); + if (postponeDrawing) { + return; + } + this.eventBus.dispatch("pagerendered", { + source: this, + pageNumber: this.id, + cssTransform: true, + timestamp: performance.now(), + error: this.#renderError + }); + return; + } + if (!this.zoomLayer && !this.canvas.hidden) { + this.zoomLayer = this.canvas.parentNode; + this.zoomLayer.style.position = "absolute"; + } + } + if (this.zoomLayer) { + this.cssTransform({ + target: this.zoomLayer.firstChild + }); + } + this.reset({ + keepZoomLayer: true, + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true + }); + } + + cancelRendering({ + keepAnnotationLayer = false, + keepAnnotationEditorLayer = false, + keepXfaLayer = false, + keepTextLayer = false, + cancelExtraDelay = 0 + } = {}) { + if (this.renderTask) { + this.renderTask.cancel(cancelExtraDelay); + this.renderTask = null; + } + this.resume = null; + if (this.textLayer && (!keepTextLayer || !this.textLayer.div)) { + this.textLayer.cancel(); + this.textLayer = null; + } + if (this.structTreeLayer && !this.textLayer) { + this.structTreeLayer = null; + } + if (this.annotationLayer && (!keepAnnotationLayer || !this.annotationLayer.div)) { + this.annotationLayer.cancel(); + this.annotationLayer = null; + this._annotationCanvasMap = null; + } + if (this.annotationEditorLayer && (!keepAnnotationEditorLayer || !this.annotationEditorLayer.div)) { + this.annotationEditorLayer.cancel(); + this.annotationEditorLayer = null; + } + if (this.xfaLayer && (!keepXfaLayer || !this.xfaLayer.div)) { + this.xfaLayer.cancel(); + this.xfaLayer = null; + this._textHighlighter?.disable(); + } + } + + cssTransform({ + target, + redrawAnnotationLayer = false, + redrawAnnotationEditorLayer = false, + redrawXfaLayer = false, + redrawTextLayer = false, + hideTextLayer = false + }) { + if (!target.hasAttribute("zooming")) { + target.setAttribute("zooming", true); + const { + style + } = target; + style.width = style.height = ""; + } + const originalViewport = this.#viewportMap.get(target); + if (this.viewport !== originalViewport) { + const relativeRotation = this.viewport.rotation - originalViewport.rotation; + const absRotation = Math.abs(relativeRotation); + let scaleX = 1, + scaleY = 1; + if (absRotation === 90 || absRotation === 270) { + const { + width, + height + } = this.viewport; + scaleX = height / width; + scaleY = width / height; + } + target.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX}, ${scaleY})`; + } + if (redrawAnnotationLayer && this.annotationLayer) { + this.#renderAnnotationLayer(); + } + if (redrawAnnotationEditorLayer && this.annotationEditorLayer) { + this.#renderAnnotationEditorLayer(); + } + if (redrawXfaLayer && this.xfaLayer) { + this.#renderXfaLayer(); + } + if (this.textLayer) { + if (hideTextLayer) { + this.textLayer.hide(); + this.structTreeLayer?.hide(); + } else if (redrawTextLayer) { + this.#renderTextLayer(); + } + } + } + + get width() { + return this.viewport.width; + } + + get height() { + return this.viewport.height; + } + + getPagePoint(x, y) { + return this.viewport.convertToPdfPoint(x, y); + } + + async #finishRenderTask(renderTask, error = null) { + if (renderTask === this.renderTask) { + this.renderTask = null; + } + if (error instanceof _pdfjsLib.RenderingCancelledException) { + this.#renderError = null; + return; + } + this.#renderError = error; + this.renderingState = _ui_utils.RenderingStates.FINISHED; + this._resetZoomLayer(true); + this.#useThumbnailCanvas.regularAnnotations = !renderTask.separateAnnots; + this.eventBus.dispatch("pagerendered", { + source: this, + pageNumber: this.id, + cssTransform: false, + timestamp: performance.now(), + error: this.#renderError + }); + if (error) { + throw error; + } + } + + async draw() { + if (this.renderingState !== _ui_utils.RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + this.reset(); + } + const { + div, + l10n, + pageColors, + pdfPage, + viewport + } = this; + if (!pdfPage) { + this.renderingState = _ui_utils.RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = _ui_utils.RenderingStates.RUNNING; + const canvasWrapper = document.createElement("div"); + canvasWrapper.classList.add("canvasWrapper"); + div.append(canvasWrapper); + if (!this.textLayer && this.#textLayerMode !== _ui_utils.TextLayerMode.DISABLE && !pdfPage.isPureXfa) { + this._accessibilityManager ||= new _text_accessibility.TextAccessibilityManager(); + this.textLayer = new _text_layer_builder.TextLayerBuilder({ + highlighter: this._textHighlighter, + accessibilityManager: this._accessibilityManager, + isOffscreenCanvasSupported: this.isOffscreenCanvasSupported, + enablePermissions: this.#textLayerMode === _ui_utils.TextLayerMode.ENABLE_PERMISSIONS + }); + div.append(this.textLayer.div); + } + if (!this.annotationLayer && this.#annotationMode !== _pdfjsLib.AnnotationMode.DISABLE) { + const { + annotationStorage, + downloadManager, + enableScripting, + fieldObjectsPromise, + hasJSActionsPromise, + linkService + } = this.#layerProperties(); + this._annotationCanvasMap ||= new Map(); + this.annotationLayer = new _annotation_layer_builder.AnnotationLayerBuilder({ + pageDiv: div, + pdfPage, + annotationStorage, + imageResourcesPath: this.imageResourcesPath, + renderForms: this.#annotationMode === _pdfjsLib.AnnotationMode.ENABLE_FORMS, + linkService, + downloadManager, + l10n, + enableScripting, + hasJSActionsPromise, + fieldObjectsPromise, + annotationCanvasMap: this._annotationCanvasMap, + accessibilityManager: this._accessibilityManager + }); + } + const renderContinueCallback = cont => { + showCanvas?.(false); + if (this.renderingQueue && !this.renderingQueue.isHighestPriority(this)) { + this.renderingState = _ui_utils.RenderingStates.PAUSED; + this.resume = () => { + this.renderingState = _ui_utils.RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + const { + width, + height + } = viewport; + const canvas = document.createElement("canvas"); + canvas.setAttribute("role", "presentation"); + canvas.hidden = true; + const hasHCM = !!(pageColors?.background && pageColors?.foreground); + let showCanvas = isLastShow => { + if (!hasHCM || isLastShow) { + canvas.hidden = false; + showCanvas = null; + } + }; + canvasWrapper.append(canvas); + this.canvas = canvas; + const ctx = canvas.getContext("2d", { + alpha: false + }); + const outputScale = this.outputScale = new _ui_utils.OutputScale(); + if (this.maxCanvasPixels === 0) { + const invScale = 1 / this.scale; + outputScale.sx *= invScale; + outputScale.sy *= invScale; + this.#hasRestrictedScaling = true; + } else if (this.maxCanvasPixels > 0) { + const pixelsInViewport = width * height; + const maxScale = Math.sqrt(this.maxCanvasPixels / pixelsInViewport); + if (outputScale.sx > maxScale || outputScale.sy > maxScale) { + outputScale.sx = maxScale; + outputScale.sy = maxScale; + this.#hasRestrictedScaling = true; + } else { + this.#hasRestrictedScaling = false; + } + } + const sfx = (0, _ui_utils.approximateFraction)(outputScale.sx); + const sfy = (0, _ui_utils.approximateFraction)(outputScale.sy); + canvas.width = (0, _ui_utils.roundToDivide)(width * outputScale.sx, sfx[0]); + canvas.height = (0, _ui_utils.roundToDivide)(height * outputScale.sy, sfy[0]); + const { + style + } = canvas; + style.width = (0, _ui_utils.roundToDivide)(width, sfx[1]) + "px"; + style.height = (0, _ui_utils.roundToDivide)(height, sfy[1]) + "px"; + this.#viewportMap.set(canvas, viewport); + const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; + const renderContext = { + canvasContext: ctx, + transform, + viewport, + annotationMode: this.#annotationMode, + optionalContentConfigPromise: this._optionalContentConfigPromise, + annotationCanvasMap: this._annotationCanvasMap, + pageColors + }; + const renderTask = this.renderTask = this.pdfPage.render(renderContext); + renderTask.onContinue = renderContinueCallback; + const resultPromise = renderTask.promise.then(async () => { + showCanvas?.(true); + await this.#finishRenderTask(renderTask); + this.#renderTextLayer(); + if (this.annotationLayer) { + await this.#renderAnnotationLayer(); + } + if (!this.annotationEditorLayer) { + const { + annotationEditorUIManager + } = this.#layerProperties(); + if (!annotationEditorUIManager) { + return; + } + this.annotationEditorLayer = new _annotation_editor_layer_builder.AnnotationEditorLayerBuilder({ + uiManager: annotationEditorUIManager, + pageDiv: div, + pdfPage, + l10n, + accessibilityManager: this._accessibilityManager, + annotationLayer: this.annotationLayer?.annotationLayer + }); + } + this.#renderAnnotationEditorLayer(); + }, error => { + if (!(error instanceof _pdfjsLib.RenderingCancelledException)) { + showCanvas?.(true); + } + return this.#finishRenderTask(renderTask, error); + }); + if (pdfPage.isPureXfa) { + if (!this.xfaLayer) { + const { + annotationStorage, + linkService + } = this.#layerProperties(); + this.xfaLayer = new _xfa_layer_builder.XfaLayerBuilder({ + pageDiv: div, + pdfPage, + annotationStorage, + linkService + }); + } else if (this.xfaLayer.div) { + div.append(this.xfaLayer.div); + } + this.#renderXfaLayer(); + } + div.setAttribute("data-loaded", true); + this.eventBus.dispatch("pagerender", { + source: this, + pageNumber: this.id + }); + return resultPromise; + } + + setPageLabel(label) { + this.pageLabel = typeof label === "string" ? label : null; + if (this.pageLabel !== null) { + this.div.setAttribute("data-page-label", this.pageLabel); + } else { + this.div.removeAttribute("data-page-label"); + } + } + + get thumbnailCanvas() { + const { + directDrawing, + initialOptionalContent, + regularAnnotations + } = this.#useThumbnailCanvas; + return directDrawing && initialOptionalContent && regularAnnotations ? this.canvas : null; + } + } + + exports.PDFPageView = PDFPageView; + + /***/ + }), + /* 32 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.AnnotationEditorLayerBuilder = void 0; + var _pdfjsLib = __webpack_require__(4); + var _l10n_utils = __webpack_require__(30); + + class AnnotationEditorLayerBuilder { + #annotationLayer = null; + #uiManager; + + constructor(options) { + this.pageDiv = options.pageDiv; + this.pdfPage = options.pdfPage; + this.accessibilityManager = options.accessibilityManager; + this.l10n = options.l10n || _l10n_utils.NullL10n; + this.annotationEditorLayer = null; + this.div = null; + this._cancelled = false; + this.#uiManager = options.uiManager; + this.#annotationLayer = options.annotationLayer || null; + } + + async render(viewport, intent = "display") { + if (intent !== "display") { + return; + } + if (this._cancelled) { + return; + } + const clonedViewport = viewport.clone({ + dontFlip: true + }); + if (this.div) { + this.annotationEditorLayer.update({ + viewport: clonedViewport + }); + this.show(); + return; + } + const div = this.div = document.createElement("div"); + div.className = "annotationEditorLayer"; + div.tabIndex = 0; + div.hidden = true; + div.dir = this.#uiManager.direction; + this.pageDiv.append(div); + this.annotationEditorLayer = new _pdfjsLib.AnnotationEditorLayer({ + uiManager: this.#uiManager, + div, + accessibilityManager: this.accessibilityManager, + pageIndex: this.pdfPage.pageNumber - 1, + l10n: this.l10n, + viewport: clonedViewport, + annotationLayer: this.#annotationLayer + }); + const parameters = { + viewport: clonedViewport, + div, + annotations: null, + intent + }; + this.annotationEditorLayer.render(parameters); + this.show(); + } + + cancel() { + this._cancelled = true; + if (!this.div) { + return; + } + this.pageDiv = null; + this.annotationEditorLayer.destroy(); + this.div.remove(); + } + + hide() { + if (!this.div) { + return; + } + this.div.hidden = true; + } + + show() { + if (!this.div || this.annotationEditorLayer.isEmpty) { + return; + } + this.div.hidden = false; + } + } + + exports.AnnotationEditorLayerBuilder = AnnotationEditorLayerBuilder; + + /***/ + }), + /* 33 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.AnnotationLayerBuilder = void 0; + var _pdfjsLib = __webpack_require__(4); + var _l10n_utils = __webpack_require__(30); + var _ui_utils = __webpack_require__(3); + + class AnnotationLayerBuilder { + #onPresentationModeChanged = null; + + constructor({ + pageDiv, + pdfPage, + linkService, + downloadManager, + annotationStorage = null, + imageResourcesPath = "", + renderForms = true, + l10n = _l10n_utils.NullL10n, + enableScripting = false, + hasJSActionsPromise = null, + fieldObjectsPromise = null, + annotationCanvasMap = null, + accessibilityManager = null + }) { + this.pageDiv = pageDiv; + this.pdfPage = pdfPage; + this.linkService = linkService; + this.downloadManager = downloadManager; + this.imageResourcesPath = imageResourcesPath; + this.renderForms = renderForms; + this.l10n = l10n; + this.annotationStorage = annotationStorage; + this.enableScripting = enableScripting; + this._hasJSActionsPromise = hasJSActionsPromise || Promise.resolve(false); + this._fieldObjectsPromise = fieldObjectsPromise || Promise.resolve(null); + this._annotationCanvasMap = annotationCanvasMap; + this._accessibilityManager = accessibilityManager; + this.annotationLayer = null; + this.div = null; + this._cancelled = false; + this._eventBus = linkService.eventBus; + } + + async render(viewport, intent = "display") { + if (this.div) { + if (this._cancelled || !this.annotationLayer) { + return; + } + this.annotationLayer.update({ + viewport: viewport.clone({ + dontFlip: true + }) + }); + return; + } + const [annotations, hasJSActions, fieldObjects] = await Promise.all([this.pdfPage.getAnnotations({ + intent + }), this._hasJSActionsPromise, this._fieldObjectsPromise]); + if (this._cancelled) { + return; + } + const div = this.div = document.createElement("div"); + div.className = "annotationLayer"; + this.pageDiv.append(div); + if (annotations.length === 0) { + this.hide(); + return; + } + this.annotationLayer = new _pdfjsLib.AnnotationLayer({ + div, + accessibilityManager: this._accessibilityManager, + annotationCanvasMap: this._annotationCanvasMap, + l10n: this.l10n, + page: this.pdfPage, + viewport: viewport.clone({ + dontFlip: true + }) + }); + await this.annotationLayer.render({ + annotations, + imageResourcesPath: this.imageResourcesPath, + renderForms: this.renderForms, + linkService: this.linkService, + downloadManager: this.downloadManager, + annotationStorage: this.annotationStorage, + enableScripting: this.enableScripting, + hasJSActions, + fieldObjects + }); + if (this.linkService.isInPresentationMode) { + this.#updatePresentationModeState(_ui_utils.PresentationModeState.FULLSCREEN); + } + if (!this.#onPresentationModeChanged) { + this.#onPresentationModeChanged = evt => { + this.#updatePresentationModeState(evt.state); + }; + this._eventBus?._on("presentationmodechanged", this.#onPresentationModeChanged); + } + } + + cancel() { + this._cancelled = true; + if (this.#onPresentationModeChanged) { + this._eventBus?._off("presentationmodechanged", this.#onPresentationModeChanged); + this.#onPresentationModeChanged = null; + } + } + + hide() { + if (!this.div) { + return; + } + this.div.hidden = true; + } + + #updatePresentationModeState(state) { + if (!this.div) { + return; + } + let disableFormElements = false; + switch (state) { + case _ui_utils.PresentationModeState.FULLSCREEN: + disableFormElements = true; + break; + case _ui_utils.PresentationModeState.NORMAL: + break; + default: + return; + } + for (const section of this.div.childNodes) { + if (section.hasAttribute("data-internal-link")) { + continue; + } + section.inert = disableFormElements; + } + } + } + + exports.AnnotationLayerBuilder = AnnotationLayerBuilder; + + /***/ + }), + /* 34 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.StructTreeLayerBuilder = void 0; + var _ui_utils = __webpack_require__(3); + const PDF_ROLE_TO_HTML_ROLE = { + Document: null, + DocumentFragment: null, + Part: "group", + Sect: "group", + Div: "group", + Aside: "note", + NonStruct: "none", + P: null, + H: "heading", + Title: null, + FENote: "note", + Sub: "group", + Lbl: null, + Span: null, + Em: null, + Strong: null, + Link: "link", + Annot: "note", + Form: "form", + Ruby: null, + RB: null, + RT: null, + RP: null, + Warichu: null, + WT: null, + WP: null, + L: "list", + LI: "listitem", + LBody: null, + Table: "table", + TR: "row", + TH: "columnheader", + TD: "cell", + THead: "columnheader", + TBody: null, + TFoot: null, + Caption: null, + Figure: "figure", + Formula: null, + Artifact: null + }; + const HEADING_PATTERN = /^H(\d+)$/; + + class StructTreeLayerBuilder { + #treeDom = undefined; + + get renderingDone() { + return this.#treeDom !== undefined; + } + + render(structTree) { + if (this.#treeDom !== undefined) { + return this.#treeDom; + } + const treeDom = this.#walk(structTree); + treeDom?.classList.add("structTree"); + return this.#treeDom = treeDom; + } + + hide() { + if (this.#treeDom && !this.#treeDom.hidden) { + this.#treeDom.hidden = true; + } + } + + show() { + if (this.#treeDom?.hidden) { + this.#treeDom.hidden = false; + } + } + + #setAttributes(structElement, htmlElement) { + const { + alt, + id, + lang + } = structElement; + if (alt !== undefined) { + htmlElement.setAttribute("aria-label", (0, _ui_utils.removeNullCharacters)(alt)); + } + if (id !== undefined) { + htmlElement.setAttribute("aria-owns", id); + } + if (lang !== undefined) { + htmlElement.setAttribute("lang", (0, _ui_utils.removeNullCharacters)(lang, true)); + } + } + + #walk(node) { + if (!node) { + return null; + } + const element = document.createElement("span"); + if ("role" in node) { + const { + role + } = node; + const match = role.match(HEADING_PATTERN); + if (match) { + element.setAttribute("role", "heading"); + element.setAttribute("aria-level", match[1]); + } else if (PDF_ROLE_TO_HTML_ROLE[role]) { + element.setAttribute("role", PDF_ROLE_TO_HTML_ROLE[role]); + } + } + this.#setAttributes(node, element); + if (node.children) { + if (node.children.length === 1 && "id" in node.children[0]) { + this.#setAttributes(node.children[0], element); + } else { + for (const kid of node.children) { + element.append(this.#walk(kid)); + } + } + } + return element; + } + } + + exports.StructTreeLayerBuilder = StructTreeLayerBuilder; + + /***/ + }), + /* 35 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.TextAccessibilityManager = void 0; + var _ui_utils = __webpack_require__(3); + + class TextAccessibilityManager { + #enabled = false; + #textChildren = null; + #textNodes = new Map(); + #waitingElements = new Map(); + + setTextMapping(textDivs) { + this.#textChildren = textDivs; + } + + static #compareElementPositions(e1, e2) { + const rect1 = e1.getBoundingClientRect(); + const rect2 = e2.getBoundingClientRect(); + if (rect1.width === 0 && rect1.height === 0) { + return +1; + } + if (rect2.width === 0 && rect2.height === 0) { + return -1; + } + const top1 = rect1.y; + const bot1 = rect1.y + rect1.height; + const mid1 = rect1.y + rect1.height / 2; + const top2 = rect2.y; + const bot2 = rect2.y + rect2.height; + const mid2 = rect2.y + rect2.height / 2; + if (mid1 <= top2 && mid2 >= bot1) { + return -1; + } + if (mid2 <= top1 && mid1 >= bot2) { + return +1; + } + const centerX1 = rect1.x + rect1.width / 2; + const centerX2 = rect2.x + rect2.width / 2; + return centerX1 - centerX2; + } + + enable() { + if (this.#enabled) { + throw new Error("TextAccessibilityManager is already enabled."); + } + if (!this.#textChildren) { + throw new Error("Text divs and strings have not been set."); + } + this.#enabled = true; + this.#textChildren = this.#textChildren.slice(); + this.#textChildren.sort(TextAccessibilityManager.#compareElementPositions); + if (this.#textNodes.size > 0) { + const textChildren = this.#textChildren; + for (const [id, nodeIndex] of this.#textNodes) { + const element = document.getElementById(id); + if (!element) { + this.#textNodes.delete(id); + continue; + } + this.#addIdToAriaOwns(id, textChildren[nodeIndex]); + } + } + for (const [element, isRemovable] of this.#waitingElements) { + this.addPointerInTextLayer(element, isRemovable); + } + this.#waitingElements.clear(); + } + + disable() { + if (!this.#enabled) { + return; + } + this.#waitingElements.clear(); + this.#textChildren = null; + this.#enabled = false; + } + + removePointerInTextLayer(element) { + if (!this.#enabled) { + this.#waitingElements.delete(element); + return; + } + const children = this.#textChildren; + if (!children || children.length === 0) { + return; + } + const { + id + } = element; + const nodeIndex = this.#textNodes.get(id); + if (nodeIndex === undefined) { + return; + } + const node = children[nodeIndex]; + this.#textNodes.delete(id); + let owns = node.getAttribute("aria-owns"); + if (owns?.includes(id)) { + owns = owns.split(" ").filter(x => x !== id).join(" "); + if (owns) { + node.setAttribute("aria-owns", owns); + } else { + node.removeAttribute("aria-owns"); + node.setAttribute("role", "presentation"); + } + } + } + + #addIdToAriaOwns(id, node) { + const owns = node.getAttribute("aria-owns"); + if (!owns?.includes(id)) { + node.setAttribute("aria-owns", owns ? `${owns} ${id}` : id); + } + node.removeAttribute("role"); + } + + addPointerInTextLayer(element, isRemovable) { + const { + id + } = element; + if (!id) { + return null; + } + if (!this.#enabled) { + this.#waitingElements.set(element, isRemovable); + return null; + } + if (isRemovable) { + this.removePointerInTextLayer(element); + } + const children = this.#textChildren; + if (!children || children.length === 0) { + return null; + } + const index = (0, _ui_utils.binarySearchFirstItem)(children, node => TextAccessibilityManager.#compareElementPositions(element, node) < 0); + const nodeIndex = Math.max(0, index - 1); + const child = children[nodeIndex]; + this.#addIdToAriaOwns(id, child); + this.#textNodes.set(id, nodeIndex); + const parent = child.parentNode; + return parent?.classList.contains("markedContent") ? parent.id : null; + } + + moveElementInDOM(container, element, contentElement, isRemovable) { + const id = this.addPointerInTextLayer(contentElement, isRemovable); + if (!container.hasChildNodes()) { + container.append(element); + return id; + } + const children = Array.from(container.childNodes).filter(node => node !== element); + if (children.length === 0) { + return id; + } + const elementToCompare = contentElement || element; + const index = (0, _ui_utils.binarySearchFirstItem)(children, node => TextAccessibilityManager.#compareElementPositions(elementToCompare, node) < 0); + if (index === 0) { + children[0].before(element); + } else { + children[index - 1].after(element); + } + return id; + } + } + + exports.TextAccessibilityManager = TextAccessibilityManager; + + /***/ + }), + /* 36 */ + /***/ ((__unused_webpack_module, exports) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.TextHighlighter = void 0; + + class TextHighlighter { + constructor({ + findController, + eventBus, + pageIndex + }) { + this.findController = findController; + this.matches = []; + this.eventBus = eventBus; + this.pageIdx = pageIndex; + this._onUpdateTextLayerMatches = null; + this.textDivs = null; + this.textContentItemsStr = null; + this.enabled = false; + } + + setTextMapping(divs, texts) { + this.textDivs = divs; + this.textContentItemsStr = texts; + } + + enable() { + if (!this.textDivs || !this.textContentItemsStr) { + throw new Error("Text divs and strings have not been set."); + } + if (this.enabled) { + throw new Error("TextHighlighter is already enabled."); + } + this.enabled = true; + if (!this._onUpdateTextLayerMatches) { + this._onUpdateTextLayerMatches = evt => { + if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) { + this._updateMatches(); + } + }; + this.eventBus._on("updatetextlayermatches", this._onUpdateTextLayerMatches); + } + this._updateMatches(); + } + + disable() { + if (!this.enabled) { + return; + } + this.enabled = false; + if (this._onUpdateTextLayerMatches) { + this.eventBus._off("updatetextlayermatches", this._onUpdateTextLayerMatches); + this._onUpdateTextLayerMatches = null; + } + this._updateMatches(true); + } + + _convertMatches(matches, matchesLength) { + if (!matches) { + return []; + } + const { + textContentItemsStr + } = this; + let i = 0, + iIndex = 0; + const end = textContentItemsStr.length - 1; + const result = []; + for (let m = 0, mm = matches.length; m < mm; m++) { + let matchIdx = matches[m]; + while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) { + iIndex += textContentItemsStr[i].length; + i++; + } + if (i === textContentItemsStr.length) { + console.error("Could not find a matching mapping"); + } + const match = { + begin: { + divIdx: i, + offset: matchIdx - iIndex + } + }; + matchIdx += matchesLength[m]; + while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) { + iIndex += textContentItemsStr[i].length; + i++; + } + match.end = { + divIdx: i, + offset: matchIdx - iIndex + }; + result.push(match); + } + return result; + } + + _renderMatches(matches) { + if (matches.length === 0) { + return; + } + const { + findController, + pageIdx + } = this; + const { + textContentItemsStr, + textDivs + } = this; + const isSelectedPage = pageIdx === findController.selected.pageIdx; + const selectedMatchIdx = findController.selected.matchIdx; + const highlightAll = findController.state.highlightAll; + let prevEnd = null; + const infinity = { + divIdx: -1, + offset: undefined + }; + + function beginText(begin, className) { + const divIdx = begin.divIdx; + textDivs[divIdx].textContent = ""; + return appendTextToDiv(divIdx, 0, begin.offset, className); + } + + function appendTextToDiv(divIdx, fromOffset, toOffset, className) { + let div = textDivs[divIdx]; + if (div.nodeType === Node.TEXT_NODE) { + const span = document.createElement("span"); + div.before(span); + span.append(div); + textDivs[divIdx] = span; + div = span; + } + const content = textContentItemsStr[divIdx].substring(fromOffset, toOffset); + const node = document.createTextNode(content); + if (className) { + const span = document.createElement("span"); + span.className = `${className} appended`; + span.append(node); + div.append(span); + return className.includes("selected") ? span.offsetLeft : 0; + } + div.append(node); + return 0; + } + + let i0 = selectedMatchIdx, + i1 = i0 + 1; + if (highlightAll) { + i0 = 0; + i1 = matches.length; + } else if (!isSelectedPage) { + return; + } + let lastDivIdx = -1; + let lastOffset = -1; + for (let i = i0; i < i1; i++) { + const match = matches[i]; + const begin = match.begin; + if (begin.divIdx === lastDivIdx && begin.offset === lastOffset) { + continue; + } + lastDivIdx = begin.divIdx; + lastOffset = begin.offset; + const end = match.end; + const isSelected = isSelectedPage && i === selectedMatchIdx; + const highlightSuffix = isSelected ? " selected" : ""; + let selectedLeft = 0; + if (!prevEnd || begin.divIdx !== prevEnd.divIdx) { + if (prevEnd !== null) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + beginText(begin); + } else { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset); + } + if (begin.divIdx === end.divIdx) { + selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, end.offset, "highlight" + highlightSuffix); + } else { + selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, "highlight begin" + highlightSuffix); + for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) { + textDivs[n0].className = "highlight middle" + highlightSuffix; + } + beginText(end, "highlight end" + highlightSuffix); + } + prevEnd = end; + if (isSelected) { + findController.scrollMatchIntoView({ + element: textDivs[begin.divIdx], + selectedLeft, + pageIndex: pageIdx, + matchIndex: selectedMatchIdx + }); + } + } + if (prevEnd) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + } + + _updateMatches(reset = false) { + if (!this.enabled && !reset) { + return; + } + const { + findController, + matches, + pageIdx + } = this; + const { + textContentItemsStr, + textDivs + } = this; + let clearedUntilDivIdx = -1; + for (const match of matches) { + const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx); + for (let n = begin, end = match.end.divIdx; n <= end; n++) { + const div = textDivs[n]; + div.textContent = textContentItemsStr[n]; + div.className = ""; + } + clearedUntilDivIdx = match.end.divIdx + 1; + } + if (!findController?.highlightMatches || reset) { + return; + } + const pageMatches = findController.pageMatches[pageIdx] || null; + const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null; + this.matches = this._convertMatches(pageMatches, pageMatchesLength); + this._renderMatches(this.matches); + } + } + + exports.TextHighlighter = TextHighlighter; + + /***/ + }), + /* 37 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.TextLayerBuilder = void 0; + var _pdfjsLib = __webpack_require__(4); + var _ui_utils = __webpack_require__(3); + + class TextLayerBuilder { + #enablePermissions = false; + #rotation = 0; + #scale = 0; + #textContentSource = null; + + constructor({ + highlighter = null, + accessibilityManager = null, + isOffscreenCanvasSupported = true, + enablePermissions = false + }) { + this.textContentItemsStr = []; + this.renderingDone = false; + this.textDivs = []; + this.textDivProperties = new WeakMap(); + this.textLayerRenderTask = null; + this.highlighter = highlighter; + this.accessibilityManager = accessibilityManager; + this.isOffscreenCanvasSupported = isOffscreenCanvasSupported; + this.#enablePermissions = enablePermissions === true; + this.div = document.createElement("div"); + this.div.className = "textLayer"; + this.hide(); + } + + #finishRendering() { + this.renderingDone = true; + const endOfContent = document.createElement("div"); + endOfContent.className = "endOfContent"; + this.div.append(endOfContent); + this.#bindMouse(); + } + + get numTextDivs() { + return this.textDivs.length; + } + + async render(viewport) { + if (!this.#textContentSource) { + throw new Error('No "textContentSource" parameter specified.'); + } + const scale = viewport.scale * (globalThis.devicePixelRatio || 1); + const { + rotation + } = viewport; + if (this.renderingDone) { + const mustRotate = rotation !== this.#rotation; + const mustRescale = scale !== this.#scale; + if (mustRotate || mustRescale) { + this.hide(); + (0, _pdfjsLib.updateTextLayer)({ + container: this.div, + viewport, + textDivs: this.textDivs, + textDivProperties: this.textDivProperties, + isOffscreenCanvasSupported: this.isOffscreenCanvasSupported, + mustRescale, + mustRotate + }); + this.#scale = scale; + this.#rotation = rotation; + } + this.show(); + return; + } + this.cancel(); + this.highlighter?.setTextMapping(this.textDivs, this.textContentItemsStr); + this.accessibilityManager?.setTextMapping(this.textDivs); + this.textLayerRenderTask = (0, _pdfjsLib.renderTextLayer)({ + textContentSource: this.#textContentSource, + container: this.div, + viewport, + textDivs: this.textDivs, + textDivProperties: this.textDivProperties, + textContentItemsStr: this.textContentItemsStr, + isOffscreenCanvasSupported: this.isOffscreenCanvasSupported + }); + await this.textLayerRenderTask.promise; + this.#finishRendering(); + this.#scale = scale; + this.#rotation = rotation; + this.show(); + this.accessibilityManager?.enable(); + } + + hide() { + if (!this.div.hidden) { + this.highlighter?.disable(); + this.div.hidden = true; + } + } + + show() { + if (this.div.hidden && this.renderingDone) { + this.div.hidden = false; + this.highlighter?.enable(); + } + } + + cancel() { + if (this.textLayerRenderTask) { + this.textLayerRenderTask.cancel(); + this.textLayerRenderTask = null; + } + this.highlighter?.disable(); + this.accessibilityManager?.disable(); + this.textContentItemsStr.length = 0; + this.textDivs.length = 0; + this.textDivProperties = new WeakMap(); + } + + setTextContentSource(source) { + this.cancel(); + this.#textContentSource = source; + } + + #bindMouse() { + const { + div + } = this; + div.addEventListener("mousedown", evt => { + const end = div.querySelector(".endOfContent"); + if (!end) { + return; + } + let adjustTop = evt.target !== div; + adjustTop &&= getComputedStyle(end).getPropertyValue("-moz-user-select") !== "none"; + if (adjustTop) { + const divBounds = div.getBoundingClientRect(); + const r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height); + end.style.top = (r * 100).toFixed(2) + "%"; + } + end.classList.add("active"); + }); + div.addEventListener("mouseup", () => { + const end = div.querySelector(".endOfContent"); + if (!end) { + return; + } + end.style.top = ""; + end.classList.remove("active"); + }); + div.addEventListener("copy", event => { + if (!this.#enablePermissions) { + const selection = document.getSelection(); + event.clipboardData.setData("text/plain", (0, _ui_utils.removeNullCharacters)((0, _pdfjsLib.normalizeUnicode)(selection.toString()))); + } + event.preventDefault(); + event.stopPropagation(); + }); + } + } + + exports.TextLayerBuilder = TextLayerBuilder; + + /***/ + }), + /* 38 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.XfaLayerBuilder = void 0; + var _pdfjsLib = __webpack_require__(4); + + class XfaLayerBuilder { + constructor({ + pageDiv, + pdfPage, + annotationStorage = null, + linkService, + xfaHtml = null + }) { + this.pageDiv = pageDiv; + this.pdfPage = pdfPage; + this.annotationStorage = annotationStorage; + this.linkService = linkService; + this.xfaHtml = xfaHtml; + this.div = null; + this._cancelled = false; + } + + async render(viewport, intent = "display") { + if (intent === "print") { + const parameters = { + viewport: viewport.clone({ + dontFlip: true + }), + div: this.div, + xfaHtml: this.xfaHtml, + annotationStorage: this.annotationStorage, + linkService: this.linkService, + intent + }; + const div = document.createElement("div"); + this.pageDiv.append(div); + parameters.div = div; + return _pdfjsLib.XfaLayer.render(parameters); + } + const xfaHtml = await this.pdfPage.getXfa(); + if (this._cancelled || !xfaHtml) { + return { + textDivs: [] + }; + } + const parameters = { + viewport: viewport.clone({ + dontFlip: true + }), + div: this.div, + xfaHtml, + annotationStorage: this.annotationStorage, + linkService: this.linkService, + intent + }; + if (this.div) { + return _pdfjsLib.XfaLayer.update(parameters); + } + this.div = document.createElement("div"); + this.pageDiv.append(this.div); + parameters.div = this.div; + return _pdfjsLib.XfaLayer.render(parameters); + } + + cancel() { + this._cancelled = true; + } + + hide() { + if (!this.div) { + return; + } + this.div.hidden = true; + } + } + + exports.XfaLayerBuilder = XfaLayerBuilder; + + /***/ + }), + /* 39 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.SecondaryToolbar = void 0; + var _ui_utils = __webpack_require__(3); + var _pdf_viewer = __webpack_require__(29); + + class SecondaryToolbar { + constructor(options, eventBus) { + this.toolbar = options.toolbar; + this.toggleButton = options.toggleButton; + this.buttons = [{ + element: options.presentationModeButton, + eventName: "presentationmode", + close: true + }, { + element: options.printButton, + eventName: "print", + close: true + }, { + element: options.downloadButton, + eventName: "download", + close: true + }, { + element: options.viewBookmarkButton, + eventName: null, + close: true + }, { + element: options.firstPageButton, + eventName: "firstpage", + close: true + }, { + element: options.lastPageButton, + eventName: "lastpage", + close: true + }, { + element: options.pageRotateCwButton, + eventName: "rotatecw", + close: false + }, { + element: options.pageRotateCcwButton, + eventName: "rotateccw", + close: false + }, { + element: options.cursorSelectToolButton, + eventName: "switchcursortool", + eventDetails: { + tool: _ui_utils.CursorTool.SELECT + }, + close: true + }, { + element: options.cursorHandToolButton, + eventName: "switchcursortool", + eventDetails: { + tool: _ui_utils.CursorTool.HAND + }, + close: true + }, { + element: options.scrollPageButton, + eventName: "switchscrollmode", + eventDetails: { + mode: _ui_utils.ScrollMode.PAGE + }, + close: true + }, { + element: options.scrollVerticalButton, + eventName: "switchscrollmode", + eventDetails: { + mode: _ui_utils.ScrollMode.VERTICAL + }, + close: true + }, { + element: options.scrollHorizontalButton, + eventName: "switchscrollmode", + eventDetails: { + mode: _ui_utils.ScrollMode.HORIZONTAL + }, + close: true + }, { + element: options.scrollWrappedButton, + eventName: "switchscrollmode", + eventDetails: { + mode: _ui_utils.ScrollMode.WRAPPED + }, + close: true + }, { + element: options.spreadNoneButton, + eventName: "switchspreadmode", + eventDetails: { + mode: _ui_utils.SpreadMode.NONE + }, + close: true + }, { + element: options.spreadOddButton, + eventName: "switchspreadmode", + eventDetails: { + mode: _ui_utils.SpreadMode.ODD + }, + close: true + }, { + element: options.spreadEvenButton, + eventName: "switchspreadmode", + eventDetails: { + mode: _ui_utils.SpreadMode.EVEN + }, + close: true + }, { + element: options.documentPropertiesButton, + eventName: "documentproperties", + close: true + }]; + this.buttons.push({ + element: options.openFileButton, + eventName: "openfile", + close: true + }); + this.items = { + firstPage: options.firstPageButton, + lastPage: options.lastPageButton, + pageRotateCw: options.pageRotateCwButton, + pageRotateCcw: options.pageRotateCcwButton + }; + this.eventBus = eventBus; + this.opened = false; + this.#bindClickListeners(); + this.#bindCursorToolsListener(options); + this.#bindScrollModeListener(options); + this.#bindSpreadModeListener(options); + this.reset(); + } + + get isOpen() { + return this.opened; + } + + setPageNumber(pageNumber) { + this.pageNumber = pageNumber; + this.#updateUIState(); + } + + setPagesCount(pagesCount) { + this.pagesCount = pagesCount; + this.#updateUIState(); + } + + reset() { + this.pageNumber = 0; + this.pagesCount = 0; + this.#updateUIState(); + this.eventBus.dispatch("secondarytoolbarreset", { + source: this + }); + } + + #updateUIState() { + this.items.firstPage.disabled = this.pageNumber <= 1; + this.items.lastPage.disabled = this.pageNumber >= this.pagesCount; + this.items.pageRotateCw.disabled = this.pagesCount === 0; + this.items.pageRotateCcw.disabled = this.pagesCount === 0; + } + + #bindClickListeners() { + this.toggleButton.addEventListener("click", this.toggle.bind(this)); + for (const { + element, + eventName, + close, + eventDetails + } of this.buttons) { + element.addEventListener("click", evt => { + if (eventName !== null) { + this.eventBus.dispatch(eventName, { + source: this, + ...eventDetails + }); + } + if (close) { + this.close(); + } + this.eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "buttons", + data: { + id: element.id + } + } + }); + }); + } + } + + #bindCursorToolsListener({ + cursorSelectToolButton, + cursorHandToolButton + }) { + this.eventBus._on("cursortoolchanged", ({ + tool + }) => { + (0, _ui_utils.toggleCheckedBtn)(cursorSelectToolButton, tool === _ui_utils.CursorTool.SELECT); + (0, _ui_utils.toggleCheckedBtn)(cursorHandToolButton, tool === _ui_utils.CursorTool.HAND); + }); + } + + #bindScrollModeListener({ + scrollPageButton, + scrollVerticalButton, + scrollHorizontalButton, + scrollWrappedButton, + spreadNoneButton, + spreadOddButton, + spreadEvenButton + }) { + const scrollModeChanged = ({ + mode + }) => { + (0, _ui_utils.toggleCheckedBtn)(scrollPageButton, mode === _ui_utils.ScrollMode.PAGE); + (0, _ui_utils.toggleCheckedBtn)(scrollVerticalButton, mode === _ui_utils.ScrollMode.VERTICAL); + (0, _ui_utils.toggleCheckedBtn)(scrollHorizontalButton, mode === _ui_utils.ScrollMode.HORIZONTAL); + (0, _ui_utils.toggleCheckedBtn)(scrollWrappedButton, mode === _ui_utils.ScrollMode.WRAPPED); + const forceScrollModePage = this.pagesCount > _pdf_viewer.PagesCountLimit.FORCE_SCROLL_MODE_PAGE; + scrollPageButton.disabled = forceScrollModePage; + scrollVerticalButton.disabled = forceScrollModePage; + scrollHorizontalButton.disabled = forceScrollModePage; + scrollWrappedButton.disabled = forceScrollModePage; + const isHorizontal = mode === _ui_utils.ScrollMode.HORIZONTAL; + spreadNoneButton.disabled = isHorizontal; + spreadOddButton.disabled = isHorizontal; + spreadEvenButton.disabled = isHorizontal; + }; + this.eventBus._on("scrollmodechanged", scrollModeChanged); + this.eventBus._on("secondarytoolbarreset", evt => { + if (evt.source === this) { + scrollModeChanged({ + mode: _ui_utils.ScrollMode.VERTICAL + }); + } + }); + } + + #bindSpreadModeListener({ + spreadNoneButton, + spreadOddButton, + spreadEvenButton + }) { + const spreadModeChanged = ({ + mode + }) => { + (0, _ui_utils.toggleCheckedBtn)(spreadNoneButton, mode === _ui_utils.SpreadMode.NONE); + (0, _ui_utils.toggleCheckedBtn)(spreadOddButton, mode === _ui_utils.SpreadMode.ODD); + (0, _ui_utils.toggleCheckedBtn)(spreadEvenButton, mode === _ui_utils.SpreadMode.EVEN); + }; + this.eventBus._on("spreadmodechanged", spreadModeChanged); + this.eventBus._on("secondarytoolbarreset", evt => { + if (evt.source === this) { + spreadModeChanged({ + mode: _ui_utils.SpreadMode.NONE + }); + } + }); + } + + open() { + if (this.opened) { + return; + } + this.opened = true; + (0, _ui_utils.toggleExpandedBtn)(this.toggleButton, true, this.toolbar); + } + + close() { + if (!this.opened) { + return; + } + this.opened = false; + (0, _ui_utils.toggleExpandedBtn)(this.toggleButton, false, this.toolbar); + } + + toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } + } + + exports.SecondaryToolbar = SecondaryToolbar; + + /***/ + }), + /* 40 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.Toolbar = void 0; + var _ui_utils = __webpack_require__(3); + var _pdfjsLib = __webpack_require__(4); + const PAGE_NUMBER_LOADING_INDICATOR = "visiblePageIsLoading"; + + class Toolbar { + #wasLocalized = false; + + constructor(options, eventBus, l10n) { + this.toolbar = options.container; + this.eventBus = eventBus; + this.l10n = l10n; + this.buttons = [{ + element: options.previous, + eventName: "previouspage" + }, { + element: options.next, + eventName: "nextpage" + }, { + element: options.zoomIn, + eventName: "zoomin" + }, { + element: options.zoomOut, + eventName: "zoomout" + }, { + element: options.print, + eventName: "print" + }, { + element: options.download, + eventName: "download" + }, { + element: options.editorFreeTextButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorFreeTextButton; + return classList.contains("toggled") ? _pdfjsLib.AnnotationEditorType.NONE : _pdfjsLib.AnnotationEditorType.FREETEXT; + } + } + }, { + element: options.editorInkButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorInkButton; + return classList.contains("toggled") ? _pdfjsLib.AnnotationEditorType.NONE : _pdfjsLib.AnnotationEditorType.INK; + } + } + }, { + element: options.editorStampButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorStampButton; + return classList.contains("toggled") ? _pdfjsLib.AnnotationEditorType.NONE : _pdfjsLib.AnnotationEditorType.STAMP; + } + } + }]; + this.buttons.push({ + element: options.openFile, + eventName: "openfile" + }); + this.items = { + numPages: options.numPages, + pageNumber: options.pageNumber, + scaleSelect: options.scaleSelect, + customScaleOption: options.customScaleOption, + previous: options.previous, + next: options.next, + zoomIn: options.zoomIn, + zoomOut: options.zoomOut + }; + this.#bindListeners(options); + this.reset(); + } + + setPageNumber(pageNumber, pageLabel) { + this.pageNumber = pageNumber; + this.pageLabel = pageLabel; + this.#updateUIState(false); + } + + setPagesCount(pagesCount, hasPageLabels) { + this.pagesCount = pagesCount; + this.hasPageLabels = hasPageLabels; + this.#updateUIState(true); + } + + setPageScale(pageScaleValue, pageScale) { + this.pageScaleValue = (pageScaleValue || pageScale).toString(); + this.pageScale = pageScale; + this.#updateUIState(false); + } + + reset() { + this.pageNumber = 0; + this.pageLabel = null; + this.hasPageLabels = false; + this.pagesCount = 0; + this.pageScaleValue = _ui_utils.DEFAULT_SCALE_VALUE; + this.pageScale = _ui_utils.DEFAULT_SCALE; + this.#updateUIState(true); + this.updateLoadingIndicatorState(); + this.eventBus.dispatch("toolbarreset", { + source: this + }); + } + + #bindListeners(options) { + const { + pageNumber, + scaleSelect + } = this.items; + const self = this; + for (const { + element, + eventName, + eventDetails + } of this.buttons) { + element.addEventListener("click", evt => { + if (eventName !== null) { + this.eventBus.dispatch(eventName, { + source: this, + ...eventDetails + }); + } + }); + } + pageNumber.addEventListener("click", function () { + this.select(); + }); + pageNumber.addEventListener("change", function () { + self.eventBus.dispatch("pagenumberchanged", { + source: self, + value: this.value + }); + }); + scaleSelect.addEventListener("change", function () { + if (this.value === "custom") { + return; + } + self.eventBus.dispatch("scalechanged", { + source: self, + value: this.value + }); + }); + scaleSelect.addEventListener("click", function (evt) { + const target = evt.target; + if (this.value === self.pageScaleValue && target.tagName.toUpperCase() === "OPTION") { + this.blur(); + } + }); + scaleSelect.oncontextmenu = _pdfjsLib.noContextMenu; + this.eventBus._on("localized", () => { + this.#wasLocalized = true; + this.#adjustScaleWidth(); + this.#updateUIState(true); + }); + this.#bindEditorToolsListener(options); + } + + #bindEditorToolsListener({ + editorFreeTextButton, + editorFreeTextParamsToolbar, + editorInkButton, + editorInkParamsToolbar, + editorStampButton, + editorStampParamsToolbar + }) { + const editorModeChanged = ({ + mode + }) => { + (0, _ui_utils.toggleCheckedBtn)(editorFreeTextButton, mode === _pdfjsLib.AnnotationEditorType.FREETEXT, editorFreeTextParamsToolbar); + (0, _ui_utils.toggleCheckedBtn)(editorInkButton, mode === _pdfjsLib.AnnotationEditorType.INK, editorInkParamsToolbar); + (0, _ui_utils.toggleCheckedBtn)(editorStampButton, mode === _pdfjsLib.AnnotationEditorType.STAMP, editorStampParamsToolbar); + const isDisable = mode === _pdfjsLib.AnnotationEditorType.DISABLE; + editorFreeTextButton.disabled = isDisable; + editorInkButton.disabled = isDisable; + editorStampButton.disabled = isDisable; + }; + this.eventBus._on("annotationeditormodechanged", editorModeChanged); + this.eventBus._on("toolbarreset", evt => { + if (evt.source === this) { + editorModeChanged({ + mode: _pdfjsLib.AnnotationEditorType.DISABLE + }); + } + }); + } + + #updateUIState(resetNumPages = false) { + if (!this.#wasLocalized) { + return; + } + const { + pageNumber, + pagesCount, + pageScaleValue, + pageScale, + items + } = this; + if (resetNumPages) { + if (this.hasPageLabels) { + items.pageNumber.type = "text"; + } else { + items.pageNumber.type = "number"; + this.l10n.get("of_pages", { + pagesCount + }).then(msg => { + items.numPages.textContent = msg; + }); + } + items.pageNumber.max = pagesCount; + } + if (this.hasPageLabels) { + items.pageNumber.value = this.pageLabel; + this.l10n.get("page_of_pages", { + pageNumber, + pagesCount + }).then(msg => { + items.numPages.textContent = msg; + }); + } else { + items.pageNumber.value = pageNumber; + } + items.previous.disabled = pageNumber <= 1; + items.next.disabled = pageNumber >= pagesCount; + items.zoomOut.disabled = pageScale <= _ui_utils.MIN_SCALE; + items.zoomIn.disabled = pageScale >= _ui_utils.MAX_SCALE; + this.l10n.get("page_scale_percent", { + scale: Math.round(pageScale * 10000) / 100 + }).then(msg => { + let predefinedValueFound = false; + for (const option of items.scaleSelect.options) { + if (option.value !== pageScaleValue) { + option.selected = false; + continue; + } + option.selected = true; + predefinedValueFound = true; + } + if (!predefinedValueFound) { + items.customScaleOption.textContent = msg; + items.customScaleOption.selected = true; + } + }); + } + + updateLoadingIndicatorState(loading = false) { + const { + pageNumber + } = this.items; + pageNumber.classList.toggle(PAGE_NUMBER_LOADING_INDICATOR, loading); + } + + async #adjustScaleWidth() { + const { + items, + l10n + } = this; + const predefinedValuesPromise = Promise.all([l10n.get("page_scale_auto"), l10n.get("page_scale_actual"), l10n.get("page_scale_fit"), l10n.get("page_scale_width")]); + await _ui_utils.animationStarted; + const style = getComputedStyle(items.scaleSelect); + const scaleSelectWidth = parseFloat(style.getPropertyValue("--scale-select-width")); + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d", { + alpha: false + }); + ctx.font = `${style.fontSize} ${style.fontFamily}`; + let maxWidth = 0; + for (const predefinedValue of await predefinedValuesPromise) { + const { + width + } = ctx.measureText(predefinedValue); + if (width > maxWidth) { + maxWidth = width; + } + } + maxWidth += 0.3 * scaleSelectWidth; + if (maxWidth > scaleSelectWidth) { + const container = items.scaleSelect.parentNode; + container.style.setProperty("--scale-select-width", `${maxWidth}px`); + } + canvas.width = 0; + canvas.height = 0; + } + } + + exports.Toolbar = Toolbar; + + /***/ + }), + /* 41 */ + /***/ ((__unused_webpack_module, exports) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.ViewHistory = void 0; + const DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20; + + class ViewHistory { + constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) { + this.fingerprint = fingerprint; + this.cacheSize = cacheSize; + this._initializedPromise = this._readFromStorage().then(databaseStr => { + const database = JSON.parse(databaseStr || "{}"); + let index = -1; + if (!Array.isArray(database.files)) { + database.files = []; + } else { + while (database.files.length >= this.cacheSize) { + database.files.shift(); + } + for (let i = 0, ii = database.files.length; i < ii; i++) { + const branch = database.files[i]; + if (branch.fingerprint === this.fingerprint) { + index = i; + break; + } + } + } + if (index === -1) { + index = database.files.push({ + fingerprint: this.fingerprint + }) - 1; + } + this.file = database.files[index]; + this.database = database; + }); + } + + async _writeToStorage() { + const databaseStr = JSON.stringify(this.database); + localStorage.setItem("pdfjs.history", databaseStr); + } + + async _readFromStorage() { + return localStorage.getItem("pdfjs.history"); + } + + async set(name, val) { + await this._initializedPromise; + this.file[name] = val; + return this._writeToStorage(); + } + + async setMultiple(properties) { + await this._initializedPromise; + for (const name in properties) { + this.file[name] = properties[name]; + } + return this._writeToStorage(); + } + + async get(name, defaultValue) { + await this._initializedPromise; + const val = this.file[name]; + return val !== undefined ? val : defaultValue; + } + + async getMultiple(properties) { + await this._initializedPromise; + const values = Object.create(null); + for (const name in properties) { + const val = this.file[name]; + values[name] = val !== undefined ? val : properties[name]; + } + return values; + } + } + + exports.ViewHistory = ViewHistory; + + /***/ + }), + /* 42 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.BasePreferences = void 0; + var _app_options = __webpack_require__(5); + + class BasePreferences { + #defaults = Object.freeze({ + "annotationEditorMode": 0, + "annotationMode": 2, + "cursorToolOnLoad": 0, + "defaultZoomDelay": 400, + "defaultZoomValue": "", + "disablePageLabels": false, + "enablePermissions": false, + "enablePrintAutoRotate": true, + "enableScripting": true, + "enableStampEditor": true, + "externalLinkTarget": 0, + "historyUpdateUrl": false, + "ignoreDestinationZoom": false, + "forcePageColors": false, + "pageColorsBackground": "Canvas", + "pageColorsForeground": "CanvasText", + "pdfBugEnabled": false, + "sidebarViewOnLoad": -1, + "scrollModeOnLoad": -1, + "spreadModeOnLoad": -1, + "textLayerMode": 1, + "viewerCssTheme": 0, + "viewOnLoad": 0, + "disableAutoFetch": false, + "disableFontFace": false, + "disableRange": false, + "disableStream": false, + "enableXfa": true + }); + #prefs = Object.create(null); + #initializedPromise = null; + + constructor() { + if (this.constructor === BasePreferences) { + throw new Error("Cannot initialize BasePreferences."); + } + this.#initializedPromise = this._readFromStorage(this.#defaults).then(prefs => { + for (const name in this.#defaults) { + const prefValue = prefs?.[name]; + if (typeof prefValue === typeof this.#defaults[name]) { + this.#prefs[name] = prefValue; + } + } + }); + } + + async _writeToStorage(prefObj) { + throw new Error("Not implemented: _writeToStorage"); + } + + async _readFromStorage(prefObj) { + throw new Error("Not implemented: _readFromStorage"); + } + + async reset() { + await this.#initializedPromise; + const prefs = this.#prefs; + this.#prefs = Object.create(null); + return this._writeToStorage(this.#defaults).catch(reason => { + this.#prefs = prefs; + throw reason; + }); + } + + async set(name, value) { + await this.#initializedPromise; + const defaultValue = this.#defaults[name], + prefs = this.#prefs; + if (defaultValue === undefined) { + throw new Error(`Set preference: "${name}" is undefined.`); + } else if (value === undefined) { + throw new Error("Set preference: no value is specified."); + } + const valueType = typeof value, + defaultType = typeof defaultValue; + if (valueType !== defaultType) { + if (valueType === "number" && defaultType === "string") { + value = value.toString(); + } else { + throw new Error(`Set preference: "${value}" is a ${valueType}, expected a ${defaultType}.`); + } + } else if (valueType === "number" && !Number.isInteger(value)) { + throw new Error(`Set preference: "${value}" must be an integer.`); + } + this.#prefs[name] = value; + return this._writeToStorage(this.#prefs).catch(reason => { + this.#prefs = prefs; + throw reason; + }); + } + + async get(name) { + await this.#initializedPromise; + const defaultValue = this.#defaults[name]; + if (defaultValue === undefined) { + throw new Error(`Get preference: "${name}" is undefined.`); + } + return this.#prefs[name] ?? defaultValue; + } + + async getAll() { + await this.#initializedPromise; + const obj = Object.create(null); + for (const name in this.#defaults) { + obj[name] = this.#prefs[name] ?? this.#defaults[name]; + } + return obj; + } + } + + exports.BasePreferences = BasePreferences; + + /***/ + }), + /* 43 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.DownloadManager = void 0; + var _pdfjsLib = __webpack_require__(4); + ; + + function download(blobUrl, filename) { + const a = document.createElement("a"); + if (!a.click) { + throw new Error('DownloadManager: "a.click()" is not supported.'); + } + a.href = blobUrl; + a.target = "_parent"; + if ("download" in a) { + a.download = filename; + } + (document.body || document.documentElement).append(a); + a.click(); + a.remove(); + } + + class DownloadManager { + #openBlobUrls = new WeakMap(); + + downloadUrl(url, filename, _options) { + if (!(0, _pdfjsLib.createValidAbsoluteUrl)(url, "http://example.com")) { + console.error(`downloadUrl - not a valid URL: ${url}`); + return; + } + download(url + "#pdfjs.action=download", filename); + } + + downloadData(data, filename, contentType) { + const blobUrl = URL.createObjectURL(new Blob([data], { + type: contentType + })); + download(blobUrl, filename); + } + + openOrDownloadData(element, data, filename) { + const isPdfData = (0, _pdfjsLib.isPdfFile)(filename); + const contentType = isPdfData ? "application/pdf" : ""; + if (isPdfData) { + let blobUrl = this.#openBlobUrls.get(element); + if (!blobUrl) { + blobUrl = URL.createObjectURL(new Blob([data], { + type: contentType + })); + this.#openBlobUrls.set(element, blobUrl); + } + let viewerUrl; + viewerUrl = "?file=" + encodeURIComponent(blobUrl + "#" + filename); + try { + window.open(viewerUrl); + return true; + } catch (ex) { + console.error(`openOrDownloadData: ${ex}`); + URL.revokeObjectURL(blobUrl); + this.#openBlobUrls.delete(element); + } + } + this.downloadData(data, filename, contentType); + return false; + } + + download(blob, url, filename, _options) { + const blobUrl = URL.createObjectURL(blob); + download(blobUrl, filename); + } + } + + exports.DownloadManager = DownloadManager; + + /***/ + }), + /* 44 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.GenericL10n = void 0; + __webpack_require__(45); + var _l10n_utils = __webpack_require__(30); + const PARTIAL_LANG_CODES = { + en: "en-US", + es: "es-ES", + fy: "fy-NL", + ga: "ga-IE", + gu: "gu-IN", + hi: "hi-IN", + hy: "hy-AM", + nb: "nb-NO", + ne: "ne-NP", + nn: "nn-NO", + pa: "pa-IN", + pt: "pt-PT", + sv: "sv-SE", + zh: "zh-CN" + }; + + function fixupLangCode(langCode) { + return PARTIAL_LANG_CODES[langCode?.toLowerCase()] || langCode; + } + + class GenericL10n { + constructor(lang) { + const { + webL10n + } = document; + this._lang = lang; + this._ready = new Promise((resolve, reject) => { + webL10n.setLanguage(fixupLangCode(lang), () => { + resolve(webL10n); + }); + }); + } + + async getLanguage() { + const l10n = await this._ready; + return l10n.getLanguage(); + } + + async getDirection() { + const l10n = await this._ready; + return l10n.getDirection(); + } + + async get(key, args = null, fallback = (0, _l10n_utils.getL10nFallback)(key, args)) { + const l10n = await this._ready; + return l10n.get(key, args, fallback); + } + + async translate(element) { + const l10n = await this._ready; + return l10n.translate(element); + } + } + + exports.GenericL10n = GenericL10n; + + /***/ + }), + /* 45 */ + /***/ (() => { + + + document.webL10n = function (window, document) { + var gL10nData = {}; + var gTextData = ''; + var gTextProp = 'textContent'; + var gLanguage = ''; + var gMacros = {}; + var gReadyState = 'loading'; + var gAsyncResourceLoading = true; + + function getL10nResourceLinks() { + return document.querySelectorAll('link[type="application/l10n"]'); + } + + function getL10nDictionary() { + var script = document.querySelector('script[type="application/l10n"]'); + return script ? JSON.parse(script.innerHTML) : null; + } + + function getTranslatableChildren(element) { + return element ? element.querySelectorAll('*[data-l10n-id]') : []; + } + + function getL10nAttributes(element) { + if (!element) return {}; + var l10nId = element.getAttribute('data-l10n-id'); + var l10nArgs = element.getAttribute('data-l10n-args'); + var args = {}; + if (l10nArgs) { + try { + args = JSON.parse(l10nArgs); + } catch (e) { + console.warn('could not parse arguments for #' + l10nId); + } + } + return { + id: l10nId, + args: args + }; + } + + function xhrLoadText(url, onSuccess, onFailure) { + onSuccess = onSuccess || function _onSuccess(data) { + }; + onFailure = onFailure || function _onFailure() { + }; + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, gAsyncResourceLoading); + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=utf-8'); + } + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + if (xhr.status == 200 || xhr.status === 0) { + onSuccess(xhr.responseText); + } else { + onFailure(); + } + } + }; + xhr.onerror = onFailure; + xhr.ontimeout = onFailure; + try { + xhr.send(null); + } catch (e) { + onFailure(); + } + } + + function parseResource(href, lang, successCallback, failureCallback) { + var baseURL = href.replace(/[^\/]*$/, '') || './'; + + function evalString(text) { + if (text.lastIndexOf('\\') < 0) return text; + return text.replace(/\\\\/g, '\\').replace(/\\n/g, '\n').replace(/\\r/g, '\r').replace(/\\t/g, '\t').replace(/\\b/g, '\b').replace(/\\f/g, '\f').replace(/\\{/g, '{').replace(/\\}/g, '}').replace(/\\"/g, '"').replace(/\\'/g, "'"); + } + + function parseProperties(text, parsedPropertiesCallback) { + var dictionary = {}; + var reBlank = /^\s*|\s*$/; + var reComment = /^\s*#|^\s*$/; + var reSection = /^\s*\[(.*)\]\s*$/; + var reImport = /^\s*@import\s+url\((.*)\)\s*$/i; + var reSplit = /^([^=\s]*)\s*=\s*(.+)$/; + + function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) { + var entries = rawText.replace(reBlank, '').split(/[\r\n]+/); + var currentLang = '*'; + var genericLang = lang.split('-', 1)[0]; + var skipLang = false; + var match = ''; + + function nextEntry() { + while (true) { + if (!entries.length) { + parsedRawLinesCallback(); + return; + } + var line = entries.shift(); + if (reComment.test(line)) continue; + if (extendedSyntax) { + match = reSection.exec(line); + if (match) { + currentLang = match[1].toLowerCase(); + skipLang = currentLang !== '*' && currentLang !== lang && currentLang !== genericLang; + continue; + } else if (skipLang) { + continue; + } + match = reImport.exec(line); + if (match) { + loadImport(baseURL + match[1], nextEntry); + return; + } + } + var tmp = line.match(reSplit); + if (tmp && tmp.length == 3) { + dictionary[tmp[1]] = evalString(tmp[2]); + } + } + } + + nextEntry(); + } + + function loadImport(url, callback) { + xhrLoadText(url, function (content) { + parseRawLines(content, false, callback); + }, function () { + console.warn(url + ' not found.'); + callback(); + }); + } + + parseRawLines(text, true, function () { + parsedPropertiesCallback(dictionary); + }); + } + + xhrLoadText(href, function (response) { + gTextData += response; + parseProperties(response, function (data) { + for (var key in data) { + var id, + prop, + index = key.lastIndexOf('.'); + if (index > 0) { + id = key.substring(0, index); + prop = key.substring(index + 1); + } else { + id = key; + prop = gTextProp; + } + if (!gL10nData[id]) { + gL10nData[id] = {}; + } + gL10nData[id][prop] = data[key]; + } + if (successCallback) { + successCallback(); + } + }); + }, failureCallback); + } + + function loadLocale(lang, callback) { + if (lang) { + lang = lang.toLowerCase(); + } + callback = callback || function _callback() { + }; + clear(); + gLanguage = lang; + var langLinks = getL10nResourceLinks(); + var langCount = langLinks.length; + if (langCount === 0) { + var dict = getL10nDictionary(); + if (dict && dict.locales && dict.default_locale) { + console.log('using the embedded JSON directory, early way out'); + gL10nData = dict.locales[lang]; + if (!gL10nData) { + var defaultLocale = dict.default_locale.toLowerCase(); + for (var anyCaseLang in dict.locales) { + anyCaseLang = anyCaseLang.toLowerCase(); + if (anyCaseLang === lang) { + gL10nData = dict.locales[lang]; + break; + } else if (anyCaseLang === defaultLocale) { + gL10nData = dict.locales[defaultLocale]; + } + } + } + callback(); + } else { + console.log('no resource to load, early way out'); + } + gReadyState = 'complete'; + return; + } + var onResourceLoaded = null; + var gResourceCount = 0; + onResourceLoaded = function () { + gResourceCount++; + if (gResourceCount >= langCount) { + callback(); + gReadyState = 'complete'; + } + }; + + function L10nResourceLink(link) { + var href = link.href; + this.load = function (lang, callback) { + parseResource(href, lang, callback, function () { + console.warn(href + ' not found.'); + console.warn('"' + lang + '" resource not found'); + gLanguage = ''; + callback(); + }); + }; + } + + for (var i = 0; i < langCount; i++) { + var resource = new L10nResourceLink(langLinks[i]); + resource.load(lang, onResourceLoaded); + } + } + + function clear() { + gL10nData = {}; + gTextData = ''; + gLanguage = ''; + } + + function getPluralRules(lang) { + var locales2rules = { + 'af': 3, + 'ak': 4, + 'am': 4, + 'ar': 1, + 'asa': 3, + 'az': 0, + 'be': 11, + 'bem': 3, + 'bez': 3, + 'bg': 3, + 'bh': 4, + 'bm': 0, + 'bn': 3, + 'bo': 0, + 'br': 20, + 'brx': 3, + 'bs': 11, + 'ca': 3, + 'cgg': 3, + 'chr': 3, + 'cs': 12, + 'cy': 17, + 'da': 3, + 'de': 3, + 'dv': 3, + 'dz': 0, + 'ee': 3, + 'el': 3, + 'en': 3, + 'eo': 3, + 'es': 3, + 'et': 3, + 'eu': 3, + 'fa': 0, + 'ff': 5, + 'fi': 3, + 'fil': 4, + 'fo': 3, + 'fr': 5, + 'fur': 3, + 'fy': 3, + 'ga': 8, + 'gd': 24, + 'gl': 3, + 'gsw': 3, + 'gu': 3, + 'guw': 4, + 'gv': 23, + 'ha': 3, + 'haw': 3, + 'he': 2, + 'hi': 4, + 'hr': 11, + 'hu': 0, + 'id': 0, + 'ig': 0, + 'ii': 0, + 'is': 3, + 'it': 3, + 'iu': 7, + 'ja': 0, + 'jmc': 3, + 'jv': 0, + 'ka': 0, + 'kab': 5, + 'kaj': 3, + 'kcg': 3, + 'kde': 0, + 'kea': 0, + 'kk': 3, + 'kl': 3, + 'km': 0, + 'kn': 0, + 'ko': 0, + 'ksb': 3, + 'ksh': 21, + 'ku': 3, + 'kw': 7, + 'lag': 18, + 'lb': 3, + 'lg': 3, + 'ln': 4, + 'lo': 0, + 'lt': 10, + 'lv': 6, + 'mas': 3, + 'mg': 4, + 'mk': 16, + 'ml': 3, + 'mn': 3, + 'mo': 9, + 'mr': 3, + 'ms': 0, + 'mt': 15, + 'my': 0, + 'nah': 3, + 'naq': 7, + 'nb': 3, + 'nd': 3, + 'ne': 3, + 'nl': 3, + 'nn': 3, + 'no': 3, + 'nr': 3, + 'nso': 4, + 'ny': 3, + 'nyn': 3, + 'om': 3, + 'or': 3, + 'pa': 3, + 'pap': 3, + 'pl': 13, + 'ps': 3, + 'pt': 3, + 'rm': 3, + 'ro': 9, + 'rof': 3, + 'ru': 11, + 'rwk': 3, + 'sah': 0, + 'saq': 3, + 'se': 7, + 'seh': 3, + 'ses': 0, + 'sg': 0, + 'sh': 11, + 'shi': 19, + 'sk': 12, + 'sl': 14, + 'sma': 7, + 'smi': 7, + 'smj': 7, + 'smn': 7, + 'sms': 7, + 'sn': 3, + 'so': 3, + 'sq': 3, + 'sr': 11, + 'ss': 3, + 'ssy': 3, + 'st': 3, + 'sv': 3, + 'sw': 3, + 'syr': 3, + 'ta': 3, + 'te': 3, + 'teo': 3, + 'th': 0, + 'ti': 4, + 'tig': 3, + 'tk': 3, + 'tl': 4, + 'tn': 3, + 'to': 0, + 'tr': 0, + 'ts': 3, + 'tzm': 22, + 'uk': 11, + 'ur': 3, + 've': 3, + 'vi': 0, + 'vun': 3, + 'wa': 4, + 'wae': 3, + 'wo': 0, + 'xh': 3, + 'xog': 3, + 'yo': 0, + 'zh': 0, + 'zu': 3 + }; + + function isIn(n, list) { + return list.indexOf(n) !== -1; + } + + function isBetween(n, start, end) { + return start <= n && n <= end; + } + + var pluralRules = { + '0': function (n) { + return 'other'; + }, + '1': function (n) { + if (isBetween(n % 100, 3, 10)) return 'few'; + if (n === 0) return 'zero'; + if (isBetween(n % 100, 11, 99)) return 'many'; + if (n == 2) return 'two'; + if (n == 1) return 'one'; + return 'other'; + }, + '2': function (n) { + if (n !== 0 && n % 10 === 0) return 'many'; + if (n == 2) return 'two'; + if (n == 1) return 'one'; + return 'other'; + }, + '3': function (n) { + if (n == 1) return 'one'; + return 'other'; + }, + '4': function (n) { + if (isBetween(n, 0, 1)) return 'one'; + return 'other'; + }, + '5': function (n) { + if (isBetween(n, 0, 2) && n != 2) return 'one'; + return 'other'; + }, + '6': function (n) { + if (n === 0) return 'zero'; + if (n % 10 == 1 && n % 100 != 11) return 'one'; + return 'other'; + }, + '7': function (n) { + if (n == 2) return 'two'; + if (n == 1) return 'one'; + return 'other'; + }, + '8': function (n) { + if (isBetween(n, 3, 6)) return 'few'; + if (isBetween(n, 7, 10)) return 'many'; + if (n == 2) return 'two'; + if (n == 1) return 'one'; + return 'other'; + }, + '9': function (n) { + if (n === 0 || n != 1 && isBetween(n % 100, 1, 19)) return 'few'; + if (n == 1) return 'one'; + return 'other'; + }, + '10': function (n) { + if (isBetween(n % 10, 2, 9) && !isBetween(n % 100, 11, 19)) return 'few'; + if (n % 10 == 1 && !isBetween(n % 100, 11, 19)) return 'one'; + return 'other'; + }, + '11': function (n) { + if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few'; + if (n % 10 === 0 || isBetween(n % 10, 5, 9) || isBetween(n % 100, 11, 14)) return 'many'; + if (n % 10 == 1 && n % 100 != 11) return 'one'; + return 'other'; + }, + '12': function (n) { + if (isBetween(n, 2, 4)) return 'few'; + if (n == 1) return 'one'; + return 'other'; + }, + '13': function (n) { + if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few'; + if (n != 1 && isBetween(n % 10, 0, 1) || isBetween(n % 10, 5, 9) || isBetween(n % 100, 12, 14)) return 'many'; + if (n == 1) return 'one'; + return 'other'; + }, + '14': function (n) { + if (isBetween(n % 100, 3, 4)) return 'few'; + if (n % 100 == 2) return 'two'; + if (n % 100 == 1) return 'one'; + return 'other'; + }, + '15': function (n) { + if (n === 0 || isBetween(n % 100, 2, 10)) return 'few'; + if (isBetween(n % 100, 11, 19)) return 'many'; + if (n == 1) return 'one'; + return 'other'; + }, + '16': function (n) { + if (n % 10 == 1 && n != 11) return 'one'; + return 'other'; + }, + '17': function (n) { + if (n == 3) return 'few'; + if (n === 0) return 'zero'; + if (n == 6) return 'many'; + if (n == 2) return 'two'; + if (n == 1) return 'one'; + return 'other'; + }, + '18': function (n) { + if (n === 0) return 'zero'; + if (isBetween(n, 0, 2) && n !== 0 && n != 2) return 'one'; + return 'other'; + }, + '19': function (n) { + if (isBetween(n, 2, 10)) return 'few'; + if (isBetween(n, 0, 1)) return 'one'; + return 'other'; + }, + '20': function (n) { + if ((isBetween(n % 10, 3, 4) || n % 10 == 9) && !(isBetween(n % 100, 10, 19) || isBetween(n % 100, 70, 79) || isBetween(n % 100, 90, 99))) return 'few'; + if (n % 1000000 === 0 && n !== 0) return 'many'; + if (n % 10 == 2 && !isIn(n % 100, [12, 72, 92])) return 'two'; + if (n % 10 == 1 && !isIn(n % 100, [11, 71, 91])) return 'one'; + return 'other'; + }, + '21': function (n) { + if (n === 0) return 'zero'; + if (n == 1) return 'one'; + return 'other'; + }, + '22': function (n) { + if (isBetween(n, 0, 1) || isBetween(n, 11, 99)) return 'one'; + return 'other'; + }, + '23': function (n) { + if (isBetween(n % 10, 1, 2) || n % 20 === 0) return 'one'; + return 'other'; + }, + '24': function (n) { + if (isBetween(n, 3, 10) || isBetween(n, 13, 19)) return 'few'; + if (isIn(n, [2, 12])) return 'two'; + if (isIn(n, [1, 11])) return 'one'; + return 'other'; + } + }; + var index = locales2rules[lang.replace(/-.*$/, '')]; + if (!(index in pluralRules)) { + console.warn('plural form unknown for [' + lang + ']'); + return function () { + return 'other'; + }; + } + return pluralRules[index]; + } + + gMacros.plural = function (str, param, key, prop) { + var n = parseFloat(param); + if (isNaN(n)) return str; + if (prop != gTextProp) return str; + if (!gMacros._pluralRules) { + gMacros._pluralRules = getPluralRules(gLanguage); + } + var index = '[' + gMacros._pluralRules(n) + ']'; + if (n === 0 && key + '[zero]' in gL10nData) { + str = gL10nData[key + '[zero]'][prop]; + } else if (n == 1 && key + '[one]' in gL10nData) { + str = gL10nData[key + '[one]'][prop]; + } else if (n == 2 && key + '[two]' in gL10nData) { + str = gL10nData[key + '[two]'][prop]; + } else if (key + index in gL10nData) { + str = gL10nData[key + index][prop]; + } else if (key + '[other]' in gL10nData) { + str = gL10nData[key + '[other]'][prop]; + } + return str; + }; + + function getL10nData(key, args, fallback) { + var data = gL10nData[key]; + if (!data) { + console.warn('#' + key + ' is undefined.'); + if (!fallback) { + return null; + } + data = fallback; + } + var rv = {}; + for (var prop in data) { + var str = data[prop]; + str = substIndexes(str, args, key, prop); + str = substArguments(str, args, key); + rv[prop] = str; + } + return rv; + } + + function substIndexes(str, args, key, prop) { + var reIndex = /\{\[\s*([a-zA-Z]+)\(([a-zA-Z]+)\)\s*\]\}/; + var reMatch = reIndex.exec(str); + if (!reMatch || !reMatch.length) return str; + var macroName = reMatch[1]; + var paramName = reMatch[2]; + var param; + if (args && paramName in args) { + param = args[paramName]; + } else if (paramName in gL10nData) { + param = gL10nData[paramName]; + } + if (macroName in gMacros) { + var macro = gMacros[macroName]; + str = macro(str, param, key, prop); + } + return str; + } + + function substArguments(str, args, key) { + var reArgs = /\{\{\s*(.+?)\s*\}\}/g; + return str.replace(reArgs, function (matched_text, arg) { + if (args && arg in args) { + return args[arg]; + } + if (arg in gL10nData) { + return gL10nData[arg]; + } + console.log('argument {{' + arg + '}} for #' + key + ' is undefined.'); + return matched_text; + }); + } + + function translateElement(element) { + var l10n = getL10nAttributes(element); + if (!l10n.id) return; + var data = getL10nData(l10n.id, l10n.args); + if (!data) { + console.warn('#' + l10n.id + ' is undefined.'); + return; + } + if (data[gTextProp]) { + if (getChildElementCount(element) === 0) { + element[gTextProp] = data[gTextProp]; + } else { + var children = element.childNodes; + var found = false; + for (var i = 0, l = children.length; i < l; i++) { + if (children[i].nodeType === 3 && /\S/.test(children[i].nodeValue)) { + if (found) { + children[i].nodeValue = ''; + } else { + children[i].nodeValue = data[gTextProp]; + found = true; + } + } + } + if (!found) { + var textNode = document.createTextNode(data[gTextProp]); + element.prepend(textNode); + } + } + delete data[gTextProp]; + } + for (var k in data) { + element[k] = data[k]; + } + } + + function getChildElementCount(element) { + if (element.children) { + return element.children.length; + } + if (typeof element.childElementCount !== 'undefined') { + return element.childElementCount; + } + var count = 0; + for (var i = 0; i < element.childNodes.length; i++) { + count += element.nodeType === 1 ? 1 : 0; + } + return count; + } + + function translateFragment(element) { + element = element || document.documentElement; + var children = getTranslatableChildren(element); + var elementCount = children.length; + for (var i = 0; i < elementCount; i++) { + translateElement(children[i]); + } + translateElement(element); + } + + return { + get: function (key, args, fallbackString) { + var index = key.lastIndexOf('.'); + var prop = gTextProp; + if (index > 0) { + prop = key.substring(index + 1); + key = key.substring(0, index); + } + var fallback; + if (fallbackString) { + fallback = {}; + fallback[prop] = fallbackString; + } + var data = getL10nData(key, args, fallback); + if (data && prop in data) { + return data[prop]; + } + return '{{' + key + '}}'; + }, + getData: function () { + return gL10nData; + }, + getText: function () { + return gTextData; + }, + getLanguage: function () { + return gLanguage; + }, + setLanguage: function (lang, callback) { + loadLocale(lang, function () { + if (callback) callback(); + }); + }, + getDirection: function () { + var rtlList = ['ar', 'he', 'fa', 'ps', 'ur']; + var shortCode = gLanguage.split('-', 1)[0]; + return rtlList.indexOf(shortCode) >= 0 ? 'rtl' : 'ltr'; + }, + translate: translateFragment, + getReadyState: function () { + return gReadyState; + }, + ready: function (callback) { + if (!callback) { + return; + } else if (gReadyState == 'complete' || gReadyState == 'interactive') { + window.setTimeout(function () { + callback(); + }); + } else if (document.addEventListener) { + document.addEventListener('localized', function once() { + document.removeEventListener('localized', once); + callback(); + }); + } + } + }; + }(window, document); + + /***/ + }), + /* 46 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.GenericScripting = void 0; + exports.docProperties = docProperties; + var _pdfjsLib = __webpack_require__(4); + + async function docProperties(pdfDocument) { + const url = "", + baseUrl = url.split("#")[0]; + let { + info, + metadata, + contentDispositionFilename, + contentLength + } = await pdfDocument.getMetadata(); + if (!contentLength) { + const { + length + } = await pdfDocument.getDownloadInfo(); + contentLength = length; + } + return { + ...info, + baseURL: baseUrl, + filesize: contentLength, + filename: contentDispositionFilename || (0, _pdfjsLib.getPdfFilenameFromUrl)(url), + metadata: metadata?.getRaw(), + authors: metadata?.get("dc:creator"), + numPages: pdfDocument.numPages, + URL: url + }; + } + + class GenericScripting { + constructor(sandboxBundleSrc) { + this._ready = (0, _pdfjsLib.loadScript)(sandboxBundleSrc, true).then(() => { + return window.pdfjsSandbox.QuickJSSandbox(); + }); + } + + async createSandbox(data) { + const sandbox = await this._ready; + sandbox.create(data); + } + + async dispatchEventInSandbox(event) { + const sandbox = await this._ready; + setTimeout(() => sandbox.dispatchEvent(event), 0); + } + + async destroySandbox() { + const sandbox = await this._ready; + sandbox.nukeSandbox(); + } + } + + exports.GenericScripting = GenericScripting; + + /***/ + }), + /* 47 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.PDFPrintService = void 0; + var _pdfjsLib = __webpack_require__(4); + var _app = __webpack_require__(2); + var _print_utils = __webpack_require__(48); + let activeService = null; + let dialog = null; + let overlayManager = null; + + function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size, printResolution, optionalContentConfigPromise, printAnnotationStoragePromise) { + const scratchCanvas = activeService.scratchCanvas; + const PRINT_UNITS = printResolution / _pdfjsLib.PixelsPerInch.PDF; + scratchCanvas.width = Math.floor(size.width * PRINT_UNITS); + scratchCanvas.height = Math.floor(size.height * PRINT_UNITS); + const ctx = scratchCanvas.getContext("2d"); + ctx.save(); + ctx.fillStyle = "rgb(255, 255, 255)"; + ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height); + ctx.restore(); + return Promise.all([pdfDocument.getPage(pageNumber), printAnnotationStoragePromise]).then(function ([pdfPage, printAnnotationStorage]) { + const renderContext = { + canvasContext: ctx, + transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0], + viewport: pdfPage.getViewport({ + scale: 1, + rotation: size.rotation + }), + intent: "print", + annotationMode: _pdfjsLib.AnnotationMode.ENABLE_STORAGE, + optionalContentConfigPromise, + printAnnotationStorage + }; + return pdfPage.render(renderContext).promise; + }); + } + + class PDFPrintService { + constructor(pdfDocument, pagesOverview, printContainer, printResolution, optionalContentConfigPromise = null, printAnnotationStoragePromise = null, l10n) { + this.pdfDocument = pdfDocument; + this.pagesOverview = pagesOverview; + this.printContainer = printContainer; + this._printResolution = printResolution || 150; + this._optionalContentConfigPromise = optionalContentConfigPromise || pdfDocument.getOptionalContentConfig(); + this._printAnnotationStoragePromise = printAnnotationStoragePromise || Promise.resolve(); + this.l10n = l10n; + this.currentPage = -1; + this.scratchCanvas = document.createElement("canvas"); + } + + layout() { + this.throwIfInactive(); + const body = document.querySelector("body"); + body.setAttribute("data-pdfjsprinting", true); + const { + width, + height + } = this.pagesOverview[0]; + const hasEqualPageSizes = this.pagesOverview.every(size => size.width === width && size.height === height); + if (!hasEqualPageSizes) { + console.warn("Not all pages have the same size. The printed result may be incorrect!"); + } + this.pageStyleSheet = document.createElement("style"); + this.pageStyleSheet.textContent = `@page { size: ${width}pt ${height}pt;}`; + body.append(this.pageStyleSheet); + } + + destroy() { + if (activeService !== this) { + return; + } + this.printContainer.textContent = ""; + const body = document.querySelector("body"); + body.removeAttribute("data-pdfjsprinting"); + if (this.pageStyleSheet) { + this.pageStyleSheet.remove(); + this.pageStyleSheet = null; + } + this.scratchCanvas.width = this.scratchCanvas.height = 0; + this.scratchCanvas = null; + activeService = null; + ensureOverlay().then(function () { + if (overlayManager.active === dialog) { + overlayManager.close(dialog); + } + }); + } + + renderPages() { + if (this.pdfDocument.isPureXfa) { + (0, _print_utils.getXfaHtmlForPrinting)(this.printContainer, this.pdfDocument); + return Promise.resolve(); + } + const pageCount = this.pagesOverview.length; + const renderNextPage = (resolve, reject) => { + this.throwIfInactive(); + if (++this.currentPage >= pageCount) { + renderProgress(pageCount, pageCount, this.l10n); + resolve(); + return; + } + const index = this.currentPage; + renderProgress(index, pageCount, this.l10n); + renderPage(this, this.pdfDocument, index + 1, this.pagesOverview[index], this._printResolution, this._optionalContentConfigPromise, this._printAnnotationStoragePromise).then(this.useRenderedPage.bind(this)).then(function () { + renderNextPage(resolve, reject); + }, reject); + }; + return new Promise(renderNextPage); + } + + useRenderedPage() { + this.throwIfInactive(); + const img = document.createElement("img"); + const scratchCanvas = this.scratchCanvas; + if ("toBlob" in scratchCanvas) { + scratchCanvas.toBlob(function (blob) { + img.src = URL.createObjectURL(blob); + }); + } else { + img.src = scratchCanvas.toDataURL(); + } + const wrapper = document.createElement("div"); + wrapper.className = "printedPage"; + wrapper.append(img); + this.printContainer.append(wrapper); + return new Promise(function (resolve, reject) { + img.onload = resolve; + img.onerror = reject; + }); + } + + performPrint() { + this.throwIfInactive(); + return new Promise(resolve => { + setTimeout(() => { + if (!this.active) { + resolve(); + return; + } + print.call(window); + setTimeout(resolve, 20); + }, 0); + }); + } + + get active() { + return this === activeService; + } + + throwIfInactive() { + if (!this.active) { + throw new Error("This print request was cancelled or completed."); + } + } + } + + exports.PDFPrintService = PDFPrintService; + const print = window.print; + window.print = function () { + if (activeService) { + console.warn("Ignored window.print() because of a pending print job."); + return; + } + ensureOverlay().then(function () { + if (activeService) { + overlayManager.open(dialog); + } + }); + try { + dispatchEvent("beforeprint"); + } finally { + if (!activeService) { + console.error("Expected print service to be initialized."); + ensureOverlay().then(function () { + if (overlayManager.active === dialog) { + overlayManager.close(dialog); + } + }); + return; + } + const activeServiceOnEntry = activeService; + activeService.renderPages().then(function () { + return activeServiceOnEntry.performPrint(); + }).catch(function () { + }).then(function () { + if (activeServiceOnEntry.active) { + abort(); + } + }); + } + }; + + function dispatchEvent(eventType) { + const event = new CustomEvent(eventType, { + bubbles: false, + cancelable: false, + detail: "custom" + }); + window.dispatchEvent(event); + } + + function abort() { + if (activeService) { + activeService.destroy(); + dispatchEvent("afterprint"); + } + } + + function renderProgress(index, total, l10n) { + dialog ||= document.getElementById("printServiceDialog"); + const progress = Math.round(100 * index / total); + const progressBar = dialog.querySelector("progress"); + const progressPerc = dialog.querySelector(".relative-progress"); + progressBar.value = progress; + l10n.get("print_progress_percent", { + progress + }).then(msg => { + progressPerc.textContent = msg; + }); + } + + window.addEventListener("keydown", function (event) { + if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) { + window.print(); + event.preventDefault(); + event.stopImmediatePropagation(); + } + }, true); + if ("onbeforeprint" in window) { + const stopPropagationIfNeeded = function (event) { + if (event.detail !== "custom") { + event.stopImmediatePropagation(); + } + }; + window.addEventListener("beforeprint", stopPropagationIfNeeded); + window.addEventListener("afterprint", stopPropagationIfNeeded); + } + let overlayPromise; + + function ensureOverlay() { + if (!overlayPromise) { + overlayManager = _app.PDFViewerApplication.overlayManager; + if (!overlayManager) { + throw new Error("The overlay manager has not yet been initialized."); + } + dialog ||= document.getElementById("printServiceDialog"); + overlayPromise = overlayManager.register(dialog, true); + document.getElementById("printCancel").onclick = abort; + dialog.addEventListener("close", abort); + } + return overlayPromise; + } + + _app.PDFPrintServiceFactory.instance = { + supportsPrinting: true, + createPrintService(pdfDocument, pagesOverview, printContainer, printResolution, optionalContentConfigPromise, printAnnotationStoragePromise, l10n) { + if (activeService) { + throw new Error("The print service is created and active."); + } + activeService = new PDFPrintService(pdfDocument, pagesOverview, printContainer, printResolution, optionalContentConfigPromise, printAnnotationStoragePromise, l10n); + return activeService; + } + }; + + /***/ + }), + /* 48 */ + /***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + exports.getXfaHtmlForPrinting = getXfaHtmlForPrinting; + var _pdfjsLib = __webpack_require__(4); + var _pdf_link_service = __webpack_require__(7); + var _xfa_layer_builder = __webpack_require__(38); + + function getXfaHtmlForPrinting(printContainer, pdfDocument) { + const xfaHtml = pdfDocument.allXfaHtml; + const linkService = new _pdf_link_service.SimpleLinkService(); + const scale = Math.round(_pdfjsLib.PixelsPerInch.PDF_TO_CSS_UNITS * 100) / 100; + for (const xfaPage of xfaHtml.children) { + const page = document.createElement("div"); + page.className = "xfaPrintedPage"; + printContainer.append(page); + const builder = new _xfa_layer_builder.XfaLayerBuilder({ + pageDiv: page, + pdfPage: null, + annotationStorage: pdfDocument.annotationStorage, + linkService, + xfaHtml: xfaPage + }); + const viewport = (0, _pdfjsLib.getXfaPageViewport)(xfaPage, { + scale + }); + builder.render(viewport, "print"); + } + } + + /***/ + }) + /******/]); + /************************************************************************/ + /******/ // The module cache + /******/ + var __webpack_module_cache__ = {}; + /******/ + /******/ // The require function + /******/ + function __webpack_require__(moduleId) { + /******/ // Check if module is in cache + /******/ + var cachedModule = __webpack_module_cache__[moduleId]; + /******/ + if (cachedModule !== undefined) { + /******/ + return cachedModule.exports; + /******/ + } + /******/ // Create a new module (and put it into the cache) + /******/ + var module = __webpack_module_cache__[moduleId] = { + /******/ // no module.id needed + /******/ // no module.loaded needed + /******/ exports: {} + /******/ + }; + /******/ + /******/ // Execute the module function + /******/ + __webpack_modules__[moduleId](module, module.exports, __webpack_require__); + /******/ + /******/ // Return the exports of the module + /******/ + return module.exports; + /******/ + } + + /******/ + /************************************************************************/ + var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. + (() => { + var exports = __webpack_exports__; + + + Object.defineProperty(exports, "__esModule", ({ + value: true + })); + Object.defineProperty(exports, "PDFViewerApplication", ({ + enumerable: true, + get: function () { + return _app.PDFViewerApplication; + } + })); + exports.PDFViewerApplicationConstants = void 0; + Object.defineProperty(exports, "PDFViewerApplicationOptions", ({ + enumerable: true, + get: function () { + return _app_options.AppOptions; + } + })); + __webpack_require__(1); + __webpack_require__(47); + var _ui_utils = __webpack_require__(3); + var _app_options = __webpack_require__(5); + var _pdf_link_service = __webpack_require__(7); + var _app = __webpack_require__(2); + const pdfjsVersion = '3.11.174'; + const pdfjsBuild = 'ce8716743'; + const AppConstants = { + LinkTarget: _pdf_link_service.LinkTarget, + RenderingStates: _ui_utils.RenderingStates, + ScrollMode: _ui_utils.ScrollMode, + SpreadMode: _ui_utils.SpreadMode + }; + exports.PDFViewerApplicationConstants = AppConstants; + window.PDFViewerApplication = _app.PDFViewerApplication; + window.PDFViewerApplicationConstants = AppConstants; + window.PDFViewerApplicationOptions = _app_options.AppOptions; + + function getViewerConfiguration() { + return { + appContainer: document.body, + mainContainer: document.getElementById("viewerContainer"), + viewerContainer: document.getElementById("viewer"), + toolbar: { + container: document.getElementById("toolbarViewer"), + numPages: document.getElementById("numPages"), + pageNumber: document.getElementById("pageNumber"), + scaleSelect: document.getElementById("scaleSelect"), + customScaleOption: document.getElementById("customScaleOption"), + previous: document.getElementById("previous"), + next: document.getElementById("next"), + zoomIn: document.getElementById("zoomIn"), + zoomOut: document.getElementById("zoomOut"), + viewFind: document.getElementById("viewFind"), + openFile: document.getElementById("openFile"), + print: document.getElementById("print"), + editorFreeTextButton: document.getElementById("editorFreeText"), + editorFreeTextParamsToolbar: document.getElementById("editorFreeTextParamsToolbar"), + editorInkButton: document.getElementById("editorInk"), + editorInkParamsToolbar: document.getElementById("editorInkParamsToolbar"), + editorStampButton: document.getElementById("editorStamp"), + editorStampParamsToolbar: document.getElementById("editorStampParamsToolbar"), + download: document.getElementById("download") + }, + secondaryToolbar: { + toolbar: document.getElementById("secondaryToolbar"), + toggleButton: document.getElementById("secondaryToolbarToggle"), + presentationModeButton: document.getElementById("presentationMode"), + openFileButton: document.getElementById("secondaryOpenFile"), + printButton: document.getElementById("secondaryPrint"), + downloadButton: document.getElementById("secondaryDownload"), + viewBookmarkButton: document.getElementById("viewBookmark"), + firstPageButton: document.getElementById("firstPage"), + lastPageButton: document.getElementById("lastPage"), + pageRotateCwButton: document.getElementById("pageRotateCw"), + pageRotateCcwButton: document.getElementById("pageRotateCcw"), + cursorSelectToolButton: document.getElementById("cursorSelectTool"), + cursorHandToolButton: document.getElementById("cursorHandTool"), + scrollPageButton: document.getElementById("scrollPage"), + scrollVerticalButton: document.getElementById("scrollVertical"), + scrollHorizontalButton: document.getElementById("scrollHorizontal"), + scrollWrappedButton: document.getElementById("scrollWrapped"), + spreadNoneButton: document.getElementById("spreadNone"), + spreadOddButton: document.getElementById("spreadOdd"), + spreadEvenButton: document.getElementById("spreadEven"), + documentPropertiesButton: document.getElementById("documentProperties") + }, + sidebar: { + outerContainer: document.getElementById("outerContainer"), + sidebarContainer: document.getElementById("sidebarContainer"), + toggleButton: document.getElementById("sidebarToggle"), + resizer: document.getElementById("sidebarResizer"), + thumbnailButton: document.getElementById("viewThumbnail"), + outlineButton: document.getElementById("viewOutline"), + attachmentsButton: document.getElementById("viewAttachments"), + layersButton: document.getElementById("viewLayers"), + thumbnailView: document.getElementById("thumbnailView"), + outlineView: document.getElementById("outlineView"), + attachmentsView: document.getElementById("attachmentsView"), + layersView: document.getElementById("layersView"), + outlineOptionsContainer: document.getElementById("outlineOptionsContainer"), + currentOutlineItemButton: document.getElementById("currentOutlineItem") + }, + findBar: { + bar: document.getElementById("findbar"), + toggleButton: document.getElementById("viewFind"), + findField: document.getElementById("findInput"), + highlightAllCheckbox: document.getElementById("findHighlightAll"), + caseSensitiveCheckbox: document.getElementById("findMatchCase"), + matchDiacriticsCheckbox: document.getElementById("findMatchDiacritics"), + entireWordCheckbox: document.getElementById("findEntireWord"), + findMsg: document.getElementById("findMsg"), + findResultsCount: document.getElementById("findResultsCount"), + findPreviousButton: document.getElementById("findPrevious"), + findNextButton: document.getElementById("findNext") + }, + passwordOverlay: { + dialog: document.getElementById("passwordDialog"), + label: document.getElementById("passwordText"), + input: document.getElementById("password"), + submitButton: document.getElementById("passwordSubmit"), + cancelButton: document.getElementById("passwordCancel") + }, + documentProperties: { + dialog: document.getElementById("documentPropertiesDialog"), + closeButton: document.getElementById("documentPropertiesClose"), + fields: { + fileName: document.getElementById("fileNameField"), + fileSize: document.getElementById("fileSizeField"), + title: document.getElementById("titleField"), + author: document.getElementById("authorField"), + subject: document.getElementById("subjectField"), + keywords: document.getElementById("keywordsField"), + creationDate: document.getElementById("creationDateField"), + modificationDate: document.getElementById("modificationDateField"), + creator: document.getElementById("creatorField"), + producer: document.getElementById("producerField"), + version: document.getElementById("versionField"), + pageCount: document.getElementById("pageCountField"), + pageSize: document.getElementById("pageSizeField"), + linearized: document.getElementById("linearizedField") + } + }, + altTextDialog: { + dialog: document.getElementById("altTextDialog"), + optionDescription: document.getElementById("descriptionButton"), + optionDecorative: document.getElementById("decorativeButton"), + textarea: document.getElementById("descriptionTextarea"), + cancelButton: document.getElementById("altTextCancel"), + saveButton: document.getElementById("altTextSave") + }, + annotationEditorParams: { + editorFreeTextFontSize: document.getElementById("editorFreeTextFontSize"), + editorFreeTextColor: document.getElementById("editorFreeTextColor"), + editorInkColor: document.getElementById("editorInkColor"), + editorInkThickness: document.getElementById("editorInkThickness"), + editorInkOpacity: document.getElementById("editorInkOpacity"), + editorStampAddImage: document.getElementById("editorStampAddImage") + }, + printContainer: document.getElementById("printContainer"), + openFileInput: document.getElementById("fileInput"), + debuggerScriptPath: "./debugger.js" + }; + } + + function webViewerLoad() { + const config = getViewerConfiguration(); + const event = new CustomEvent("webviewerloaded", { + bubbles: true, + cancelable: true, + detail: { + source: window + } + }); + try { + parent.document.dispatchEvent(event); + } catch (ex) { + console.error(`webviewerloaded: ${ex}`); + document.dispatchEvent(event); + } + _app.PDFViewerApplication.run(config); + } + + document.blockUnblockOnload?.(true); + if (document.readyState === "interactive" || document.readyState === "complete") { + webViewerLoad(); + } else { + document.addEventListener("DOMContentLoaded", webViewerLoad, true); + } + })(); + + /******/ +})() +; +//# sourceMappingURL=viewer.js.map \ No newline at end of file diff --git a/src/main/resources/static/pdfjs/js/viewer.js.map b/src/main/resources/static/pdfjs/js/viewer.js.map new file mode 100644 index 000000000..faf37bc98 --- /dev/null +++ b/src/main/resources/static/pdfjs/js/viewer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"viewer.js","mappings":"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","sources":["webpack://pdf.js/web/genericcom.js","webpack://pdf.js/web/app.js","webpack://pdf.js/web/ui_utils.js","webpack://pdf.js/web/pdfjs.js","webpack://pdf.js/web/app_options.js","webpack://pdf.js/web/event_utils.js","webpack://pdf.js/web/pdf_link_service.js","webpack://pdf.js/web/alt_text_manager.js","webpack://pdf.js/web/annotation_editor_params.js","webpack://pdf.js/web/overlay_manager.js","webpack://pdf.js/web/password_prompt.js","webpack://pdf.js/web/pdf_attachment_viewer.js","webpack://pdf.js/web/base_tree_viewer.js","webpack://pdf.js/web/pdf_cursor_tools.js","webpack://pdf.js/web/grab_to_pan.js","webpack://pdf.js/web/pdf_document_properties.js","webpack://pdf.js/web/pdf_find_bar.js","webpack://pdf.js/web/pdf_find_controller.js","webpack://pdf.js/web/pdf_find_utils.js","webpack://pdf.js/web/pdf_history.js","webpack://pdf.js/web/pdf_layer_viewer.js","webpack://pdf.js/web/pdf_outline_viewer.js","webpack://pdf.js/web/pdf_presentation_mode.js","webpack://pdf.js/web/pdf_rendering_queue.js","webpack://pdf.js/web/pdf_scripting_manager.js","webpack://pdf.js/web/pdf_sidebar.js","webpack://pdf.js/web/pdf_thumbnail_viewer.js","webpack://pdf.js/web/pdf_thumbnail_view.js","webpack://pdf.js/web/pdf_viewer.js","webpack://pdf.js/web/l10n_utils.js","webpack://pdf.js/web/pdf_page_view.js","webpack://pdf.js/web/annotation_editor_layer_builder.js","webpack://pdf.js/web/annotation_layer_builder.js","webpack://pdf.js/web/struct_tree_layer_builder.js","webpack://pdf.js/web/text_accessibility.js","webpack://pdf.js/web/text_highlighter.js","webpack://pdf.js/web/text_layer_builder.js","webpack://pdf.js/web/xfa_layer_builder.js","webpack://pdf.js/web/secondary_toolbar.js","webpack://pdf.js/web/toolbar.js","webpack://pdf.js/web/view_history.js","webpack://pdf.js/web/preferences.js","webpack://pdf.js/web/download_manager.js","webpack://pdf.js/web/genericl10n.js","webpack://pdf.js/external/webL10n/l10n.js","webpack://pdf.js/web/generic_scripting.js","webpack://pdf.js/web/pdf_print_service.js","webpack://pdf.js/web/print_utils.js","webpack://pdf.js/webpack/bootstrap","webpack://pdf.js/web/viewer.js"],"sourcesContent":["/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DefaultExternalServices, PDFViewerApplication } from \"./app.js\";\nimport { BasePreferences } from \"./preferences.js\";\nimport { DownloadManager } from \"./download_manager.js\";\nimport { GenericL10n } from \"./genericl10n.js\";\nimport { GenericScripting } from \"./generic_scripting.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"GENERIC\")) {\n throw new Error(\n 'Module \"pdfjs-web/genericcom\" shall not be used outside GENERIC build.'\n );\n}\n\nconst GenericCom = {};\n\nclass GenericPreferences extends BasePreferences {\n async _writeToStorage(prefObj) {\n localStorage.setItem(\"pdfjs.preferences\", JSON.stringify(prefObj));\n }\n\n async _readFromStorage(prefObj) {\n return JSON.parse(localStorage.getItem(\"pdfjs.preferences\"));\n }\n}\n\nclass GenericExternalServices extends DefaultExternalServices {\n static createDownloadManager() {\n return new DownloadManager();\n }\n\n static createPreferences() {\n return new GenericPreferences();\n }\n\n static createL10n({ locale = \"en-US\" }) {\n return new GenericL10n(locale);\n }\n\n static createScripting({ sandboxBundleSrc }) {\n return new GenericScripting(sandboxBundleSrc);\n }\n}\nPDFViewerApplication.externalServices = GenericExternalServices;\n\nexport { GenericCom };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n animationStarted,\n apiPageLayoutToViewerModes,\n apiPageModeToSidebarView,\n AutoPrintRegExp,\n CursorTool,\n DEFAULT_SCALE_VALUE,\n getActiveOrFocusedElement,\n isValidRotation,\n isValidScrollMode,\n isValidSpreadMode,\n normalizeWheelEventDirection,\n parseQueryString,\n ProgressBar,\n RenderingStates,\n ScrollMode,\n SidebarView,\n SpreadMode,\n TextLayerMode,\n} from \"./ui_utils.js\";\nimport {\n AnnotationEditorType,\n build,\n FeatureTest,\n getDocument,\n getFilenameFromUrl,\n getPdfFilenameFromUrl,\n GlobalWorkerOptions,\n InvalidPDFException,\n isDataScheme,\n isPdfFile,\n loadScript,\n MissingPDFException,\n PDFWorker,\n PromiseCapability,\n shadow,\n UnexpectedResponseException,\n version,\n} from \"pdfjs-lib\";\nimport { AppOptions, OptionKind } from \"./app_options.js\";\nimport { AutomationEventBus, EventBus } from \"./event_utils.js\";\nimport { LinkTarget, PDFLinkService } from \"./pdf_link_service.js\";\nimport { AltTextManager } from \"web-alt_text_manager\";\nimport { AnnotationEditorParams } from \"web-annotation_editor_params\";\nimport { OverlayManager } from \"./overlay_manager.js\";\nimport { PasswordPrompt } from \"./password_prompt.js\";\nimport { PDFAttachmentViewer } from \"web-pdf_attachment_viewer\";\nimport { PDFCursorTools } from \"web-pdf_cursor_tools\";\nimport { PDFDocumentProperties } from \"web-pdf_document_properties\";\nimport { PDFFindBar } from \"web-pdf_find_bar\";\nimport { PDFFindController } from \"./pdf_find_controller.js\";\nimport { PDFHistory } from \"./pdf_history.js\";\nimport { PDFLayerViewer } from \"web-pdf_layer_viewer\";\nimport { PDFOutlineViewer } from \"web-pdf_outline_viewer\";\nimport { PDFPresentationMode } from \"web-pdf_presentation_mode\";\nimport { PDFRenderingQueue } from \"./pdf_rendering_queue.js\";\nimport { PDFScriptingManager } from \"./pdf_scripting_manager.js\";\nimport { PDFSidebar } from \"web-pdf_sidebar\";\nimport { PDFThumbnailViewer } from \"web-pdf_thumbnail_viewer\";\nimport { PDFViewer } from \"./pdf_viewer.js\";\nimport { SecondaryToolbar } from \"web-secondary_toolbar\";\nimport { Toolbar } from \"web-toolbar\";\nimport { ViewHistory } from \"./view_history.js\";\n\nconst FORCE_PAGES_LOADED_TIMEOUT = 10000; // ms\nconst WHEEL_ZOOM_DISABLED_TIMEOUT = 1000; // ms\n\nconst ViewOnLoad = {\n UNKNOWN: -1,\n PREVIOUS: 0, // Default value.\n INITIAL: 1,\n};\n\nconst ViewerCssTheme = {\n AUTOMATIC: 0, // Default value.\n LIGHT: 1,\n DARK: 2,\n};\n\nclass DefaultExternalServices {\n constructor() {\n throw new Error(\"Cannot initialize DefaultExternalServices.\");\n }\n\n static updateFindControlState(data) {}\n\n static updateFindMatchesCount(data) {}\n\n static initPassiveLoading(callbacks) {}\n\n static reportTelemetry(data) {}\n\n static createDownloadManager() {\n throw new Error(\"Not implemented: createDownloadManager\");\n }\n\n static createPreferences() {\n throw new Error(\"Not implemented: createPreferences\");\n }\n\n static createL10n(options) {\n throw new Error(\"Not implemented: createL10n\");\n }\n\n static createScripting(options) {\n throw new Error(\"Not implemented: createScripting\");\n }\n\n static get supportsPinchToZoom() {\n return shadow(this, \"supportsPinchToZoom\", true);\n }\n\n static get supportsIntegratedFind() {\n return shadow(this, \"supportsIntegratedFind\", false);\n }\n\n static get supportsDocumentFonts() {\n return shadow(this, \"supportsDocumentFonts\", true);\n }\n\n static get supportedMouseWheelZoomModifierKeys() {\n return shadow(this, \"supportedMouseWheelZoomModifierKeys\", {\n ctrlKey: true,\n metaKey: true,\n });\n }\n\n static get isInAutomation() {\n return shadow(this, \"isInAutomation\", false);\n }\n\n static updateEditorStates(data) {\n throw new Error(\"Not implemented: updateEditorStates\");\n }\n\n static get canvasMaxAreaInBytes() {\n return shadow(this, \"canvasMaxAreaInBytes\", -1);\n }\n\n static getNimbusExperimentData() {\n return shadow(this, \"getNimbusExperimentData\", Promise.resolve(null));\n }\n}\n\nconst PDFViewerApplication = {\n initialBookmark: document.location.hash.substring(1),\n _initializedCapability: new PromiseCapability(),\n appConfig: null,\n pdfDocument: null,\n pdfLoadingTask: null,\n printService: null,\n /** @type {PDFViewer} */\n pdfViewer: null,\n /** @type {PDFThumbnailViewer} */\n pdfThumbnailViewer: null,\n /** @type {PDFRenderingQueue} */\n pdfRenderingQueue: null,\n /** @type {PDFPresentationMode} */\n pdfPresentationMode: null,\n /** @type {PDFDocumentProperties} */\n pdfDocumentProperties: null,\n /** @type {PDFLinkService} */\n pdfLinkService: null,\n /** @type {PDFHistory} */\n pdfHistory: null,\n /** @type {PDFSidebar} */\n pdfSidebar: null,\n /** @type {PDFOutlineViewer} */\n pdfOutlineViewer: null,\n /** @type {PDFAttachmentViewer} */\n pdfAttachmentViewer: null,\n /** @type {PDFLayerViewer} */\n pdfLayerViewer: null,\n /** @type {PDFCursorTools} */\n pdfCursorTools: null,\n /** @type {PDFScriptingManager} */\n pdfScriptingManager: null,\n /** @type {ViewHistory} */\n store: null,\n /** @type {DownloadManager} */\n downloadManager: null,\n /** @type {OverlayManager} */\n overlayManager: null,\n /** @type {Preferences} */\n preferences: null,\n /** @type {Toolbar} */\n toolbar: null,\n /** @type {SecondaryToolbar} */\n secondaryToolbar: null,\n /** @type {EventBus} */\n eventBus: null,\n /** @type {IL10n} */\n l10n: null,\n /** @type {AnnotationEditorParams} */\n annotationEditorParams: null,\n isInitialViewSet: false,\n downloadComplete: false,\n isViewerEmbedded: window.parent !== window,\n url: \"\",\n baseUrl: \"\",\n _downloadUrl: \"\",\n externalServices: DefaultExternalServices,\n _boundEvents: Object.create(null),\n documentInfo: null,\n metadata: null,\n _contentDispositionFilename: null,\n _contentLength: null,\n _saveInProgress: false,\n _wheelUnusedTicks: 0,\n _wheelUnusedFactor: 1,\n _touchUnusedTicks: 0,\n _touchUnusedFactor: 1,\n _PDFBug: null,\n _hasAnnotationEditors: false,\n _title: document.title,\n _printAnnotationStoragePromise: null,\n _touchInfo: null,\n _isCtrlKeyDown: false,\n _nimbusDataPromise: null,\n\n // Called once when the document is loaded.\n async initialize(appConfig) {\n this.preferences = this.externalServices.createPreferences();\n this.appConfig = appConfig;\n\n if (\n typeof PDFJSDev === \"undefined\"\n ? window.isGECKOVIEW\n : PDFJSDev.test(\"GECKOVIEW\")\n ) {\n this._nimbusDataPromise = this.externalServices.getNimbusExperimentData();\n }\n\n await this._initializeOptions();\n this._forceCssTheme();\n await this._initializeL10n();\n\n if (\n this.isViewerEmbedded &&\n AppOptions.get(\"externalLinkTarget\") === LinkTarget.NONE\n ) {\n // Prevent external links from \"replacing\" the viewer,\n // when it's embedded in e.g. an