Compare commits

...

75 Commits

Author SHA1 Message Date
Anthony Stirling
e3aa726f12 Update build.gradle 2023-05-19 00:22:40 +01:00
Anthony Stirling
e46b7aaf35 Update push-docker.yml 2023-05-19 00:19:55 +01:00
Anthony Stirling
68947de06a Update push-docker.yml 2023-05-19 00:18:30 +01:00
Anthony Stirling
1739de95a6 Update push-docker.yml 2023-05-19 00:15:22 +01:00
Anthony Stirling
759f184d36 Update push-docker.yml 2023-05-19 00:13:43 +01:00
Anthony Stirling
8a8d3437a6 Update push-docker.yml 2023-05-19 00:12:48 +01:00
Anthony Stirling
87f0d6930e Update push-docker.yml 2023-05-19 00:03:09 +01:00
Anthony Stirling
e659f11f05 Update push-docker.yml 2023-05-19 00:01:16 +01:00
Anthony Stirling
21c2bb281f Update push-docker.yml 2023-05-18 23:25:17 +01:00
Anthony Stirling
b0232eb917 Merge pull request #184 from Frooodle/conditional
Conditional removable PDF services
2023-05-18 23:23:56 +01:00
Anthony Stirling
f8c855eab1 test 2023-05-18 23:22:44 +01:00
Anthony Stirling
8a277aebd7 Test stuff 2023-05-18 23:17:46 +01:00
Anthony Stirling
d4c25476d2 Merge remote-tracking branch 'origin/main' into conditional 2023-05-18 14:16:56 +01:00
Anthony Stirling
8fa35da2d1 Merge pull request #185 from demonisius/main
add ru_RU language
2023-05-18 12:15:43 +01:00
Дмитрий
dcf5852432 add ru_RU language 2023-05-18 13:13:08 +03:00
Anthony Stirling
e2aa342539 Merge branch 'main' into conditional 2023-05-18 00:05:53 +01:00
Anthony Stirling
e28e5230d7 maybe fx 2023-05-18 00:03:59 +01:00
Anthony Stirling
cbe5b15abd fix 2023-05-17 23:59:48 +01:00
Anthony Stirling
566546748d docker script 2023-05-17 23:58:28 +01:00
Anthony Stirling
320f56e473 lots of stuff 2023-05-17 23:58:15 +01:00
Anthony Stirling
54e7998bf7 remove 2023-05-17 18:17:11 +01:00
Anthony Stirling
479dcb18b3 readme stuff 2023-05-17 18:16:39 +01:00
Anthony Stirling
1a9329d1df other endpoints 2023-05-17 17:59:28 +01:00
Anthony Stirling
7fda51a0c9 Merge pull request #182 from IXEguy/visibility_fix
Change Visability to Visibility
2023-05-17 16:43:31 +01:00
Ahrr Jay
28368cd6c0 Change Visability to Visibility 2023-05-17 08:16:11 -07:00
Anthony Stirling
5d6b1280a8 Merge remote-tracking branch 'origin/main' into conditional 2023-05-17 15:40:09 +01:00
Anthony Stirling
8fddb4d6bf Merge pull request #180 from MarcO-79/patch-8
Create pl.svg
2023-05-17 14:50:50 +01:00
Anthony Stirling
81a9b65559 Merge branch 'main' into patch-8 2023-05-17 14:49:49 +01:00
Anthony Stirling
d20533e048 Merge pull request #179 from MarcO-79/patch-7
Update navbar.html
2023-05-17 14:49:28 +01:00
Anthony Stirling
6eb32b06af Merge branch 'main' into patch-7 2023-05-17 14:48:30 +01:00
Anthony Stirling
9c9970d6fb Merge pull request #178 from MarcO-79/patch-6
Create messages_pl_PL.properties
2023-05-17 14:48:20 +01:00
MarcO-79
887d634fde Create pl.svg
Add Polish flag
2023-05-17 15:15:07 +02:00
MarcO-79
9c334fb021 Update navbar.html
Add Polish language
2023-05-17 15:12:37 +02:00
MarcO-79
8c9880145e Create messages_pl_PL.properties
Add Polish language
2023-05-17 14:58:05 +02:00
Anthony Stirling
6fa6f3d1dc Merge remote-tracking branch 'origin/main' into conditional 2023-05-17 01:05:24 +01:00
Anthony Stirling
fe0c9fe57a Merge remote-tracking branch 'origin/main' into conditional 2023-05-17 00:49:22 +01:00
Anthony Stirling
3ab820763b Merge pull request #171 from pitah81/swedish
Swedish
2023-05-17 00:26:52 +01:00
Peter Wickenberg
31a6f6af93 Add files via upload
Added swedish flag
2023-05-17 00:55:55 +02:00
Peter Wickenberg
32f4245024 Update navbar.html
Added swedish language to navbar
2023-05-17 00:55:16 +02:00
Peter Wickenberg
92a8aba69c Add files via upload
Messages file translated using Google Translate
2023-05-17 00:51:14 +02:00
Anthony Stirling
c2fec0a030 stats and conditionals 2023-05-16 22:44:53 +01:00
Anthony Stirling
e0ef53431a Merge pull request #158 from trytomakeyouprivate/patch-4
minor changes
2023-05-14 22:14:46 +01:00
Anthony Stirling
093dcba4ba Merge branch 'main' into patch-4 2023-05-14 22:11:20 +01:00
Anthony Stirling
1cffb64344 Merge pull request #160 from trytomakeyouprivate/patch-5
Added Fedora location & install commands
2023-05-14 22:11:14 +01:00
Anthony Stirling
caffe7b455 Merge branch 'main' into patch-5 2023-05-14 22:09:26 +01:00
Anthony Stirling
2e87db99c2 Merge pull request #161 from trytomakeyouprivate/main
changed APT install
2023-05-14 22:09:05 +01:00
trytomakeyouprivate
220ef5ae1a changed APT install
removed unnessecary Libreoffice core packages, these will be installed along. Changed all the python packages to pip3 instead of apt
2023-05-14 20:59:21 +00:00
trytomakeyouprivate
395f7272c3 Added Fedora location & install commands 2023-05-14 20:54:31 +00:00
trytomakeyouprivate
fd427c3931 minor changes
minor
2023-05-14 20:28:52 +00:00
Anthony Stirling
2ea07688be Merge pull request #156 from trytomakeyouprivate/main
Update LocalRunGuide.md
2023-05-14 20:41:25 +01:00
Anthony Stirling
b1f8324c21 Merge branch 'main' into main 2023-05-14 20:40:45 +01:00
trytomakeyouprivate
e920fb16d4 Update LocalRunGuide.md 2023-05-14 19:35:02 +00:00
Anthony Stirling
802ae3643c Merge pull request #155 from trytomakeyouprivate/patch-3
Update LocalRunGuide.md
2023-05-14 19:55:26 +01:00
trytomakeyouprivate
42cc031200 Update LocalRunGuide.md
fixed one file that was not executable with chmod +x

also added language-pack installation and viewing.

Manually adding langpacks could also be useful but dont see the reason yet
2023-05-14 18:32:17 +00:00
Anthony Stirling
d6cf4648a2 Merge pull request #154 from trytomakeyouprivate/patch-2
Update LocalRunGuide.md
2023-05-14 19:02:02 +01:00
trytomakeyouprivate
d6deb52731 Update LocalRunGuide.md
added tesseract-osd nessecary in Fedora
2023-05-14 17:56:50 +00:00
Anthony Stirling
a4c8221fc4 Merge pull request #152 from trytomakeyouprivate/patch-1
Update LocalRunGuide.md
2023-05-14 18:35:43 +01:00
trytomakeyouprivate
50b921f318 Update LocalRunGuide.md
Added Fedora Installation translations.

Not sure about zlib-devel.

Why are pip packages installed through apt on ubuntu? Where is the reasoning?
2023-05-14 17:11:04 +00:00
Anthony Stirling
e0526b9584 Version bump 2023-05-14 15:43:56 +01:00
Anthony Stirling
f822f6d931 Merge pull request #150 from pesaventofilippo/ita-translation
Added Italian language
2023-05-14 15:37:25 +01:00
Filippo Pesavento
0a25d75682 Merge branch 'Frooodle:main' into ita-translation 2023-05-14 15:43:20 +02:00
Filippo Pesavento
0eea2c672f Added Italian translation 2023-05-14 15:43:12 +02:00
Anthony Stirling
e4e7b8f449 Merge pull request #148 from JabSYsEmb/main
fix style issue for rtl languages
2023-05-14 12:12:55 +01:00
JabSysEmb
54a5c621c4 add style in common file general.css 2023-05-14 14:03:09 +03:00
Filippo Pesavento
03e1d9a863 Added Italian flag 2023-05-14 11:54:01 +02:00
Filippo Pesavento
098fc340ca Added Italian language to navbar.html 2023-05-14 11:51:46 +02:00
JabSysEmb
27c8a03c16 fix style issue for rtl languages 2023-05-14 12:01:13 +03:00
Anthony Stirling
1ddf829a6d Update LocalRunGuide.md 2023-05-13 23:40:50 +01:00
Anthony Stirling
6952a8b72a Add files via upload 2023-05-13 17:04:21 +01:00
Anthony Stirling
2ee720760d Add files via upload 2023-05-13 16:58:00 +01:00
Anthony Stirling
ccee0eecb5 Update build.gradle 2023-05-13 13:28:20 +01:00
Anthony Stirling
2b7e97a09f Merge pull request #147 from Frooodle/hotfix
Minor fixes
2023-05-13 13:27:37 +01:00
Anthony Stirling
a2926b8fe9 Minor language stuff 2023-05-13 13:26:28 +01:00
Anthony Stirling
9009317f83 star in top right fix 2023-05-13 13:15:24 +01:00
Anthony Stirling
67772e7221 Update README.md 2023-05-13 11:12:50 +01:00
40 changed files with 2561 additions and 178 deletions

View File

@@ -38,7 +38,7 @@ jobs:
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_API }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2.1.0
with:
@@ -54,22 +54,54 @@ jobs:
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
ghcr.io/${{ github.repository_owner }}/s-pdf
tags: |
${{ steps.versionNumber.outputs.versionNumber }}${{ github.ref == 'refs/heads/main' && '-alpha' || '' }}
type=raw,value=${{ steps.versionNumber.outputs.versionNumber }},enable=${{ github.ref == 'refs/heads/master' }}
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }}
type=raw,value=alpha,enable=${{ github.ref == 'refs/heads/main' }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v2.1.0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2.5.0
- name: Build and push
- name: Build and push main Dockerfile
uses: docker/build-push-action@v4.0.0
with:
context: .
dockerfile: ./Dockerfile
push: true
cache-from: type=gha
cache-to: type=gha,mode=max
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: linux/amd64,linux/arm64/v8
- name: Generate tags
id: meta2
uses: docker/metadata-action@v4.4.0
with:
images: |
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
ghcr.io/${{ github.repository_owner }}/s-pdf
tags: |
type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-ultra-light,enable=${{ github.ref == 'refs/heads/master' }}
type=raw,value=latest-ultra-light,enable=${{ github.ref == 'refs/heads/master' }}
type=raw,value=alpha-ultra-light,enable=${{ github.ref == 'refs/heads/main' }}
- name: Convert repository owner to lowercase
id: repoowner
run: echo "::set-output name=lowercase::$(echo ${{ github.repository_owner }} | awk '{print tolower($0)}')"
- name: Build and push Dockerfile-ultralite
uses: docker/build-push-action@v4.0.0
with:
context: .
file: ./Dockerfile-ultralite
push: true
cache-from: type=gha
cache-to: type=gha,mode=max
tags: ${{ steps.meta2.outputs.tags }}
labels: ${{ steps.meta2.outputs.labels }}
platforms: linux/amd64,linux/arm64/v8

14
Dockerfile-ultralite Normal file
View File

@@ -0,0 +1,14 @@
# Build jbig2enc in a separate stage
FROM openjdk:17-jdk-slim
# Copy the application JAR file
COPY build/libs/*.jar app.jar
# Expose the application port
EXPOSE 8080
# Set environment variables
ENV GROUPS_TO_REMOVE=LibreOffice,CLI
# Run the application
CMD ["java", "-jar", "/app.jar"]

View File

@@ -26,11 +26,11 @@ RUN git clone https://github.com/agl/jbig2enc && \
FROM openjdk:17-jdk-slim AS base
RUN apt-get update && \
apt-get install -y --no-install-recommends \
libreoffice-core \
libreoffice-core-nogui \
libreoffice-common \
libreoffice-writer \
libreoffice-calc \
libreoffice-impress \
libreoffice-writer-nogui \
libreoffice-calc-nogui \
libreoffice-impress-nogui \
python3-uno \
python3-pip \
unoconv \

View File

@@ -18,7 +18,7 @@ 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`
2. Place the `.traineddata` files in the Tesseract tessdata directory: `/usr/share/tesseract-ocr/4.00/tessdata` (Debian) or `/usr/share/tesseract/tessdata` (Fedora)
# DO NOT REMOVE EXISTING ENG.TRAINEDDATA, ITS REQUIRED.
@@ -48,4 +48,29 @@ Add the following to your existing docker run command
If you are not using Docker, you need to install the OCR components, including the ocrmypdf app.
You can see [OCRmyPDF install guide](https://ocrmypdf.readthedocs.io/en/latest/installation.html)
Debian based systems, install languages with this command:
```bash
sudo apt update &&\
# All languages
# sudo apt install -y 'tesseract-ocr-*'
# Find languages:
apt search tesseract-ocr-
# View installed languages:
dpkg-query -W tesseract-ocr- | sed 's/tesseract-ocr-//g'
```
Fedora:
```bash
# All languages
# sudo dnf install -y tesseract-langpack-*
# Find languages:
dnf search -C tesseract-langpack-
# View installed languages:
rpm -qa | grep tesseract-langpack | sed 's/tesseract-langpack-//g'
```

View File

@@ -43,14 +43,22 @@ sudo apt-get update
sudo apt-get install -y git automake autoconf libtool libleptonica-dev pkg-config zlib1g-dev make g++ java-17-openjdk python3 python3-pip
```
For Fedora-based systems use this command:
```bash
sudo dnf install -y git automake autoconf libtool leptonica-devel pkg-config zlib-devel make gcc-c++ java-17-openjdk python3 python3-pip
```
### Step 2: Clone and Build jbig2enc (Only required for certain OCR functionality)
```bash
git clone https:github.com/agl/jbig2enc
cd jbig2enc
./autogen.sh
./configure
make
mkdir ~/.git
cd ~/.git &&\
git clone https://github.com/agl/jbig2enc.git &&\
cd jbig2enc &&\
./autogen.sh &&\
./configure &&\
make &&\
sudo make install
```
@@ -84,15 +92,24 @@ Install the following software:
For Debian-based systems, you can use the following command:
```bash
sudo apt-get install -y libreoffice-core libreoffice-common libreoffice-writer libreoffice-calc libreoffice-impress python3-uno unoconv pngquant unpaper ocrmypdf
pip3 install opencv-python-headless
sudo apt-get install -y libreoffice-writer libreoffice-calc libreoffice-impress unpaper ocrmypdf
pip3 install uno opencv-python-headless unoconv pngquant
```
For Fedora:
```bash
sudo dnf install -y libreoffice-writer libreoffice-calc libreoffice-impress unpaper ocrmypdf
pip3 install uno opencv-python-headless unoconv pngquant
```
### Step 4: Clone and Build Stirling-PDF
```bash
git clone https://github.com/Frooodle/Stirling-PDF.git
cd Stirling-PDF
cd ~/.git &&\
git clone https://github.com/Frooodle/Stirling-PDF.git &&\
cd Stirling-PDF &&\
chmod +x ./gradlew &&\
./gradlew build
```
@@ -104,18 +121,53 @@ You can move this file to a desired location, for example, `/opt/Stirling-PDF/`.
You must also move the Script folder within the Stirling-PDF repo that you have downloaded to this directory.
This folder is required for the python scripts using OpenCV
```bash
sudo mkdir /opt/Stirling-PDF &&\
sudo mv /build/libs/S-PDF-*.jar /opt/Stirling-PDF/ &&\
sudo mv scripts /opt/Stirling-PDF/ &&\
echo "Scripts installed."
```
### Step 6: Other files
#### OCR
If you plan to use the OCR (Optical Character Recognition) functionality, you might need to install language packs for Tesseract if running none english scanning.
If you plan to use the OCR (Optical Character Recognition) functionality, you might need to install language packs for Tesseract if running non-english scanning.
##### Installing Language Packs
Easiest is to use the langpacks provided by your repositories. Skip the other steps
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`
Please view [OCRmyPDF install guide](https:ocrmypdf.readthedocs.io/en/latest/installation.html) for more info.
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.
Debian based systems, install languages with this command:
```bash
sudo apt update &&\
# All languages
# sudo apt install -y 'tesseract-ocr-*'
# Find languages:
apt search tesseract-ocr-
# View installed languages:
dpkg-query -W tesseract-ocr- | sed 's/tesseract-ocr-//g'
```
Fedora:
```bash
# All languages
# sudo dnf install -y tesseract-langpack-*
# Find languages:
dnf search -C tesseract-langpack-
# View installed languages:
rpm -qa | grep tesseract-langpack | sed 's/tesseract-langpack-//g'
```
### Step 7: Run Stirling-PDF
@@ -125,6 +177,31 @@ or
java -jar build/libs/app.jar
```
### Step 8: Adding a Desktop icon
This will add a modified Appstarter to your Appmenu.
```bash
location=$(pwd)/gradlew
image=$(pwd)/docs/stirling-transparent.svg
cat > ~/.local/share/applications/Stirling-PDF.desktop <<EOF
[Desktop Entry]
Name=Stirling PDF;
GenericName=Launch StirlingPDF and open its WebGUI;
Category=Office;
Exec=xdg-open http://localhost:8080 && nohup $location bootRun &;
Icon=$image;
Keywords=pdf;
Type=Application;
NoDisplay=false;
Terminal=true;
EOF
```
Note: Currently the app will run in the background until manually closed.
---
Remember to set the necessary environment variables before running the project if you want to customize the application the list can be seen in the main readme.
You can do this in the terminal by using the `export` command or -D arguements to java -jar command:
@@ -134,4 +211,3 @@ export APP_HOME_NAME="Stirling PDF"
or
-DAPP_HOME_NAME="Stirling PDF"
```

View File

@@ -10,6 +10,11 @@
This is a powerful locally hosted web based PDF manipulation tool using docker that allows you to perform various operations on PDF files, such as splitting merging, converting, reorganizing, adding images, rotating, compressing, and more. This locally hosted web application started as a 100% ChatGPT-made application and has evolved to include a wide range of features to handle all your PDF needs.
Stirling PDF makes no outbount calls for any record keeping or tracking.
All files and PDFs are either purely client side, in server memory only during the execution of the task or within a temporay file only for execution of the task.
Any file which has been downloaded by the user will have already been deleted from the server by that time.
Feel free to request any features or bug fixes either in github issues or our [Discord](https://discord.gg/Cn8pWhQRxZ)
@@ -42,6 +47,7 @@ Feel free to request any features or bug fixes either in github issues or our [D
- Parallel file processing and downloads
- API for integration with external scripts
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)
Hosted instance/demo of the app can be seen [here](https://pdf.adminforge.de/) hosted by the team at adminforge.de
## Technologies used
@@ -75,7 +81,7 @@ docker run -d \
-e APP_HOME_NAME="Stirling PDF" \
-e APP_HOME_DESCRIPTION="Your locally hosted one-stop-shop for all your PDF needs." \
-e APP_NAVBAR_NAME="Stirling PDF" \
-e ALLOW_GOOGLE_VISABILITY="true" \
-e ALLOW_GOOGLE_VISIBILITY="true" \
-e APP_ROOT_PATH="/" \
-e APP_LOCALE="en_GB" \
```
@@ -96,7 +102,7 @@ services:
# APP_HOME_DESCRIPTION: Your locally hosted one-stop-shop for all your PDF needs.
# APP_NAVBAR_NAME: Stirling PDF
# APP_ROOT_PATH: /
# ALLOW_GOOGLE_VISABILITY: true
# ALLOW_GOOGLE_VISIBILITY: true
```
@@ -106,12 +112,16 @@ Please view https://github.com/Frooodle/Stirling-PDF/blob/main/HowToUseOCR.md
## Want to add your own language?
Stirling PDF currently supports
- English
- Arabic (العربية)
- German (Deutsch)
- French (Français)
- Spanish (Español)
- Chinese (简体中文)
- English (English) (en_GB)
- Arabic (العربية) (ar_AR)
- German (Deutsch) (de_DE)
- French (Français) (fr_FR)
- Spanish (Español) (es_ES)
- Chinese (简体中文) (it_IT)
- Catalan (Català) (zh_CN)
- Italian (Italiano) (ca_CA)
- Swedish (Svenska) (sv_SE)
- Polish (Polski) (pl_PL)
If you want to add your own language to Stirling-PDF please refer
https://github.com/Frooodle/Stirling-PDF/blob/main/HowToAddNewLanguage.md
@@ -131,10 +141,34 @@ Simply use environment variables APP_HOME_NAME, APP_HOME_DESCRIPTION and APP_NAV
If running Java directly, you can also pass these as properties using -D arguments.
Using the same method you can also change
- The default language by providing APP_LOCALE with values like de-DE fr-FR or ar-AR to select your default language (Will always default to English on invalid locale)
- Enable/Disable search engine visablility with ALLOW_GOOGLE_VISABILITY with true / false values. Default disable visability.
- The default language by providing APP_LOCALE with values like de-DE fr-FR or ar-AR (Note the - character not _ ) to select your default language (Will always default to English on invalid locale) Current accepted locales can be seen above in the Want to add your own language section
- Enable/Disable search engine visiblility with ALLOW_GOOGLE_VISIBILITY with true / false values. Default disable visiblility.
- Change root URI for Stirling-PDF ie change server.com/ to server.com/pdf-app by running APP_ROOT_PATH as pdf-app
- Disable and remove endpoints and functionality from Stirling-PDF. Currently the endpoints ENDPOINTS_TO_REMOVE and GROUPS_TO_REMOVE can include comma seperated 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)
## API
For those wanting to use Stirling-PDFs backend API to link with their own custom scripting to edit PDFs you can view all existing API documentation
[here](https://app.swaggerhub.com/apis-docs/Frooodle/Stirling-PDF/1.0.0) or navigate to /swagger-ui/index.html of your stirling-pdf instance for your versions documentation
[here](https://app.swaggerhub.com/apis-docs/Frooodle/Stirling-PDF/) or navigate to /swagger-ui/index.html of your stirling-pdf instance for your versions documentation
## FAQ
### Q1: Where is the authentication for Stirling PDF
There is no Auth within Stirling PDF and there is none planned. This feature will not be added. Instead its recommended to use trusted and secure auth software like Authentik or Authelia.
### Q2: What are your planned features
- Crop
- Progress bar/Tracking
- Annotations (Sign/draw logic directly on page)
- Full custom logic pipelines to combine multiple operations together.
- Folder support with auto scanning to perform operations on
- Redact text
- Add page numbers
- Auto rename (Renames file based on file title text)
- URL to PDF
- Change contrast
### Q3: Why is my application download .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.

View File

@@ -5,7 +5,7 @@ plugins {
}
group = 'stirling.software'
version = '0.8.0'
version = '0.8.3'
sourceCompatibility = '17'
repositories {
@@ -24,6 +24,11 @@ dependencies {
//general PDF
implementation 'org.apache.pdfbox:pdfbox:2.0.28'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-core'
developmentOnly("org.springframework.boot:spring-boot-devtools")
}

32
groups.md Normal file
View File

@@ -0,0 +1,32 @@
Operation | PageOps | Convert | Security | Other | CLI | Python | OpenCV | LibreOffice | OCRmyPDF | Java | Javascript
--------------------|---------|---------|----------|-------|------|--------|--------|-------------|--------- |-------- |-----------
remove-pages | X | | | | | | | | | X |
merge-pdfs | X | | | | | | | | | X |
split-pdfs | X | | | | | | | | | X |
pdf-organizer | X | | | | | | | | | X | X
rotate-pdf | X | | | | | | | | | X |
pdf-to-img | | X | | | | | | | | X |
img-to-pdf | | X | | | | | | | | X |
pdf-to-pdfa | | X | | | X | | | | X | |
file-to-pdf | | X | | | X | | | X | | |
xlsx-to-pdf | | X | | | X | | | X | | |
pdf-to-word | | X | | | X | | | X | | |
pdf-to-presentation | | X | | | X | | | X | | |
pdf-to-text | | X | | | X | | | X | | |
pdf-to-html | | X | | | X | | | X | | |
pdf-to-xml | | X | | | X | | | X | | |
add-password | | | X | | | | | | | X |
remove-password | | | X | | | | | | | X |
change-permissions | | | X | | | | | | | X |
add-watermark | | | X | | | | | | | X |
ocr-pdf | | | | X | X | | | | X | |
add-image | | | | X | | | | | | X |
compress-pdf | | | | X | X | | | | X
extract-images | | | | X | | | | | | X |
change-metadata | | | | X | | | | | | X |
extract-image-scans | | | | X | X | X | X | | | |
sign | | | | X | | | | | | | X
flatten | | | | X | | | | | | |
repair | | | | X | X | | | X | | |
remove-blanks | | | | X | X | X | X | | | |
compare | | | | X | | | | | | | X

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 128 KiB

View File

@@ -0,0 +1,192 @@
package stirling.software.SPDF.config;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.slf4j.Logger;
@Service
public class EndpointConfiguration {
private static final Logger logger = LoggerFactory.getLogger(EndpointConfiguration.class);
private Map<String, Boolean> endpointStatuses = new ConcurrentHashMap<>();
private Map<String, Set<String>> endpointGroups = new ConcurrentHashMap<>();
public EndpointConfiguration() {
init();
processEnvironmentConfigs();
}
public void enableEndpoint(String endpoint) {
endpointStatuses.put(endpoint, true);
}
public void disableEndpoint(String endpoint) {
logger.info("Disabling {}", endpoint);
endpointStatuses.put(endpoint, false);
}
public boolean isEndpointEnabled(String endpoint) {
if (endpoint.startsWith("/")) {
endpoint = endpoint.substring(1);
}
return endpointStatuses.getOrDefault(endpoint, true);
}
public void addEndpointToGroup(String group, String endpoint) {
endpointGroups.computeIfAbsent(group, k -> new HashSet<>()).add(endpoint);
}
public void enableGroup(String group) {
Set<String> endpoints = endpointGroups.get(group);
if (endpoints != null) {
for (String endpoint : endpoints) {
enableEndpoint(endpoint);
}
}
}
public void disableGroup(String group) {
Set<String> endpoints = endpointGroups.get(group);
if (endpoints != null) {
for (String endpoint : endpoints) {
disableEndpoint(endpoint);
}
}
}
public void init() {
// Adding endpoints to "PageOps" group
addEndpointToGroup("PageOps", "remove-pages");
addEndpointToGroup("PageOps", "merge-pdfs");
addEndpointToGroup("PageOps", "split-pdfs");
addEndpointToGroup("PageOps", "pdf-organizer");
addEndpointToGroup("PageOps", "rotate-pdf");
// Adding endpoints to "Convert" group
addEndpointToGroup("Convert", "pdf-to-img");
addEndpointToGroup("Convert", "img-to-pdf");
addEndpointToGroup("Convert", "pdf-to-pdfa");
addEndpointToGroup("Convert", "file-to-pdf");
addEndpointToGroup("Convert", "xlsx-to-pdf");
addEndpointToGroup("Convert", "pdf-to-word");
addEndpointToGroup("Convert", "pdf-to-presentation");
addEndpointToGroup("Convert", "pdf-to-text");
addEndpointToGroup("Convert", "pdf-to-html");
addEndpointToGroup("Convert", "pdf-to-xml");
// Adding endpoints to "Security" group
addEndpointToGroup("Security", "add-password");
addEndpointToGroup("Security", "remove-password");
addEndpointToGroup("Security", "change-permissions");
addEndpointToGroup("Security", "add-watermark");
// Adding endpoints to "Other" group
addEndpointToGroup("Other", "ocr-pdf");
addEndpointToGroup("Other", "add-image");
addEndpointToGroup("Other", "compress-pdf");
addEndpointToGroup("Other", "extract-images");
addEndpointToGroup("Other", "change-metadata");
addEndpointToGroup("Other", "extract-image-scans");
addEndpointToGroup("Other", "sign");
addEndpointToGroup("Other", "flatten");
addEndpointToGroup("Other", "repair");
addEndpointToGroup("Other", "remove-blanks");
addEndpointToGroup("Other", "compare");
//CLI
addEndpointToGroup("CLI", "compress-pdf");
addEndpointToGroup("CLI", "extract-image-scans");
addEndpointToGroup("CLI", "remove-blanks");
addEndpointToGroup("CLI", "repair");
addEndpointToGroup("CLI", "pdf-to-pdfa");
addEndpointToGroup("CLI", "file-to-pdf");
addEndpointToGroup("CLI", "xlsx-to-pdf");
addEndpointToGroup("CLI", "pdf-to-word");
addEndpointToGroup("CLI", "pdf-to-presentation");
addEndpointToGroup("CLI", "pdf-to-text");
addEndpointToGroup("CLI", "pdf-to-html");
addEndpointToGroup("CLI", "pdf-to-xml");
addEndpointToGroup("CLI", "ocr-pdf");
//python
addEndpointToGroup("Python", "extract-image-scans");
addEndpointToGroup("Python", "remove-blanks");
//openCV
addEndpointToGroup("OpenCV", "extract-image-scans");
addEndpointToGroup("OpenCV", "remove-blanks");
//LibreOffice
addEndpointToGroup("LibreOffice", "repair");
addEndpointToGroup("LibreOffice", "file-to-pdf");
addEndpointToGroup("LibreOffice", "xlsx-to-pdf");
addEndpointToGroup("LibreOffice", "pdf-to-word");
addEndpointToGroup("LibreOffice", "pdf-to-presentation");
addEndpointToGroup("LibreOffice", "pdf-to-text");
addEndpointToGroup("LibreOffice", "pdf-to-html");
addEndpointToGroup("LibreOffice", "pdf-to-xml");
//OCRmyPDF
addEndpointToGroup("OCRmyPDF", "compress-pdf");
addEndpointToGroup("OCRmyPDF", "pdf-to-pdfa");
addEndpointToGroup("OCRmyPDF", "ocr-pdf");
//Java
addEndpointToGroup("Java", "merge-pdfs");
addEndpointToGroup("Java", "remove-pages");
addEndpointToGroup("Java", "split-pdfs");
addEndpointToGroup("Java", "pdf-organizer");
addEndpointToGroup("Java", "rotate-pdf");
addEndpointToGroup("Java", "pdf-to-img");
addEndpointToGroup("Java", "img-to-pdf");
addEndpointToGroup("Java", "add-password");
addEndpointToGroup("Java", "remove-password");
addEndpointToGroup("Java", "change-permissions");
addEndpointToGroup("Java", "add-watermark");
addEndpointToGroup("Java", "add-image");
addEndpointToGroup("Java", "extract-images");
addEndpointToGroup("Java", "change-metadata");
//Javascript
addEndpointToGroup("Javascript", "pdf-organizer");
addEndpointToGroup("Javascript", "sign");
addEndpointToGroup("Javascript", "compare");
}
private void processEnvironmentConfigs() {
String endpointsToRemove = System.getenv("ENDPOINTS_TO_REMOVE");
String groupsToRemove = System.getenv("GROUPS_TO_REMOVE");
if (endpointsToRemove != null) {
String[] endpoints = endpointsToRemove.split(",");
for (String endpoint : endpoints) {
disableEndpoint(endpoint.trim());
}
}
if (groupsToRemove != null) {
String[] groups = groupsToRemove.split(",");
for (String group : groups) {
disableGroup(group.trim());
}
}
}
}

View File

@@ -0,0 +1,26 @@
package stirling.software.SPDF.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@Component
public class EndpointInterceptor implements HandlerInterceptor {
@Autowired
private EndpointConfiguration endpointConfiguration;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String requestURI = request.getRequestURI();
if (!endpointConfiguration.isEndpointEnabled(requestURI)) {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "This endpoint is disabled");
return false;
}
return true;
}
}

View File

@@ -0,0 +1,28 @@
package stirling.software.SPDF.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.config.MeterFilter;
import io.micrometer.core.instrument.config.MeterFilterReply;
@Configuration
public class MetricsConfig {
@Bean
public MeterFilter meterFilter() {
return new MeterFilter() {
@Override
public MeterFilterReply accept(Meter.Id id) {
if (id.getName().equals("http.requests")) {
return MeterFilterReply.NEUTRAL;
}
return MeterFilterReply.DENY;
}
};
}
}

View File

@@ -0,0 +1,50 @@
package stirling.software.SPDF.config;
import java.io.IOException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.config.MeterFilter;
import io.micrometer.core.instrument.config.MeterFilterReply;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@Component
public class MetricsFilter extends OncePerRequestFilter {
private final MeterRegistry meterRegistry;
@Autowired
public MetricsFilter(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String uri = request.getRequestURI();
// Ignore static resources
if (!(uri.startsWith("/js") || uri.startsWith("/images") || uri.endsWith(".ico") || uri.endsWith(".css") || uri.endsWith(".svg")|| uri.endsWith(".js") || uri.contains("swagger") || uri.startsWith("/api"))) {
Counter counter = Counter.builder("http.requests")
.tag("uri", uri)
.tag("method", request.getMethod())
.register(meterRegistry);
counter.increment();
}
filterChain.doFilter(request, response);
}
}

View File

@@ -0,0 +1,18 @@
package stirling.software.SPDF.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private EndpointInterceptor endpointInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(endpointInterceptor);
}
}

View File

@@ -80,9 +80,9 @@ public class GeneralWebController {
@ResponseBody
@Hidden
public String getRobotsTxt() {
String allowGoogleVisibility = System.getProperty("ALLOW_GOOGLE_VISABILITY");
String allowGoogleVisibility = System.getProperty("ALLOW_GOOGLE_VISIBILITY");
if (allowGoogleVisibility == null)
allowGoogleVisibility = System.getenv("ALLOW_GOOGLE_VISABILITY");
allowGoogleVisibility = System.getenv("ALLOW_GOOGLE_VISIBILITY");
if (allowGoogleVisibility == null)
allowGoogleVisibility = "false";
if (Boolean.parseBoolean(allowGoogleVisibility)) {

View File

@@ -0,0 +1,80 @@
package stirling.software.SPDF.controller.web;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.swagger.v3.oas.annotations.Operation;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1")
public class MetricsController {
private final MeterRegistry meterRegistry;
public MetricsController(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
}
@GetMapping("/status")
@Operation(summary = "Application status and version",
description = "This endpoint returns the status of the application and its version number.")
public Map<String, String> getStatus() {
Map<String, String> status = new HashMap<>();
status.put("status", "UP");
status.put("version", getClass().getPackage().getImplementationVersion());
return status;
}
@GetMapping("/loads")
@Operation(summary = "GET request count",
description = "This endpoint returns the total count of GET requests or the count of GET requests for a specific endpoint.")
public Double getPageLoads(@RequestParam Optional<String> endpoint) {
try {
double count = 0.0;
for (Meter meter : meterRegistry.getMeters()) {
if (meter.getId().getName().equals("http.requests")) {
String method = meter.getId().getTag("method");
if (method != null && method.equals("GET")) {
if (meter instanceof Counter) {
count += ((Counter) meter).count();
}
}
}
}
return count;
} catch (Exception e) {
return -1.0;
}
}
@GetMapping("/requests")
@Operation(summary = "POST request count",
description = "This endpoint returns the total count of POST requests or the count of POST requests for a specific endpoint.")
public Double getTotalRequests(@RequestParam Optional<String> endpoint) {
try {
Counter counter;
if (endpoint.isPresent()) {
counter = meterRegistry.get("http.requests")
.tags("method", "POST", "uri", endpoint.get()).counter();
} else {
counter = meterRegistry.get("http.requests")
.tags("method", "POST").counter();
}
return counter.count();
} catch (Exception e) {
return -1.0;
}
}
}

View File

@@ -23,3 +23,6 @@ spring.devtools.restart.enabled=true
spring.devtools.livereload.enabled=true
spring.thymeleaf.encoding=UTF-8
server.connection-timeout=${CONNECTION_TIMEOUT:5m}
spring.mvc.async.request-timeout=${ASYNC_CONNECTION_TIMEOUT:300000}

View File

@@ -21,6 +21,9 @@ false=\u062E\u0637\u0623
unknown=\u063A\u064A\u0631 \u0645\u0639\u0631\u0648\u0641
save=\u062D\u0641\u0638
close=\u0625\u063A\u0644\u0627\u0642
filesSelected = الملفات المحددة
noFavourites = لم تتم إضافة أي مفضلات
bored = الانتظار بالملل؟
#############
# HOME-PAGE #

View File

@@ -17,7 +17,9 @@ false=Fals
unknown=Desconegut
save=Desa
close=Tanca
filesSelected=fitxers seleccionats
noFavourites=No s'ha afegit cap favorit
bored=Avorrit esperant?
#############
# HOME-PAGE #
#############

View File

@@ -17,7 +17,9 @@ false=Falsch
unknown=Unbekannt
save=Speichern
close=Schließen
filesSelected=Dateien ausgewählt
noFavourites=Keine Favoriten hinzugefügt
bored=Gelangweiltes Warten?
#############
# HOME-PAGE #
#############

View File

@@ -17,7 +17,9 @@ false=False
unknown=Unknown
save=Save
close=Close
filesSelected=files selected
noFavourites=No favourites added
bored=Bored Waiting?
#############
# HOME-PAGE #
#############

View File

@@ -17,7 +17,9 @@ false=Falso
unknown=Desconocido
save=Guardar
close=Cerrar
filesSelected=archivos seleccionados
noFavourites=No se agregaron favoritos
bored=¿Aburrido de esperar?
#############
# HOME-PAGE #
#############

View File

@@ -21,7 +21,9 @@ false=Faux
unknown=Inconnu
save=Enregistrer
close=Fermer
filesSelected=fichiers sélectionnés
noFavourites=Aucun favori ajouté
bored=Ennuyé d'attendre ?
#############
# HOME-PAGE #
#############

View File

@@ -0,0 +1,432 @@
###########
# Generic #
###########
# the direction that the language is written (ltr = left to right, rtl = right to left)
language.direction=ltr
pdfPrompt=Scegli PDF
multiPdfPrompt=Scegli 2 o più PDF
multiPdfDropPrompt=Scegli (o trascina e rilascia) uno o più PDF
imgPrompt=Scegli immagine/i
genericSubmit=Invia
processTimeWarning=Nota: Questo processo potrebbe richiedere fino a un minuto in base alla dimensione dei file
pageOrderPrompt=Ordine delle pagine (inserisci una lista di numeri separati da virgola):
goToPage=Vai
true=Vero
false=Falso
unknown=Sconosciuto
save=Salva
close=Chiudi
filesSelected=file selezionati
noFavourites=Nessun preferito
bored=Stanco di aspettare?
#############
# HOME-PAGE #
#############
home.desc=La tua pagina self-hostata per gestire qualsiasi PDF.
navbar.convert=Converti
navbar.security=Sicurezza
navbar.other=Altro
navbar.darkmode=Modalità Scura
navbar.pageOps=Modifica pagine
home.multiTool.title=Multifunzione PDF
home.multiTool.desc=Unisci, Ruota, Riordina, e Rimuovi pagine
home.merge.title=Unisci
home.merge.desc=Unisci facilmente più PDF in uno.
home.split.title=Dividi
home.split.desc=Dividi un singolo PDF in più documenti.
home.rotate.title=Ruota
home.rotate.desc=Ruota un PDF.
home.imageToPdf.title=Da immagine a PDF
home.imageToPdf.desc=Converti un'immagine (PNG, JPEG, GIF) in PDF.
home.pdfToImage.title=Da PDF a immagine
home.pdfToImage.desc=Converti un PDF in un'immagine. (PNG, JPEG, GIF)
home.pdfOrganiser.title=Organizza
home.pdfOrganiser.desc=Rimuovi/Riordina le pagine in qualsiasi ordine.
home.addImage.title=Aggiungi Immagine
home.addImage.desc=Aggiungi un'immagine in un punto specifico del PDF (Work in progress)
home.watermark.title=Aggiungi Filigrana
home.watermark.desc=Aggiungi una filigrana al tuo PDF.
home.remove-watermark.title=Rimuovi Filigrana
home.remove-watermark.desc=Rimuovi la filigrana dal tuo PDF.
home.permissions.title=Cambia Permessi
home.permissions.desc=Cambia i permessi del tuo PDF.
home.removePages.title=Rimuovi
home.removePages.desc=Elimina alcune pagine dal PDF.
home.addPassword.title=Aggiungi Password
home.addPassword.desc=Crittografa il tuo PDF con una password.
home.removePassword.title=Rimuovi Password
home.removePassword.desc=Rimuovi la password dal tuo PDF.
home.compressPdfs.title=Comprimi
home.compressPdfs.desc=Comprimi PDF per ridurne le dimensioni.
home.changeMetadata.title=Modifica Proprietà
home.changeMetadata.desc=Modifica/Aggiungi/Rimuovi le proprietà di un documento PDF.
home.fileToPDF.title=Converti file in PDF
home.fileToPDF.desc=Converti quasi ogni file in PDF (DOCX, PNG, XLS, PPT, TXT e altro)
home.ocr.title=OCR / Pulisci scansioni
home.ocr.desc=Pulisci scansioni ed estrai testo da immagini, convertendo le immagini in testo puro.
home.extractImages.title=Estrai immagini
home.extractImages.desc=Estrai tutte le immagini da un PDF e salvale come zip.
home.pdfToPDFA.title=Converti in PDF/A
home.pdfToPDFA.desc=Converti un PDF nel formato PDF/A per archiviazione a lungo termine.
home.PDFToWord.title=Da PDF a Word
home.PDFToWord.desc=Converti un PDF nei formati Word (DOC, DOCX e ODT)
home.PDFToPresentation.title=Da PDF a presentazioni
home.PDFToPresentation.desc=Converti un PDF in presentazioni (PPT, PPTX and ODP)
home.PDFToText.title=Da PDF a testo/RTF
home.PDFToText.desc=Converti un PDF in testo o RTF.
home.PDFToHTML.title=Da PDF ad HTML
home.PDFToHTML.desc=Converti un PDF in HTML.
home.PDFToXML.title=Da PDF a XML
home.PDFToXML.desc=Converti un PDF in XML.
home.ScannerImageSplit.title=Trova/Dividi foto scansionate
home.ScannerImageSplit.desc=Estrai più foto da una singola foto o PDF.
home.sign.title=Firma
home.sign.desc=Aggiungi una firma al PDF da disegno, testo o immagine.
home.flatten.title=Appiattisci
home.flatten.desc=Rimuovi tutti gli elementi interattivi e moduli da un PDF.
home.repair.title=Ripara
home.repair.desc=Prova a riparare un PDF corrotto.
home.removeBlanks.title=Rimuovi pagine vuote
home.removeBlanks.desc=Trova e rimuovi pagine vuote da un PDF.
home.compare.title=Compara
home.compare.desc=Vedi e compara le differenze tra due PDF.
downloadPdf=Scarica PDF
text=Testo
font=Font
removeBlanks.title=Rimuovi spazi vuoti
removeBlanks.header=Rimuovi pagine vuote
removeBlanks.threshold=Soglia:
removeBlanks.thresholdDesc=Soglia che determina un pixel 'bianco'
removeBlanks.whitePercent=Percentuale di bianco (%):
removeBlanks.whitePercentDesc=Percentuale della pagina che deve essere bianca per venire rimossa
removeBlanks.submit=Rimuovi
compare.title=Compara
compare.header=Compara PDF
compare.document.1=Documento 1
compare.document.2=Documento 2
compare.submit=Compara
sign.title=Firma
sign.header=Firma PDF
sign.upload=Carica immagine
sign.draw=Disegna Firma
sign.text=Testo
sign.clear=Cancella
sign.add=Aggiungi
repair.title=Ripara
repair.header=Ripara PDF
repair.submit=Ripara
flatten.title=Appiattisci
flatten.header=Appiattisci PDF
flatten.submit=Appiattisci
ScannerImageSplit.selectText.1=Soglia angolo:
ScannerImageSplit.selectText.2=Imposta il minimo angolo richiesto perché l'immagine venga ruotata (default: 10).
ScannerImageSplit.selectText.3=Tolleranza:
ScannerImageSplit.selectText.4=Imposta lo spettro di colori attorno al colore di sfondo stimato (default: 30).
ScannerImageSplit.selectText.5=Area minima:
ScannerImageSplit.selectText.6=Imposta l'area minima di una foto (default: 10000).
ScannerImageSplit.selectText.7=Area di contorno minima:
ScannerImageSplit.selectText.8=Imposta l'area minima del contorno di una foto
ScannerImageSplit.selectText.9=Spessore bordo:
ScannerImageSplit.selectText.10=Imposta lo spessore del bordo aggiunto o rimosso per prevenire bordi bianchi nel risultato (default: 1).
navbar.settings=Impostazioni
settings.title=Impostazioni
settings.update=Aggiornamento disponibile
settings.appVersion=Versione App:
settings.downloadOption.title=Scegli opzione di download (Per file singoli non compressi):
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
#OCR
ocr.title=OCR / Pulisci scansioni
ocr.header=Pulisci scansioni / OCR (riconoscimento testo)
ocr.selectText.1=Scegli lingue da usare per il riconoscimento testo (L'elenco contiene quelle attualmente disponibili):
ocr.selectText.2=Crea file di testo contenente il testo estratto oltre al PDF originale
ocr.selectText.3=Sistema le pagine che sono state scansionate storte ruotandole in posizione corretta.
ocr.selectText.4=Pulisci il foglio in modo da evitare errori nella lettura. (non cambia il risultato)
ocr.selectText.5=Pulisci il foglio in modo da evitare errori nella lettura. (cambia il risultato)
ocr.selectText.6=Ignora pagine che contengono testo interattivo, scansiona solo pagine che contengono immagini
ocr.selectText.7=Forza scansione, scansiona ogni pagina rimuovendo gli elementi originali
ocr.selectText.8=Normale (Darà errore se il PDF contiene testo)
ocr.selectText.9=Impostazioni extra
ocr.selectText.10=Modalità OCR
ocr.selectText.11=Rimuovi immagini dopo la scansione (Rimuove TUTTE le immagini, utile solo come parte del processo di conversione)
ocr.selectText.12=Modalità di rendering (avanzato)
ocr.help=Per favore leggi la documentazione su come usare il programma per altri linguaggi e/o uso non in Docker
ocr.credit=Questo servizio utilizza OCRmyPDF e Tesseract per l'OCR.
ocr.submit=Scansiona testo nel PDF con OCR
extractImages.title=Estrai immagini
extractImages.header=Estrai immagini
extractImages.selectText=Seleziona il formato in cui salvare le immagini estratte
extractImages.submit=Estrai
#File to PDF
fileToPDF.title=Converti file in PDF
fileToPDF.header=Converti qualsiasi file in PDF
fileToPDF.credit=Questo servizio utilizza LibreOffice e Unoconv per la conversione dei file.
fileToPDF.supportedFileTypes=I formati file supportati dovrebbero includere quelli sottostanti. Tuttavia, per una lista aggiornata controlla la documentazione di LibreOffice
fileToPDF.submit=Converti in PDF
#compress
compress.title=Comprimi
compress.header=Comprimi PDF
compress.credit=Questo servizio utilizza OCRmyPDF per la compressione e ottimizzazione.
compress.selectText.1=Livello di ottimizzazione:
compress.selectText.2=0 (Nessuna compressione)
compress.selectText.3=1 (Default, nessuna perdita di qualità)
compress.selectText.4=2 (Perdita di qualità)
compress.selectText.5=3 (Perdita di qualità, più aggressivo)
compress.selectText.6=Visualizzazione rapida sul web (linearizza PDF)
compress.selectText.7=Attiva codifica JBIG2 (lossy)
compress.submit=Comprimi
#Add image
addImage.title=Aggiungi Immagine
addImage.header=Aggiungi un'immagine ad un PDF.
addImage.everyPage=Ogni pagina?
addImage.submit=Aggiungi immagine
#merge
merge.title=Unisci
merge.header=Unisci 2 o più PDF
merge.submit=Unisci
#pdfOrganiser
pdfOrganiser.title=Organizza pagine
pdfOrganiser.header=Organizza le pagine di un PDF
pdfOrganiser.submit=Riordina pagine
#multiTool
multiTool.title=Multifunzione PDF
multiTool.header=Multifunzione PDF
#pageRemover
pageRemover.title=Rimuovi pagine
pageRemover.header=Rimuovi pagine da un PDF
pageRemover.pagesToDelete=Pagine da eliminare (inserisci una lista di numeri separati da virgola):
pageRemover.submit=Rimuovi pagine
#rotate
rotate.title=Ruota PDF
rotate.header=Ruota PDF
rotate.selectAngle=Scegli angolo di rotazione (in multipli di 90 gradi):
rotate.submit=Ruota
#split
split.title=Dividi PDF
split.header=Dividi PDF
split.desc.1=I numeri che scegli sono le pagine a cui desideri dividere il documento
split.desc.2=Per esempio inserendo 1,3,7-8 separeresti un documento di 10 pagine in 6 diversi PDF con:
split.desc.3=Documento #1: Pagina 1
split.desc.4=Documento #2: Pagine 2 e 3
split.desc.5=Documento #3: Pagine 4, 5 e 6
split.desc.6=Documento #4: Pagina 7
split.desc.7=Documento #5: Pagina 8
split.desc.8=Documento #6: Pagine 9 e 10
split.splitPages=Inserisci pagine a cui dividere:
split.submit=Dividi
#imageToPDF
imageToPDF.title=Immagine a PDF
imageToPDF.header=Immagine a PDF
imageToPDF.submit=Converti
imageToPDF.selectText.1=Allarga per riempire
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
imageToPDF.selectText.5=Converti in PDF separati
#pdfToImage
pdfToImage.title=PDF a immagine
pdfToImage.header=PDF a immagine
pdfToImage.selectText=Formato immagini
pdfToImage.singleOrMultiple=Tipo di immagine
pdfToImage.single=Unica immagine larga
pdfToImage.multi=Più immagini
pdfToImage.colorType=Tipo di colore
pdfToImage.color=A colori
pdfToImage.grey=Scala di grigi
pdfToImage.blackwhite=Bianco e Nero (potresti perdere dettagli!)
pdfToImage.submit=Converti
#addPassword
addPassword.title=Aggiungi Password
addPassword.header=Aggiungi password (crittografa)
addPassword.selectText.1=Seleziona PDF da crittografare
addPassword.selectText.2=Password
addPassword.selectText.3=Lunghezza chiave
addPassword.selectText.4=Valori più grandi sono più sicuri, ma valori più piccoli offrono una compatibilità maggiore.
addPassword.selectText.5=Permessi
addPassword.selectText.6=Previeni assemblaggio del documento
addPassword.selectText.7=Previeni estrazione del contenuto
addPassword.selectText.8=Previeni estrazione per accessibilità
addPassword.selectText.9=Previeni compilazione dei moduli
addPassword.selectText.10=Previeni modifiche
addPassword.selectText.11=Previeni annotazioni
addPassword.selectText.12=Previeni stampa
addPassword.selectText.13=Previeni stampa in diversi formati
addPassword.submit=Crittografa
#watermark
watermark.title=Aggiungi Filigrana
watermark.header=Aggiungi filigrana
watermark.selectText.1=Seleziona PDF a cui aggiungere la filigrana:
watermark.selectText.2=Testo:
watermark.selectText.3=Dimensione carattere:
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.submit=Aggiungi Filigrana
#remove-watermark
remove-watermark.title=Rimuovi Filigrana
remove-watermark.header=Rimuovi filigrana
remove-watermark.selectText.1=Seleziona PDF da cui rimuovere la filigrana:
remove-watermark.selectText.2=Testo:
remove-watermark.submit=Rimuovi Filigrana
#Change permissions
permissions.title=Cambia Permessi
permissions.header=Cambia permessi
permissions.warning=Attenzione: per avere questi permessi non modificabili è raccomandabile impostarli attraverso una password
permissions.selectText.1=Seleziona PDF a cui cambiare permessi
permissions.selectText.2=Permessi da impostare
permissions.selectText.3=Previeni assemblaggio del documento
permissions.selectText.4=Previeni estrazione del contenuto
permissions.selectText.5=Previeni estrazione per accessibilità
permissions.selectText.6=Previeni compilazione dei moduli
permissions.selectText.7=Previeni modifiche
permissions.selectText.8=Previeni annotazioni
permissions.selectText.9=Previeni stampa
permissions.selectText.10=Previeni stampa in diversi formati
permissions.submit=Cambia Permessi
#remove password
removePassword.title=Rimuovi Password
removePassword.header=Rimuovi password (de-crittografa)
removePassword.selectText.1=Seleziona PDF da decrittare
removePassword.selectText.2=Password
removePassword.submit=Rimuovi Password
changeMetadata.title=Cambia Proprietà
changeMetadata.header=Cambia Proprietà
changeMetadata.selectText.1=Imposta i dati che vuoi cambiare
changeMetadata.selectText.2=Cancella tutte le proprietà
changeMetadata.selectText.3=Visualizza proprietà custom:
changeMetadata.author=Autore:
changeMetadata.creationDate=Data di creazione (yyyy/MM/dd HH:mm:ss):
changeMetadata.creator=Creatore:
changeMetadata.keywords=Parole chiave:
changeMetadata.modDate=Data di modifica (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Produttore:
changeMetadata.subject=Oggetto:
changeMetadata.title=Titolo:
changeMetadata.trapped=Trapped:
changeMetadata.selectText.4=Altre proprietà:
changeMetadata.selectText.5=Aggiungi proprietà personalizzata:
changeMetadata.submit=Cambia Proprietà
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.title=Da PDF a PDF/A
pdfToPDFA.header=Da PDF a PDF/A
pdfToPDFA.credit=Questo servizio utilizza OCRmyPDF per la conversione in PDF/A.
pdfToPDFA.submit=Converti
PDFToWord.title=Da PDF a Word
PDFToWord.header=Da PDF a Word
PDFToWord.selectText.1=Formato file di output
PDFToWord.credit=Questo servizio utilizza LibreOffice per la conversione.
PDFToWord.submit=Converti
PDFToPresentation.title=Da PDF a presentazione
PDFToPresentation.header=Da PDF a presentazione
PDFToPresentation.selectText.1=Formato file di output
PDFToPresentation.credit=Questo servizio utilizza LibreOffice per la conversione.
PDFToPresentation.submit=Converti
PDFToText.title=Da PDF a testo/RTF
PDFToText.header=Da PDF a testo/RTF
PDFToText.selectText.1=Formato file di output
PDFToText.credit=Questo servizio utilizza LibreOffice per la conversione.
PDFToText.submit=Converti
PDFToHTML.title=Da PDF a HTML
PDFToHTML.header=Da PDF a HTML
PDFToHTML.credit=Questo servizio utilizza LibreOffice per la conversione.
PDFToHTML.submit=Converti
PDFToXML.title=Da PDF a XML
PDFToXML.header=Da PDF a XML
PDFToXML.credit=Questo servizio utilizza LibreOffice per la conversione.
PDFToXML.submit=Converti

View File

@@ -0,0 +1,432 @@
###########
# Generic #
###########
# the direction that the language is written (ltr = left to right, rtl = right to left)
language.direction=ltr
pdfPrompt=Wybierz PDF
multiPdfPrompt=Wybierz PDF (2+)
multiPdfDropPrompt=Wybierz (lub przeciągnij i puść) wszystkie pliki PDF
imgPrompt=Wybierz obraz(y)
genericSubmit=Wyślij
processTimeWarning=Ostrzeżenie: Ten proces może potrwać do minuty, w zależności od rozmiaru pliku
pageOrderPrompt=Kolejność stron (wprowadź listę numerów stron oddzielonych przecinkami) :
goToPage=Idź
true=Prawda
false=Fałsz
unknown=Nieznany
save=Zapisz
close=Zamknij
filesSelected=wybrane pliki
noFavourites=Nie dodano ulubionych
bored=Znudzony czekaniem?
#############
# HOME-PAGE #
#############
home.desc=Twoja lokalna aplikacja do kompleksowej obsługi Twoich potrzeb związanych z plikami PDF.
navbar.convert=Konwertuj
navbar.security=Bezpieczeństwo
navbar.other=Inne
navbar.darkmode=Tryb nocny
navbar.pageOps=Operacje strony
home.multiTool.title=Wielofunkcyjne narzędzie PDF
home.multiTool.desc=Łącz, dziel, obracaj, zmieniaj kolejność i usuwaj strony
home.merge.title=Połącz
home.merge.desc=Łatwe łączenie wielu plików PDF w jeden.
home.split.title=Podziel
home.split.desc=Podziel pliki PDF na wiele dokumentów
home.rotate.title=Obróć
home.rotate.desc=Łatwo obracaj pliki PDF.
home.imageToPdf.title=Obraz na PDF
home.imageToPdf.desc=Konwertuj obraz (PNG, JPEG, GIF) do formatu PDF.
home.pdfToImage.title=PDF na Obraz
home.pdfToImage.desc=Konwertuj plik PDF na obraz (PNG, JPEG, GIF).
home.pdfOrganiser.title=Uporządkuj
home.pdfOrganiser.desc=Usuń/Zmień kolejność stron w dowolnej kolejności
home.addImage.title=Dodaj obraz
home.addImage.desc=Dodaje obraz do wybranej lokalizacji w dokumencie PDF (komponent w budowie)
home.watermark.title=Dodaj znak wodny
home.watermark.desc=Dodaj niestandardowy znak wodny do dokumentu PDF.
home.remove-watermark.title=Usuń znak wodny
home.remove-watermark.desc=Usuń znaki wodne z dokumentu PDF.
home.permissions.title=Zmień uprawnienia
home.permissions.desc=Zmień uprawnienia dokumentu PDF
home.removePages.title=Usuń
home.removePages.desc=Usuń niechciane strony z dokumentu PDF.
home.addPassword.title=Dodaj hasło
home.addPassword.desc=Zaszyfruj dokument PDF za pomocą hasła.
home.removePassword.title=Usuń hasło
home.removePassword.desc=Usuń ochronę hasłem z dokumentu PDF.
home.compressPdfs.title=Kompresuj
home.compressPdfs.desc=Kompresuj dokumenty PDF, aby zmniejszyć ich rozmiar.
home.changeMetadata.title=Zmień metadane
home.changeMetadata.desc=Zmień/Usuń/Dodaj metadane z dokumentu PDF
home.fileToPDF.title=Konwertuj plik do formatu PDF
home.fileToPDF.desc=Konwertuj prawie każdy plik do formatu PDF (DOCX, PNG, XLS, PPT, TXT i więcej)
home.ocr.title=OCR / Zamiana na tekst
home.ocr.desc=OCR skanuje i wykrywa tekst z obrazów w pliku PDF i zamienia go na tekst.
home.extractImages.title=Wyodrębnij obrazy
home.extractImages.desc=Wyodrębnia wszystkie obrazy z pliku PDF i zapisuje je w formacie zip
home.pdfToPDFA.title=PDF na PDF/A
home.pdfToPDFA.desc=Konwertuj pliki PDF na PDF/A w celu długoterminowego przechowywania
home.PDFToWord.title=PDF na Word
home.PDFToWord.desc=Konwertuj pliki PDF na formaty Microsoft Word (DOC, DOCX i ODT)
home.PDFToPresentation.title=PDF na Prezentację
home.PDFToPresentation.desc=Konwertuj pliki PDF na formaty prezentacji (PPT, PPTX i ODP)
home.PDFToText.title=PDF na Tekst/RTF
home.PDFToText.desc=Konwertuj PDF na tekst lub format RTF
home.PDFToHTML.title=PDF na HTML
home.PDFToHTML.desc=Konwertuj PDF na format HTML
home.PDFToXML.title=PDF na XML
home.PDFToXML.desc=Konwertuj PDF na format XML
home.ScannerImageSplit.title=Wykryj/Podziel zeskanowane zdjęcia
home.ScannerImageSplit.desc=Podziel na wiele zdjęć z jednego zdjęcia/PDF
home.sign.title=Podpis
home.sign.desc=Dodaje podpis do pliku PDF za pomocą rysunku, tekstu lub obrazu
home.flatten.title=Spłaszcz
home.flatten.desc=Usuń wszystkie interaktywne elementy i formularze z pliku PDF
home.repair.title=Napraw
home.repair.desc=Spróbuj naprawić uszkodzony plik PDF
home.removeBlanks.title=Usuń puste strony
home.removeBlanks.desc=Wykrywa i usuwa puste strony z dokumentu PDF
home.compare.title=Porównaj
home.compare.desc=Porównuje i pokazuje różnice między 2 dokumentami PDF
downloadPdf=Pobierz PDF
text=Tekst
font=Czcionka
removeBlanks.title=Usuń puste
removeBlanks.header=Usuń puste strony
removeBlanks.threshold=Próg:
removeBlanks.thresholdDesc=Próg określający, jak biały musi być biały piksel
removeBlanks.whitePercent=Procent białego (%):
removeBlanks.whitePercentDesc=Procent strony, która musi być biała, aby została usunięta
removeBlanks.submit=Usuń puste
compare.title=Porównaj
compare.header=Porównaj PDF(y)
compare.document.1=Dokument 1
compare.document.2=Dokument 2
compare.submit=Porównaj
sign.title=Podpis
sign.header=Dodaj podpis do PDF(a)
sign.upload=Wczytaj opbraz
sign.draw=Narysuj podpis
sign.text=Wprowadź tekst
sign.clear=Wyczyść
sign.add=Dodaj
repair.title=Napraw
repair.header=Napraw PDF(y)
repair.submit=Napraw
flatten.title=Spłaszcz
flatten.header=Spłaszcz PDF(y)
flatten.submit=Spłaszcz
ScannerImageSplit.selectText.1=Próg kąta:
ScannerImageSplit.selectText.2=Ustawia minimalny kąt bezwzględny wymagany do obrócenia obrazu (domyślnie: 10).
ScannerImageSplit.selectText.3=Tolerancja:
ScannerImageSplit.selectText.4=Określa zakres zmienności kolorów wokół szacowanego koloru tła (domyślnie: 30).
ScannerImageSplit.selectText.5=Minimalna powierzchnia:
ScannerImageSplit.selectText.6=Ustawia próg minimalnego obszaru dla zdjęcia (domyślnie: 10000).
ScannerImageSplit.selectText.7=Minimalny obszar konturu:
ScannerImageSplit.selectText.8=Ustawia próg minimalnego obszaru konturu dla zdjęcia
ScannerImageSplit.selectText.9=Rozmiar obramowania:
ScannerImageSplit.selectText.10=Ustawia rozmiar dodawanego i usuwanego obramowania, aby uniknąć białych obramowań na wyjściu (domyślnie: 1).
navbar.settings=Ustawienia
settings.title=Ustawienia
settings.update=Dostępna aktualizacja
settings.appVersion=Wersia aplikacji:
settings.downloadOption.title=Wybierz opcję pobierania (w przypadku pobierania pojedynczych plików innych niż ZIP):
settings.downloadOption.1=Otwórz w tym samym oknie
settings.downloadOption.2=Otwórz w nowym oknie
settings.downloadOption.3=Pobierz plik
settings.zipThreshold=Spakuj pliki, gdy liczba pobranych plików przekroczy
#OCR
ocr.title=OCR / Zamiana na tekst
ocr.header=OCR / Zamiana na tekst (optyczne rozpoznawanie znaków)
ocr.selectText.1=Wybierz języki, które mają zostać wykryte w pliku PDF (te z listy to języki, które są obecnie wykrywane):
ocr.selectText.2=Utwórz plik tekstowy zawierający tekst OCR wraz z plikiem PDF z OCR
ocr.selectText.3=Prawidłowe strony zostały zeskanowane pod przekrzywionym kątem przez obrócenie ich z powrotem na miejsce
ocr.selectText.4=Wyczyść stronę, więc jest mniej prawdopodobne, że OCR znajdzie tekst w szumie tła. (Brak zmiany wyjścia)
ocr.selectText.5=Wyczyść stronę, więc jest mniej prawdopodobne, że OCR znajdzie tekst w szumie tła, utrzymuje porządek na wyjściu.
ocr.selectText.6=Ignoruje strony zawierające interaktywny tekst, tylko strony OCR, które są obrazami
ocr.selectText.7=Wymuś OCR, każda strona usunie wszystkie oryginalne elementy tekstowe
ocr.selectText.8=Normalny (wystąpi błąd, jeśli plik PDF zawiera tekst)
ocr.selectText.9=Dodatkowe ustawienia
ocr.selectText.10=Tryb OCR
ocr.selectText.11=Usuń obrazy po OCR (usuwa wszystkie obrazy, przydatne tylko, jeśli jest częścią etapu konwersji)
ocr.selectText.12=Typ renderowania (zaawansowany)
ocr.help=Przeczytaj tę dokumentację, aby dowiedzieć się, jak używać tego w innych językach i/lub nie używać docker
ocr.credit=Ta usługa używa OCRmyPDF i Tesseract do OCR.
ocr.submit=Przetwarzaj PDF za pomocą OCR
extractImages.title=Wyodrębnij obrazy
extractImages.header=Wyodrębnij obrazy
extractImages.selectText=Wybierz format obrazu, aby przekonwertować wyodrębnione obrazy
extractImages.submit=Wyodrębnij
#File to PDF
fileToPDF.title=Plik na PDF
fileToPDF.header=Konwertuj kady plik na PDF
fileToPDF.credit=Ta usługa używa LibreOffice i Unoconv do konwersji plików.
fileToPDF.supportedFileTypes=Obsługiwane typy plików powinny być zgodne z poniższymi, jednak pełną zaktualizowaną listę obsługiwanych formatów można znaleźć w dokumentacji LibreOffice
fileToPDF.submit=Konwertuj na PDF
#compress
compress.title=Kompresuj
compress.header=Kompresuj PDF
compress.credit=Ta usługa wykorzystuje OCRmyPDF do kompresji/optymalizacji PDF.
compress.selectText.1=Poziom optymalizacji:
compress.selectText.2=0 (Brak optymalizacji)
compress.selectText.3=1 (Domyślna, bezstratna optymalizacja)
compress.selectText.4=2 (Stratna optymalizacja)
compress.selectText.5=3 (Stratna optymalizacja, bardziej agresywna)
compress.selectText.6=Włącz szybki podgląd w Internecie (linearyzacja PDF)
compress.selectText.7=Włącz stratne kodowanie JBIG2
compress.submit=Kompresuj
#Add image
addImage.title=Dodaj obraz
addImage.header=Dodaj obraz do PDF
addImage.everyPage=Każda strona?
addImage.submit=Dodaj obraz
#merge
merge.title=Połącz
merge.header=Połącz wiele plików PDF (2+)
merge.submit=Połącz
#pdfOrganiser
pdfOrganiser.title=Kolejność stron
pdfOrganiser.header=Kolejność stron PDF
pdfOrganiser.submit=Zmień kolejność stron
#multiTool
multiTool.title=Wielofunkcyjne narzędzie PDF
multiTool.header=Wielofunkcyjne narzędzie PDF
#pageRemover
pageRemover.title=Narzędzie do usuwania stron
pageRemover.header=Narzędzie do usuwania stron w plikach PDF
pageRemover.pagesToDelete=Strony do usunięcia (wprowadź listę numerów stron oddzielonych przecinkami):
pageRemover.submit=Usuń strony
#rotate
rotate.title=Obróć plik PDF
rotate.header=Obróć plik PDF
rotate.selectAngle=Wybierz kąt obrotu (domyślnie 90 stopni):
rotate.submit=Obróć
#merge
split.title=Podziel plik PDF
split.header=Podziel plik PDF
split.desc.1=Wybrane numery to numery stron, na których chcesz dokonać podziału
split.desc.2=Np. taki wybór 1,3,7-8 podzieliłby 10-stronicowy dokument na 6 oddzielnych plików PDF z:
split.desc.3=Dokument #1: Strona 1
split.desc.4=Dokument #2: Strona 2 i 3
split.desc.5=Dokument #3: Strona 4, 5 i 6
split.desc.6=Dokument #4: Strona 7
split.desc.7=Dokument #5: Strona 8
split.desc.8=Dokument #6: Strona 9 i 10
split.splitPages=Wprowadź strony do podziału na:
split.submit=Podziel
#merge
imageToPDF.title=Obraz na PDF
imageToPDF.header=Obraz na PDF
imageToPDF.submit=Konwertuj
imageToPDF.selectText.1=Rozciągnij, aby dopasować
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 plik PDF
imageToPDF.selectText.5=Konwertuj na osobne pliki PDF
#pdfToImage
pdfToImage.title=PDF na Obraz
pdfToImage.header=PDF na Obraz
pdfToImage.selectText=Format obrazu
pdfToImage.singleOrMultiple=Typ pliku obrazu
pdfToImage.single=Pojedynczy duży obraz
pdfToImage.multi=Wiele obrazów
pdfToImage.colorType=Rodzaj koloru
pdfToImage.color=Kolor
pdfToImage.grey=Odcień szarości
pdfToImage.blackwhite=Czarno-biały (może spowodować utratę danych!)
pdfToImage.submit=Konwertuj
#addPassword
addPassword.title=Dodaj hasło
addPassword.header=Dodaj hasło (zaszyfruj)
addPassword.selectText.1=Wybierz plik PDF do zaszyfrowania
addPassword.selectText.2=Hasło
addPassword.selectText.3=Długość hasła
addPassword.selectText.4=Wyższe wartości są silniejsze, ale niższe wartości zapewniają lepszą kompatybilność.
addPassword.selectText.5=Uprawnienia do zmian
addPassword.selectText.6=Zablokuj zmiany w dokumencie
addPassword.selectText.7=Zablokuj zmiany w treści
addPassword.selectText.8=Zablokuj zmiany w celu ułatwienia dostępu
addPassword.selectText.9=Zablokuj wypełnianie formularzy
addPassword.selectText.10=Zablokuj modyfikacje
addPassword.selectText.11=Zablokuj modyfikacje adnotacji
addPassword.selectText.12=Zablokuj drukowanie
addPassword.selectText.13=Zablokuj drukowanie różnych formatów
addPassword.submit=Zablokuj
#watermark
watermark.title=Dodaj znak wodny
watermark.header=Dodaj znak wodny
watermark.selectText.1=Wybierz plik PDF, do którego chcesz dodać znak wodny:
watermark.selectText.2=Treść znaku wodnego:
watermark.selectText.3=Rozmiar czcionki:
watermark.selectText.4=Obrót (0-360):
watermark.selectText.5=odstępy poziomo (odstęp między każdym znakiem wodnym w poziomie):
watermark.selectText.6=odstępy pionowo (odstęp między każdym znakiem wodnym w pionie):
watermark.selectText.7=Nieprzezroczystość (0% - 100%):
watermark.submit=Dodaj znak wodny
#remove-watermark
remove-watermark.title=Usuń znak wodny
remove-watermark.header=Usuń znak wodny
remove-watermark.selectText.1=Wybierz PDF, aby usunąć znak wodny z:
remove-watermark.selectText.2=Treść zanku wodnego:
remove-watermark.submit=Usuń znak wodny
#Change permissions
permissions.title=Zmień uprawnienia
permissions.header=Zmień uprawnienia
permissions.warning=Ostrzeżenie, aby te uprawnienia były zablokowane, zaleca się ustawienie hasła na stronie dodawania hasła
permissions.selectText.1=Wybierz PDF, aby zmienić uprawnienia
permissions.selectText.2=Uprawnienia do zmian
permissions.selectText.3=Zablokuj zmiany w dokumencie
permissions.selectText.4=Zablokuj zmiany w treści
permissions.selectText.5=Zablokuj zmiany w celu ułatwienia dostępu
permissions.selectText.6=Zablokuj wypełnianie formularzy
permissions.selectText.7=Zablokuj modyfikacje
permissions.selectText.8=Zablokuj modyfikacje adnotacji
permissions.selectText.9=Zablokuj drukowanie
permissions.selectText.10=Zablokuj drukowanie różnych formatów
permissions.submit=Zmień
#remove password
removePassword.title=Usuń hasło
removePassword.header=Usuń hasło (odszyfruj)
removePassword.selectText.1=Wybierz plik PDF do odszyfrowania
removePassword.selectText.2=Hasło
removePassword.submit=Usuń
changeMetadata.title=Zmień metadane
changeMetadata.header=Zmień metadane
changeMetadata.selectText.1=Edytuj zmienne, które chcesz zmienić
changeMetadata.selectText.2=Usuń wszystkie metadane
changeMetadata.selectText.3=Pokaż niestandardowe metadane:
changeMetadata.author=Autor:
changeMetadata.creationDate=Data utworzenia (dd/MM/yyyy HH:mm:ss):
changeMetadata.creator=Twórca:
changeMetadata.keywords=Słowa kluczowe:
changeMetadata.modDate=Data modyfikacji (dd/MM/yyyy HH:mm:ss):
changeMetadata.producer=Producent:
changeMetadata.subject=Temat:
changeMetadata.title=Tytuł:
changeMetadata.trapped=Uwięziony:
changeMetadata.selectText.4=Inne metadane:
changeMetadata.selectText.5=Dodaj niestandardowy wpis w metadanych
changeMetadata.submit=Zmień
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.title=PDF na PDF/A
pdfToPDFA.header=PDF na PDF/A
pdfToPDFA.credit=Ta usługa używa OCRmyPDF do konwersji PDF/A
pdfToPDFA.submit=Konwertuj
PDFToWord.title=PDF na Word
PDFToWord.header=PDF na Word
PDFToWord.selectText.1=Format pliku wyjściowego
PDFToWord.credit=Ta usługa używa LibreOffice do konwersji plików.
PDFToWord.submit=Konwertuj
PDFToPresentation.title=PDF na Prezentację
PDFToPresentation.header=PDF na Prezentację
PDFToPresentation.selectText.1=Format pliku wyjściowego
PDFToPresentation.credit=Ta usługa używa LibreOffice do konwersji plików.
PDFToPresentation.submit=Konwertuj
PDFToText.title=PDF na Tekst/RTF
PDFToText.header=PDF na Tekst/RTF
PDFToText.selectText.1=Format pliku wyjściowego
PDFToText.credit=Ta usługa używa LibreOffice do konwersji plików.
PDFToText.submit=Konwertuj
PDFToHTML.title=PDF na HTML
PDFToHTML.header=PDF na HTML
PDFToHTML.credit=Ta usługa używa LibreOffice do konwersji plików.
PDFToHTML.submit=Konwertuj
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

View File

@@ -0,0 +1,444 @@
###########
# 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=Порядок страниц (введите список номеров страниц через запятую):
goToPage=Вперед
true=Истина
false=Ложь
unknown=Неизвестно
save=Сохранить
close=Закрыть
filesSelected=файлов выбрано
noFavourites=Нет избранного
bored=Скучно ждать?
#############
# HOME-PAGE #
#############
home.desc=Ваш локальный универсальный магазин для всех ваших потребностей в PDF.
navbar.convert=Конвертировать
navbar.security=Безопасность
navbar.other=Другое
navbar.darkmode=Темный режим
navbar.pageOps=Операции со страницей
home.multiTool.title=Мультиинструмент PDF
home.multiTool.desc=Объединение, поворот, изменение порядка и удаление страниц
home.merge.title=Объединить
home.merge.desc=Легко объединяйте несколько PDF-файлов в один.
home.split.title=Разделить
home.split.desc=Разделить PDF-файлы на несколько документов
home.rotate.title=Повернуть
home.rotate.desc=Легко поворачивайте свои PDF-файлы.
home.imageToPdf.title=Изображение в PDF
home.imageToPdf.desc=Преобразование изображения (PNG, JPEG, GIF) в PDF.
home.pdfToImage.title=PDF в изображение
home.pdfToImage.desc=Преобразование PDF в изображение. (PNG, JPEG, GIF)
home.pdfOrganiser.title=Реорганизация
home.pdfOrganiser.desc=Удалить/переставить страницы в любом порядке
home.addImage.title=Добавить изображение
home.addImage.desc=Добавляет изображение в заданное место в PDF (в процессе)
home.watermark.title=Добавить водяной знак
home.watermark.desc=Добавьте собственный водяной знак в документ PDF.
home.remove-watermark.title=Удалить водяной знак
home.remove-watermark.desc=Удалите водяные знаки из документа PDF.
home.permissions.title=Изменить разрешения
home.permissions.desc=Измените разрешения вашего PDF-документа
home.removePages.title=Удаление
home.removePages.desc=Удалите ненужные страницы из документа PDF.
home.addPassword.title=Добавить пароль
home.addPassword.desc=Зашифруйте PDF-документ паролем.
home.removePassword.title=Удалить пароль
home.removePassword.desc=Снимите защиту паролем с вашего PDF-документа.
home.compressPdfs.title=Сжать
home.compressPdfs.desc=Сжимайте PDF-файлы, чтобы уменьшить их размер.
home.changeMetadata.title=Изменить метаданные
home.changeMetadata.desc=Изменить/удалить/добавить метаданные из документа PDF
home.fileToPDF.title=Конвертировать файл в PDF
home.fileToPDF.desc=Конвертируйте практически любой файл в PDF (DOCX, PNG, XLS, PPT, TXT и другие)
home.ocr.title=OCR / Очистка сканирования
home.ocr.desc=Очистка сканирования и обнаружение текста на изображениях в PDF-файле и повторно добавляет его как текст.
home.extractImages.title=Извлечь изображения
home.extractImages.desc=Извлекает все изображения из PDF и сохраняет их в zip
home.pdfToPDFA.title=PDF в PDF/A
home.pdfToPDFA.desc=Преобразование PDF в PDF/A для длительного хранения
home.PDFToWord.title=PDF в Word
home.PDFToWord.desc=Преобразование PDF в форматы Word (DOC, DOCX и ODT)
home.PDFToPresentation.title=PDF в презентацию
home.PDFToPresentation.desc=Преобразование PDF в форматы презентаций (PPT, PPTX и ODP)
home.PDFToText.title=PDF в Text/RTF
home.PDFToText.desc=Преобразование PDF в текстовый или RTF формат
home.PDFToHTML.title=PDF в HTML
home.PDFToHTML.desc=Преобразование PDF в формат HTML
home.PDFToXML.title=PDF в XML
home.PDFToXML.desc=Преобразование PDF в формат XML
home.ScannerImageSplit.title=Обнаружение/разделение отсканированных фотографий
home.ScannerImageSplit.desc=Разделяет несколько фотографий из фото/PDF
home.sign.title=Подпись
home.sign.desc=Добавляет подпись в PDF с помощью рисунка, текста или изображения
home.flatten.title=Сглаживание
home.flatten.desc=Удалить все интерактивные элементы и формы из PDF
home.repair.title=Ремонт
home.repair.desc=Пытается восстановить поврежденный/сломанный PDF
home.removeBlanks.title=Удалить пустые страницы
home.removeBlanks.desc=Обнаруживает и удаляет пустые страницы из документа
home.compare.title=Сравнение
home.compare.desc=Сравнивает и показывает различия между двумя PDF-документами
downloadPdf=Скачать PDF
text=Текст
font=Шрифт
removeBlanks.title=Удалить Пустые
removeBlanks.header=Удалить Пустые Страницы
removeBlanks.threshold=Порог:
removeBlanks.thresholdDesc=Порог для определения того, насколько белым должен быть белый пиксель
removeBlanks.whitePercent=Процент Белого (%):
removeBlanks.whitePercentDesc=Общий процент белого на странице, для удаления
removeBlanks.submit=Удалить Пустые
compare.title=Сравнение
compare.header=Сравнение PDFы
compare.document.1=Документ 1
compare.document.2=Документ 2
compare.submit=Сравнить
sign.title=Подпись
sign.header=Подписать PDFы
sign.upload=Загрузить изображение
sign.draw=Нарисовать подпись
sign.text=Ввод текста
sign.clear=Очистить
sign.add=Добавить
repair.title=Ремонт
repair.header=Ремонт PDF ов
repair.submit=Ремонт
flatten.title=Сглаживание
flatten.header=Сглаживание PDF ов
flatten.submit=Сгладить
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).
navbar.settings=Настройки
settings.title=Настройки
settings.update=Доступно обновление
settings.appVersion=Версия приложения:
settings.downloadOption.title=Выберите вариант загрузки (для загрузки одного файла без zip):
settings.downloadOption.1=Открыть в том же окне
settings.downloadOption.2=Открыть в новом окне
settings.downloadOption.3=Загрузить файл
settings.zipThreshold=Zip-файлы, когда количество загруженных файлов превышает
#OCR
ocr.title=OCR / Очистка сканирования
ocr.header=Очистка сканирования / OCR (Optical Character Recognition) Распознавание текста
ocr.selectText.1=Выберите языки, которые должны быть обнаружены в PDF-файле (перечислены те, которые обнаружены в данный момент):
ocr.selectText.2=Создайте текстовый файл, содержащий текст OCR, вместе с PDF-файлом, обработанным OCR.
ocr.selectText.3=Правильные страницы были отсканированы под перекошенным углом путем поворота их на место
ocr.selectText.4=Очистите страницу, чтобы меньше шансов, что OCR найдет текст в фоновом шуме. (без изменения выхода)
ocr.selectText.5=Очистите страницу, чтобы меньше шансов, что OCR найдет текст в фоновом шуме, поддерживает очистку вывода.
ocr.selectText.6=Игнорирует страницы с интерактивным текстом, распознает только страницы с изображениями
ocr.selectText.7=Принудительное распознавание символов, будет распознавать каждую страницу, удаляя все элементы исходного текста
ocr.selectText.8=Обычный (будет ошибка, если PDF содержит текст)
ocr.selectText.9=Дополнительные настройки
ocr.selectText.10=OCR режим
ocr.selectText.11=Удалить изображения после OCR (удаляет ВСЕ изображения, полезно только в том случае, если они являются частью шага преобразования)
ocr.selectText.12=Тип рендера (расширенный)
ocr.help=Прочтите эту документацию о том, как использовать это для других языков и/или использовать не в докере.
ocr.credit=Этот сервис использует OCRmyPDF и Tesseract для OCR.
ocr.submit=Обработка PDF с OCR
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=Этот сервис использует OCRmyPDF для сжатия/оптимизации PDF.
compress.selectText.1=Уровень оптимизации:
compress.selectText.2=0 (Без оптимизации)
compress.selectText.3=1 (Оптимизация по умолчанию без потерь)
compress.selectText.4=2 (Оптимизация с потерями)
compress.selectText.5=3 (Оптимизация с потерями, более агрессивная)
compress.selectText.6=Включить быстрый веб-просмотр (линеаризовать PDF)
compress.selectText.7=Включить кодирование JBIG2 с потерями
compress.submit=Сжать
#Add image
addImage.title=Добавить изображение
addImage.header=Добавить изображение в PDF
addImage.everyPage=Каждая страница?
addImage.submit=Добавить изображение
#merge
merge.title=Объединить
merge.header=Объединение нескольких PDF-файлов (2+)
merge.submit=Объединить
#pdfOrganiser
pdfOrganiser.title=Организатор страниц
pdfOrganiser.header=Организатор PDF-страниц
pdfOrganiser.submit=Переупорядочить страницы
#multiTool
multiTool.title=Мультиинструмент PDF
multiTool.header=Мультиинструмент 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: Page 1
split.desc.4=Документ #2: Page 2 and 3
split.desc.5=Документ #3: Page 4, 5 and 6
split.desc.6=Документ #4: Page 7
split.desc.7=Документ #5: Page 8
split.desc.8=Документ #6: Page 9 and 10
split.splitPages=Введите страницы для разделения:
split.submit=Разделить
#merge
imageToPDF.title=Изображение в PDF
imageToPDF.header=Изображение в PDF
imageToPDF.submit=Конвертировать
imageToPDF.selectText.1=Растянуть, чтобы соответствовать
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.submit=Шифровать
#watermark
watermark.title=Добавить водяной знак
watermark.header=Добавить водяной знак
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.7=Непрозрачность (0% - 100%):
watermark.submit=Добавить водяной знак
#remove-watermark
remove-watermark.title=Удалить водяной знак
remove-watermark.header=Удалить водяной знак
remove-watermark.selectText.1=Выберите PDF, чтобы удалить водяной знак из:
remove-watermark.selectText.2=Текст водяного знака:
remove-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.title=Изменить метаданные
changeMetadata.header=Изменить метаданные
changeMetadata.selectText.1=Пожалуйста, отредактируйте переменные, которые вы хотите изменить
changeMetadata.selectText.2=Удалить все метаданные
changeMetadata.selectText.3=Показать пользовательские метаданные:
changeMetadata.author=Автор:
changeMetadata.creationDate=Дата создания (yyyy/MM/dd HH:mm:ss):
changeMetadata.creator=Создатель:
changeMetadata.keywords=Ключевые слова:
changeMetadata.modDate=Дата изменения (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Изготовитель:
changeMetadata.subject=Тема:
changeMetadata.title=Заголовок:
changeMetadata.trapped=Trapped:
changeMetadata.selectText.4=Другие метаданные:
changeMetadata.selectText.5=Добавить пользовательскую запись метаданных
changeMetadata.submit=Изменить
xlsToPdf.title=Excel в PDF
xlsToPdf.header=Excel в PDF
xlsToPdf.selectText.1=Выберите книгу Excel XLS или XLSX для преобразования
xlsToPdf.convert=Конвертировать
pdfToPDFA.title=PDF в PDF/A
pdfToPDFA.header=PDF в PDF/A
pdfToPDFA.credit=Этот сервис использует OCRmyPDF для преобразования PDF/A
pdfToPDFA.submit=Конвертировать
PDFToWord.title=PDF в Word
PDFToWord.header=PDF в Word
PDFToWord.selectText.1=Формат выходного файла
PDFToWord.credit=Этот сервис использует LibreOffice для преобразования файлов.
PDFToWord.submit=Конвертировать
PDFToPresentation.title=PDF в Презентацию
PDFToPresentation.header=PDF в Презентацию
PDFToPresentation.selectText.1=Формат выходного файла
PDFToPresentation.credit=Этот сервис использует LibreOffice для преобразования файлов.
PDFToPresentation.submit=Конвертировать
PDFToText.title=PDF в Text/RTF
PDFToText.header=PDF в Text/RTF
PDFToText.selectText.1=Формат выходного файла
PDFToText.credit=Этот сервис использует LibreOffice для преобразования файлов.
PDFToText.submit=Конвертировать
PDFToHTML.title=PDF в HTML
PDFToHTML.header=PDF в HTML
PDFToHTML.credit=Этот сервис использует LibreOffice для преобразования файлов.
PDFToHTML.submit=Конвертировать
PDFToXML.title=PDF в XML
PDFToXML.header=PDF в XML
PDFToXML.credit=Этот сервис использует LibreOffice для преобразования файлов.
PDFToXML.submit=Конвертировать

View File

@@ -0,0 +1,444 @@
###########
# Generisk #
###########
# riktningen som språket skrivs (ltr = vänster till höger, rtl = höger till vänster)
language.direction=ltr
pdfPrompt=Välj PDF(er)
multiPdfPrompt=Välj PDF-filer (2+)
multiPdfDropPrompt=Välj (eller dra och släpp) alla PDF-filer du behöver
imgPrompt=Välj bild(er)
genericSubmit=Skicka
processTimeWarning=Varning: Denna process kan ta upp till en minut beroende på filstorlek
pageOrderPrompt=Sidordning (Ange en kommaseparerad lista med sidnummer) :
goToPage=Gå till
sant=Sant
false=Falskt
unknown=Okänt
save=Spara
close=Stäng
filesSelected=filer valda
noFavourites=Inga favoriter har lagts till
bored=Utråkad att vänta?
#############
# HEMSIDA #
#############
home.desc=Din lokala one-stop-shop för alla dina PDF-behov.
navbar.convert=Konvertera
navbar.security=Säkerhet
navbar.other=Annat
navbar.darkmode=Mörkt läge
navbar.pageOps=Sidoperationer
home.multiTool.title=PDF Multi-verktyg
home.multiTool.desc=Sammanfoga, rotera, ordna om och ta bort sidor
home.merge.title=Sammanfoga
home.merge.desc=Sammanfoga enkelt flera PDF-filer till en.
home.split.title=Dela
home.split.desc=Dela upp PDF-filer i flera dokument
home.rotate.title=Rotera
home.rotate.desc=Rotera enkelt dina PDF-filer.
home.imageToPdf.title=Bild till PDF
home.imageToPdf.desc=Konvertera en bild (PNG, JPEG, GIF) till PDF.
home.pdfToImage.title=PDF till bild
home.pdfToImage.desc=Konvertera en PDF till en bild. (PNG, JPEG, GIF)
home.pdfOrganiser.title=Ordna
home.pdfOrganiser.desc=Ta bort/ordna om sidor i valfri ordning
home.addImage.title=Lägg till bild
home.addImage.desc=Lägger till en bild på en angiven plats i PDF:en (pågår arbete)
home.watermark.title=Lägg till vattenstämpel
home.watermark.desc=Lägg till en anpassad vattenstämpel till ditt PDF-dokument.
home.remove-watermark.title=Ta bort vattenstämpel
home.remove-watermark.desc=Ta bort vattenstämplar från ditt PDF-dokument.
home.permissions.title=Ändra behörigheter
home.permissions.desc=Ändra behörigheterna för ditt PDF-dokument
home.removePages.title=Ta bort
home.removePages.desc=Ta bort oönskade sidor från ditt PDF-dokument.
home.addPassword.title=Lägg till lösenord
home.addPassword.desc=Kryptera ditt PDF-dokument med ett lösenord.
home.removePassword.title=Ta bort lösenord
home.removePassword.desc=Ta bort lösenordsskydd från ditt PDF-dokument.
home.compressPdfs.title=Komprimera
home.compressPdfs.desc=Komprimera PDF-filer för att minska deras filstorlek.
home.changeMetadata.title=Ändra metadata
home.changeMetadata.desc=Ändra/ta bort/lägg till metadata från ett PDF-dokument
home.fileToPDF.title=Konvertera fil till PDF
home.fileToPDF.desc=Konvertera nästan vilken fil som helst till PDF (DOCX, PNG, XLS, PPT, TXT och mer)
home.ocr.title=OCR / Rensningsskanningar
home.ocr.desc=Cleanup skannar och upptäcker text från bilder i en PDF och lägger till den igen som text.
home.extractImages.title=Extrahera bilder
home.extractImages.desc=Extraherar alla bilder från en PDF och sparar dem till zip
home.pdfToPDFA.title=PDF till PDF/A
home.pdfToPDFA.desc=Konvertera PDF till PDF/A för långtidslagring
home.PDFToWord.title=PDF till Word
home.PDFToWord.desc=Konvertera PDF till Word-format (DOC, DOCX och ODT)
home.PDFToPresentation.title=PDF till presentation
home.PDFToPresentation.desc=Konvertera PDF till presentationsformat (PPT, PPTX och ODP)
home.PDFToText.title=PDF till text/RTF
home.PDFToText.desc=Konvertera PDF till text- eller RTF-format
home.PDFToHTML.title=PDF till HTML
home.PDFToHTML.desc=Konvertera PDF till HTML-format
home.PDFToXML.title=PDF till XML
home.PDFToXML.desc=Konvertera PDF till XML-format
home.ScannerImageSplit.title=Detektera/Dela skannade foton
home.ScannerImageSplit.desc=Delar flera foton från ett foto/PDF
home.sign.title=Signera
home.sign.desc=Lägger till signatur till PDF genom ritning, text eller bild
home.flatten.title=Platta till
home.flatten.desc=Ta bort alla interaktiva element och formulär från en PDF
home.repair.title=Reparera
home.repair.desc=Försöker reparera en korrupt/trasig PDF
home.removeBlanks.title=Ta bort tomma sidor
home.removeBlanks.desc=Känner av och tar bort tomma sidor från ett dokument
home.compare.title=Jämför
home.compare.desc=Jämför och visar skillnaderna mellan 2 PDF-dokument
downloadPdf=Ladda ner PDF
text=Text
font=Teckensnitt
removeBlanks.title=Ta bort tomrum
removeBlanks.header=Ta bort tomma sidor
removeBlanks.threshold=Tröskel:
removeBlanks.thresholdDesc=Tröskel för att bestämma hur vit en vit pixel måste vara
removeBlanks.whitePercent=Vit procent (%):
removeBlanks.whitePercentDesc=Procentandel av sidan som måste vara vit för att kunna tas bort
removeBlanks.submit=Ta bort tomrum
compare.title=Jämför
compare.header=Jämför PDF-filer
compare.document.1=Dokument 1
compare.document.2=Dokument 2
compare.submit=Jämför
sign.title=Signera
sign.header=Skriv under PDF-filer
sign.upload=Ladda upp bild
sign.draw=Rita signatur
sign.text=Textinmatning
sign.clear=Rensa
sign.add=Lägg till
repair.title=Reparera
repair.header=Reparera PDF-filer
repair.submit=Reparera
flatten.title=Platta till
flatten.header=Placera PDF-filer
flatten.submit=Platta till
ScannerImageSplit.selectText.1=Vinkeltröskel:
ScannerImageSplit.selectText.2=Ställer in den minsta absoluta vinkeln som krävs för att bilden ska roteras (standard: 10).
ScannerImageSplit.selectText.3=Tolerans:
ScannerImageSplit.selectText.4=Bestämmer intervallet för färgvariation runt den uppskattade bakgrundsfärgen (standard: 30).
ScannerImageSplit.selectText.5=Minsta area:
ScannerImageSplit.selectText.6=Ställer in minsta areatröskel för ett foto (standard: 10000).
ScannerImageSplit.selectText.7=Minsta konturarea:
ScannerImageSplit.selectText.8=Ställer in minsta tröskelvärde för konturarea för ett foto
ScannerImageSplit.selectText.9=Kantstorlek:
ScannerImageSplit.selectText.10=Ställer in storleken på kanten som läggs till och tas bort för att förhindra vita kanter i utdata (standard: 1).
navbar.settings=Inställningar
settings.title=Inställningar
settings.update=Uppdatering tillgänglig
settings.appVersion=Appversion:
settings.downloadOption.title=Välj nedladdningsalternativ (för nedladdning av en fil utan zip):
settings.downloadOption.1=Öppnas i samma fönster
settings.downloadOption.2=Öppna i nytt fönster
settings.downloadOption.3=Ladda ner fil
settings.zipThreshold=Zip-filer när antalet nedladdade filer överskrider
#OCR
ocr.title=OCR / Scan Cleanup
ocr.header=Rengöringsskanningar / OCR (Optical Character Recognition)
ocr.selectText.1=Välj språk som ska upptäckas i PDF:en (de listade är de som för närvarande identifieras):
ocr.selectText.2=Producera en textfil som innehåller OCR-text tillsammans med den OCR-skrivna PDF-filen
ocr.selectText.3=Korrekta sidor skannades i en sned vinkel genom att rotera dem tillbaka på plats
ocr.selectText.4=Rensa sidan så det är mindre troligt att OCR hittar text i bakgrundsbrus. (Ingen utgångsändring)
ocr.selectText.5=Rensa sidan så det är mindre sannolikt att OCR kommer att hitta text i bakgrundsbrus, upprätthåller rensning i utdata.
ocr.selectText.6=Ignorerar sidor som har interaktiv text, endast OCR-sidor som är bilder
ocr.selectText.7=Tvinga OCR, kommer OCR att ta bort alla ursprungliga textelement
ocr.selectText.8=Normal (kommer fel om PDF innehåller text)
ocr.selectText.9=Ytterligare inställningar
ocr.selectText.10=OCR-läge
ocr.selectText.11=Ta bort bilder efter OCR (tar bort ALLA bilder, endast användbart om en del av konverteringssteget)
ocr.selectText.12=Rendertyp (avancerat)
ocr.help=Vänligen läs den här dokumentationen om hur du använder detta för andra språk och/eller använder inte i docker
ocr.credit=Denna tjänst använder OCRmyPDF och Tesseract för OCR.
ocr.submit=Bearbeta PDF med OCR
extractImages.title=Extrahera bilder
extractImages.header=Extrahera bilder
extractImages.selectText=Välj bildformat att konvertera extraherade bilder till
extractImages.submit=Extrahera
#Fil till PDF
fileToPDF.title=Fil till PDF
fileToPDF.header=Konvertera valfri fil till PDF
fileToPDF.credit=Denna tjänst använder LibreOffice och Unoconv för filkonvertering.
fileToPDF.supportedFileTypes=Filtyper som stöds bör inkludera nedanstående men för en fullständig uppdaterad lista över format som stöds, se LibreOffice-dokumentationen
fileToPDF.submit=Konvertera till PDF
#komprimera
compress.title=Komprimera
compress.header=Komprimera PDF
compress.credit=Denna tjänst använder OCRmyPDF för PDF-komprimering/optimering.
compress.selectText.1=Optimeringsnivå:
compress.selectText.2=0 (Ingen optimering)
compress.selectText.3=1 (Standard, förlustfri optimering)
compress.selectText.4=2 (förlustoptimering)
compress.selectText.5=3 (förlustoptimering, mer aggressiv)
compress.selectText.6=Aktivera snabb webbvy (linjärisera PDF)
compress.selectText.7=Aktivera JBIG2-kodning med förlust
compress.submit=Komprimera
#Lägg till bild
addImage.title=Lägg till bild
addImage.header=Lägg till bild till PDF
addImage.everyPage=Varje sida?
addImage.submit=Lägg till bild
#sammanfoga
merge.title=Sammanfoga
merge.header=Slå samman flera PDF-filer (2+)
merge.submit=Slå samman
#pdfArrangör
pdfOrganiser.title=Sidorganisatör
pdfOrganiser.header=PDF-sidorganisatör
pdfOrganiser.submit=Ordna om sidor
#multiverktyg
multiTool.title=PDF-multiverktyg
multiTool.header=PDF Multi-verktyg
#pageRemover
pageRemover.title=Sidborttagare
pageRemover.header=PDF Sidborttagning
pageRemover.pagesToDelete=Sidor att radera (Ange en kommaseparerad lista med sidnummer) :
pageRemover.submit=Ta bort sidor
#rotera
rotate.title=Rotera PDF
rotate.header=Rotera PDF
rotate.selectAngle=Välj rotationsvinkel (i multipler av 90 grader):
rotate.submit=Rotera
#sammanfoga
split.title=Dela upp PDF
split.header=Dela upp PDF
split.desc.1=Siffrorna du väljer är sidnumret du vill göra en split på
split.desc.2=Som sådan skulle ett val av 1,3,7-8 dela upp ett 10-sidigt dokument i 6 separata PDF-filer med:
split.desc.3=Dokument #1: Sida 1
split.desc.4=Dokument #2: Sida 2 och 3
split.desc.5=Dokument #3: Sida 4, 5 och 6
split.desc.6=Dokument #4: Sida 7
split.desc.7=Dokument #5: Sida 8
split.desc.8=Dokument #6: Sida 9 och 10
split.splitPages=Ange sidor att dela på:
split.submit=Dela
#sammanfoga
imageToPDF.title=Bild till PDF
imageToPDF.header=Bild till PDF
imageToPDF.submit=Konvertera
imageToPDF.selectText.1=Sträck för att passa
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
imageToPDF.selectText.5=Konvertera till separata PDF-filer
#pdfToImage
pdfToImage.title=PDF till bild
pdfToImage.header=PDF till bild
pdfToImage.selectText=Bildformat
pdfToImage.singleOrMultiple=Bildresultattyp
pdfToImage.single=Enstaka stor bild
pdfToImage.multi=Flera bilder
pdfToImage.colorType=Färgtyp
pdfToImage.color=Färg
pdfToImage.grey=Gråskala
pdfToImage.blackwhite=Svartvitt (kan förlora data!)
pdfToImage.submit=Konvertera
#addPassword
addPassword.title=Lägg till lösenord
addPassword.header=Lägg till lösenord (kryptera)
addPassword.selectText.1=Välj PDF för att kryptera
addPassword.selectText.2=Lösenord
addPassword.selectText.3=Längd på krypteringsnyckeln
addPassword.selectText.4=Högre värden är starkare, men lägre värden har bättre kompatibilitet.
addPassword.selectText.5=Behörigheter att ställa in
addPassword.selectText.6=Förhindra sammansättning av dokument
addPassword.selectText.7=Förhindra innehållsextraktion
addPassword.selectText.8=Förhindra extraktion för tillgänglighet
addPassword.selectText.9=Förhindra att fylla i formulär
addPassword.selectText.10=Förhindra modifiering
addPassword.selectText.11=Förhindra anteckningsändring
addPassword.selectText.12=Förhindra utskrift
addPassword.selectText.13=Förhindra utskrift av olika format
addPassword.submit=Kryptera
#vattenstämpel
watermark.title=Lägg till vattenstämpel
watermark.header=Lägg till vattenstämpel
watermark.selectText.1=Välj PDF för att lägga till vattenstämpel till:
watermark.selectText.2=Vattenmärkestext:
watermark.selectText.3=Teckenstorlek:
watermark.selectText.4=Rotation (0-360):
watermark.selectText.5=widthSpacer (mellanrum mellan varje vattenstämpel horisontellt):
watermark.selectText.6=heightSpacer (mellanrum mellan varje vattenstämpel vertikalt):
watermark.selectText.7=Opacitet (0% - 100%):
watermark.submit=Lägg till vattenstämpel
#remove-watermark
remove-watermark.title=Ta bort vattenstämpel
remove-watermark.header=Ta bort vattenstämpel
remove-watermark.selectText.1=Välj PDF för att ta bort vattenstämpel från:
remove-watermark.selectText.2=Vattenstämpeltext:
remove-watermark.submit=Ta bort vattenstämpel
#Ändra behörigheter
permissions.title=Ändra behörigheter
permissions.header=Ändra behörigheter
permissions.warning=Varning för att dessa behörigheter ska vara oföränderliga, det rekommenderas att ställa in dem med ett lösenord via sidan Lägg till lösenord
permissions.selectText.1=Välj PDF för att ändra behörigheter
permissions.selectText.2=Behörigheter att ställa in
permissions.selectText.3=Förhindra sammansättning av dokument
permissions.selectText.4=Förhindra innehållsextraktion
permissions.selectText.5=Förhindra extraktion för tillgänglighet
permissions.selectText.6=Förhindra att fylla i formulär
permissions.selectText.7=Förhindra ändring
permissions.selectText.8=Förhindra anteckningsändring
permissions.selectText.9=Förhindra utskrift
permissions.selectText.10=Förhindra utskrift av olika format
permissions.submit=Ändra
#ta bort lösenord
removePassword.title=Ta bort lösenord
removePassword.header=Ta bort lösenord (Dekryptera)
removePassword.selectText.1=Välj PDF att dekryptera
removePassword.selectText.2=Lösenord
removePassword.submit=Ta bort
changeMetadata.title=Ändra metadata
changeMetadata.header=Ändra metadata
changeMetadata.selectText.1=Redigera de variabler du vill ändra
changeMetadata.selectText.2=Ta bort all metadata
changeMetadata.selectText.3=Visa anpassade metadata:
changeMetadata.author=Författare:
changeMetadata.creationDate=Skapningsdatum (åååå/MM/dd HH:mm:ss):
changeMetadata.creator=Skapare:
changeMetadata.keywords=Sökord:
changeMetadata.modDate=Ändringsdatum (åååå/MM/dd HH:mm:ss):
changeMetadata.producer=Producent:
changeMetadata.subject=Ämne:
changeMetadata.title=Titel:
changeMetadata.trapped=Fångad:
changeMetadata.selectText.4=Andra metadata:
changeMetadata.selectText.5=Lägg till anpassad metadatapost
changeMetadata.submit=Ändra
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.title=PDF till PDF/A
pdfToPDFA.header=PDF till PDF/A
pdfToPDFA.credit=Denna tjänst använder OCRmyPDF för PDF/A-konvertering
pdfToPDFA.submit=Konvertera
PDFToWord.title=PDF till Word
PDFToWord.header=PDF till Word
PDFToWord.selectText.1=Utdatafilformat
PDFToWord.credit=Denna tjänst använder LibreOffice för filkonvertering.
PDFToWord.submit=Konvertera
PDFToPresentation.title=PDF till presentation
PDFToPresentation.header=PDF till presentation
PDFToPresentation.selectText.1=Utdatafilformat
PDFToPresentation.credit=Denna tjänst använder LibreOffice för filkonvertering.
PDFToPresentation.submit=Konvertera
PDFToText.title=PDF till text/RTF
PDFToText.header=PDF till text/RTF
PDFToText.selectText.1=Utdatafilformat
PDFToText.credit=Denna tjänst använder LibreOffice för filkonvertering.
PDFToText.submit=Konvertera
PDFToHTML.title=PDF till HTML
PDFToHTML.header=PDF till HTML
PDFToHTML.credit=Denna tjänst använder LibreOffice för filkonvertering.
PDFToHTML.submit=Konvertera
PDFToXML.title=PDF till XML
PDFToXML.header=PDF till XML
PDFToXML.credit=Denna tjänst använder LibreOffice för filkonvertering.
PDFToXML.submit=Konvertera

View File

@@ -17,7 +17,9 @@ false=False
unknown=未知
save=保存
close=关闭
filesSelected=\u9009\u62E9\u7684\u6587\u4EF6
noFavourites=\u6CA1\u6709\u6DFB\u52A0\u6536\u85CF\u5939
bored=\u65E0\u804A\u7B49\u5F85\uFF1F
#############
# HOME-PAGE #
#############

View File

@@ -51,6 +51,14 @@ html[lang-direction=rtl] * {
border-bottom-left-radius: 0.25rem !important;
}
html[lang-direction="rtl"] input.form-check-input {
position: relative;
margin-left: 0px;
}
html[lang-direction="rtl"] label.form-check-label {
display: inline;
}
.margin-auto-parent {
width: 100%;
display: flex;

View File

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-it" viewBox="0 0 640 480">
<g fill-rule="evenodd" stroke-width="1pt">
<path fill="#fff" d="M0 0h640v480H0z"/>
<path fill="#009246" d="M0 0h213.3v480H0z"/>
<path fill="#ce2b37" d="M426.7 0H640v480H426.7z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 289 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-pl" viewBox="0 0 640 480">
<g fill-rule="evenodd">
<path fill="#fff" d="M640 480H0V0h640z"/>
<path fill="#dc143c" d="M640 480H0V240h640z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 219 B

View File

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-ru" viewBox="0 0 640 480">
<g fill-rule="evenodd" stroke-width="1pt">
<path fill="#fff" d="M0 0h640v480H0z"/>
<path fill="#0039a6" d="M0 160h640v320H0z"/>
<path fill="#d52b1e" d="M0 320h640v160H0z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 283 B

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-se" viewBox="0 0 640 480">
<path fill="#005293" d="M0 0h640v480H0z"/>
<path fill="#fecb00" d="M176 0v192H0v96h176v192h96V288h368v-96H272V0h-96z"/>
</svg>

After

Width:  |  Height:  |  Size: 213 B

View File

@@ -1,4 +1,4 @@
<div th:fragment="card" class="feature-card" th:id="${id}">
<div th:fragment="card" class="feature-card" th:id="${id}" th:if="${@endpointConfiguration.isEndpointEnabled(cardLink)}">
<a th:href="${cardLink}">
<div class="d-flex align-items-center"> <!-- Add a flex container to align the SVG and title -->
<img th:if="${svgPath}" id="card-icon" class="home-card-icon home-card-icon-colour" th:src="${svgPath}" alt="Icon" width="30" height="30">

View File

@@ -543,7 +543,7 @@ document.addEventListener("DOMContentLoaded", function () {
if (fileNames.length === 1) {
$(inputElement).siblings(".custom-file-label").addClass("selected").html(fileNames[0]);
} else if (fileNames.length > 1) {
$(inputElement).siblings(".custom-file-label").addClass("selected").html(fileNames.length + " files selected");
$(inputElement).siblings(".custom-file-label").addClass("selected").html(fileNames.length + " " + [[#{filesSelected}]]);
} else {
$(inputElement).siblings(".custom-file-label").addClass("selected").html([[#{pdfPrompt}]]);
}

View File

@@ -151,26 +151,12 @@ function compareVersions(version1, version2) {
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<!-- Existing menu items -->
<a class="dropdown-item" href="#" th:href="@{merge-pdfs}" th:classappend="${currentPage}=='merge-pdfs' ? 'active' : ''" th:title="#{home.merge.desc}">
<img class="icon" src="images/union.svg" alt="icon">
<span class="icon-text" th:text="#{home.merge.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{split-pdfs}" th:classappend="${currentPage}=='split-pdfs' ? 'active' : ''" th:title="#{home.split.desc}">
<img class="icon" src="images/layout-split.svg" alt="icon">
<span class="icon-text" th:text="#{home.split.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{pdf-organizer}" th:classappend="${currentPage}=='pdf-organizer' ? 'active' : ''" th:title="#{home.pdfOrganiser.desc}">
<img class="icon" src="images/sort-numeric-down.svg" alt="icon">
<span class="icon-text" th:text="#{home.pdfOrganiser.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{rotate-pdf}" th:classappend="${currentPage}=='rotate-pdf' ? 'active' : ''" th:title="#{home.rotate.desc}">
<img class="icon" src="images/arrow-clockwise.svg" alt="icon">
<span class="icon-text" th:text="#{home.rotate.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{remove-pages}" th:classappend="${currentPage}=='remove-pages' ? 'active' : ''" th:title="#{home.removePages.desc}">
<img class="icon" src="images/file-earmark-x.svg" alt="icon">
<span class="icon-text" th:text="#{home.removePages.title}"></span>
</a>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('merge-pdfs', 'images/union.svg', 'home.merge.title', 'home.merge.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('split-pdfs', 'images/layout-split.svg', 'home.split.title', 'home.split.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ( 'pdf-organizer', 'images/sort-numeric-down.svg', 'home.pdfOrganiser.title', 'home.pdfOrganiser.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ( 'rotate-pdf', 'images/arrow-clockwise.svg', 'home.rotate.title', 'home.rotate.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ( 'remove-pages', 'images/file-earmark-x.svg', 'home.removePages.title', 'home.removePages.desc')}"></div>
</div>
</li>
<li class="nav-item nav-item-separator"></li>
@@ -181,56 +167,18 @@ function compareVersions(version1, version2) {
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<!-- Existing menu items -->
<a class="dropdown-item" href="#" th:href="@{img-to-pdf}" th:classappend="${currentPage}=='img-to-pdf' ? 'active' : ''" th:title="#{home.imageToPdf.desc}">
<img class="icon" src="images/image.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;">
<span class="icon-text" th:text="#{home.imageToPdf.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{file-to-pdf}" th:classappend="${currentPage}=='file-to-pdf' ? 'active' : ''" th:title="#{home.fileToPDF.desc}">
<img class="icon" src="images/file.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;">
<span class="icon-text" th:text="#{home.fileToPDF.title}"></span>
</a>
<hr class="dropdown-divider">
<a class="dropdown-item" href="#" th:href="@{pdf-to-img}" th:classappend="${currentPage}=='pdf-to-img' ? 'active' : ''" th:title="#{home.pdfToImage.desc}">
<img class="icon" src="images/image.svg" alt="icon">
<span class="icon-text" th:text="#{home.pdfToImage.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{pdf-to-word}" th:classappend="${currentPage}=='pdf-to-word' ? 'active' : ''" th:title="#{home.PDFToWord.desc}">
<img class="icon" src="images/file-earmark-word.svg" alt="icon">
<span class="icon-text" th:text="#{home.PDFToWord.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{pdf-to-presentation}" th:classappend="${currentPage}=='pdf-to-presentation' ? 'active' : ''" th:title="#{home.PDFToPresentation.desc}">
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('img-to-pdf', 'images/image.svg', 'home.imageToPdf.title', 'home.imageToPdf.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('file-to-pdf', 'images/file.svg', 'home.fileToPDF.title', 'home.fileToPDF.desc')}"></div>
<hr class="dropdown-divider">
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('pdf-to-img', 'images/image.svg', 'home.pdfToImage.title', 'home.pdfToImage.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('pdf-to-word', 'images/file-earmark-word.svg', 'home.PDFToWord.title', 'home.PDFToWord.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('pdf-to-presentation', 'images/file-earmark-ppt.svg', 'home.PDFToPresentation.title', 'home.PDFToPresentation.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('pdf-to-text', 'images/filetype-txt.svg', 'home.PDFToText.title', 'home.PDFToText.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('pdf-to-html', 'images/filetype-html.svg', 'home.PDFToHTML.title', 'home.PDFToHTML.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('pdf-to-xml', 'images/filetype-xml.svg', 'home.PDFToXML.title', 'home.PDFToXML.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('pdf-to-pdfa', 'images/file-earmark-pdf.svg', 'home.pdfToPDFA.title', 'home.pdfToPDFA.desc')}"></div>
<img class="icon" src="images/file-earmark-ppt.svg" alt="icon">
<span class="icon-text" th:text="#{home.PDFToPresentation.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{pdf-to-text}" th:classappend="${currentPage}=='pdf-to-text' ? 'active' : ''" th:title="#{home.PDFToText.desc}">
<img class="icon" src="images/filetype-txt.svg" alt="icon">
<span class="icon-text" th:text="#{home.PDFToText.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{pdf-to-html}" th:classappend="${currentPage}=='pdf-to-html' ? 'active' : ''" th:title="#{home.PDFToHTML.desc}">
<img class="icon" src="images/filetype-html.svg" alt="icon">
<span class="icon-text" th:text="#{home.PDFToHTML.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{pdf-to-xml}" th:classappend="${currentPage}=='pdf-to-xml' ? 'active' : ''" th:title="#{home.PDFToXML.desc}">
<img class="icon" src="images/filetype-xml.svg" alt="icon">
<span class="icon-text" th:text="#{home.PDFToXML.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{pdf-to-pdfa}" th:classappend="${currentPage}=='pdf-to-pdfa' ? 'active' : ''" th:title="#{home.pdfToPDFA.desc}">
<img class="icon" src="images/file-earmark-pdf.svg" alt="icon">
<span class="icon-text" th:text="#{home.pdfToPDFA.title}"></span>
</a>
</div>
@@ -243,18 +191,11 @@ function compareVersions(version1, version2) {
<img class="icon" src="images/shield-check.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{navbar.security}"></span>
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="#" th:href="@{add-password}" th:classappend="${currentPage}=='add-password' ? 'active' : ''" th:title="#{home.addPassword.desc}">
<img class="icon" src="images/lock.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.addPassword.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{remove-password}" th:classappend="${currentPage}=='remove-password' ? 'active' : ''" th:title="#{home.removePassword.desc}">
<img class="icon" src="images/unlock.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.removePassword.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{change-permissions}" th:classappend="${currentPage}=='change-permissions' ? 'active' : ''" th:title="#{home.permissions.desc}">
<img class="icon" src="images/shield-lock.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.permissions.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{add-watermark}" th:classappend="${currentPage}=='add-watermark' ? 'active' : ''" th:title="#{home.watermark.desc}">
<img class="icon" src="images/droplet.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.watermark.title}"></span>
</a>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('add-password', 'images/lock.svg', 'home.addPassword.title', 'home.addPassword.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('remove-password', 'images/unlock.svg', 'home.removePassword.title', 'home.removePassword.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('change-permissions', 'images/shield-lock.svg', 'home.permissions.title', 'home.permissions.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('add-watermark', 'images/droplet.svg', 'home.watermark.title', 'home.watermark.desc')}"></div>
</div>
</li>
@@ -266,39 +207,17 @@ function compareVersions(version1, version2) {
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="#" th:href="@{ocr-pdf}" th:classappend="${currentPage}=='ocr-pdf' ? 'active' : ''" th:title="#{home.ocr.desc}">
<img class="icon" src="images/search.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.ocr.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{add-image}" th:classappend="${currentPage}=='add-image' ? 'active' : ''" th:title="#{home.addImage.desc}">
<img class="icon" src="images/file-earmark-richtext.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.addImage.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{compress-pdf}" th:classappend="${currentPage}=='compress-pdf' ? 'active' : ''" th:title="#{home.compressPdfs.desc}">
<img class="icon" src="images/file-zip.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.compressPdfs.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{extract-images}" th:classappend="${currentPage}=='extract-images' ? 'active' : ''" th:title="#{home.extractImages.desc}">
<img class="icon" src="images/images.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.extractImages.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{change-metadata}" th:classappend="${currentPage}=='change-metadata' ? 'active' : ''" th:title="#{home.changeMetadata.desc}">
<img class="icon" src="images/clipboard-data.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.changeMetadata.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{extract-image-scans}" th:classappend="${currentPage}=='extract-image-scans' ? 'active' : ''" th:title="#{home.ScannerImageSplit.desc}">
<img class="icon" src="images/scanner.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.ScannerImageSplit.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{sign}" th:classappend="${currentPage}=='sign' ? 'active' : ''" th:title="#{home.sign.desc}">
<img class="icon" src="images/sign.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.sign.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{flatten}" th:classappend="${currentPage}=='flatten' ? 'active' : ''" th:title="#{home.flatten.desc}">
<img class="icon" src="images/flatten.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.flatten.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{repair}" th:classappend="${currentPage}=='repair' ? 'active' : ''" th:title="#{home.repair.desc}">
<img class="icon" src="images/wrench.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.repair.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{remove-blanks}" th:classappend="${currentPage}=='remove-blanks' ? 'active' : ''" th:title="#{home.removeBlanks.desc}">
<img class="icon" src="images/blank-file.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.removeBlanks.title}"></span>
</a>
<a class="dropdown-item" href="#" th:href="@{compare}" th:classappend="${currentPage}=='compare' ? 'active' : ''" th:title="#{home.compare.desc}">
<img class="icon" src="images/scales.svg" alt="icon" style="width: 16px; height: 16px; vertical-align: middle;"> <span class="icon-text" th:text="#{home.compare.title}"></span>
</a>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('ocr-pdf', 'images/search.svg', 'home.ocr.title', 'home.ocr.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('add-image', 'images/file-earmark-richtext.svg', 'home.addImage.title', 'home.addImage.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('compress-pdf', 'images/file-zip.svg', 'home.compressPdfs.title', 'home.compressPdfs.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('extract-images', 'images/images.svg', 'home.extractImages.title', 'home.extractImages.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('change-metadata', 'images/clipboard-data.svg', 'home.changeMetadata.title', 'home.changeMetadata.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('extract-image-scans', 'images/scanner.svg', 'home.ScannerImageSplit.title', 'home.ScannerImageSplit.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('sign', 'images/sign.svg', 'home.sign.title', 'home.sign.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('flatten', 'images/flatten.svg', 'home.flatten.title', 'home.flatten.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('repair', 'images/wrench.svg', 'home.repair.title', 'home.repair.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('remove-blanks', 'images/blank-file.svg', 'home.removeBlanks.title', 'home.removeBlanks.desc')}"></div>
<div th:replace="~{fragments/navbarEntry :: navbarEntry ('compare', 'images/scales.svg', 'home.compare.title', 'home.compare.desc')}"></div>
</div>
</li>
@@ -327,29 +246,42 @@ function compareVersions(version1, version2) {
</svg>
</a>
<div class="dropdown-menu" aria-labelledby="languageDropdown">
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="en_GB">
<img src="images/flags/gb.svg" alt="icon" width="20" height="15"> English
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="ar_AR">
<img src="images/flags/sa.svg" alt="icon" width="20" height="15"> العربية
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="de_DE">
<img src="images/flags/de.svg" alt="icon" width="20" height="15"> Deutsch
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="fr_FR">
<img src="images/flags/fr.svg" alt="icon" width="20" height="15"> Français
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="es_ES">
<img src="images/flags/es.svg" alt="icon" width="20" height="15"> Español
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="zh_CN">
<img src="images/flags/cn.svg" alt="icon" width="20" height="15"> 简体中文
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="ca_CA">
<img src="images/flags/es-ct.svg" alt="icon" width="20" height="15"> Català
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="zh_CN">
<img src="images/flags/cn.svg" alt="icon" width="20" height="15"> 简体中文
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="de_DE">
<img src="images/flags/de.svg" alt="icon" width="20" height="15"> Deutsch
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="en_GB">
<img src="images/flags/gb.svg" alt="icon" width="20" height="15"> English
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="es_ES">
<img src="images/flags/es.svg" alt="icon" width="20" height="15"> Español
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="fr_FR">
<img src="images/flags/fr.svg" alt="icon" width="20" height="15"> Français
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="it_IT">
<img src="images/flags/it.svg" alt="icon" width="20" height="15"> Italiano
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="pl_PL">
<img src="images/flags/pl.svg" alt="icon" width="20" height="15"> Polski
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="sv_SE">
<img src="images/flags/se.svg" alt="icon" width="20" height="15"> Svenska
</a>
<a class="dropdown-item lang_dropdown-item" href="" data-language-code="ru_RU">
<img src="images/flags/ru.svg" alt="icon" width="20" height="15"> Русский
</a>
</div>
</li>
<li class="nav-item">
<!-- Settings Button -->
@@ -364,7 +296,7 @@ function compareVersions(version1, version2) {
</div>
</div>
<script>
<script th:inline="javascript">
function updateFavoritesDropdown() {
@@ -396,7 +328,7 @@ function compareVersions(version1, version2) {
if(!hasFavorites){
var defaultItem = document.createElement('a');
defaultItem.className = 'dropdown-item';
defaultItem.textContent = 'No favourites added';
defaultItem.textContent = [[#{noFavourites}]]
dropdown.appendChild(defaultItem);
}
}
@@ -421,9 +353,13 @@ function compareVersions(version1, version2) {
<div class="modal-body">
<div class="d-flex justify-content-between align-items-center mb-3">
<p class="mb-0" th:utext="#{settings.appVersion} + ' ' + ${@appVersion}"></p>
<a href="swagger-ui/index.html" target="_blank">
<button type="button" class="btn btn-sm btn-outline-primary"> API </button>
</a>
<a href="https://github.com/Frooodle/Stirling-PDF/releases" target="_blank">
<button type="button" class="btn btn-sm btn-outline-primary" id="update-btn" th:utext="#{settings.update}"></button>
</a>
</div>
<div class="form-group">
@@ -442,9 +378,10 @@ function compareVersions(version1, version2) {
<div class="form-group">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="boredWaiting">
<label class="custom-control-label" for="boredWaiting">Bored Waiting? :)</label>
<label class="custom-control-label" for="boredWaiting" th:text="#{bored}"></label>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{close}"></button>
@@ -455,6 +392,26 @@ function compareVersions(version1, version2) {
<script>
$(document).ready(function() {
$(".nav-item.dropdown").each(function() {
var $dropdownMenu = $(this).find(".dropdown-menu");
if ($dropdownMenu.children().length <= 2 && $dropdownMenu.children("hr.dropdown-divider").length === $dropdownMenu.children().length) {
$(this).prev('.nav-item.nav-item-separator').remove();
$(this).remove();
}
});
//Sort languages by alphabet
var list = $('.dropdown-menu[aria-labelledby="languageDropdown"]').children("a");
list.sort(function(a, b) {
var A = $(a).text().toUpperCase();
var B = $(b).text().toUpperCase();
return (A < B) ? -1 : (A > B) ? 1 : 0;
})
.appendTo('.dropdown-menu[aria-labelledby="languageDropdown"]');
});
// Get the download option from local storage, or set it to 'sameWindow' if it doesn't exist

View File

@@ -0,0 +1,6 @@
<div th:fragment="navbarEntry (endpoint, imgSrc, titleKey, descKey)" th:if="${@endpointConfiguration.isEndpointEnabled(endpoint)}">
<a class="dropdown-item" href="#" th:href="@{${endpoint}}" th:classappend="${endpoint.equals(currentPage)} ? 'active' : ''" th:title="#{${descKey}}">
<img class="icon" th:src="@{${imgSrc}}" alt="icon">
<span class="icon-text" th:text="#{${titleKey}}"></span>
</a>
</div>

View File

@@ -58,10 +58,15 @@ filter: invert(0.2) sepia(2) saturate(50) hue-rotate(190deg);
}
.favorite-icon {
display: none;
position: absolute;
top: 10px;
right: 10px;
cursor: pointer;
}
/* Only show the favorite icons when the parent card is being hovered over */
.feature-card:hover .favorite-icon {
display: block;
}
.favorite-icon img {
filter: brightness(0);
@@ -83,6 +88,8 @@ filter: invert(0.2) sepia(2) saturate(50) hue-rotate(190deg);
<!-- Features -->
<div class="features-container container">
<div th:replace="~{fragments/card :: card(id='multi-tool', cardTitle=#{home.multiTool.title}, cardText=#{home.multiTool.desc}, cardLink='multi-tool', svgPath='images/tools.svg')}"></div>
<div th:replace="~{fragments/card :: card(id='merge-pdfs', cardTitle=#{home.merge.title}, cardText=#{home.merge.desc}, cardLink='merge-pdfs', svgPath='images/union.svg')}"></div>
<div th:replace="~{fragments/card :: card(id='split-pdfs', cardTitle=#{home.split.title}, cardText=#{home.split.desc}, cardLink='split-pdfs', svgPath='images/layout-split.svg')}"></div>

View File

@@ -80,5 +80,4 @@
<div th:insert="~{fragments/footer.html :: footer}"></div>
</div>
</body>
</html>