Compare commits

...

22 Commits

Author SHA1 Message Date
Anthony Stirling
167c85e73f Update UserService.java to generate API key if empty (#3016)
# Description of Changes

Please provide a summary of the changes, including:

- What was changed
- Why the change was made
- Any challenges encountered

Closes #(issue_number)

---

## Checklist

### General

- [ ] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [ ] I have performed a self-review of my own code
- [ ] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-02-21 15:02:03 +00:00
stirlingbot[bot]
505c4bd2a7 Update 3rd Party Licenses (#2997)
Auto-generated by StirlingBot

Signed-off-by: stirlingbot[bot] <1113334+stirlingbot[bot]@users.noreply.github.com>
Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-02-20 10:36:07 +00:00
dependabot[bot]
11a5b2e79f Bump actions/create-github-app-token from 1.11.2 to 1.11.3 (#2878)
Bumps
[actions/create-github-app-token](https://github.com/actions/create-github-app-token)
from 1.11.2 to 1.11.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/create-github-app-token/releases">actions/create-github-app-token's
releases</a>.</em></p>
<blockquote>
<h2>v1.11.3</h2>
<h2><a
href="https://github.com/actions/create-github-app-token/compare/v1.11.2...v1.11.3">1.11.3</a>
(2025-02-04)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>deps:</strong> bump the production-dependencies group with 3
updates (<a
href="https://redirect.github.com/actions/create-github-app-token/issues/203">#203</a>)
(<a
href="8e85a3cf14">8e85a3c</a>),
closes <a
href="https://redirect.github.com/actions/create-github-app-token/issues/665">#665</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/665">#665</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/663">#663</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/662">#662</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/661">#661</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/659">#659</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/660">#660</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/658">#658</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/656">#656</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/657">#657</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/655">#655</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/731">#731</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/4016">nodejs/undici#4016</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/4017">nodejs/undici#4017</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/4018">nodejs/undici#4018</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/4008">nodejs/undici#4008</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3991">nodejs/undici#3991</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/4001">nodejs/undici#4001</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3980">nodejs/undici#3980</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/4003">nodejs/undici#4003</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3965">nodejs/undici#3965</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/4002">nodejs/undici#4002</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/4006">nodejs/undici#4006</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3956">nodejs/undici#3956</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3964">nodejs/undici#3964</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3447">nodejs/undici#3447</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/3966">#3966</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3967">nodejs/undici#3967</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3971">nodejs/undici#3971</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3954">nodejs/undici#3954</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3972">nodejs/undici#3972</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3974">nodejs/undici#3974</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3976">nodejs/undici#3976</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/3975">#3975</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3977">nodejs/undici#3977</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3978">nodejs/undici#3978</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3981">nodejs/undici#3981</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3983">nodejs/undici#3983</a>
<a
href="https://redirect.github.com/nodejs/undici/issues/3986">nodejs/undici#3986</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/4021">#4021</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/4018">#4018</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/4017">#4017</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/4016">#4016</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/4008">#4008</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/4007">#4007</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/4006">#4006</a>
<a
href="https://redirect.github.com/actions/create-github-app-token/issues/3965">#3965</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="67e27a7eb7"><code>67e27a7</code></a>
build(release): 1.11.3 [skip ci]</li>
<li><a
href="8e85a3cf14"><code>8e85a3c</code></a>
fix(deps): bump the production-dependencies group with 3 updates (<a
href="https://redirect.github.com/actions/create-github-app-token/issues/203">#203</a>)</li>
<li>See full diff in <a
href="136412a57a...67e27a7eb7">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/create-github-app-token&package-manager=github_actions&previous-version=1.11.2&new-version=1.11.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
Co-authored-by: Ludy <Ludy87@users.noreply.github.com>
2025-02-19 22:17:42 +00:00
stirlingbot[bot]
896258f011 🌐 Sync Translations + Update README Progress Table (#2989)
### Description of Changes

This Pull Request was automatically generated to synchronize updates to
translation files and documentation. Below are the details of the
changes made:

#### **1. Synchronization of Translation Files**
- Updated translation files (`messages_*.properties`) to reflect changes
in the reference file `messages_en_GB.properties`.
- Ensured consistency and synchronization across all supported language
files.
- Highlighted any missing or incomplete translations.

#### **2. Update README.md**
- Generated the translation progress table in `README.md`.
- Added a summary of the current translation status for all supported
languages.
- Included up-to-date statistics on translation coverage.

#### **Why these changes are necessary**
- Keeps translation files aligned with the latest reference updates.
- Ensures the documentation reflects the current translation progress.

---

Auto-generated by [create-pull-request][1].

[1]: https://github.com/peter-evans/create-pull-request

Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-02-19 22:10:05 +00:00
dependabot[bot]
69c6544877 Bump io.micrometer:micrometer-core from 1.14.3 to 1.14.4 (#2927)
Bumps
[io.micrometer:micrometer-core](https://github.com/micrometer-metrics/micrometer)
from 1.14.3 to 1.14.4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/micrometer-metrics/micrometer/releases">io.micrometer:micrometer-core's
releases</a>.</em></p>
<blockquote>
<h2>1.14.4</h2>
<h2>🐞 Bug Fixes</h2>
<ul>
<li>Log4j2Metrics does not work with multiple registries and non-root
loggers <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5893">#5893</a></li>
<li>Fix LongTaskTimer output for LoggingMeterRegistry <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5834">#5834</a></li>
<li><code>Log4j2Metrics</code> creates more <code>MetricsFilter</code>
instances than needed <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5818">#5818</a></li>
<li>Fix unit discrepancy between Timer and FunctionTimer in
LoggingMeterRegistry <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5816">#5816</a></li>
<li>Distribution bucket_counts sum does not equal the count <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/4868">#4868</a></li>
</ul>
<h2>📔 Documentation</h2>
<ul>
<li>Remove obviated GraalVM native image compilation section from
Stackdriver docs <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5819">#5819</a></li>
<li>Update Docs with right contract of MeterFilter <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5480">#5480</a></li>
</ul>
<h2>🔨 Dependency Upgrades</h2>
<ul>
<li>Bump com.netflix.spectator:spectator-reg-atlas from 1.8.3 to 1.8.4
<a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5907">#5907</a></li>
<li>Bump org.apache.httpcomponents.client5:httpclient5 from 5.4.1 to
5.4.2 <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5876">#5876</a></li>
<li>Bump io.netty:netty-bom from 4.1.116.Final to 4.1.117.Final <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5872">#5872</a></li>
<li>Bump org.postgresql:postgresql from 42.7.4 to 42.7.5 <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5871">#5871</a></li>
<li>Bump jersey3 from 3.1.9 to 3.1.10 <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5870">#5870</a></li>
<li>Bump software.amazon.awssdk:cloudwatch from 2.29.46 to 2.29.52 <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5869">#5869</a></li>
<li>Bump jetty9 from 9.4.56.v20240826 to 9.4.57.v20241219 <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5868">#5868</a></li>
<li>Bump dropwizard-metrics from 4.2.29 to 4.2.30 <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5867">#5867</a></li>
<li>Bump com.signalfx.public:signalfx-java from 1.0.48 to 1.0.49 <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5895">#5895</a></li>
<li>Bump org.apache.commons:commons-pool2 from 2.12.0 to 2.12.1 <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5865">#5865</a></li>
</ul>
<h2>📝 Tasks</h2>
<ul>
<li>Increase sleep time to avoid exemplar sampling rate limiting for
openMetricsScrapeWithExemplars() <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5908">#5908</a></li>
<li>Fix flakiness in
DynatraceMeterRegistryTest.shouldTrackPercentilesWhenDynatraceSummaryInstrumentsNotUsed()
<a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5900">#5900</a></li>
<li>Fix flakiness in
JmsInstrumentationTests.shouldInstrumentMessageListener() <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5899">#5899</a></li>
<li>Fix flakiness in JettyClientMetricsWithObservationTest.activeTimer()
<a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5894">#5894</a></li>
<li>Increase wait duration in
PushMeterRegistryTest.closeRespectsInterrupt() <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5890">#5890</a></li>
<li>Enable TimedAspectTest.pjpFunctionThrows() <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5889">#5889</a></li>
<li>Add .kotlin to .gitignore <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5888">#5888</a></li>
<li>Polish <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5886">#5886</a></li>
<li>Migrate to dependabot auto-merge function <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5874">#5874</a></li>
<li>Back-port LoggingMeterRegistry tests <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5833">#5833</a></li>
<li>Bump build machine image to ubuntu-2404:2024.11.1 <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5829">#5829</a></li>
<li>Bump build JDKs to 21.0.6, 17.0.14, 11.0.26 <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5828">#5828</a></li>
<li>Upgrade to Gradle Wrapper 8.12.1 <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/5823">#5823</a></li>
</ul>
<h2>❤️ Contributors</h2>
<p>Thank you to all the contributors who worked on this release:</p>
<p><a href="https://github.com/izeye"><code>@​izeye</code></a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e387558fcc"><code>e387558</code></a>
Merge branch '1.13.x' into 1.14.x</li>
<li><a
href="f33456630e"><code>f334566</code></a>
Increase sleep time to avoid exemplar sampling rate limiting for
openMetricsS...</li>
<li><a
href="94686e8895"><code>94686e8</code></a>
Merge branch '1.13.x' into 1.14.x</li>
<li><a
href="9e4dfbf8be"><code>9e4dfbf</code></a>
Migrates post actions to java gh action</li>
<li><a
href="e44147a942"><code>e44147a</code></a>
Bump com.netflix.spectator:spectator-reg-atlas from 1.8.3 to 1.8.4 (<a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5907">#5907</a>)</li>
<li><a
href="7c65ad6585"><code>7c65ad6</code></a>
Fix flakiness in
DynatraceMeterRegistryTest.shouldTrackPercentilesWhenDynatra...</li>
<li><a
href="f879d3abf1"><code>f879d3a</code></a>
Fix flakiness in
JmsInstrumentationTests.shouldInstrumentMessageListener() (#...</li>
<li><a
href="20d0a9ef6e"><code>20d0a9e</code></a>
Fix flakiness in JettyClientMetricsWithObservationTest.activeTimer() (<a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5894">#5894</a>)</li>
<li><a
href="fd6d438441"><code>fd6d438</code></a>
Bump com.signalfx.public:signalfx-java from 1.0.48 to 1.0.49 (<a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5898">#5898</a>)</li>
<li><a
href="9311c173de"><code>9311c17</code></a>
Bump com.signalfx.public:signalfx-java from 1.0.48 to 1.0.49 (<a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5895">#5895</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/micrometer-metrics/micrometer/compare/v1.14.3...v1.14.4">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=io.micrometer:micrometer-core&package-manager=gradle&previous-version=1.14.3&new-version=1.14.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-19 22:08:45 +00:00
Ludy
e145f25ba4 Enhance Java Development Configuration and Code Formatting (#2991)
# Description of Changes

Please provide a summary of the changes, including:

This PR improves Java development settings and code formatting by:
- Removing the deprecated `Checkstyle` extension from
`.vscode/extensions.json`.
- Updating `.vscode/settings.json` with:
  - Structured formatting for better readability.
  - Improved Java formatting with `google-java-format`.
  - Enhanced auto-save behavior.
  - Additional Java cleanup actions for better code quality.
  - Optimized project resource filtering.
  - More precise import sorting and ordering.
- Refining `build.gradle` to:
- Extend the `importOrder` rule to include `jakarta`, `lombok`, `me`,
and `stirling`.
  - Improve `spotless` formatting configurations.

These changes streamline the development workflow, enhance code
consistency, and improve maintainability.

---

## Checklist

### General

- [x] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [x] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [x] I have performed a self-review of my own code
- [x] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-02-19 21:41:02 +00:00
IT Creativity + Art Team
696e5ff9ca Update messages_bg_BG.properties (#2996)
BG lang strings sync


# Description of Changes

Please provide a summary of the changes, including:

- What was changed - the language strings only towards the current ones
- Why the change was made - to have an up-to-date translation
- Any challenges encountered - none


---

## Checklist

### General

- [x] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [x] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [x]I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [x]I have performed a self-review of my own code
- [x] My changes generate no new warnings

### Documentation

- [x]I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [x] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [x] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-02-19 21:40:37 +00:00
albanobattistella
f9cf75e247 Update messages_it_IT.properties (#2993)
# Description of Changes

Please provide a summary of the changes, including:

- What was changed
- Why the change was made
- Any challenges encountered

Closes #(issue_number)

---

## Checklist

### General

- [ ] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [ ] I have performed a self-review of my own code
- [ ] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-02-19 12:55:15 +00:00
Anthony Stirling
a67fd82c42 name change for view PDF to view/edit PDF (#2988)
# Description of Changes

Please provide a summary of the changes, including:

- What was changed
- Why the change was made
- Any challenges encountered

Closes #(issue_number)

---

## Checklist

### General

- [ ] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [ ] I have performed a self-review of my own code
- [ ] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-02-18 17:54:48 +00:00
stirlingbot[bot]
e2dd8a3d91 🌐 Sync Translations + Update README Progress Table (#2987)
### Description of Changes

This Pull Request was automatically generated to synchronize updates to
translation files and documentation. Below are the details of the
changes made:

#### **1. Synchronization of Translation Files**
- Updated translation files (`messages_*.properties`) to reflect changes
in the reference file `messages_en_GB.properties`.
- Ensured consistency and synchronization across all supported language
files.
- Highlighted any missing or incomplete translations.

#### **2. Update README.md**
- Generated the translation progress table in `README.md`.
- Added a summary of the current translation status for all supported
languages.
- Included up-to-date statistics on translation coverage.

#### **Why these changes are necessary**
- Keeps translation files aligned with the latest reference updates.
- Ensures the documentation reflects the current translation progress.

---

Auto-generated by [create-pull-request][1].

[1]: https://github.com/peter-evans/create-pull-request

---------

Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-02-18 17:41:55 +00:00
dependabot[bot]
554c112a94 Bump step-security/harden-runner from 2.10.4 to 2.11.0 (#2980)
Bumps
[step-security/harden-runner](https://github.com/step-security/harden-runner)
from 2.10.4 to 2.11.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/step-security/harden-runner/releases">step-security/harden-runner's
releases</a>.</em></p>
<blockquote>
<h2>v2.11.0</h2>
<h2>What's Changed</h2>
<p>Release v2.11.0 in <a
href="https://redirect.github.com/step-security/harden-runner/issues/498">#498</a>
Harden-Runner Enterprise tier now supports the use of eBPF for DNS
resolution and network call monitoring</p>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/step-security/harden-runner/compare/v2...v2.11.0">https://github.com/step-security/harden-runner/compare/v2...v2.11.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4d991eb9b9"><code>4d991eb</code></a>
Merge pull request <a
href="https://redirect.github.com/step-security/harden-runner/issues/498">#498</a>
from step-security/rc-18</li>
<li><a
href="4ea872f897"><code>4ea872f</code></a>
Update README.md</li>
<li><a
href="65d6f6e4ee"><code>65d6f6e</code></a>
Add workflows</li>
<li><a
href="1034c9a805"><code>1034c9a</code></a>
Update package-lock.json</li>
<li><a
href="ab221e2d7a"><code>ab221e2</code></a>
Update agent</li>
<li><a
href="7cb6c2fb52"><code>7cb6c2f</code></a>
Update agent</li>
<li>See full diff in <a
href="cb605e52c2...4d991eb9b9">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=step-security/harden-runner&package-manager=github_actions&previous-version=2.10.4&new-version=2.11.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-18 12:07:08 +00:00
stirlingbot[bot]
d7e6cae313 🌐 Sync Translations + Update README Progress Table (#2982)
### Description of Changes

This Pull Request was automatically generated to synchronize updates to
translation files and documentation. Below are the details of the
changes made:

#### **1. Synchronization of Translation Files**
- Updated translation files (`messages_*.properties`) to reflect changes
in the reference file `messages_en_GB.properties`.
- Ensured consistency and synchronization across all supported language
files.
- Highlighted any missing or incomplete translations.

#### **2. Update README.md**
- Generated the translation progress table in `README.md`.
- Added a summary of the current translation status for all supported
languages.
- Included up-to-date statistics on translation coverage.

#### **Why these changes are necessary**
- Keeps translation files aligned with the latest reference updates.
- Ensures the documentation reflects the current translation progress.

---

Auto-generated by [create-pull-request][1].

[1]: https://github.com/peter-evans/create-pull-request

---------

Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-02-18 12:04:06 +00:00
stirlingbot[bot]
a3affe63f9 Update 3rd Party Licenses (#2985)
Auto-generated by StirlingBot

Signed-off-by: stirlingbot[bot] <1113334+stirlingbot[bot]@users.noreply.github.com>
Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-02-18 12:03:34 +00:00
Anthony Stirling
d34c44ed7b [Test PR] Desktop fix and unoconv to unoserver (#2971)
# Description of Changes

This pull request includes several updates to the Docker configuration
and Java application UI scaling. The changes enhance environment
variable management, dependency installation, and UI responsiveness to
different screen sizes.

### Docker Configuration Updates:
* Added new environment variables `STIRLING_PDF_DESKTOP_UI`,
`PYTHONPATH`, `UNO_PATH`, and `URE_BOOTSTRAP` to `Dockerfile` and
`Dockerfile.fat` to improve the configuration and integration of the
LibreOffice environment.
[[1]](diffhunk://#diff-dd2c0eb6ea5cfc6c4bd4eac30934e2d5746747af48fef6da689e85b752f39557L38-R46)
[[2]](diffhunk://#diff-571631582b988e88c52c86960cc083b0b8fa63cf88f056f26e9e684195221c27L40-R49)
* Updated the `CMD` instruction in `Dockerfile` and `Dockerfile.fat` to
run both the Java application and `unoserver` simultaneously.
[[1]](diffhunk://#diff-dd2c0eb6ea5cfc6c4bd4eac30934e2d5746747af48fef6da689e85b752f39557L87-R96)
[[2]](diffhunk://#diff-571631582b988e88c52c86960cc083b0b8fa63cf88f056f26e9e684195221c27L87-R100)
* Modified the `RUN` instruction to include additional Python
dependencies and setup a virtual environment.
[[1]](diffhunk://#diff-dd2c0eb6ea5cfc6c4bd4eac30934e2d5746747af48fef6da689e85b752f39557L68-R81)
[[2]](diffhunk://#diff-571631582b988e88c52c86960cc083b0b8fa63cf88f056f26e9e684195221c27R72-R86)

### Workflow Enhancements:
* Added `STIRLING_PDF_DESKTOP_UI` environment variable to the GitHub
Actions workflows (`PR-Demo-Comment.yml` and `push-docker.yml`) to
ensure consistent environment settings.
[[1]](diffhunk://#diff-145fe5c0ed8c24e4673c9ad39800dd171a2d0a2e8050497cff980fc7e3a3df0dR106)
[[2]](diffhunk://#diff-76056236de05155107f6a660f1e3956059e37338011b8f0e72188afcb9b17b6fR41)

### Java Application UI Scaling:
* Introduced `UIScaling` utility to dynamically adjust the size of UI
components based on screen resolution in `DesktopBrowser` and
`LoadingWindow` classes.
[[1]](diffhunk://#diff-dff83b0fe53cba8ee80dc8cee96b9c2bfec612ec1f2c636ebdf22dedb36671e8L218-R219)
[[2]](diffhunk://#diff-dff83b0fe53cba8ee80dc8cee96b9c2bfec612ec1f2c636ebdf22dedb36671e8L267-R270)
[[3]](diffhunk://#diff-3e287daf297213b698b3c94d6e6ed4aae139d570ba6b115da459d72b5c36c42fL44-R64)
[[4]](diffhunk://#diff-3e287daf297213b698b3c94d6e6ed4aae139d570ba6b115da459d72b5c36c42fL86-R102)
* Improved the loading of icons by using the `UIScaling` utility for
better visual quality.

---

## Checklist

### General

- [ ] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [ ] I have performed a self-review of my own code
- [ ] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.

---------

Co-authored-by: pixeebot[bot] <104101892+pixeebot[bot]@users.noreply.github.com>
Co-authored-by: a <a>
2025-02-18 11:57:56 +00:00
Wn0304
68e8a0174c Translation localization (#2969)
# Description of Changes

Please provide a summary of the changes, including:

- What was changed
messages_zh_CN.properties
- Why the change was made
Try to translate the rest of the Chinese information
- Any challenges encountered
No
Closes #(issue_number)

---

## Checklist

### General

- [ ] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [ ] I have performed a self-review of my own code
- [ ] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2025-02-18 00:08:05 +00:00
bendem
4b40a0460e Unify translations for "rédiger" and "caviarder" with "censurer" (#2972)
"Rédiger" is a literal translation, it doesn't have that meaning in
french. "Caviarder" is not that common.
"Censurer", imo will be more widely understood by french speakers.

I left the tags so it's still easy to find, not matter which term you
use in search.

# Description of Changes

Please provide a summary of the changes, including:

- What was changed
- Why the change was made
- Any challenges encountered

Closes #(issue_number)

---

## Checklist

### General

- [ ] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [x] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [x] I have performed a self-review of my own code
- [ ] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-02-18 00:05:26 +00:00
Ludy
27fc5e9a9e Enable Java Formatting - Use build code formatting in VS Code IDE (#2978)
# Description of Changes

Please provide a summary of the changes, including:

This PR updates the VSCode settings by making the following changes:

- Changed the value of `editor.wordSegmenterLocales` from `null` to an
empty string (`""`). This adjustment helps to avoid potential issues
with locale detection in the editor.
- Added new Java formatting settings:
  - Enabled Java formatting with `"java.format.enabled": true`
  - Set the formatting profile to `"GoogleStyle"`
  - Specified the Google Java formatting version as `"1.25.2"`

These changes improve consistency and enforce coding standards in the
development environment by aligning Java code formatting with the Google
style guide.

---

## Checklist

### General

- [x] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [x] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [x] I have performed a self-review of my own code
- [x] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-02-17 21:16:51 +00:00
Ludy
3d7eb040ab Fix: Replace pull_request with pull_request_target in SonarQube Workflow for Fork Analysis (#2977)
# Description of Changes

Please provide a summary of the changes, including:

This update changes the workflow trigger for SonarQube from using the
`pull_request` event to `pull_request_target` for the "main" branch. By
doing so, the workflow runs in the context of the base repository,
ensuring that the required secrets (like `SONAR_TOKEN`) are available
during execution—even when analyzing code from forked repositories. This
change enables full Sonar analysis for PRs from forks while being
mindful of potential security implications.

---

## Checklist

### General

- [x] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [x] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [ ] I have performed a self-review of my own code
- [x] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-02-17 20:26:18 +00:00
Abdur Rahman
82b1ab4263 Fix/full invert crash 2942 (#2957)
# Description of Changes

Please provide a summary of the changes, including:

- What was changed
- Modified the `convertToBufferedImageTpFile` to use
`File.createTempFile()` instead of writing to `"image.png"` in the
current directory.
- This change ensures the file is saved in the default temporary
directory, preventing permission issues.

- Why the change was made
- Previously, the method attempted to save the file in the current
working directory, which caused permission errors
(`java.io.FileNotFoundException: image.png (Permission denied)`).
 
- Any challenges encountered

Closes #2942

---

## Checklist

### General

- [x] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [x] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [x] I have performed a self-review of my own code
- [x] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [x] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-02-17 10:26:47 +00:00
dependabot[bot]
c1d7217242 Bump sigstore/cosign-installer from 3.7.0 to 3.8.0 (#2901)
Bumps
[sigstore/cosign-installer](https://github.com/sigstore/cosign-installer)
from 3.7.0 to 3.8.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/sigstore/cosign-installer/releases">sigstore/cosign-installer's
releases</a>.</em></p>
<blockquote>
<h2>v3.8.0</h2>
<h2>What's Changed</h2>
<ul>
<li>test action against all non-rc releases, verify entry in rekor log
by <a
href="https://github.com/bobcallaway"><code>@​bobcallaway</code></a> in
<a
href="https://redirect.github.com/sigstore/cosign-installer/pull/179">sigstore/cosign-installer#179</a></li>
<li>bump for cosign v2.4.2 release by <a
href="https://github.com/bobcallaway"><code>@​bobcallaway</code></a> in
<a
href="https://redirect.github.com/sigstore/cosign-installer/pull/181">sigstore/cosign-installer#181</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/sigstore/cosign-installer/compare/v3...v3.8.0">https://github.com/sigstore/cosign-installer/compare/v3...v3.8.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c56c2d3e59"><code>c56c2d3</code></a>
Bump actions/setup-go from 5.2.0 to 5.3.0 (<a
href="https://redirect.github.com/sigstore/cosign-installer/issues/180">#180</a>)</li>
<li><a
href="02e36b8dc8"><code>02e36b8</code></a>
bump for cosign v2.4.2 release (<a
href="https://redirect.github.com/sigstore/cosign-installer/issues/181">#181</a>)</li>
<li><a
href="789d2886c0"><code>789d288</code></a>
test action against all non-rc releases, verify entry in rekor log (<a
href="https://redirect.github.com/sigstore/cosign-installer/issues/179">#179</a>)</li>
<li><a
href="e11c089243"><code>e11c089</code></a>
Bump actions/setup-go from 5.1.0 to 5.2.0 (<a
href="https://redirect.github.com/sigstore/cosign-installer/issues/178">#178</a>)</li>
<li><a
href="718228a5f8"><code>718228a</code></a>
Bump actions/setup-go from 5.0.2 to 5.1.0 (<a
href="https://redirect.github.com/sigstore/cosign-installer/issues/176">#176</a>)</li>
<li><a
href="325063e39f"><code>325063e</code></a>
Bump actions/checkout from 4.2.1 to 4.2.2 (<a
href="https://redirect.github.com/sigstore/cosign-installer/issues/177">#177</a>)</li>
<li><a
href="b929758a86"><code>b929758</code></a>
Bump actions/checkout from 4.2.0 to 4.2.1 (<a
href="https://redirect.github.com/sigstore/cosign-installer/issues/175">#175</a>)</li>
<li>See full diff in <a
href="dc72c7d5c4...c56c2d3e59">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sigstore/cosign-installer&package-manager=github_actions&previous-version=3.7.0&new-version=3.8.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
Co-authored-by: Ludy <Ludy87@users.noreply.github.com>
2025-02-17 10:24:25 +00:00
dependabot[bot]
708ede5e26 Bump alpine from 3.21.2 to 3.21.3 (#2961)
Bumps alpine from 3.21.2 to 3.21.3.


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=alpine&package-manager=docker&previous-version=3.21.2&new-version=3.21.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-17 10:21:40 +00:00
songge8
af74f9d6c6 localization (#2950)
localization
2025-02-14 23:50:50 +00:00
89 changed files with 1163 additions and 620 deletions

View File

@@ -37,7 +37,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -82,7 +82,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -103,6 +103,7 @@ jobs:
run: ./gradlew clean build run: ./gradlew clean build
env: env:
DOCKER_ENABLE_SECURITY: false DOCKER_ENABLE_SECURITY: false
STIRLING_PDF_DESKTOP_UI: false
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0 uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0

View File

@@ -21,7 +21,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -13,7 +13,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -24,7 +24,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -62,7 +62,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -106,7 +106,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -18,7 +18,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -18,13 +18,13 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
- name: Generate GitHub App Token - name: Generate GitHub App Token
id: generate-token id: generate-token
uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2 uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3
with: with:
app-id: ${{ secrets.GH_APP_ID }} app-id: ${{ secrets.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}

View File

@@ -15,7 +15,7 @@ jobs:
issues: write issues: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -16,7 +16,7 @@ jobs:
versionMac: ${{ steps.versionNumberMac.outputs.versionNumberMac }} versionMac: ${{ steps.versionNumberMac.outputs.versionNumberMac }}
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -51,7 +51,7 @@ jobs:
file_suffix: "" file_suffix: ""
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -101,7 +101,7 @@ jobs:
file_suffix: "" file_suffix: ""
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -139,7 +139,7 @@ jobs:
contents: write contents: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -210,7 +210,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -224,7 +224,7 @@ jobs:
- name: Install Cosign - name: Install Cosign
if: matrix.os == 'windows-latest' if: matrix.os == 'windows-latest'
uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0 uses: sigstore/cosign-installer@c56c2d3e59e4281cc41dea2217323ba5694b171e # v3.8.0
- name: Generate key pair - name: Generate key pair
if: matrix.os == 'windows-latest' if: matrix.os == 'windows-latest'
@@ -271,7 +271,7 @@ jobs:
contents: write contents: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -16,13 +16,13 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
- name: Generate GitHub App Token - name: Generate GitHub App Token
id: generate-token id: generate-token
uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2 uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3
with: with:
app-id: ${{ secrets.GH_APP_ID }} app-id: ${{ secrets.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}

View File

@@ -18,7 +18,7 @@ jobs:
id-token: write id-token: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -38,10 +38,11 @@ jobs:
run: ./gradlew clean build run: ./gradlew clean build
env: env:
DOCKER_ENABLE_SECURITY: false DOCKER_ENABLE_SECURITY: false
STIRLING_PDF_DESKTOP_UI: false
- name: Install cosign - name: Install cosign
if: github.ref == 'refs/heads/master' if: github.ref == 'refs/heads/master'
uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0 uses: sigstore/cosign-installer@c56c2d3e59e4281cc41dea2217323ba5694b171e # v3.8.0
with: with:
cosign-release: "v2.4.1" cosign-release: "v2.4.1"

View File

@@ -23,7 +23,7 @@ jobs:
version: ${{ steps.versionNumber.outputs.versionNumber }} version: ${{ steps.versionNumber.outputs.versionNumber }}
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -83,7 +83,7 @@ jobs:
file_suffix: "" file_suffix: ""
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -95,7 +95,7 @@ jobs:
run: ls -R run: ls -R
- name: Install Cosign - name: Install Cosign
uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0 uses: sigstore/cosign-installer@c56c2d3e59e4281cc41dea2217323ba5694b171e # v3.8.0
- name: Generate key pair - name: Generate key pair
run: cosign generate-key-pair run: cosign generate-key-pair
@@ -161,7 +161,7 @@ jobs:
file_suffix: "" file_suffix: ""
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -34,7 +34,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -1,23 +1,24 @@
name: Run Sonarqube
on: on:
push: push:
branches: branches:
- master - master
pull_request: pull_request_target:
branches: [ "main" ] branches:
- main
workflow_dispatch: workflow_dispatch:
permissions: permissions:
pull-requests: read pull-requests: read
actions: read actions: read
name: Run Sonarqube
jobs: jobs:
sonarqube: sonarqube:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -16,7 +16,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -24,13 +24,13 @@ jobs:
committer: ${{ steps.committer.outputs.committer }} committer: ${{ steps.committer.outputs.committer }}
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
- name: Generate GitHub App Token - name: Generate GitHub App Token
id: generate-token id: generate-token
uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2 uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3
with: with:
app-id: ${{ secrets.GH_APP_ID }} app-id: ${{ secrets.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
@@ -57,13 +57,13 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
- name: Generate GitHub App Token - name: Generate GitHub App Token
id: generate-token id: generate-token
uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2 uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3
with: with:
app-id: ${{ vars.GH_APP_ID }} app-id: ${{ vars.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}

View File

@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -105,7 +105,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit
@@ -134,7 +134,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -9,7 +9,6 @@
// "ms-vscode-remote.vscode-remote-extensionpack", // Remote Development Pack for SSH, WSL, and Containers // "ms-vscode-remote.vscode-remote-extensionpack", // Remote Development Pack for SSH, WSL, and Containers
"Oracle.oracle-java", // Oracle Java extension with additional features for Java development "Oracle.oracle-java", // Oracle Java extension with additional features for Java development
"redhat.java", // Java support by Red Hat with IntelliSense, debugging, and code navigation "redhat.java", // Java support by Red Hat with IntelliSense, debugging, and code navigation
"shengchen.vscode-checkstyle", // Checkstyle integration for Java code quality checks
"streetsidesoftware.code-spell-checker", // Spell checker for code to avoid typos "streetsidesoftware.code-spell-checker", // Spell checker for code to avoid typos
"vmware.vscode-boot-dev-pack", // Developer tools for Spring Boot by VMware "vmware.vscode-boot-dev-pack", // Developer tools for Spring Boot by VMware
"vmware.vscode-spring-boot", // Spring Boot tools by VMware for enhanced Spring development "vmware.vscode-spring-boot", // Spring Boot tools by VMware for enhanced Spring development

121
.vscode/settings.json vendored
View File

@@ -2,54 +2,147 @@
"java.compile.nullAnalysis.mode": "automatic", "java.compile.nullAnalysis.mode": "automatic",
"files.eol": "auto", "files.eol": "auto",
"java.configuration.updateBuildConfiguration": "interactive", "java.configuration.updateBuildConfiguration": "interactive",
"black-formatter.args": ["--line-length", "127"], "black-formatter.args": [
"flake8.args": ["--max-line-length", "127"], "--line-length",
"pylint.args": ["max-line-length", "127"], "127"
],
"flake8.args": [
"--max-line-length",
"127"
],
"[java]": { "[java]": {
"editor.tabSize": 4, "editor.tabSize": 4,
"editor.detectIndentation": false, "editor.detectIndentation": false,
"editor.rulers": [127] "editor.rulers": [
127
],
"editor.defaultFormatter": "josevseb.google-java-format-for-vs-code"
}, },
"[python]": { "[python]": {
"editor.tabSize": 2, "editor.tabSize": 2,
"editor.detectIndentation": false, "editor.detectIndentation": false,
"editor.rulers": [127] "editor.rulers": [
127
]
}, },
"[gradle-build]": { "[gradle-build]": {
"editor.tabSize": 4, "editor.tabSize": 4,
"editor.detectIndentation": false, "editor.detectIndentation": false,
"editor.rulers": [127] "editor.rulers": [
127
]
}, },
"[gradle]": { "[gradle]": {
"editor.tabSize": 4, "editor.tabSize": 4,
"editor.detectIndentation": false, "editor.detectIndentation": false,
"editor.rulers": [127] "editor.rulers": [
127
]
}, },
"[html]": { "[html]": {
"editor.tabSize": 2, "editor.tabSize": 2,
"editor.rulers": [127], "editor.rulers": [
127
],
"files.trimFinalNewlines": false, "files.trimFinalNewlines": false,
"files.insertFinalNewline": false "files.insertFinalNewline": false
}, },
"[javascript]": { "[javascript]": {
"editor.tabSize": 2, "editor.tabSize": 2,
"editor.rulers": [127] "editor.rulers": [
127
]
}, },
"[yaml]": { "[yaml]": {
"files.trimFinalNewlines": false, "files.trimFinalNewlines": false,
"files.insertFinalNewline": false "files.insertFinalNewline": false
}, },
"diffEditor.maxComputationTime": 0,
"editor.wordSegmenterLocales": null,
"editor.guides.bracketPairs": "active",
"editor.guides.bracketPairsHorizontal": "active",
"files.insertFinalNewline": true, "files.insertFinalNewline": true,
"files.trimFinalNewlines": true, "files.trimFinalNewlines": true,
"files.trimTrailingWhitespace": true, "files.trimTrailingWhitespace": true,
"files.autoSave": "onFocusChange",
"files.autoSaveWhenNoErrors": true,
"diffEditor.maxComputationTime": 0,
"editor.wordSegmenterLocales": "",
"editor.guides.bracketPairs": "active",
"editor.guides.bracketPairsHorizontal": "active",
"editor.indentSize": "tabSize", "editor.indentSize": "tabSize",
"editor.stickyScroll.enabled": false, "editor.stickyScroll.enabled": false,
"editor.minimap.enabled": false, "editor.minimap.enabled": false,
"editor.formatOnSave": true, "editor.formatOnSave": true,
"editor.insertSpaces": true,
"java.format.enabled": true,
"java.format.settings.profile": "GoogleStyle",
"java.format.settings.google.version": "1.25.2",
"java.format.settings.google.mode": "jar-file", "java.format.settings.google.mode": "jar-file",
"java.format.settings.google.extra": "--aosp --skip-sorting-imports" "java.format.settings.google.extra": "--aosp --skip-sorting-imports --skip-javadoc-formatting",
// (DE) Aktiviert Kommentare im Java-Format.
// (EN) Enables comments in Java formatting.
// "java.format.comments.enabled": true,
// (DE) Generiert automatisch Kommentare im Code.
// (EN) Automatically generates comments in code.
// "java.codeGeneration.generateComments": true,
// https://github.com/redhat-developer/vscode-java/blob/master/document/_java.learnMoreAboutCleanUps.md#java-clean-ups
"java.saveActions.cleanup": true,
"java.cleanup.actions": [
"invertEquals", // Inverts calls to Object.equals(Object) and String.equalsIgnoreCase(String) to avoid useless null pointer exception.
"instanceofPatternMatch" // Replaces instanceof checks with pattern matching.
],
// (DE) Aktiviert die Code-Vervollständigung für Java.
// (EN) Enables code completion for Java.
"java.completion.engine": "dom",
"java.completion.enabled": true,
"java.completion.importOrder": [
"java",
"javax",
"org",
"com",
"net",
"io",
"jakarta",
"lombok",
"me",
"stirling",
],
"java.project.resourceFilters": [
".devcontainer/",
".git/",
".github/",
".gradle/",
".venv/",
".venv*/",
".vscode/",
"bin/",
"build/",
"configs/",
"customFiles/",
"docs/",
"exampleYmlFiles",
"gradle/",
"images/",
"logs/",
"pipeline/",
"scripts/",
"testings/",
".git-blame-ignore-revs",
".gitattributes",
".gitignore",
".pre-commit-config.yaml",
],
// Enables signature help in Java.
"java.signatureHelp.enabled": true,
// Enables detailed signature help descriptions.
"java.signatureHelp.description.enabled": true,
// Downloads sources for Maven dependencies.
"java.maven.downloadSources": true,
// Enables Gradle project import.
"java.import.gradle.enabled": true,
// Downloads sources for Eclipse projects.
"java.eclipse.downloadSources": true,
// Enables import of the Gradle wrapper.
"java.import.gradle.wrapper.enabled": true,
"spring.initializr.defaultLanguage": "Java",
"spring.initializr.defaultGroupId": "stirling.software.SPDF",
"spring.initializr.defaultArtifactId": "SPDF",
"cSpell.enabled": false,
} }

View File

@@ -1,5 +1,5 @@
# Main stage # Main stage
FROM alpine:3.21.2@sha256:56fa17d2a7e7f168a043a2712e63aed1f8543aeafdcee47c58dcffe38ed51099 FROM alpine:3.21.3@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c
# Copy necessary files # Copy necessary files
COPY scripts /scripts COPY scripts /scripts
@@ -35,47 +35,56 @@ ENV DOCKER_ENABLE_SECURITY=false \
HOME=/home/stirlingpdfuser \ HOME=/home/stirlingpdfuser \
PUID=1000 \ PUID=1000 \
PGID=1000 \ PGID=1000 \
UMASK=022 UMASK=022 \
PYTHONPATH=/usr/lib/libreoffice/program:/opt/venv/lib/python3.12/site-packages \
UNO_PATH=/usr/lib/libreoffice/program \
URE_BOOTSTRAP=file:///usr/lib/libreoffice/program/fundamentalrc
# JDK for app # JDK for app
RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories && \ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories && \
echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories && \ echo "@community https://dl-cdn.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories && \
echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \ echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \
apk upgrade --no-cache -a && \ apk upgrade --no-cache -a && \
apk add --no-cache \ apk add --no-cache \
ca-certificates \ ca-certificates \
tzdata \ tzdata \
tini \ tini \
bash \ bash \
curl \ curl \
qpdf \ qpdf \
shadow \ shadow \
su-exec \ su-exec \
openssl \ openssl \
openssl-dev \ openssl-dev \
openjdk21-jre \ openjdk21-jre \
# Doc conversion # Doc conversion
gcompat \ gcompat \
libc6-compat \ libc6-compat \
libreoffice \ libreoffice \
# pdftohtml # pdftohtml
poppler-utils \ poppler-utils \
# OCR MY PDF (unpaper for descew and other advanced features) # OCR MY PDF (unpaper for descew and other advanced features)
tesseract-ocr-data-eng \ tesseract-ocr-data-eng \
# CV # CV
py3-opencv \ py3-opencv \
# python3/pip python3 \
python3 \ py3-pip \
py3-pip && \ py3-pillow@testing \
# uno unoconv and HTML py3-pdf2image@testing && \
pip install --break-system-packages --no-cache-dir --upgrade unoconv WeasyPrint pdf2image pillow && \ python3 -m venv /opt/venv && \
export PATH="/opt/venv/bin:$PATH" && \
pip install --upgrade pip && \
pip install --no-cache-dir --upgrade unoserver weasyprint && \
ln -s /usr/lib/libreoffice/program/uno.py /opt/venv/lib/python3.12/site-packages/ && \
ln -s /usr/lib/libreoffice/program/unohelper.py /opt/venv/lib/python3.12/site-packages/ && \
ln -s /usr/lib/libreoffice/program /opt/venv/lib/python3.12/site-packages/LibreOffice && \
mv /usr/share/tessdata /usr/share/tessdata-original && \ mv /usr/share/tessdata /usr/share/tessdata-original && \
mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \ mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \
fc-cache -f -v && \ fc-cache -f -v && \
chmod +x /scripts/* && \ chmod +x /scripts/* && \
chmod +x /scripts/init.sh && \ chmod +x /scripts/init.sh && \
# User permissions # User permissions
addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \ addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \
chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \ chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \
chown stirlingpdfuser:stirlingpdfgroup /app.jar chown stirlingpdfuser:stirlingpdfgroup /app.jar
@@ -84,4 +93,4 @@ EXPOSE 8080/tcp
# Set user and run command # Set user and run command
ENTRYPOINT ["tini", "--", "/scripts/init.sh"] ENTRYPOINT ["tini", "--", "/scripts/init.sh"]
CMD ["java", "-Dfile.encoding=UTF-8", "-jar", "/app.jar"] CMD ["sh", "-c", "java -Dfile.encoding=UTF-8 -jar /app.jar & /opt/venv/bin/unoserver --port 2003 --interface 0.0.0.0"]

View File

@@ -9,10 +9,11 @@ COPY . .
# Build the application with DOCKER_ENABLE_SECURITY=false # Build the application with DOCKER_ENABLE_SECURITY=false
RUN DOCKER_ENABLE_SECURITY=true \ RUN DOCKER_ENABLE_SECURITY=true \
STIRLING_PDF_DESKTOP_UI=false \
./gradlew clean build ./gradlew clean build
# Main stage # Main stage
FROM alpine:3.21.2@sha256:56fa17d2a7e7f168a043a2712e63aed1f8543aeafdcee47c58dcffe38ed51099 FROM alpine:3.21.3@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c
# Copy necessary files # Copy necessary files
COPY scripts /scripts COPY scripts /scripts
@@ -37,12 +38,15 @@ ENV DOCKER_ENABLE_SECURITY=false \
PGID=1000 \ PGID=1000 \
UMASK=022 \ UMASK=022 \
FAT_DOCKER=true \ FAT_DOCKER=true \
INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false \
PYTHONPATH=/usr/lib/libreoffice/program:/opt/venv/lib/python3.12/site-packages \
UNO_PATH=/usr/lib/libreoffice/program \
URE_BOOTSTRAP=file:///usr/lib/libreoffice/program/fundamentalrc
# JDK for app # JDK for app
RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories && \ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories && \
echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories && \ echo "@community https://dl-cdn.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories && \
echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \ echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \
apk upgrade --no-cache -a && \ apk upgrade --no-cache -a && \
apk add --no-cache \ apk add --no-cache \
@@ -65,14 +69,21 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
# OCR MY PDF (unpaper for descew and other advanced featues) # OCR MY PDF (unpaper for descew and other advanced featues)
qpdf \ qpdf \
tesseract-ocr-data-eng \ tesseract-ocr-data-eng \
font-terminus font-dejavu font-noto font-noto-cjk font-awesome font-noto-extra \ font-terminus font-dejavu font-noto font-noto-cjk font-awesome font-noto-extra \
# CV # CV
py3-opencv \ py3-opencv \
# python3/pip python3 \
python3 \ py3-pip \
py3-pip && \ py3-pillow@testing \
# uno unoconv and HTML py3-pdf2image@testing && \
pip install --break-system-packages --no-cache-dir --upgrade unoconv WeasyPrint pdf2image pillow && \ python3 -m venv /opt/venv && \
export PATH="/opt/venv/bin:$PATH" && \
pip install --upgrade pip && \
pip install --no-cache-dir --upgrade unoserver weasyprint && \
ln -s /usr/lib/libreoffice/program/uno.py /opt/venv/lib/python3.12/site-packages/ && \
ln -s /usr/lib/libreoffice/program/unohelper.py /opt/venv/lib/python3.12/site-packages/ && \
ln -s /usr/lib/libreoffice/program /opt/venv/lib/python3.12/site-packages/LibreOffice && \
mv /usr/share/tessdata /usr/share/tessdata-original && \ mv /usr/share/tessdata /usr/share/tessdata-original && \
mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \ mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \
fc-cache -f -v && \ fc-cache -f -v && \
@@ -84,7 +95,6 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
chown stirlingpdfuser:stirlingpdfgroup /app.jar chown stirlingpdfuser:stirlingpdfgroup /app.jar
EXPOSE 8080/tcp EXPOSE 8080/tcp
# Set user and run command # Set user and run command
ENTRYPOINT ["tini", "--", "/scripts/init.sh"] ENTRYPOINT ["tini", "--", "/scripts/init.sh"]
CMD ["java", "-Dfile.encoding=UTF-8", "-jar", "/app.jar"] CMD ["sh", "-c", "java -Dfile.encoding=UTF-8 -jar /app.jar & /opt/venv/bin/unoserver --port 2003 --interface 0.0.0.0"]

View File

@@ -1,5 +1,5 @@
# use alpine # use alpine
FROM alpine:3.21.2@sha256:56fa17d2a7e7f168a043a2712e63aed1f8543aeafdcee47c58dcffe38ed51099 FROM alpine:3.21.3@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c
ARG VERSION_TAG ARG VERSION_TAG

View File

@@ -3,7 +3,6 @@
[![Docker Pulls](https://img.shields.io/docker/pulls/frooodle/s-pdf)](https://hub.docker.com/r/frooodle/s-pdf) [![Docker Pulls](https://img.shields.io/docker/pulls/frooodle/s-pdf)](https://hub.docker.com/r/frooodle/s-pdf)
[![Discord](https://img.shields.io/discord/1068636748814483718?label=Discord)](https://discord.gg/HYmhKj45pU) [![Discord](https://img.shields.io/discord/1068636748814483718?label=Discord)](https://discord.gg/HYmhKj45pU)
[![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/frooodle/s-pdf/latest)](https://github.com/Stirling-Tools/Stirling-PDF/)
[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/Stirling-Tools/Stirling-PDF/badge)](https://scorecard.dev/viewer/?uri=github.com/Stirling-Tools/Stirling-PDF) [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/Stirling-Tools/Stirling-PDF/badge)](https://scorecard.dev/viewer/?uri=github.com/Stirling-Tools/Stirling-PDF)
[![GitHub Repo stars](https://img.shields.io/github/stars/stirling-tools/stirling-pdf?style=social)](https://github.com/Stirling-Tools/stirling-pdf) [![GitHub Repo stars](https://img.shields.io/github/stars/stirling-tools/stirling-pdf?style=social)](https://github.com/Stirling-Tools/stirling-pdf)
@@ -120,10 +119,10 @@ Stirling-PDF currently supports 39 languages!
| Arabic (العربية) (ar_AR) | ![89%](https://geps.dev/progress/89) | | Arabic (العربية) (ar_AR) | ![89%](https://geps.dev/progress/89) |
| Azerbaijani (Azərbaycan Dili) (az_AZ) | ![88%](https://geps.dev/progress/88) | | Azerbaijani (Azərbaycan Dili) (az_AZ) | ![88%](https://geps.dev/progress/88) |
| Basque (Euskara) (eu_ES) | ![51%](https://geps.dev/progress/51) | | Basque (Euskara) (eu_ES) | ![51%](https://geps.dev/progress/51) |
| Bulgarian (Български) (bg_BG) | ![85%](https://geps.dev/progress/85) | | Bulgarian (Български) (bg_BG) | ![99%](https://geps.dev/progress/99) |
| Catalan (Català) (ca_CA) | ![80%](https://geps.dev/progress/80) | | Catalan (Català) (ca_CA) | ![80%](https://geps.dev/progress/80) |
| Croatian (Hrvatski) (hr_HR) | ![87%](https://geps.dev/progress/87) | | Croatian (Hrvatski) (hr_HR) | ![86%](https://geps.dev/progress/86) |
| Czech (Česky) (cs_CZ) | ![98%](https://geps.dev/progress/98) | | Czech (Česky) (cs_CZ) | ![97%](https://geps.dev/progress/97) |
| Danish (Dansk) (da_DK) | ![85%](https://geps.dev/progress/85) | | Danish (Dansk) (da_DK) | ![85%](https://geps.dev/progress/85) |
| Dutch (Nederlands) (nl_NL) | ![85%](https://geps.dev/progress/85) | | Dutch (Nederlands) (nl_NL) | ![85%](https://geps.dev/progress/85) |
| English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) |
@@ -136,23 +135,23 @@ Stirling-PDF currently supports 39 languages!
| Indonesian (Bahasa Indonesia) (id_ID) | ![86%](https://geps.dev/progress/86) | | Indonesian (Bahasa Indonesia) (id_ID) | ![86%](https://geps.dev/progress/86) |
| Irish (Gaeilge) (ga_IE) | ![98%](https://geps.dev/progress/98) | | Irish (Gaeilge) (ga_IE) | ![98%](https://geps.dev/progress/98) |
| Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) |
| Japanese (日本語) (ja_JP) | ![93%](https://geps.dev/progress/93) | | Japanese (日本語) (ja_JP) | ![92%](https://geps.dev/progress/92) |
| Korean (한국어) (ko_KR) | ![98%](https://geps.dev/progress/98) | | Korean (한국어) (ko_KR) | ![98%](https://geps.dev/progress/98) |
| Norwegian (Norsk) (no_NB) | ![78%](https://geps.dev/progress/78) | | Norwegian (Norsk) (no_NB) | ![78%](https://geps.dev/progress/78) |
| Persian (فارسی) (fa_IR) | ![94%](https://geps.dev/progress/94) | | Persian (فارسی) (fa_IR) | ![94%](https://geps.dev/progress/94) |
| Polish (Polski) (pl_PL) | ![86%](https://geps.dev/progress/86) | | Polish (Polski) (pl_PL) | ![85%](https://geps.dev/progress/85) |
| Portuguese (Português) (pt_PT) | ![97%](https://geps.dev/progress/97) | | Portuguese (Português) (pt_PT) | ![97%](https://geps.dev/progress/97) |
| Portuguese Brazilian (Português) (pt_BR) | ![98%](https://geps.dev/progress/98) | | Portuguese Brazilian (Português) (pt_BR) | ![98%](https://geps.dev/progress/98) |
| Romanian (Română) (ro_RO) | ![81%](https://geps.dev/progress/81) | | Romanian (Română) (ro_RO) | ![80%](https://geps.dev/progress/80) |
| Russian (Русский) (ru_RU) | ![98%](https://geps.dev/progress/98) | | Russian (Русский) (ru_RU) | ![97%](https://geps.dev/progress/97) |
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![63%](https://geps.dev/progress/63) | | Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![63%](https://geps.dev/progress/63) |
| Simplified Chinese (简体中文) (zh_CN) | ![90%](https://geps.dev/progress/90) | | Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) |
| Slovakian (Slovensky) (sk_SK) | ![74%](https://geps.dev/progress/74) | | Slovakian (Slovensky) (sk_SK) | ![74%](https://geps.dev/progress/74) |
| Slovenian (Slovenščina) (sl_SI) | ![97%](https://geps.dev/progress/97) | | Slovenian (Slovenščina) (sl_SI) | ![96%](https://geps.dev/progress/96) |
| Spanish (Español) (es_ES) | ![87%](https://geps.dev/progress/87) | | Spanish (Español) (es_ES) | ![86%](https://geps.dev/progress/86) |
| Swedish (Svenska) (sv_SE) | ![92%](https://geps.dev/progress/92) | | Swedish (Svenska) (sv_SE) | ![92%](https://geps.dev/progress/92) |
| Thai (ไทย) (th_TH) | ![86%](https://geps.dev/progress/86) | | Thai (ไทย) (th_TH) | ![85%](https://geps.dev/progress/85) |
| Tibetan (བོད་ཡིག་) (zh_BO) | ![95%](https://geps.dev/progress/95) | | Tibetan (བོད་ཡིག་) (zh_BO) | ![94%](https://geps.dev/progress/94) |
| Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | | Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) |
| Turkish (Türkçe) (tr_TR) | ![82%](https://geps.dev/progress/82) | | Turkish (Türkçe) (tr_TR) | ![82%](https://geps.dev/progress/82) |
| Ukrainian (Українська) (uk_UA) | ![72%](https://geps.dev/progress/72) | | Ukrainian (Українська) (uk_UA) | ![72%](https://geps.dev/progress/72) |

View File

@@ -15,9 +15,8 @@ plugins {
import com.github.jk1.license.render.* import com.github.jk1.license.render.*
ext { ext {
springBootVersion = "3.4.1" springBootVersion = "3.4.2"
pdfboxVersion = "3.0.4" pdfboxVersion = "3.0.4"
logbackVersion = "1.5.7"
imageioVersion = "3.12.0" imageioVersion = "3.12.0"
lombokVersion = "1.18.36" lombokVersion = "1.18.36"
bouncycastleVersion = "1.80" bouncycastleVersion = "1.80"
@@ -26,7 +25,7 @@ ext {
} }
group = "stirling.software" group = "stirling.software"
version = "0.41.0" version = "0.42.0"
java { java {
// 17 is lowest but we support and recommend 21 // 17 is lowest but we support and recommend 21
@@ -261,7 +260,7 @@ spotless {
googleJavaFormat("1.25.2").aosp().reorderImports(false) googleJavaFormat("1.25.2").aosp().reorderImports(false)
importOrder("java", "javax", "org", "com", "net", "io") importOrder("java", "javax", "org", "com", "net", "io", "jakarta", "lombok", "me", "stirling")
toggleOffOn() toggleOffOn()
trimTrailingWhitespace() trimTrailingWhitespace()
leadingTabsToSpaces() leadingTabsToSpaces()
@@ -273,7 +272,7 @@ sonar {
properties { properties {
property "sonar.projectKey", "Stirling-Tools_Stirling-PDF" property "sonar.projectKey", "Stirling-Tools_Stirling-PDF"
property "sonar.organization", "stirling-tools" property "sonar.organization", "stirling-tools"
property "sonar.exclusions", "**/build-wrapper-dump.json, src/main/java/org/apache/**, src/main/resources/static/pdfjs/**, src/main/resources/static/pdfjs-legacy/**, src/main/resources/static/js/thirdParty/**" property "sonar.exclusions", "**/build-wrapper-dump.json, src/main/java/org/apache/**, src/main/resources/static/pdfjs/**, src/main/resources/static/pdfjs-legacy/**, src/main/resources/static/js/thirdParty/**"
property "sonar.coverage.exclusions", "src/main/java/org/apache/**, src/main/resources/static/pdfjs/**, src/main/resources/static/pdfjs-legacy/**, src/main/resources/static/js/thirdParty/**" property "sonar.coverage.exclusions", "src/main/java/org/apache/**, src/main/resources/static/pdfjs/**, src/main/resources/static/pdfjs-legacy/**, src/main/resources/static/js/thirdParty/**"
property "sonar.cpd.exclusions", "src/main/java/org/apache/**, src/main/resources/static/pdfjs/**, src/main/resources/static/pdfjs-legacy/**, src/main/resources/static/js/thirdParty/**" property "sonar.cpd.exclusions", "src/main/java/org/apache/**, src/main/resources/static/pdfjs/**, src/main/resources/static/pdfjs-legacy/**, src/main/resources/static/js/thirdParty/**"
@@ -294,14 +293,27 @@ configurations.all {
} }
dependencies { dependencies {
//tmp for security bumps
implementation 'ch.qos.logback:logback-core:1.5.15'
implementation 'ch.qos.logback:logback-classic:1.5.15'
// Exclude vulnerable BouncyCastle version used in tableau
configurations.all {
exclude group: 'org.bouncycastle', module: 'bcpkix-jdk15on'
exclude group: 'org.bouncycastle', module: 'bcutil-jdk15on'
exclude group: 'org.bouncycastle', module: 'bcmail-jdk15on'
}
if (System.getenv("STIRLING_PDF_DESKTOP_UI") != "false") { if (System.getenv("STIRLING_PDF_DESKTOP_UI") != "false") {
implementation 'org.apache.commons:commons-compress:1.26.0'
implementation "me.friwi:jcefmaven:127.3.1" implementation "me.friwi:jcefmaven:127.3.1"
implementation "org.openjfx:javafx-controls:21" implementation "org.openjfx:javafx-controls:21"
implementation "org.openjfx:javafx-swing:21" implementation "org.openjfx:javafx-swing:21"
} }
//security updates //security updates
implementation "org.springframework:spring-webmvc:6.2.2" implementation "org.springframework:spring-webmvc:6.2.3"
implementation("io.github.pixee:java-security-toolkit:1.2.1") implementation("io.github.pixee:java-security-toolkit:1.2.1")
@@ -320,8 +332,8 @@ dependencies {
implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion"
implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion"
implementation "org.springframework.session:spring-session-core:$springBootVersion" implementation "org.springframework.session:spring-session-core:3.4.1"
implementation "org.springframework:spring-jdbc:6.2.2" implementation "org.springframework:spring-jdbc:6.2.3"
implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5' implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5'
// Don't upgrade h2database // Don't upgrade h2database
@@ -396,7 +408,7 @@ dependencies {
implementation "org.bouncycastle:bcprov-jdk18on:$bouncycastleVersion" implementation "org.bouncycastle:bcprov-jdk18on:$bouncycastleVersion"
implementation "org.bouncycastle:bcpkix-jdk18on:$bouncycastleVersion" implementation "org.bouncycastle:bcpkix-jdk18on:$bouncycastleVersion"
implementation "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion"
implementation "io.micrometer:micrometer-core:1.14.3" implementation "io.micrometer:micrometer-core:1.14.4"
implementation group: "com.google.zxing", name: "core", version: "3.5.3" implementation group: "com.google.zxing", name: "core", version: "3.5.3"
// https://mvnrepository.com/artifact/org.commonmark/commonmark // https://mvnrepository.com/artifact/org.commonmark/commonmark
implementation "org.commonmark:commonmark:0.24.0" implementation "org.commonmark:commonmark:0.24.0"

View File

@@ -41,6 +41,7 @@ import me.friwi.jcefmaven.MavenCefAppHandlerAdapter;
import me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler; import me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler;
import stirling.software.SPDF.UI.WebBrowser; import stirling.software.SPDF.UI.WebBrowser;
import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.config.InstallationPathConfig;
import stirling.software.SPDF.utils.UIScaling;
@Component @Component
@Slf4j @Slf4j
@@ -215,7 +216,7 @@ public class DesktopBrowser implements WebBrowser {
} }
}); });
frame.setSize(1280, 768); frame.setSize(UIScaling.scaleWidth(1280), UIScaling.scaleHeight(800));
frame.setLocationRelativeTo(null); frame.setLocationRelativeTo(null);
loadIcon(); loadIcon();
@@ -264,7 +265,9 @@ public class DesktopBrowser implements WebBrowser {
frame.setOpacity(1.0f); frame.setOpacity(1.0f);
frame.setUndecorated(false); frame.setUndecorated(false);
frame.pack(); frame.pack();
frame.setSize(1280, 800); frame.setSize(
UIScaling.scaleWidth(1280),
UIScaling.scaleHeight(800));
frame.setLocationRelativeTo(null); frame.setLocationRelativeTo(null);
log.debug("Frame reconfigured"); log.debug("Frame reconfigured");

View File

@@ -1,12 +1,20 @@
package stirling.software.SPDF.UI.impl; package stirling.software.SPDF.UI.impl;
import java.awt.*; import java.awt.*;
import java.io.BufferedReader;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.swing.*; import javax.swing.*;
import io.github.pixee.security.BoundedLineReader;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.utils.UIScaling;
@Slf4j @Slf4j
public class LoadingWindow extends JDialog { public class LoadingWindow extends JDialog {
@@ -16,6 +24,13 @@ public class LoadingWindow extends JDialog {
private final JLabel brandLabel; private final JLabel brandLabel;
private long startTime; private long startTime;
private Timer stuckTimer;
private long stuckThreshold = 4000;
private long timeAt90Percent = -1;
private volatile Process explorerProcess;
private static final boolean IS_WINDOWS =
System.getProperty("os.name").toLowerCase().contains("win");
public LoadingWindow(Frame parent, String initialUrl) { public LoadingWindow(Frame parent, String initialUrl) {
super(parent, "Initializing Stirling-PDF", true); super(parent, "Initializing Stirling-PDF", true);
startTime = System.currentTimeMillis(); startTime = System.currentTimeMillis();
@@ -41,12 +56,12 @@ public class LoadingWindow extends JDialog {
if (is != null) { if (is != null) {
Image img = ImageIO.read(is); Image img = ImageIO.read(is);
if (img != null) { if (img != null) {
Image scaledImg = img.getScaledInstance(48, 48, Image.SCALE_SMOOTH); Image scaledImg = UIScaling.scaleIcon(img, 48, 48);
JLabel iconLabel = new JLabel(new ImageIcon(scaledImg)); JLabel iconLabel = new JLabel(new ImageIcon(scaledImg));
iconLabel.setHorizontalAlignment(SwingConstants.CENTER); iconLabel.setHorizontalAlignment(SwingConstants.CENTER);
gbc.gridy = 0; gbc.gridy = 0;
mainPanel.add(iconLabel, gbc); mainPanel.add(iconLabel, gbc);
log.debug("Icon loaded and scaled successfully"); log.info("Icon loaded and scaled successfully");
} }
} }
} }
@@ -83,7 +98,8 @@ public class LoadingWindow extends JDialog {
setUndecorated(false); setUndecorated(false);
// Set size and position // Set size and position
setSize(400, 200); setSize(UIScaling.scaleWidth(400), UIScaling.scaleHeight(200));
setLocationRelativeTo(parent); setLocationRelativeTo(parent);
setAlwaysOnTop(true); setAlwaysOnTop(true);
setProgress(0); setProgress(0);
@@ -94,6 +110,163 @@ public class LoadingWindow extends JDialog {
System.currentTimeMillis() - startTime); System.currentTimeMillis() - startTime);
} }
private void checkAndRefreshExplorer() {
if (!IS_WINDOWS) {
return;
}
if (timeAt90Percent == -1) {
timeAt90Percent = System.currentTimeMillis();
stuckTimer =
new Timer(
1000,
e -> {
long currentTime = System.currentTimeMillis();
if (currentTime - timeAt90Percent > stuckThreshold) {
try {
log.debug(
"Attempting Windows explorer refresh due to 90% stuck state");
String currentDir = System.getProperty("user.dir");
// Store current explorer PIDs before we start new one
Set<String> existingPids = new HashSet<>();
ProcessBuilder listExplorer =
new ProcessBuilder(
"cmd",
"/c",
"wmic",
"process",
"where",
"name='explorer.exe'",
"get",
"ProcessId",
"/format:csv");
Process process = listExplorer.start();
BufferedReader reader =
new BufferedReader(
new InputStreamReader(
process.getInputStream()));
String line;
while ((line =
BoundedLineReader.readLine(
reader, 5_000_000))
!= null) {
if (line.matches(".*\\d+.*")) { // Contains numbers
String[] parts = line.trim().split(",");
if (parts.length >= 2) {
existingPids.add(
parts[parts.length - 1].trim());
}
}
}
process.waitFor(2, TimeUnit.SECONDS);
// Start new explorer
ProcessBuilder pb =
new ProcessBuilder(
"cmd",
"/c",
"start",
"/min",
"/b",
"explorer.exe",
currentDir);
pb.redirectErrorStream(true);
explorerProcess = pb.start();
// Schedule cleanup
Timer cleanupTimer =
new Timer(
2000,
cleanup -> {
try {
// Find new explorer processes
ProcessBuilder findNewExplorer =
new ProcessBuilder(
"cmd",
"/c",
"wmic",
"process",
"where",
"name='explorer.exe'",
"get",
"ProcessId",
"/format:csv");
Process newProcess =
findNewExplorer.start();
BufferedReader newReader =
new BufferedReader(
new InputStreamReader(
newProcess
.getInputStream()));
String newLine;
while ((newLine =
BoundedLineReader
.readLine(
newReader,
5_000_000))
!= null) {
if (newLine.matches(
".*\\d+.*")) {
String[] parts =
newLine.trim()
.split(",");
if (parts.length >= 2) {
String pid =
parts[
parts.length
- 1]
.trim();
if (!existingPids
.contains(
pid)) {
log.debug(
"Found new explorer.exe with PID: "
+ pid);
ProcessBuilder
killProcess =
new ProcessBuilder(
"taskkill",
"/PID",
pid,
"/F");
killProcess
.redirectErrorStream(
true);
Process killResult =
killProcess
.start();
killResult.waitFor(
2,
TimeUnit
.SECONDS);
log.debug(
"Explorer process terminated: "
+ pid);
}
}
}
}
newProcess.waitFor(
2, TimeUnit.SECONDS);
} catch (Exception ex) {
log.error(
"Error cleaning up Windows explorer process",
ex);
}
});
cleanupTimer.setRepeats(false);
cleanupTimer.start();
stuckTimer.stop();
} catch (Exception ex) {
log.error("Error refreshing Windows explorer", ex);
}
}
});
stuckTimer.setRepeats(true);
stuckTimer.start();
}
}
public void setProgress(final int progress) { public void setProgress(final int progress) {
SwingUtilities.invokeLater( SwingUtilities.invokeLater(
() -> { () -> {
@@ -115,11 +288,23 @@ public class LoadingWindow extends JDialog {
// Add thread state logging // Add thread state logging
Thread currentThread = Thread.currentThread(); Thread currentThread = Thread.currentThread();
log.debug( log.info(
"Current thread state - Name: {}, State: {}, Priority: {}", "Current thread state - Name: {}, State: {}, Priority: {}",
currentThread.getName(), currentThread.getName(),
currentThread.getState(), currentThread.getState(),
currentThread.getPriority()); currentThread.getPriority());
if (validProgress >= 90 && validProgress < 95) {
checkAndRefreshExplorer();
} else {
// Reset the timer if we move past 95%
if (validProgress >= 95) {
if (stuckTimer != null) {
stuckTimer.stop();
}
timeAt90Percent = -1;
}
}
} }
progressBar.setValue(validProgress); progressBar.setValue(validProgress);
@@ -145,7 +330,7 @@ public class LoadingWindow extends JDialog {
statusLabel.setText(validStatus); statusLabel.setText(validStatus);
// Log UI state when status changes // Log UI state when status changes
log.debug( log.info(
"UI State - Window visible: {}, Progress: {}%, Status: {}", "UI State - Window visible: {}, Progress: {}%, Status: {}",
isVisible(), progressBar.getValue(), validStatus); isVisible(), progressBar.getValue(), validStatus);

View File

@@ -21,9 +21,9 @@ public class ExternalAppDepConfig {
{ {
put("soffice", List.of("LibreOffice")); put("soffice", List.of("LibreOffice"));
put("weasyprint", List.of("Weasyprint")); put("/opt/venv/bin/weasyprint", List.of("Weasyprint"));
put("pdftohtml", List.of("Pdftohtml")); put("pdftohtml", List.of("Pdftohtml"));
put("unoconv", List.of("Unoconv")); put("/opt/venv/bin/unoconvert", List.of("Unoconv"));
put("qpdf", List.of("qpdf")); put("qpdf", List.of("qpdf"));
put("tesseract", List.of("tesseract")); put("tesseract", List.of("tesseract"));
} }
@@ -101,9 +101,9 @@ public class ExternalAppDepConfig {
checkDependencyAndDisableGroup("tesseract"); checkDependencyAndDisableGroup("tesseract");
checkDependencyAndDisableGroup("soffice"); checkDependencyAndDisableGroup("soffice");
checkDependencyAndDisableGroup("qpdf"); checkDependencyAndDisableGroup("qpdf");
checkDependencyAndDisableGroup("weasyprint"); checkDependencyAndDisableGroup("/opt/venv/bin/weasyprint");
checkDependencyAndDisableGroup("pdftohtml"); checkDependencyAndDisableGroup("pdftohtml");
checkDependencyAndDisableGroup("unoconv"); checkDependencyAndDisableGroup("/opt/venv/bin/unoconvert");
// Special handling for Python/OpenCV dependencies // Special handling for Python/OpenCV dependencies
boolean pythonAvailable = isCommandAvailable("python3") || isCommandAvailable("python"); boolean pythonAvailable = isCommandAvailable("python3") || isCommandAvailable("python");
if (!pythonAvailable) { if (!pythonAvailable) {

View File

@@ -139,6 +139,9 @@ public class UserService implements UserServiceInterface {
User user = User user =
findByUsernameIgnoreCase(username) findByUsernameIgnoreCase(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found")); .orElseThrow(() -> new UsernameNotFoundException("User not found"));
if(user.getApiKey() == null || user.getApiKey().length() == 0) {
user = addApiKeyToUser(username);
}
return user.getApiKey(); return user.getApiKey();
} }

View File

@@ -174,7 +174,38 @@ public class RearrangePagesPDFController {
return newPageOrderZeroBased; return newPageOrderZeroBased;
} }
private List<Integer> processSortTypes(String sortTypes, int totalPages) { private List<Integer> duplicate(int totalPages, String pageOrder) {
List<Integer> newPageOrder = new ArrayList<>();
int duplicateCount;
try {
// Parse the duplicate count from pageOrder
duplicateCount =
pageOrder != null && !pageOrder.isEmpty()
? Integer.parseInt(pageOrder.trim())
: 2; // Default to 2 if not specified
} catch (NumberFormatException e) {
log.error("Invalid duplicate count specified", e);
duplicateCount = 2; // Default to 2 if invalid input
}
// Validate duplicate count
if (duplicateCount < 1) {
duplicateCount = 2; // Default to 2 if invalid input
}
// For each page in the document
for (int pageNum = 0; pageNum < totalPages; pageNum++) {
// Add the current page index duplicateCount times
for (int dupCount = 0; dupCount < duplicateCount; dupCount++) {
newPageOrder.add(pageNum);
}
}
return newPageOrder;
}
private List<Integer> processSortTypes(String sortTypes, int totalPages, String pageOrder) {
try { try {
SortTypes mode = SortTypes.valueOf(sortTypes.toUpperCase()); SortTypes mode = SortTypes.valueOf(sortTypes.toUpperCase());
switch (mode) { switch (mode) {
@@ -196,6 +227,8 @@ public class RearrangePagesPDFController {
return removeLast(totalPages); return removeLast(totalPages);
case REMOVE_FIRST_AND_LAST: case REMOVE_FIRST_AND_LAST:
return removeFirstAndLast(totalPages); return removeFirstAndLast(totalPages);
case DUPLICATE:
return duplicate(totalPages, pageOrder);
default: default:
throw new IllegalArgumentException("Unsupported custom mode"); throw new IllegalArgumentException("Unsupported custom mode");
} }
@@ -223,8 +256,10 @@ public class RearrangePagesPDFController {
String[] pageOrderArr = pageOrder != null ? pageOrder.split(",") : new String[0]; String[] pageOrderArr = pageOrder != null ? pageOrder.split(",") : new String[0];
int totalPages = document.getNumberOfPages(); int totalPages = document.getNumberOfPages();
List<Integer> newPageOrder; List<Integer> newPageOrder;
if (sortType != null && sortType.length() > 0) { if (sortType != null
newPageOrder = processSortTypes(sortType, totalPages); && sortType.length() > 0
&& !"custom".equals(sortType.toLowerCase())) {
newPageOrder = processSortTypes(sortType, totalPages, pageOrder);
} else { } else {
newPageOrder = GeneralUtils.parsePageList(pageOrderArr, totalPages, false); newPageOrder = GeneralUtils.parsePageList(pageOrderArr, totalPages, false);
} }

View File

@@ -61,13 +61,13 @@ public class ConvertOfficeController {
List<String> command = List<String> command =
new ArrayList<>( new ArrayList<>(
Arrays.asList( Arrays.asList(
"unoconv", "/opt/venv/bin/unoconvert",
"-vvv", "--port",
"-f", "2003",
"--convert-to",
"pdf", "pdf",
"-o", tempInputFile.toString(),
tempOutputFile.toString(), tempOutputFile.toString()));
tempInputFile.toString()));
ProcessExecutorResult returnCode = ProcessExecutorResult returnCode =
ProcessExecutor.getInstance(ProcessExecutor.Processes.LIBRE_OFFICE) ProcessExecutor.getInstance(ProcessExecutor.Processes.LIBRE_OFFICE)
.runCommandWithOutputHandling(command); .runCommandWithOutputHandling(command);

View File

@@ -65,7 +65,7 @@ public class ConvertWebsiteToPDF {
// Prepare the WeasyPrint command // Prepare the WeasyPrint command
List<String> command = new ArrayList<>(); List<String> command = new ArrayList<>();
command.add("weasyprint"); command.add("/opt/venv/bin/weasyprint");
command.add(URL); command.add(URL);
command.add(tempOutputFile.toString()); command.add(tempOutputFile.toString());

View File

@@ -1,7 +1,14 @@
package stirling.software.SPDF.controller.api.converters; package stirling.software.SPDF.controller.api.converters;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringWriter; import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.QuoteMode; import org.apache.commons.csv.QuoteMode;
@@ -18,18 +25,18 @@ import org.springframework.web.bind.annotation.RestController;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.api.extract.PDFFilePage; import stirling.software.SPDF.model.api.PDFWithPageNums;
import stirling.software.SPDF.pdf.FlexibleCSVWriter; import stirling.software.SPDF.pdf.FlexibleCSVWriter;
import technology.tabula.ObjectExtractor; import technology.tabula.ObjectExtractor;
import technology.tabula.Page; import technology.tabula.Page;
import technology.tabula.Table; import technology.tabula.Table;
import technology.tabula.extractors.SpreadsheetExtractionAlgorithm; import technology.tabula.extractors.SpreadsheetExtractionAlgorithm;
import technology.tabula.writers.Writer;
@RestController @RestController
@RequestMapping("/api/v1/convert") @RequestMapping("/api/v1/convert")
@Tag(name = "Convert", description = "Convert APIs") @Tag(name = "Convert", description = "Convert APIs")
@Slf4j
public class ExtractCSVController { public class ExtractCSVController {
@PostMapping(value = "/pdf/csv", consumes = "multipart/form-data") @PostMapping(value = "/pdf/csv", consumes = "multipart/form-data")
@@ -37,31 +44,80 @@ public class ExtractCSVController {
summary = "Extracts a CSV document from a PDF", summary = "Extracts a CSV document from a PDF",
description = description =
"This operation takes an input PDF file and returns CSV file of whole page. Input:PDF Output:CSV Type:SISO") "This operation takes an input PDF file and returns CSV file of whole page. Input:PDF Output:CSV Type:SISO")
public ResponseEntity<String> PdfToCsv(@ModelAttribute PDFFilePage form) throws Exception { public ResponseEntity<?> pdfToCsv(@ModelAttribute PDFWithPageNums form) throws Exception {
StringWriter writer = new StringWriter(); String baseName = getBaseName(form.getFileInput().getOriginalFilename());
List<CsvEntry> csvEntries = new ArrayList<>();
try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) { try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) {
CSVFormat format = List<Integer> pages = form.getPageNumbersList(document, true);
CSVFormat.EXCEL.builder().setEscape('"').setQuoteMode(QuoteMode.ALL).build();
Writer csvWriter = new FlexibleCSVWriter(format);
SpreadsheetExtractionAlgorithm sea = new SpreadsheetExtractionAlgorithm(); SpreadsheetExtractionAlgorithm sea = new SpreadsheetExtractionAlgorithm();
try (ObjectExtractor extractor = new ObjectExtractor(document)) { CSVFormat format = CSVFormat.EXCEL.builder()
Page page = extractor.extract(form.getPageId()); .setEscape('"')
List<Table> tables = sea.extract(page); .setQuoteMode(QuoteMode.ALL)
csvWriter.write(writer, tables); .build();
for (int pageNum : pages) {
try (ObjectExtractor extractor = new ObjectExtractor(document)) {
log.info("{}",pageNum);
Page page = extractor.extract(pageNum);
List<Table> tables = sea.extract(page);
for (int i = 0; i < tables.size(); i++) {
StringWriter sw = new StringWriter();
FlexibleCSVWriter csvWriter = new FlexibleCSVWriter(format);
csvWriter.write(sw, Collections.singletonList(tables.get(i)));
String entryName = generateEntryName(baseName, pageNum, i + 1);
csvEntries.add(new CsvEntry(entryName, sw.toString()));
}
}
}
if (csvEntries.isEmpty()) {
return ResponseEntity.noContent().build();
} else if (csvEntries.size() == 1) {
return createCsvResponse(csvEntries.get(0), baseName);
} else {
return createZipResponse(csvEntries, baseName);
} }
} }
HttpHeaders headers = new HttpHeaders();
headers.setContentDisposition(
ContentDisposition.builder("attachment")
.filename(
form.getFileInput()
.getOriginalFilename()
.replaceFirst("[.][^.]+$", "")
+ "_extracted.csv")
.build());
headers.setContentType(MediaType.parseMediaType("text/csv"));
return ResponseEntity.ok().headers(headers).body(writer.toString());
} }
private ResponseEntity<byte[]> createZipResponse(List<CsvEntry> entries, String baseName) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ZipOutputStream zipOut = new ZipOutputStream(baos)) {
for (CsvEntry entry : entries) {
ZipEntry zipEntry = new ZipEntry(entry.filename());
zipOut.putNextEntry(zipEntry);
zipOut.write(entry.content().getBytes(StandardCharsets.UTF_8));
zipOut.closeEntry();
}
}
HttpHeaders headers = new HttpHeaders();
headers.setContentDisposition(ContentDisposition.builder("attachment")
.filename(baseName + "_extracted.zip").build());
headers.setContentType(MediaType.parseMediaType("application/zip"));
return ResponseEntity.ok().headers(headers).body(baos.toByteArray());
}
private ResponseEntity<String> createCsvResponse(CsvEntry entry, String baseName) {
HttpHeaders headers = new HttpHeaders();
headers.setContentDisposition(ContentDisposition.builder("attachment")
.filename(baseName + "_extracted.csv").build());
headers.setContentType(MediaType.parseMediaType("text/csv"));
return ResponseEntity.ok().headers(headers).body(entry.content());
}
private String generateEntryName(String baseName, int pageNum, int tableIndex) {
return String.format("%s_p%d_t%d.csv", baseName, pageNum, tableIndex);
}
private String getBaseName(String filename) {
return filename.replaceFirst("[.][^.]+$", "");
}
private record CsvEntry(String filename, String content) {}
} }

View File

@@ -1,6 +1,7 @@
package stirling.software.SPDF.model; package stirling.software.SPDF.model;
public enum SortTypes { public enum SortTypes {
CUSTOM,
REVERSE_ORDER, REVERSE_ORDER,
DUPLEX_SORT, DUPLEX_SORT,
BOOKLET_SORT, BOOKLET_SORT,
@@ -10,4 +11,5 @@ public enum SortTypes {
REMOVE_FIRST, REMOVE_FIRST,
REMOVE_LAST, REMOVE_LAST,
REMOVE_FIRST_AND_LAST, REMOVE_FIRST_AND_LAST,
DUPLICATE
} }

View File

@@ -8,6 +8,7 @@ import org.apache.pdfbox.pdmodel.PDDocument;
import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -25,7 +26,9 @@ public class PDFWithPageNums extends PDFFile {
description = description =
"The pages to select, Supports ranges (e.g., '1,3,5-9'), or 'all' or functions in the" "The pages to select, Supports ranges (e.g., '1,3,5-9'), or 'all' or functions in the"
+ " format 'an+b' where 'a' is the multiplier of the page number 'n', and 'b' is a" + " format 'an+b' where 'a' is the multiplier of the page number 'n', and 'b' is a"
+ " constant (e.g., '2n+1', '3n', '6n-5')\"") + " constant (e.g., '2n+1', '3n', '6n-5')\"",
defaultValue = "all",
requiredMode = RequiredMode.NOT_REQUIRED)
private String pageNumbers; private String pageNumbers;
@Hidden @Hidden
@@ -41,9 +44,9 @@ public class PDFWithPageNums extends PDFFile {
} }
@Hidden @Hidden
public List<Integer> getPageNumbersList(PDDocument doc, boolean zeroCount) { public List<Integer> getPageNumbersList(PDDocument doc, boolean oneBased) {
int pageCount = 0; int pageCount = 0;
pageCount = doc.getNumberOfPages(); pageCount = doc.getNumberOfPages();
return GeneralUtils.parsePageList(pageNumbers, pageCount, zeroCount); return GeneralUtils.parsePageList(pageNumbers, pageCount, oneBased);
} }
} }

View File

@@ -1,15 +0,0 @@
package stirling.software.SPDF.model.api.extract;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import stirling.software.SPDF.model.api.PDFFile;
@Data
@EqualsAndHashCode(callSuper = true)
public class PDFFilePage extends PDFFile {
@Schema(description = "Number of chosen page", type = "number")
private int pageId;
}

View File

@@ -15,6 +15,8 @@ public class RearrangePagesRequest extends PDFWithPageNums {
implementation = SortTypes.class, implementation = SortTypes.class,
description = description =
"The custom mode for page rearrangement. Valid values are:\n" "The custom mode for page rearrangement. Valid values are:\n"
+ "CUSTOM: Uses order defined in PageNums "
+ "DUPLICATE: Duplicate pages n times (if Page order defined as 4, then duplicates each page 4 times)"
+ "REVERSE_ORDER: Reverses the order of all pages.\n" + "REVERSE_ORDER: Reverses the order of all pages.\n"
+ "DUPLEX_SORT: Sorts pages as if all fronts were scanned then all backs in reverse (1, n, 2, n-1, ...). " + "DUPLEX_SORT: Sorts pages as if all fronts were scanned then all backs in reverse (1, n, 2, n-1, ...). "
+ "BOOKLET_SORT: Arranges pages for booklet printing (last, first, second, second last, ...).\n" + "BOOKLET_SORT: Arranges pages for booklet printing (last, first, second, second last, ...).\n"

View File

@@ -1,6 +1,7 @@
package stirling.software.SPDF.model.api.misc; package stirling.software.SPDF.model.api.misc;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -11,24 +12,49 @@ import stirling.software.SPDF.model.api.PDFWithPageNums;
public class AddPageNumbersRequest extends PDFWithPageNums { public class AddPageNumbersRequest extends PDFWithPageNums {
@Schema( @Schema(
description = "Custom margin: small/medium/large", description = "Custom margin: small/medium/large/x-large",
allowableValues = {"small", "medium", "large"}) allowableValues = {"small", "medium", "large", "x-large"},
defaultValue = "medium",
requiredMode = RequiredMode.NOT_REQUIRED)
private String customMargin; private String customMargin;
@Schema(
description = "Font size for page numbers",
minimum = "1",
requiredMode = RequiredMode.REQUIRED)
private float fontSize; private float fontSize;
@Schema(
description = "Font type for page numbers",
allowableValues = {"helvetica", "courier", "times"},
requiredMode = RequiredMode.REQUIRED)
private String fontType; private String fontType;
@Schema(description = "Position: 1 of 9 positions", minimum = "1", maximum = "9") @Schema(
description =
"Position: 1-9 representing positions on the page (1=top-left, 5=center, 9=bottom-right)",
minimum = "1",
maximum = "9",
requiredMode = RequiredMode.REQUIRED)
private int position; private int position;
@Schema(description = "Starting number", minimum = "1") @Schema(
description = "Starting number for page numbering",
minimum = "1",
requiredMode = RequiredMode.REQUIRED)
private int startingNumber; private int startingNumber;
@Schema(description = "Which pages to number, default all") @Schema(
description = "Which pages to number (e.g. '1,3-5,7' or 'all')",
defaultValue = "all",
requiredMode = RequiredMode.NOT_REQUIRED)
private String pagesToNumber; private String pagesToNumber;
@Schema( @Schema(
description = description =
"Custom text: defaults to just number but can have things like \"Page {n} of {p}\"") "Custom text pattern. Available variables: {n}=current page number, {total}=total pages, {filename}=original filename",
example = "Page {n} of {total}",
defaultValue = "{n}",
requiredMode = RequiredMode.NOT_REQUIRED)
private String customText; private String customText;
} }

View File

@@ -50,7 +50,7 @@ public class FileToPdf {
List<String> command = new ArrayList<>(); List<String> command = new ArrayList<>();
if (!htmlFormatsInstalled) { if (!htmlFormatsInstalled) {
command.add("weasyprint"); command.add("/opt/venv/bin/weasyprint");
command.add("-e"); command.add("-e");
command.add("utf-8"); command.add("utf-8");
command.add("-v"); command.add("-v");

View File

@@ -210,8 +210,7 @@ public class GeneralUtils {
result.addAll(handlePart(page, totalPages, offset)); result.addAll(handlePart(page, totalPages, offset));
} }
} }
return new ArrayList<>( return result;
new java.util.LinkedHashSet<>(result)); // Remove duplicates and maintain order
} }
public static List<Integer> evaluateNFunc(String expression, int maxValue) { public static List<Integer> evaluateNFunc(String expression, int maxValue) {

View File

@@ -0,0 +1,67 @@
package stirling.software.SPDF.utils;
import java.awt.*;
import javax.swing.*;
public class UIScaling {
private static final double BASE_RESOLUTION_WIDTH = 1920.0;
private static final double BASE_RESOLUTION_HEIGHT = 1080.0;
public static double getWidthScaleFactor() {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
return screenSize.getWidth() / BASE_RESOLUTION_WIDTH;
}
public static double getHeightScaleFactor() {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
return screenSize.getHeight() / BASE_RESOLUTION_HEIGHT;
}
public static int scaleWidth(int value) {
return (int) Math.round(value * getWidthScaleFactor());
}
public static int scaleHeight(int value) {
return (int) Math.round(value * getHeightScaleFactor());
}
public static Dimension scale(Dimension dim) {
return new Dimension(scaleWidth(dim.width), scaleHeight(dim.height));
}
public static Insets scale(Insets insets) {
return new Insets(
scaleHeight(insets.top),
scaleWidth(insets.left),
scaleHeight(insets.bottom),
scaleWidth(insets.right));
}
public static Font scaleFont(Font font) {
// For fonts, we'll use the smaller scale factor to ensure readability
double scaleFactor = Math.min(getWidthScaleFactor(), getHeightScaleFactor());
return font.deriveFont((float) (font.getSize() * scaleFactor));
}
// Utility method for aspect ratio aware icon scaling
public static Image scaleIcon(Image icon, int targetWidth, int targetHeight) {
if (icon == null) return null;
double widthScale = getWidthScaleFactor();
double heightScale = getHeightScaleFactor();
int scaledWidth = (int) Math.round(targetWidth * widthScale);
int scaledHeight = (int) Math.round(targetHeight * heightScale);
// Maintain aspect ratio for icons
double aspectRatio = (double) icon.getWidth(null) / icon.getHeight(null);
if (scaledWidth / scaledHeight > aspectRatio) {
scaledWidth = (int) (scaledHeight * aspectRatio);
} else {
scaledHeight = (int) (scaledWidth / aspectRatio);
}
return icon.getScaledInstance(scaledWidth, scaledHeight, Image.SCALE_SMOOTH);
}
}

View File

@@ -30,52 +30,69 @@ public class InvertFullColorStrategy extends ReplaceAndInvertColorStrategy {
@Override @Override
public InputStreamResource replace() throws IOException { public InputStreamResource replace() throws IOException {
// Create a temporary file, with the original filename from the multipart file File file = null;
File file = Files.createTempFile("temp", getFileInput().getOriginalFilename()).toFile(); try {
// Create a temporary file, with the original filename from the multipart file
file = Files.createTempFile("temp", getFileInput().getOriginalFilename()).toFile();
// Transfer the content of the multipart file to the file // Transfer the content of the multipart file to the file
getFileInput().transferTo(file); getFileInput().transferTo(file);
// Load the uploaded PDF // Load the uploaded PDF
PDDocument document = Loader.loadPDF(file); PDDocument document = Loader.loadPDF(file);
// Render each page and invert colors // Render each page and invert colors
PDFRenderer pdfRenderer = new PDFRenderer(document); PDFRenderer pdfRenderer = new PDFRenderer(document);
for (int page = 0; page < document.getNumberOfPages(); page++) { for (int page = 0; page < document.getNumberOfPages(); page++) {
BufferedImage image = BufferedImage image =
pdfRenderer.renderImageWithDPI(page, 300); // Render page at 300 DPI pdfRenderer.renderImageWithDPI(page, 300); // Render page at 300 DPI
// Invert the colors // Invert the colors
invertImageColors(image); invertImageColors(image);
// Create a new PDPage from the inverted image // Create a new PDPage from the inverted image
PDPage pdPage = document.getPage(page); PDPage pdPage = document.getPage(page);
PDImageXObject pdImage = File tempImageFile = null;
PDImageXObject.createFromFileByContent( try {
convertToBufferedImageTpFile(image), document); tempImageFile = convertToBufferedImageTpFile(image);
PDImageXObject pdImage =
PDImageXObject.createFromFileByContent(tempImageFile, document);
PDPageContentStream contentStream = PDPageContentStream contentStream =
new PDPageContentStream( new PDPageContentStream(
document, pdPage, PDPageContentStream.AppendMode.OVERWRITE, true); document,
contentStream.drawImage( pdPage,
pdImage, PDPageContentStream.AppendMode.OVERWRITE,
0, true);
0, contentStream.drawImage(
pdPage.getMediaBox().getWidth(), pdImage,
pdPage.getMediaBox().getHeight()); 0,
contentStream.close(); 0,
pdPage.getMediaBox().getWidth(),
pdPage.getMediaBox().getHeight());
contentStream.close();
} finally {
if (tempImageFile != null && tempImageFile.exists()) {
Files.delete(tempImageFile.toPath());
}
}
}
// Save the modified PDF to a ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
document.save(byteArrayOutputStream);
document.close();
// Prepare the modified PDF for download
ByteArrayInputStream inputStream =
new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
InputStreamResource resource = new InputStreamResource(inputStream);
return resource;
} finally {
if (file != null && file.exists()) {
Files.delete(file.toPath());
}
} }
// Save the modified PDF to a ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
document.save(byteArrayOutputStream);
document.close();
// Prepare the modified PDF for download
ByteArrayInputStream inputStream =
new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
InputStreamResource resource = new InputStreamResource(inputStream);
return resource;
} }
// Method to invert image colors // Method to invert image colors
@@ -98,7 +115,7 @@ public class InvertFullColorStrategy extends ReplaceAndInvertColorStrategy {
// Helper method to convert BufferedImage to InputStream // Helper method to convert BufferedImage to InputStream
private File convertToBufferedImageTpFile(BufferedImage image) throws IOException { private File convertToBufferedImageTpFile(BufferedImage image) throws IOException {
File file = new File("image.png"); File file = File.createTempFile("image", ".png");
ImageIO.write(image, "png", file); ImageIO.write(image, "png", file);
return file; return file;
} }

View File

@@ -262,7 +262,7 @@ home.desc=متجرك الشامل المستضاف محليًا لجميع اح
home.searchBar=البحث عن الميزات... home.searchBar=البحث عن الميزات...
home.viewPdf.title=عرض PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=عرض وتعليق وإضافة نص أو صور home.viewPdf.desc=عرض وتعليق وإضافة نص أو صور
viewPdf.tags=عرض,قراءة,تعليق,نص,صورة viewPdf.tags=عرض,قراءة,تعليق,نص,صورة
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=إزالة الأول
pdfOrganiser.mode.8=إزالة الأخير pdfOrganiser.mode.8=إزالة الأخير
pdfOrganiser.mode.9=إزالة pdfOrganiser.mode.9=إزالة
pdfOrganiser.mode.10=دمج فردي-زوجي pdfOrganiser.mode.10=دمج فردي-زوجي
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(مثال: 1,3,2 أو 4-8,2,10-12 أو 2n-1) pdfOrganiser.placeholder=(مثال: 1,3,2 أو 4-8,2,10-12 أو 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=هذه الميزة متوفرة في <a href="{0}">صفحة الأدوات المتعددة</a> لدينا. اطلع عليها للحصول على واجهة مستخدم محسّنة لكل صفحة وميزات إضافية! multiTool-advert.message=هذه الميزة متوفرة في <a href="{0}">صفحة الأدوات المتعددة</a> لدينا. اطلع عليها للحصول على واجهة مستخدم محسّنة لكل صفحة وميزات إضافية!
#view pdf #view pdf
viewPdf.title=عرض PDF viewPdf.title=View/Edit PDF
viewPdf.header=عرض PDF viewPdf.header=عرض PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Bütün PDF ehtiyaclarınız üçün lokal-host edilən biraddımlıq
home.searchBar=Xüsusiyyətləri axtar... home.searchBar=Xüsusiyyətləri axtar...
home.viewPdf.title=PDF-ə bax home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Bax, sitat götür, mətn və ya şəkil əlavə et home.viewPdf.desc=Bax, sitat götür, mətn və ya şəkil əlavə et
viewPdf.tags=bax,oxu,sitat götür,mətn,şəkil viewPdf.tags=bax,oxu,sitat götür,mətn,şəkil
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Birincini Sil
pdfOrganiser.mode.8=Sonuncunu Sil pdfOrganiser.mode.8=Sonuncunu Sil
pdfOrganiser.mode.9=Birinci və Sonuncunu Sil pdfOrganiser.mode.9=Birinci və Sonuncunu Sil
pdfOrganiser.mode.10=Tək-Cüt Birləşdirmə pdfOrganiser.mode.10=Tək-Cüt Birləşdirmə
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(məs., 1,3,2 və ya 4-8,2,10-12 və ya 2n-1) pdfOrganiser.placeholder=(məs., 1,3,2 və ya 4-8,2,10-12 və ya 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=Bu xüsusiyyət bizim <a href="{0}">multi-alət səhifə</a>mizdə də mövcuddur. Əlavə xüsusiyyətlər və səhifə-səhifə interfeys üçün sınaqdan keçirin! multiTool-advert.message=Bu xüsusiyyət bizim <a href="{0}">multi-alət səhifə</a>mizdə də mövcuddur. Əlavə xüsusiyyətlər və səhifə-səhifə interfeys üçün sınaqdan keçirin!
#view pdf #view pdf
viewPdf.title=PDF-ə baxın viewPdf.title=View/Edit PDF
viewPdf.header=PDF-ə baxın viewPdf.header=PDF-ə baxın
#pageRemover #pageRemover

View File

@@ -79,10 +79,10 @@ info=Информация
pro=Pro pro=Pro
page=Страница page=Страница
pages=Страници pages=Страници
loading=Loading... loading=Зареждане на...
addToDoc=Add to Document addToDoc=Добавяне към документ
reset=Reset reset=Нулиране
apply=Apply apply=Приложи
legal.privacy=Политика за поверителност legal.privacy=Политика за поверителност
legal.terms=Правила и условия legal.terms=Правила и условия
@@ -138,13 +138,13 @@ analytics.settings=Можете да промените настройките
# NAVBAR # # NAVBAR #
############# #############
navbar.favorite=Любими navbar.favorite=Любими
navbar.recent=New and recently updated navbar.recent=Нови и наскоро актуализирани
navbar.darkmode=Тъмна тема navbar.darkmode=Тъмна тема
navbar.language=Езици navbar.language=Езици
navbar.settings=Настройки navbar.settings=Настройки
navbar.allTools=Инструменти navbar.allTools=Инструменти
navbar.multiTool=Мулти инструменти navbar.multiTool=Мулти инструменти
navbar.search=Search navbar.search=Търсене
navbar.sections.organize=Организирайте navbar.sections.organize=Организирайте
navbar.sections.convertTo=Преобразуване в PDF navbar.sections.convertTo=Преобразуване в PDF
navbar.sections.convertFrom=Преобразуване от PDF navbar.sections.convertFrom=Преобразуване от PDF
@@ -240,20 +240,20 @@ database.creationDate=Дата на създаване
database.fileSize=Размер на файла database.fileSize=Размер на файла
database.deleteBackupFile=Изтриване на архивен файл database.deleteBackupFile=Изтриване на архивен файл
database.importBackupFile=Импортиране на архивен файл database.importBackupFile=Импортиране на архивен файл
database.createBackupFile=Create Backup File database.createBackupFile=Създаване на файл с резервно копие
database.downloadBackupFile=Изтеглете архивен файл database.downloadBackupFile=Изтеглете архивен файл
database.info_1=Когато импортирате данни, е от решаващо значение да осигурите правилната структура. Ако не сте сигурни в това, което правите, потърсете съвет и подкрепа от професионалист. Грешка в структурата може да причини неизправност на приложението, включително пълна невъзможност за стартиране на приложението. database.info_1=Когато импортирате данни, е от решаващо значение да осигурите правилната структура. Ако не сте сигурни в това, което правите, потърсете съвет и подкрепа от професионалист. Грешка в структурата може да причини неизправност на приложението, включително пълна невъзможност за стартиране на приложението.
database.info_2=Името на файла няма значение при качване. След това ще бъде преименуван, за да следва формата backup_user_yyyyMMddHHmm.sql, осигурявайки последователна конвенция за именуване. database.info_2=Името на файла няма значение при качване. След това ще бъде преименуван, за да следва формата backup_user_yyyyMMddHHmm.sql, осигурявайки последователна конвенция за именуване.
database.submit=Импортиране на резервно копие database.submit=Импортиране на резервно копие
database.importIntoDatabaseSuccessed=Импортирането в базата данни бе успешно database.importIntoDatabaseSuccessed=Импортирането в базата данни бе успешно
database.backupCreated=Database backup successful database.backupCreated=Успешно архивиране на базата данни
database.fileNotFound=Файлът не е намерен database.fileNotFound=Файлът не е намерен
database.fileNullOrEmpty=Файлът не трябва да е нулев или празен database.fileNullOrEmpty=Файлът не трябва да е нулев или празен
database.failedImportFile=Неуспешно импортиране на файл database.failedImportFile=Неуспешно импортиране на файл
database.notSupported=This function is not available for your database connection. database.notSupported=Тази функция не е налична за вашата връзка с база данни.
session.expired=Вашата сесия е изтекла. Моля, опреснете страницата и опитайте отново. session.expired=Вашата сесия е изтекла. Моля, опреснете страницата и опитайте отново.
session.refreshPage=Refresh Page session.refreshPage=Презареждане на страницата
############# #############
# HOME-PAGE # # HOME-PAGE #
@@ -262,18 +262,18 @@ home.desc=Вашето локално хоствано обслужване на
home.searchBar=Търсене на функции... home.searchBar=Търсене на функции...
home.viewPdf.title=Преглед на PDF home.viewPdf.title=Преглед/Редактиране PDF
home.viewPdf.desc=Преглеждайте, коментирайте, добавяйте текст или изображения home.viewPdf.desc=Преглеждайте, коментирайте, добавяйте текст или изображения
viewPdf.tags=преглед,четене,анотиране,текст,изображение viewPdf.tags=преглед,четене,анотиране,текст,изображение
home.setFavorites=Set Favourites home.setFavorites=Задаване на предпочитани
home.hideFavorites=Hide Favourites home.hideFavorites=Скриване на предпочитани
home.showFavorites=Show Favourites home.showFavorites=Покажи предпочитани
home.legacyHomepage=Old homepage home.legacyHomepage=Стара начална страница
home.newHomePage=Try our new homepage! home.newHomePage=Опитайте новата ни начална страница!
home.alphabetical=Alphabetical home.alphabetical=По азбучен ред
home.globalPopularity=Global Popularity home.globalPopularity=Световна популярност
home.sortBy=Sort by: home.sortBy=Сортиране по:
home.multiTool.title=PDF Мулти инструмент home.multiTool.title=PDF Мулти инструмент
home.multiTool.desc=Обединяване, завъртане, пренареждане и премахване на страници home.multiTool.desc=Обединяване, завъртане, пренареждане и премахване на страници
@@ -462,9 +462,9 @@ home.MarkdownToPDF.title=Markdown към PDF
home.MarkdownToPDF.desc=Преобразува всеки Markdown файл към PDF home.MarkdownToPDF.desc=Преобразува всеки Markdown файл към PDF
MarkdownToPDF.tags=маркиране,уеб-съдържание,трансформация,преобразуване MarkdownToPDF.tags=маркиране,уеб-съдържание,трансформация,преобразуване
home.PDFToMarkdown.title=PDF to Markdown home.PDFToMarkdown.title=PDF към Markdown
home.PDFToMarkdown.desc=Converts any PDF to Markdown home.PDFToMarkdown.desc=Преобразува всеки PDF файл в Markdown
PDFToMarkdown.tags=markup,web-content,transformation,convert,md PDFToMarkdown.tags=маркиране, уеб-съдържание, трансформация, конвертиране, MD
home.getPdfInfo.title=Вземете ЦЯЛАТА информация от PDF home.getPdfInfo.title=Вземете ЦЯЛАТА информация от PDF
home.getPdfInfo.desc=Взима всяка възможна информация от PDF файлове home.getPdfInfo.desc=Взима всяка възможна информация от PDF файлове
@@ -489,11 +489,11 @@ home.autoRedact.title=Автоматично редактиране
home.autoRedact.desc=Автоматично редактира (зачернява) текст в PDF въз основа на въведен текст home.autoRedact.desc=Автоматично редактира (зачернява) текст в PDF въз основа на въведен текст
autoRedact.tags=Редактиране,Скриване,затъмняване,черен,маркер,скрит autoRedact.tags=Редактиране,Скриване,затъмняване,черен,маркер,скрит
home.redact.title=Manual Redaction home.redact.title=Ръчно редактиране
home.redact.desc=Redacts a PDF based on selected text, drawn shapes and/or selected page(s) home.redact.desc=Редактиране на PDF файл въз основа на избран текст, нарисувани форми и/или избрана страница(и)
redact.tags=Redact,Hide,black out,black,marker,hidden,manual redact.tags=Редактиране, скриване, затъмнение, черно, маркер, скрито, ръчно
home.tableExtraxt.title=PDF в CSV home.tableExtraxt.title=PDF към CSV
home.tableExtraxt.desc=Извлича таблици от PDF, като ги конвертира в CSV home.tableExtraxt.desc=Извлича таблици от PDF, като ги конвертира в CSV
tableExtraxt.tags=CSV,извличане на таблица,извличане,конвертиране tableExtraxt.tags=CSV,извличане на таблица,извличане,конвертиране
@@ -533,9 +533,9 @@ home.splitPdfByChapters.title=Разделете PDF по глави
home.splitPdfByChapters.desc=Разделете PDF на множество файлове въз основа на неговата структура на глави. home.splitPdfByChapters.desc=Разделете PDF на множество файлове въз основа на неговата структура на глави.
splitPdfByChapters.tags=разделяне, глави, отметки, организиране splitPdfByChapters.tags=разделяне, глави, отметки, организиране
home.validateSignature.title=Validate PDF Signature home.validateSignature.title=Валидиране на PDF подпис
home.validateSignature.desc=Verify digital signatures and certificates in PDF documents home.validateSignature.desc=Проверка на цифрови подписи и сертификати в PDF документи
validateSignature.tags=signature,verify,validate,pdf,certificate,digital signature,Validate Signature,Validate certificate validateSignature.tags=подпис,проверка,валидиране,pdf,сертификат,цифров подпис,валидиране на подпис,валидиране на сертификат
#replace-invert-color #replace-invert-color
replace-color.title=Замени-инвертиране-на-цвят replace-color.title=Замени-инвертиране-на-цвят
@@ -580,7 +580,7 @@ login.oauth2invalidRequest=Невалидна заявка
login.oauth2AccessDenied=Отказан достъп login.oauth2AccessDenied=Отказан достъп
login.oauth2InvalidTokenResponse=Невалиден отговор на токена login.oauth2InvalidTokenResponse=Невалиден отговор на токена
login.oauth2InvalidIdToken=Невалиден токен за идентификатор login.oauth2InvalidIdToken=Невалиден токен за идентификатор
login.relyingPartyRegistrationNotFound=No relying party registration found login.relyingPartyRegistrationNotFound=Не е открита регистрация на доверяваща се страна
login.userIsDisabled=Потребителят е деактивиран, влизането в момента е блокирано с това потребителско име. Моля, свържете се с администратора. login.userIsDisabled=Потребителят е деактивиран, влизането в момента е блокирано с това потребителско име. Моля, свържете се с администратора.
login.alreadyLoggedIn=Вече сте влезли в login.alreadyLoggedIn=Вече сте влезли в
login.alreadyLoggedIn2=устройства. Моля, излезте от устройствата и опитайте отново. login.alreadyLoggedIn2=устройства. Моля, излезте от устройствата и опитайте отново.
@@ -599,31 +599,31 @@ autoRedact.convertPDFToImageLabel=Преобразуване на PDF към PDF
autoRedact.submitButton=Изпращане autoRedact.submitButton=Изпращане
#redact #redact
redact.title=Manual Redaction redact.title=Ръчно редактиране
redact.header=Manual Redaction redact.header=Ръчно редактиране
redact.submit=Redact redact.submit=Редактиране
redact.textBasedRedaction=Text based Redaction redact.textBasedRedaction=Редактиране на базата на текст
redact.pageBasedRedaction=Page-based Redaction redact.pageBasedRedaction=Редактиране на базата на страници
redact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) redact.convertPDFToImageLabel=Конвертиране на PDF в PDF-изображение (използва се за премахване на текста зад полето)
redact.pageRedactionNumbers.title=Pages redact.pageRedactionNumbers.title=Страници
redact.pageRedactionNumbers.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) redact.pageRedactionNumbers.placeholder=(напр. 1,2,8 или 4,7,12-16 или 2n-1)
redact.redactionColor.title=Redaction Color redact.redactionColor.title=Цвят на редактиране
redact.export=Export redact.export=Експорт
redact.upload=Upload redact.upload=Качване
redact.boxRedaction=Box draw redaction redact.boxRedaction=Редактиране на рисунката в квадратчето
redact.zoom=Zoom redact.zoom=Увеличаване
redact.zoomIn=Zoom in redact.zoomIn=Увеличаване на мащаба
redact.zoomOut=Zoom out redact.zoomOut=Намаляване на мащаба
redact.nextPage=Next Page redact.nextPage=Следваща страница
redact.previousPage=Previous Page redact.previousPage=Предишна страница
redact.toggleSidebar=Toggle Sidebar redact.toggleSidebar=Превключване на страничната лента
redact.showThumbnails=Show Thumbnails redact.showThumbnails=Показване на миниатюри
redact.showDocumentOutline=Show Document Outline (double-click to expand/collapse all items) redact.showDocumentOutline=Показване на контура на документа (кликнете два пъти, за да разгънете/свиете всички елементи)
redact.showAttatchments=Show Attachments redact.showAttatchments=Показване на прикачени файлове
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Показване на слоеве (щракнете два пъти, за да върнете всички слоеве в състояние по подразбиране)
redact.colourPicker=Colour Picker redact.colourPicker=Избор на цвят
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Намиране на текущия елемент от контура
redact.applyChanges=Apply Changes redact.applyChanges=Прилагане на промените
#showJS #showJS
showJS.title=Покажи Javascript showJS.title=Покажи Javascript
@@ -661,9 +661,9 @@ MarkdownToPDF.credit=Използва WeasyPrint
#pdf-to-markdown #pdf-to-markdown
PDFToMarkdown.title=PDF To Markdown PDFToMarkdown.title=PDF към Markdown
PDFToMarkdown.header=PDF To Markdown PDFToMarkdown.header=PDF към Markdown
PDFToMarkdown.submit=Convert PDFToMarkdown.submit=Преобразуване
#url-to-pdf #url-to-pdf
@@ -809,7 +809,7 @@ certSign.showSig=Показване на подпис
certSign.reason=Причина certSign.reason=Причина
certSign.location=Местоположение certSign.location=Местоположение
certSign.name=Име certSign.name=Име
certSign.showLogo=Show Logo certSign.showLogo=Покажи лого
certSign.submit=Подпишете PDF certSign.submit=Подпишете PDF
@@ -844,9 +844,9 @@ compare.highlightColor.2=Цвят на маркирането 2:
compare.document.1=Документ 1 compare.document.1=Документ 1
compare.document.2=Документ 2 compare.document.2=Документ 2
compare.submit=Сравнявай compare.submit=Сравнявай
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced compare.complex.message=Един или и двата предоставени документа са големи файлове, точността на сравнението може да бъде намалена.
compare.large.file.message=One or Both of the provided documents are too large to process compare.large.file.message=Един или и двата предоставени документа са твърде големи за обработка
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. compare.no.text.message=Един или и двата избрани PDF файла нямат текстово съдържание. Моля, изберете PDF файлове с текст за сравнение.
#BookToPDF #BookToPDF
BookToPDF.title=Книги и комикси в PDF BookToPDF.title=Книги и комикси в PDF
@@ -869,18 +869,18 @@ sign.draw=Начертайте подпис
sign.text=Въвеждане на текст sign.text=Въвеждане на текст
sign.clear=Изчисти sign.clear=Изчисти
sign.add=Добави sign.add=Добави
sign.saved=Saved Signatures sign.saved=Съхранени подписи
sign.save=Save Signature sign.save=Запазване на подпис
sign.personalSigs=Personal Signatures sign.personalSigs=Лични подписи
sign.sharedSigs=Shared Signatures sign.sharedSigs=Споделени подписи
sign.noSavedSigs=No saved signatures found sign.noSavedSigs=Не са намерени запазени подписи
sign.addToAll=Add to all pages sign.addToAll=Дибави към всички страници
sign.delete=Delete sign.delete=Изтрий
sign.first=First page sign.first=Първа страница
sign.last=Last page sign.last=Последна страница
sign.next=Next page sign.next=Следваща страница
sign.previous=Previous page sign.previous=Предишна стараница
sign.maintainRatio=Toggle maintain aspect ratio sign.maintainRatio=Превключване за поддържане на съотношението на страните
#repair #repair
@@ -952,7 +952,7 @@ compress.title=Компресиране
compress.header=Компресиране на PDF compress.header=Компресиране на PDF
compress.credit=Тази услуга използва qpdf за PDF компресиране/оптимизиране. compress.credit=Тази услуга използва qpdf за PDF компресиране/оптимизиране.
compress.selectText.1=Ръчен режим - от 1 до 5 compress.selectText.1=Ръчен режим - от 1 до 5
compress.selectText.1.1=In optimization levels 6 to 9, in addition to general PDF compression, image resolution is scaled down to further reduce file size. Higher levels result in stronger image compression (up to 50% of the original size), achieving greater size reduction but with potential quality loss in images. compress.selectText.1.1=При нива на оптимизация от 6 до 9, в допълнение към общото компресиране на PDF, резолюцията на изображението се намалява, за да се намали допълнително размерът на файла. По-високите нива водят до по-силна компресия на изображенията (до 50% от оригиналния размер), като се постига по-голямо намаляване на размера, но с потенциална загуба на качество на изображенията.
compress.selectText.2=Ниво на оптимизация: compress.selectText.2=Ниво на оптимизация:
compress.selectText.3=4 (Ужасно за текстови изображения) compress.selectText.3=4 (Ужасно за текстови изображения)
compress.selectText.4=Автоматичен режим - Автоматично настройва качеството, за да получи PDF с точен размер compress.selectText.4=Автоматичен режим - Автоматично настройва качеството, за да получи PDF с точен размер
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Премахни първо
pdfOrganiser.mode.8=Премахване на последния pdfOrganiser.mode.8=Премахване на последния
pdfOrganiser.mode.9=Премахване на първия и последния pdfOrganiser.mode.9=Премахване на първия и последния
pdfOrganiser.mode.10=Обединяване на четно и нечетно pdfOrganiser.mode.10=Обединяване на четно и нечетно
pdfOrganiser.mode.11=Дублиране на всички страници
pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1) pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1)
@@ -999,42 +1000,42 @@ pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1)
multiTool.title=PDF Мулти инструмент multiTool.title=PDF Мулти инструмент
multiTool.header=PDF Мулти инструмент multiTool.header=PDF Мулти инструмент
multiTool.uploadPrompts=Име на файл multiTool.uploadPrompts=Име на файл
multiTool.selectAll=Select All multiTool.selectAll=Изберете всички
multiTool.deselectAll=Deselect All multiTool.deselectAll=Отмяна на избора на всички
multiTool.selectPages=Page Select multiTool.selectPages=Избор на страница
multiTool.selectedPages=Selected Pages multiTool.selectedPages=Избрани страници
multiTool.page=Page multiTool.page=Страница
multiTool.deleteSelected=Delete Selected multiTool.deleteSelected=Изтриване на избраното
multiTool.downloadAll=Export multiTool.downloadAll=Експорт
multiTool.downloadSelected=Export Selected multiTool.downloadSelected=Избрано за експортиране
multiTool.insertPageBreak=Insert Page Break multiTool.insertPageBreak=Вмъкване на прекъсване на страница
multiTool.addFile=Add File multiTool.addFile=Добавяне на файл
multiTool.rotateLeft=Rotate Left multiTool.rotateLeft=Завъртете наляво
multiTool.rotateRight=Rotate Right multiTool.rotateRight=Завъртете надясно
multiTool.split=Split multiTool.split=Разделяне
multiTool.moveLeft=Move Left multiTool.moveLeft=Преместване наляво
multiTool.moveRight=Move Right multiTool.moveRight=Преместване надясно
multiTool.delete=Delete multiTool.delete=Изтрий
multiTool.dragDropMessage=Page(s) Selected multiTool.dragDropMessage=Избран(и) страница(/и)
multiTool.undo=Undo multiTool.undo=Отмяна на
multiTool.redo=Redo multiTool.redo=Повтори
#decrypt #decrypt
decrypt.passwordPrompt=This file is password-protected. Please enter the password: decrypt.passwordPrompt=Този файл е защитен с парола. Моля, въведете паролата:
decrypt.cancelled=Operation cancelled for PDF: {0} decrypt.cancelled=Операцията за PDF е отменена: {0}
decrypt.noPassword=No password provided for encrypted PDF: {0} decrypt.noPassword=Не е предоставена парола за шифрирания PDF: {0}
decrypt.invalidPassword=Please try again with the correct password. decrypt.invalidPassword=Моля, опитайте отново с правилната парола.
decrypt.invalidPasswordHeader=Incorrect password or unsupported encryption for PDF: {0} decrypt.invalidPasswordHeader=Неправилна парола или неподдържано криптиране за PDF: {0}
decrypt.unexpectedError=There was an error processing the file. Please try again. decrypt.unexpectedError=Възникна грешка при обработката на файла. Моля, опитайте отново.
decrypt.serverError=Server error while decrypting: {0} decrypt.serverError=Грешка в работата на сървъра повреме на дешифриране: {0}
decrypt.success=File decrypted successfully. decrypt.success=Файлът е успешно дешифриран.
#multiTool-advert #multiTool-advert
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=Тази функция е налична и в нашата <a href="{0}">страница с множество инструменти</a>. Проверете го за подобрен потребителски интерфейс страница по страница и допълнителни функции!
#view pdf #view pdf
viewPdf.title=Преглед на PDF viewPdf.title=Преглед/Редактиране на PDF
viewPdf.header=Преглед на PDF viewPdf.header=Преглед на PDF
#pageRemover #pageRemover
@@ -1335,51 +1336,51 @@ splitByChapters.desc.4=Разрешаване на дубликати: Ако е
splitByChapters.submit=Разделяне на PDF splitByChapters.submit=Разделяне на PDF
#File Chooser #File Chooser
fileChooser.click=Click fileChooser.click=Щракнете
fileChooser.or=or fileChooser.or=или
fileChooser.dragAndDrop=Drag & Drop fileChooser.dragAndDrop=Влачете и пуснете
fileChooser.dragAndDropPDF=Drag & Drop PDF file fileChooser.dragAndDropPDF=Влачете и пуснете PDF файл
fileChooser.dragAndDropImage=Drag & Drop Image file fileChooser.dragAndDropImage=Влачете и пуснете изображение
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here fileChooser.hoveredDragAndDrop=Влачете и пуснете файл(ове) тук
#release notes #release notes
releases.footer=Releases releases.footer=Версии
releases.title=Release Notes releases.title=Бележки към версиите
releases.header=Release Notes releases.header=Бележки към версиите
releases.current.version=Current Release releases.current.version=Текуща версия
releases.note=Release notes are only available in English releases.note=Бележките към изданието са налични само на английски език
#Validate Signature #Validate Signature
validateSignature.title=Validate PDF Signatures validateSignature.title=Удостоверяване на PDF подписи
validateSignature.header=Validate Digital Signatures validateSignature.header=Потвърждаване на цифрови подписи
validateSignature.selectPDF=Select signed PDF file validateSignature.selectPDF=Изберете подписания PDF файл
validateSignature.submit=Validate Signatures validateSignature.submit=Потвърждаване на подписите
validateSignature.results=Validation Results validateSignature.results=Резултати от валидирането
validateSignature.status=Status validateSignature.status=Статус
validateSignature.signer=Signer validateSignature.signer=Подписващ
validateSignature.date=Date validateSignature.date=Дата
validateSignature.reason=Reason validateSignature.reason=Причина
validateSignature.location=Location validateSignature.location=Местоположение
validateSignature.noSignatures=No digital signatures found in this document validateSignature.noSignatures=В този документ не са открити цифрови подписи
validateSignature.status.valid=Valid validateSignature.status.valid=Валиден
validateSignature.status.invalid=Invalid validateSignature.status.invalid=Невалиден
validateSignature.chain.invalid=Certificate chain validation failed - cannot verify signer's identity validateSignature.chain.invalid=Удостоверяването на веригата на сертификата е неуспешно - не може да се провери самоличността на подписващия
validateSignature.trust.invalid=Certificate not in trust store - source cannot be verified validateSignature.trust.invalid=Сертификатът не е в хранилището за доверие - източникът не може да бъде проверен
validateSignature.cert.expired=Certificate has expired validateSignature.cert.expired=Сертификатът е изтекъл
validateSignature.cert.revoked=Certificate has been revoked validateSignature.cert.revoked=Сертификатът е отменен
validateSignature.signature.info=Signature Information validateSignature.signature.info=Информация за подписа
validateSignature.signature=Signature validateSignature.signature=Подпис
validateSignature.signature.mathValid=Signature is mathematically valid BUT: validateSignature.signature.mathValid=Подписът е математически валиден, НО:
validateSignature.selectCustomCert=Custom Certificate File X.509 (Optional) validateSignature.selectCustomCert=Файл със сертификат X.509 по поръчка (по избор)
validateSignature.cert.info=Certificate Details validateSignature.cert.info=Подробности за сертификата
validateSignature.cert.issuer=Issuer validateSignature.cert.issuer=Издател
validateSignature.cert.subject=Subject validateSignature.cert.subject=Тема
validateSignature.cert.serialNumber=Serial Number validateSignature.cert.serialNumber=Сериен номер
validateSignature.cert.validFrom=Valid From validateSignature.cert.validFrom=Валиден от
validateSignature.cert.validUntil=Valid Until validateSignature.cert.validUntil=Валиден до
validateSignature.cert.algorithm=Algorithm validateSignature.cert.algorithm=Алгоритъм
validateSignature.cert.keySize=Key Size validateSignature.cert.keySize=Размер на ключ
validateSignature.cert.version=Version validateSignature.cert.version=Версия
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=Предназначение на ключа за използване
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=Самостоятелно подписан
validateSignature.cert.bits=bits validateSignature.cert.bits=битове

View File

@@ -262,7 +262,7 @@ home.desc=L'eina allotjada localment per a necessitats de PDF.
home.searchBar=Cerca funcions... home.searchBar=Cerca funcions...
home.viewPdf.title=Visualitza PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Visualitza, anota, afegeix text o imatges home.viewPdf.desc=Visualitza, anota, afegeix text o imatges
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=view,read,annotate,text,image
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Eliminar Primer
pdfOrganiser.mode.8=Eliminar Últim pdfOrganiser.mode.8=Eliminar Últim
pdfOrganiser.mode.9=Eliminar Primer i Últim pdfOrganiser.mode.9=Eliminar Primer i Últim
pdfOrganiser.mode.10=Fusionar Parells-Senars pdfOrganiser.mode.10=Fusionar Parells-Senars
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(p. ex. 1,3,2 o 4-8,2,10-12 o 2n-1) pdfOrganiser.placeholder=(p. ex. 1,3,2 o 4-8,2,10-12 o 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Visualitza PDF viewPdf.title=View/Edit PDF
viewPdf.header=Visualitza PDF viewPdf.header=Visualitza PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Vaše lokálně hostované řešení pro všechny vaše potřeby PDF.
home.searchBar=Hledat funkce... home.searchBar=Hledat funkce...
home.viewPdf.title=Zobrazit PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Zobrazit, anotovat, přidat text nebo obrázky home.viewPdf.desc=Zobrazit, anotovat, přidat text nebo obrázky
viewPdf.tags=zobrazit,číst,anotovat,text,obrázek viewPdf.tags=zobrazit,číst,anotovat,text,obrázek
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Odstranit první
pdfOrganiser.mode.8=Odstranit poslední pdfOrganiser.mode.8=Odstranit poslední
pdfOrganiser.mode.9=Odstranit první a poslední pdfOrganiser.mode.9=Odstranit první a poslední
pdfOrganiser.mode.10=Sloučení sudé-liché pdfOrganiser.mode.10=Sloučení sudé-liché
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(např. 1,3,2 nebo 4-8,2,10-12 nebo 2n-1) pdfOrganiser.placeholder=(např. 1,3,2 nebo 4-8,2,10-12 nebo 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=Soubor byl úspěšně dešifrován.
multiTool-advert.message=Tato funkce je také k dispozici na naší <a href="{0}">stránce multi-nástroje</a>. Podívejte se na ni pro vylepšené rozhraní pro práci se stránkami a další funkce! multiTool-advert.message=Tato funkce je také k dispozici na naší <a href="{0}">stránce multi-nástroje</a>. Podívejte se na ni pro vylepšené rozhraní pro práci se stránkami a další funkce!
#view pdf #view pdf
viewPdf.title=Zobrazit PDF viewPdf.title=View/Edit PDF
viewPdf.header=Zobrazit PDF viewPdf.header=Zobrazit PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Dit lokalt hostede one-stop-shop for alle dine PDF-behov.
home.searchBar=Søg efter funktioner... home.searchBar=Søg efter funktioner...
home.viewPdf.title=Se PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Se, annotér, tilføj tekst eller billeder home.viewPdf.desc=Se, annotér, tilføj tekst eller billeder
viewPdf.tags=se,læs,annotér,tekst,billede viewPdf.tags=se,læs,annotér,tekst,billede
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Fjern Første
pdfOrganiser.mode.8=Fjern Sidste pdfOrganiser.mode.8=Fjern Sidste
pdfOrganiser.mode.9=Fjern Første og Sidste pdfOrganiser.mode.9=Fjern Første og Sidste
pdfOrganiser.mode.10=Ulige-Lige Sammenføjning pdfOrganiser.mode.10=Ulige-Lige Sammenføjning
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1) pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Se PDF viewPdf.title=View/Edit PDF
viewPdf.header=Se PDF viewPdf.header=Se PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Ihr lokal gehosteter One-Stop-Shop für alle Ihre PDF-Anforderungen.
home.searchBar=Suche nach Funktionen... home.searchBar=Suche nach Funktionen...
home.viewPdf.title=PDF anzeigen home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Anzeigen, Kommentieren, Text oder Bilder hinzufügen home.viewPdf.desc=Anzeigen, Kommentieren, Text oder Bilder hinzufügen
viewPdf.tags=anzeigen,lesen,kommentieren,text,bild viewPdf.tags=anzeigen,lesen,kommentieren,text,bild
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Erste entfernen
pdfOrganiser.mode.8=Letzte entfernen pdfOrganiser.mode.8=Letzte entfernen
pdfOrganiser.mode.9=Erste und letzte entfernen pdfOrganiser.mode.9=Erste und letzte entfernen
pdfOrganiser.mode.10=Ungerade-Gerade-Zusammenführung pdfOrganiser.mode.10=Ungerade-Gerade-Zusammenführung
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1) pdfOrganiser.placeholder=(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=Datei erfolgreich entschlüsselt.
multiTool-advert.message=Diese Funktion ist auch auf unserer <a href="{0}">PDF-Multitool-Seite</a> verfügbar. Probieren Sie sie aus, denn sie bietet eine verbesserte Benutzeroberfläche und zusätzliche Funktionen! multiTool-advert.message=Diese Funktion ist auch auf unserer <a href="{0}">PDF-Multitool-Seite</a> verfügbar. Probieren Sie sie aus, denn sie bietet eine verbesserte Benutzeroberfläche und zusätzliche Funktionen!
#view pdf #view pdf
viewPdf.title=PDF anzeigen viewPdf.title=View/Edit PDF
viewPdf.header=PDF anzeigen viewPdf.header=PDF anzeigen
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Ο τοπικά φιλοξενούμενος προορισμός σα
home.searchBar=Αναζήτηση λειτουργιών... home.searchBar=Αναζήτηση λειτουργιών...
home.viewPdf.title=Προβολή PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Προβολή, σχολιασμός, προσθήκη κειμένου ή εικόνων home.viewPdf.desc=Προβολή, σχολιασμός, προσθήκη κειμένου ή εικόνων
viewPdf.tags=προβολή,ανάγνωση,σχολιασμός,κείμενο,εικόνα viewPdf.tags=προβολή,ανάγνωση,σχολιασμός,κείμενο,εικόνα
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Αφαίρεση πρώτης
pdfOrganiser.mode.8=Αφαίρεση τελευταίας pdfOrganiser.mode.8=Αφαίρεση τελευταίας
pdfOrganiser.mode.9=Αφαίρεση πρώτης και τελευταίας pdfOrganiser.mode.9=Αφαίρεση πρώτης και τελευταίας
pdfOrganiser.mode.10=Συγχώνευση μονών-ζυγών pdfOrganiser.mode.10=Συγχώνευση μονών-ζυγών
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1) pdfOrganiser.placeholder=(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=Το αρχείο αποκρυπτογραφήθηκε με επ
multiTool-advert.message=Αυτή η λειτουργία είναι επίσης διαθέσιμη στη <a href="{0}">σελίδα πολυεργαλείου</a> μας. Δείτε την για βελτιωμένο περιβάλλον χρήστη σελίδα-προς-σελίδα και επιπλέον λειτουργίες! multiTool-advert.message=Αυτή η λειτουργία είναι επίσης διαθέσιμη στη <a href="{0}">σελίδα πολυεργαλείου</a> μας. Δείτε την για βελτιωμένο περιβάλλον χρήστη σελίδα-προς-σελίδα και επιπλέον λειτουργίες!
#view pdf #view pdf
viewPdf.title=Προβολή PDF viewPdf.title=View/Edit PDF
viewPdf.header=Προβολή PDF viewPdf.header=Προβολή PDF
#pageRemover #pageRemover

View File

@@ -262,9 +262,9 @@ home.desc=Your locally hosted one-stop-shop for all your PDF needs.
home.searchBar=Search for features... home.searchBar=Search for features...
home.viewPdf.title=View PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=View, annotate, add text or images home.viewPdf.desc=View, annotate, draw, add text or images
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=view,read,annotate,text,image,highlight,edit
home.setFavorites=Set Favourites home.setFavorites=Set Favourites
home.hideFavorites=Hide Favourites home.hideFavorites=Hide Favourites
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remove First
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Remove Last
pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.9=Remove First and Last
pdfOrganiser.mode.10=Odd-Even Merge pdfOrganiser.mode.10=Odd-Even Merge
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=View/Edit PDF
viewPdf.header=View PDF viewPdf.header=View PDF
#pageRemover #pageRemover

View File

@@ -262,9 +262,9 @@ home.desc=Your locally hosted one-stop-shop for all your PDF needs.
home.searchBar=Search for features... home.searchBar=Search for features...
home.viewPdf.title=View PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=View, annotate, add text or images home.viewPdf.desc=View, annotate, draw, add text or images
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=view,read,annotate,text,image,highlight,edit
home.setFavorites=Set Favourites home.setFavorites=Set Favourites
home.hideFavorites=Hide Favourites home.hideFavorites=Hide Favourites
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remove First
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Remove Last
pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.9=Remove First and Last
pdfOrganiser.mode.10=Odd-Even Merge pdfOrganiser.mode.10=Odd-Even Merge
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=View/Edit PDF
viewPdf.header=View PDF viewPdf.header=View PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Su ventanilla única autohospedada para todas sus necesidades PDF
home.searchBar=Buscar características... home.searchBar=Buscar características...
home.viewPdf.title=Ver PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Ver, anotar, añadir texto o imágenes home.viewPdf.desc=Ver, anotar, añadir texto o imágenes
viewPdf.tags=ver,leer,anotar,texto,imagen viewPdf.tags=ver,leer,anotar,texto,imagen
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Quitar primera
pdfOrganiser.mode.8=Quitar última pdfOrganiser.mode.8=Quitar última
pdfOrganiser.mode.9=Quitar primera y última pdfOrganiser.mode.9=Quitar primera y última
pdfOrganiser.mode.10=Unir impar-par pdfOrganiser.mode.10=Unir impar-par
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(por ej., 1,3,2 o 4-8,2,10-12 o 2n-1) pdfOrganiser.placeholder=(por ej., 1,3,2 o 4-8,2,10-12 o 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Ver PDF viewPdf.title=View/Edit PDF
viewPdf.header=Ver PDF viewPdf.header=Ver PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Zure leihatila bakarra autoostatatua zure PDF behar guztietarako
home.searchBar=Search for features... home.searchBar=Search for features...
home.viewPdf.title=View PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=View, annotate, add text or images home.viewPdf.desc=View, annotate, add text or images
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=view,read,annotate,text,image
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remove First
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Remove Last
pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.9=Remove First and Last
pdfOrganiser.mode.10=Odd-Even Merge pdfOrganiser.mode.10=Odd-Even Merge
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=View/Edit PDF
viewPdf.header=View PDF viewPdf.header=View PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=مغازه‌ همه‌کاره میزبانی‌شده به صورت
home.searchBar=جستجو برای ویژگی‌ها... home.searchBar=جستجو برای ویژگی‌ها...
home.viewPdf.title=مشاهده PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=مشاهده، حاشیه‌نویسی، افزودن متن یا تصاویر home.viewPdf.desc=مشاهده، حاشیه‌نویسی، افزودن متن یا تصاویر
viewPdf.tags=مشاهده،خواندن،حاشیه‌نویسی،متن،تصویر viewPdf.tags=مشاهده،خواندن،حاشیه‌نویسی،متن،تصویر
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=حذف اولین
pdfOrganiser.mode.8=حذف آخرین pdfOrganiser.mode.8=حذف آخرین
pdfOrganiser.mode.9=حذف اول و آخر pdfOrganiser.mode.9=حذف اول و آخر
pdfOrganiser.mode.10=ادغام فرد-زوج pdfOrganiser.mode.10=ادغام فرد-زوج
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(مثال: ۱,۳,۲ یا ۴-۸,۲,۱۰-۱۲ یا 2n-1) pdfOrganiser.placeholder=(مثال: ۱,۳,۲ یا ۴-۸,۲,۱۰-۱۲ یا 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=این ویژگی همچنین در <a href="{0}">صفحه ابزار چندگانه ما</a> موجود است. برای رابط کاربری صفحه به صفحه پیشرفته و ویژگی‌های اضافی بررسی کنید! multiTool-advert.message=این ویژگی همچنین در <a href="{0}">صفحه ابزار چندگانه ما</a> موجود است. برای رابط کاربری صفحه به صفحه پیشرفته و ویژگی‌های اضافی بررسی کنید!
#view pdf #view pdf
viewPdf.title=مشاهده PDF viewPdf.title=View/Edit PDF
viewPdf.header=مشاهده PDF viewPdf.header=مشاهده PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Votre application Web hébergée localement pour répondre à tous vos
home.searchBar=Rechercher des fonctionnalités... home.searchBar=Rechercher des fonctionnalités...
home.viewPdf.title=Visionner le PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Visionner, annoter, ajouter du texte ou des images. home.viewPdf.desc=Visionner, annoter, ajouter du texte ou des images.
viewPdf.tags=visualiser,lire,annoter,texte,image viewPdf.tags=visualiser,lire,annoter,texte,image
@@ -485,13 +485,13 @@ home.showJS.title=Afficher le JavaScript
home.showJS.desc=Recherche et affiche tout JavaScript injecté dans un PDF. home.showJS.desc=Recherche et affiche tout JavaScript injecté dans un PDF.
showJS.tags=JS showJS.tags=JS
home.autoRedact.title=Caviarder automatiquement home.autoRedact.title=Censure automatique
home.autoRedact.desc=Caviardez automatiquement les informations sensibles d'un PDF. home.autoRedact.desc=Censurer automatiquement les informations sensibles d'un PDF.
autoRedact.tags=caviarder,redact,auto autoRedact.tags=caviarder,rédiger,censurer,redact,auto
home.redact.title=Rédaction manuelle home.redact.title=Censure manuelle
home.redact.desc=Rédiger un PDF en fonction de texte sélectionné, formes dessinées et/ou des pages sélectionnées. home.redact.desc=Censurer un PDF en fonction de texte sélectionné, formes dessinées et/ou des pages sélectionnées.
redact.tags=Redact,Hide,black out,black,marker,hidden,manual redact.tags=Redact,Hide,black out,black,marker,hidden,manual,caviarder,rédiger,censurer
home.tableExtraxt.title=PDF en CSV home.tableExtraxt.title=PDF en CSV
home.tableExtraxt.desc=Extrait les tableaux d'un PDF et les transforme en CSV. home.tableExtraxt.desc=Extrait les tableaux d'un PDF et les transforme en CSV.
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Supprimer le premier
pdfOrganiser.mode.8=Supprimer le dernier pdfOrganiser.mode.8=Supprimer le dernier
pdfOrganiser.mode.9=Supprimer le premier et le dernier pdfOrganiser.mode.9=Supprimer le premier et le dernier
pdfOrganiser.mode.10=Méger Impair-Pair pdfOrganiser.mode.10=Méger Impair-Pair
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(par exemple 1,3,2 ou 4-8,2,10-12 ou 2n-1) pdfOrganiser.placeholder=(par exemple 1,3,2 ou 4-8,2,10-12 ou 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=Fichier déchiffré avec succès.
multiTool-advert.message=Cette fonctionnalité est aussi disponible dans la <a href="{0}">page de l'outil multifonction</a>. Allez-y pour une interface page par page améliorée et des fonctionnalités additionnelles ! multiTool-advert.message=Cette fonctionnalité est aussi disponible dans la <a href="{0}">page de l'outil multifonction</a>. Allez-y pour une interface page par page améliorée et des fonctionnalités additionnelles !
#view pdf #view pdf
viewPdf.title=Visualiser un PDF viewPdf.title=View/Edit PDF
viewPdf.header=Visualiser un PDF viewPdf.header=Visualiser un PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Do shiopa ilfhreastail arna óstáil go háitiúil do do riachtanais P
home.searchBar=Cuardaigh gnéithe... home.searchBar=Cuardaigh gnéithe...
home.viewPdf.title=Féach PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Féach ar, nótáil, cuir téacs nó íomhánna leis home.viewPdf.desc=Féach ar, nótáil, cuir téacs nó íomhánna leis
viewPdf.tags=amharc, léamh, anótáil, téacs, íomhá viewPdf.tags=amharc, léamh, anótáil, téacs, íomhá
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Bain Ar dtús
pdfOrganiser.mode.8=Bain Last pdfOrganiser.mode.8=Bain Last
pdfOrganiser.mode.9=Bain An Chéad agus an Deireadh pdfOrganiser.mode.9=Bain An Chéad agus an Deireadh
pdfOrganiser.mode.10=Corr-Fiú Cumaisc pdfOrganiser.mode.10=Corr-Fiú Cumaisc
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(m.sh. 1,3,2 nó 4-8,2,10-12 nó 2n-1) pdfOrganiser.placeholder=(m.sh. 1,3,2 nó 4-8,2,10-12 nó 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=D'éirigh le díchriptiú an chomhaid.
multiTool-advert.message=Tá an ghné seo ar fáil inár <a href="{0}">leathanach il-uirlisí</a> freisin. Seiceáil é le haghaidh Chomhéadain leathanach ar leathanach feabhsaithe agus gnéithe breise! multiTool-advert.message=Tá an ghné seo ar fáil inár <a href="{0}">leathanach il-uirlisí</a> freisin. Seiceáil é le haghaidh Chomhéadain leathanach ar leathanach feabhsaithe agus gnéithe breise!
#view pdf #view pdf
viewPdf.title=Féach PDF viewPdf.title=View/Edit PDF
viewPdf.header=Féach PDF viewPdf.header=Féach PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=आपकी सभी PDF आवश्यकताओं के ल
home.searchBar=सुविधाएं खोजें... home.searchBar=सुविधाएं खोजें...
home.viewPdf.title=PDF देखें home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=देखें, टिप्पणी करें, टेक्स्ट या छवियां जोड़ें home.viewPdf.desc=देखें, टिप्पणी करें, टेक्स्ट या छवियां जोड़ें
viewPdf.tags=देखें,पढ़ें,टिप्पणी,टेक्स्ट,छवि viewPdf.tags=देखें,पढ़ें,टिप्पणी,टेक्स्ट,छवि
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=प्रथम हटाएं
pdfOrganiser.mode.8=अंतिम हटाएं pdfOrganiser.mode.8=अंतिम हटाएं
pdfOrganiser.mode.9=प्रथम और अंतिम हटाएं pdfOrganiser.mode.9=प्रथम और अंतिम हटाएं
pdfOrganiser.mode.10=विषम-सम मर्ज pdfOrganiser.mode.10=विषम-सम मर्ज
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(जैसे 1,3,2 या 4-8,2,10-12 या 2n-1) pdfOrganiser.placeholder=(जैसे 1,3,2 या 4-8,2,10-12 या 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=फ़ाइल सफलतापूर्वक डिक्
multiTool-advert.message=यह सुविधा हमारे <a href="{0}">मल्टी-टूल पृष्ठ</a> में भी उपलब्ध है। बेहतर पृष्ठ-दर-पृष्ठ UI और अतिरिक्त सुविधाओं के लिए इसे देखें! multiTool-advert.message=यह सुविधा हमारे <a href="{0}">मल्टी-टूल पृष्ठ</a> में भी उपलब्ध है। बेहतर पृष्ठ-दर-पृष्ठ UI और अतिरिक्त सुविधाओं के लिए इसे देखें!
#view pdf #view pdf
viewPdf.title=PDF देखें viewPdf.title=View/Edit PDF
viewPdf.header=PDF देखें viewPdf.header=PDF देखें
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Sve na jednom mjestu za sve vaše PDF potrebe.
home.searchBar=Pretraži funkcije... home.searchBar=Pretraži funkcije...
home.viewPdf.title=Pregledaj PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Pregledaj, komentiraj, dodaj tekst ili slike home.viewPdf.desc=Pregledaj, komentiraj, dodaj tekst ili slike
viewPdf.tags=pregled,čitanje,komentiranje,tekst,slika viewPdf.tags=pregled,čitanje,komentiranje,tekst,slika
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Ukloni Prvu
pdfOrganiser.mode.8=Ukloni Zadnju pdfOrganiser.mode.8=Ukloni Zadnju
pdfOrganiser.mode.9=Ukloni Prvu i Zadnju pdfOrganiser.mode.9=Ukloni Prvu i Zadnju
pdfOrganiser.mode.10=Neparno-parna kombinacija pdfOrganiser.mode.10=Neparno-parna kombinacija
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1) pdfOrganiser.placeholder=(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Pogledaj viewPdf.title=View/Edit PDF
viewPdf.header=Pogledaj PDF viewPdf.header=Pogledaj PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Az Ön helyi PDF-szükségleteinek teljes körű megoldása.
home.searchBar=Funkciók keresése... home.searchBar=Funkciók keresése...
home.viewPdf.title=PDF megtekintése home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Megtekintés, jegyzetelés, szöveg vagy képek hozzáadása home.viewPdf.desc=Megtekintés, jegyzetelés, szöveg vagy képek hozzáadása
viewPdf.tags=megtekintés,olvasás,jegyzetelés,szöveg,kép viewPdf.tags=megtekintés,olvasás,jegyzetelés,szöveg,kép
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Első oldal eltávolítása
pdfOrganiser.mode.8=Utolsó oldal eltávolítása pdfOrganiser.mode.8=Utolsó oldal eltávolítása
pdfOrganiser.mode.9=Első és utolsó oldal eltávolítása pdfOrganiser.mode.9=Első és utolsó oldal eltávolítása
pdfOrganiser.mode.10=Páros-páratlan egyesítés pdfOrganiser.mode.10=Páros-páratlan egyesítés
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(pl. 1,3,2 vagy 4-8,2,10-12 vagy 2n-1) pdfOrganiser.placeholder=(pl. 1,3,2 vagy 4-8,2,10-12 vagy 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=A fájl visszafejtése sikeres.
multiTool-advert.message=Ez a funkció elérhető a <a href="{0}">többfunkciós eszköz oldalon</a> is. Nézze meg a fejlett oldalankénti felületet és további funkciókat! multiTool-advert.message=Ez a funkció elérhető a <a href="{0}">többfunkciós eszköz oldalon</a> is. Nézze meg a fejlett oldalankénti felületet és további funkciókat!
#view pdf #view pdf
viewPdf.title=PDF megtekintése viewPdf.title=View/Edit PDF
viewPdf.header=PDF megtekintése viewPdf.header=PDF megtekintése
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Semua kebutuhan PDF Anda, langsung dari komputer lokal Anda.
home.searchBar=Mencari fitur... home.searchBar=Mencari fitur...
home.viewPdf.title=Lihat PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Melihat, membuat anotasi, menambahkan teks atau gambar home.viewPdf.desc=Melihat, membuat anotasi, menambahkan teks atau gambar
viewPdf.tags=melihat,membaca,membuat anotasi,teks,gambar viewPdf.tags=melihat,membaca,membuat anotasi,teks,gambar
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Hapus Pertama
pdfOrganiser.mode.8=Hapus Terakhir pdfOrganiser.mode.8=Hapus Terakhir
pdfOrganiser.mode.9=Hapus Pertama dan Terakhir pdfOrganiser.mode.9=Hapus Pertama dan Terakhir
pdfOrganiser.mode.10=Penggabungan Genap-Ganjil pdfOrganiser.mode.10=Penggabungan Genap-Ganjil
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(misalnya 1,3,2 atau 4-8,2,10-12 atau 2n-1) pdfOrganiser.placeholder=(misalnya 1,3,2 atau 4-8,2,10-12 atau 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Lihat PDF viewPdf.title=View/Edit PDF
viewPdf.header=Lihat PDF viewPdf.header=Lihat PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=La tua pagina auto-gestita per modificare qualsiasi PDF.
home.searchBar=Cerca funzionalità... home.searchBar=Cerca funzionalità...
home.viewPdf.title=Visualizza PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Visualizza, annota, aggiungi testo o immagini home.viewPdf.desc=Visualizza, annota, aggiungi testo o immagini
viewPdf.tags=visualizzare,leggere,annotare,testo,immagine viewPdf.tags=visualizzare,leggere,annotare,testo,immagine
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Rimuovi prima
pdfOrganiser.mode.8=Rimuovi ultima pdfOrganiser.mode.8=Rimuovi ultima
pdfOrganiser.mode.9=Rimuovi la prima e l'ultima pdfOrganiser.mode.9=Rimuovi la prima e l'ultima
pdfOrganiser.mode.10=Unione pari-dispari pdfOrganiser.mode.10=Unione pari-dispari
pdfOrganiser.mode.11=Duplica tutte le pagine
pdfOrganiser.placeholder=(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1) pdfOrganiser.placeholder=(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrittografato con successo.
multiTool-advert.message=Questa funzione è disponibile anche nella nostra <a href="{0}">pagina multi-strumento</a>. Scoprila per un'interfaccia utente pagina per pagina migliorata e funzionalità aggiuntive! multiTool-advert.message=Questa funzione è disponibile anche nella nostra <a href="{0}">pagina multi-strumento</a>. Scoprila per un'interfaccia utente pagina per pagina migliorata e funzionalità aggiuntive!
#view pdf #view pdf
viewPdf.title=Visualizza PDF viewPdf.title=Visualizza/Modifica PDF
viewPdf.header=Visualizza PDF viewPdf.header=Visualizza PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=PDFのあらゆるニーズに対応するローカルホスティン
home.searchBar=機能検索... home.searchBar=機能検索...
home.viewPdf.title=PDFを表示 home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=表示、注釈、テキストや画像の追加 home.viewPdf.desc=表示、注釈、テキストや画像の追加
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=view,read,annotate,text,image
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=最初に削除
pdfOrganiser.mode.8=最後を削除 pdfOrganiser.mode.8=最後を削除
pdfOrganiser.mode.9=最初と最後を削除 pdfOrganiser.mode.9=最初と最後を削除
pdfOrganiser.mode.10=奇数-偶数の結合 pdfOrganiser.mode.10=奇数-偶数の結合
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(例:1,3,2または4-8,2,10-12または2n-1) pdfOrganiser.placeholder=(例:1,3,2または4-8,2,10-12または2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=ファイルの暗号化が正常に完了しました。
multiTool-advert.message=この機能は、<a href="{0}">マルチツール</a>でもご利用いただけます。強化されたページごとのUIと追加機能についてはこちらをご覧ください。 multiTool-advert.message=この機能は、<a href="{0}">マルチツール</a>でもご利用いただけます。強化されたページごとのUIと追加機能についてはこちらをご覧ください。
#view pdf #view pdf
viewPdf.title=PDFを表示 viewPdf.title=View/Edit PDF
viewPdf.header=PDFを表示 viewPdf.header=PDFを表示
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=PDF 관련 모든 작업을 위한 로컬 호스팅 원스톱 솔루
home.searchBar=기능 검색... home.searchBar=기능 검색...
home.viewPdf.title=PDF 보기 home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=보기, 주석 달기, 텍스트 또는 이미지 추가 home.viewPdf.desc=보기, 주석 달기, 텍스트 또는 이미지 추가
viewPdf.tags=보기,읽기,주석,텍스트,이미지 viewPdf.tags=보기,읽기,주석,텍스트,이미지
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=첫 페이지 제거
pdfOrganiser.mode.8=마지막 페이지 제거 pdfOrganiser.mode.8=마지막 페이지 제거
pdfOrganiser.mode.9=첫 페이지와 마지막 페이지 제거 pdfOrganiser.mode.9=첫 페이지와 마지막 페이지 제거
pdfOrganiser.mode.10=홀수-짝수 병합 pdfOrganiser.mode.10=홀수-짝수 병합
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(예: 1,3,2 또는 4-8,2,10-12 또는 2n-1) pdfOrganiser.placeholder=(예: 1,3,2 또는 4-8,2,10-12 또는 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=파일이 성공적으로 복호화되었습니다.
multiTool-advert.message=이 기능은 <a href="{0}">멀티 도구 페이지</a>에서도 사용할 수 있습니다. 향상된 페이지별 UI와 추가 기능을 확인해보세요! multiTool-advert.message=이 기능은 <a href="{0}">멀티 도구 페이지</a>에서도 사용할 수 있습니다. 향상된 페이지별 UI와 추가 기능을 확인해보세요!
#view pdf #view pdf
viewPdf.title=PDF 보기 viewPdf.title=View/Edit PDF
viewPdf.header=PDF 보기 viewPdf.header=PDF 보기
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Jouw lokaal gehoste one-stop-shop voor al je PDF-behoeften.
home.searchBar=Zoek naar functies... home.searchBar=Zoek naar functies...
home.viewPdf.title=PDF bekijken home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Bekijk, annoteer, voeg tekst of afbeeldingen toe home.viewPdf.desc=Bekijk, annoteer, voeg tekst of afbeeldingen toe
viewPdf.tags=bekijken,lezen,annoteren,tekst,afbeelding viewPdf.tags=bekijken,lezen,annoteren,tekst,afbeelding
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Eerste verwijderen
pdfOrganiser.mode.8=Laatste verwijderen pdfOrganiser.mode.8=Laatste verwijderen
pdfOrganiser.mode.9=Eerste en laaste verwijderen pdfOrganiser.mode.9=Eerste en laaste verwijderen
pdfOrganiser.mode.10=Oneven-even samenvoeken pdfOrganiser.mode.10=Oneven-even samenvoeken
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(bijv. 1,3,2 of 4-8,2,10-12 of 2n-1) pdfOrganiser.placeholder=(bijv. 1,3,2 of 4-8,2,10-12 of 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=PDF bekijken viewPdf.title=View/Edit PDF
viewPdf.header=PDF bekijken viewPdf.header=PDF bekijken
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Din lokale one-stop-shop for alle dine PDF-behov.
home.searchBar=Søk etter funksjoner... home.searchBar=Søk etter funksjoner...
home.viewPdf.title=Vis PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Vis, annoter, legg til tekst eller bilder home.viewPdf.desc=Vis, annoter, legg til tekst eller bilder
viewPdf.tags=vis,les,annoter,tekst,bilde viewPdf.tags=vis,les,annoter,tekst,bilde
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Fjern først
pdfOrganiser.mode.8=Fjern sist pdfOrganiser.mode.8=Fjern sist
pdfOrganiser.mode.9=Fjern først og sist pdfOrganiser.mode.9=Fjern først og sist
pdfOrganiser.mode.10=Partall-Oddetall Sammenslåing pdfOrganiser.mode.10=Partall-Oddetall Sammenslåing
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1) pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Vis PDF viewPdf.title=View/Edit PDF
viewPdf.header=Vis PDF viewPdf.header=Vis PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Twoja lokalna aplikacja do kompleksowej obsługi Twoich potrzeb związ
home.searchBar=Szukaj opcji ... home.searchBar=Szukaj opcji ...
home.viewPdf.title=Podejrzyj PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Wyświetl, adnotuj, dodaj tekst lub obrazy home.viewPdf.desc=Wyświetl, adnotuj, dodaj tekst lub obrazy
viewPdf.tags=wyświetl,czytaj,adnotuj,tekst,obraz viewPdf.tags=wyświetl,czytaj,adnotuj,tekst,obraz
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Usuń pierwszą
pdfOrganiser.mode.8=Usuń ostatnią pdfOrganiser.mode.8=Usuń ostatnią
pdfOrganiser.mode.9=Usuń pierwszą i ostatnią pdfOrganiser.mode.9=Usuń pierwszą i ostatnią
pdfOrganiser.mode.10=Połącz parzyste i nieparzyste pdfOrganiser.mode.10=Połącz parzyste i nieparzyste
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(przykład 1,3,2 lub 4-8,2,10-12 lub 2n-1) pdfOrganiser.placeholder=(przykład 1,3,2 lub 4-8,2,10-12 lub 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Podejrzyj PDF viewPdf.title=View/Edit PDF
viewPdf.header=Podejrzyj PDF viewPdf.header=Podejrzyj PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Seu tudo-em-um hospedado localmente para tudo relacionado a PDFs
home.searchBar=Pesquisar funcionalidades... home.searchBar=Pesquisar funcionalidades...
home.viewPdf.title=Visualizar PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Visualizar, anotar, adicionar texto ou imagens ao PDF. home.viewPdf.desc=Visualizar, anotar, adicionar texto ou imagens ao PDF.
viewPdf.tags=visualizar,ler,anotar,texto,imagem viewPdf.tags=visualizar,ler,anotar,texto,imagem
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remover primeiro
pdfOrganiser.mode.8=Remover último pdfOrganiser.mode.8=Remover último
pdfOrganiser.mode.9=Remover o primeiro e o último pdfOrganiser.mode.9=Remover o primeiro e o último
pdfOrganiser.mode.10=Mesclagem ímpar-par pdfOrganiser.mode.10=Mesclagem ímpar-par
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(por exemplo 1,3,2 ou 4-8,2,10-12 ou 2n-1) pdfOrganiser.placeholder=(por exemplo 1,3,2 ou 4-8,2,10-12 ou 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=Esta função também está disponível em <a href="{0}">Multiferramentas de PDF</a>. Com uma interface mais completa e funções adicionais. multiTool-advert.message=Esta função também está disponível em <a href="{0}">Multiferramentas de PDF</a>. Com uma interface mais completa e funções adicionais.
#view pdf #view pdf
viewPdf.title=Visualizar PDF viewPdf.title=View/Edit PDF
viewPdf.header=Visualizar PDF viewPdf.header=Visualizar PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=O seu centro local para todas as suas necessidades de PDF.
home.searchBar=Pesquisar funcionalidades... home.searchBar=Pesquisar funcionalidades...
home.viewPdf.title=Ver PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Ver, anotar, adicionar texto ou imagens home.viewPdf.desc=Ver, anotar, adicionar texto ou imagens
viewPdf.tags=ver,ler,anotar,texto,imagem viewPdf.tags=ver,ler,anotar,texto,imagem
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remover Primeira
pdfOrganiser.mode.8=Remover Última pdfOrganiser.mode.8=Remover Última
pdfOrganiser.mode.9=Remover Primeira e Última pdfOrganiser.mode.9=Remover Primeira e Última
pdfOrganiser.mode.10=Junção Par-Ímpar pdfOrganiser.mode.10=Junção Par-Ímpar
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(ex. 1,3,2 ou 4-8,2,10-12 ou 2n-1) pdfOrganiser.placeholder=(ex. 1,3,2 ou 4-8,2,10-12 ou 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=Ficheiro desencriptado com sucesso.
multiTool-advert.message=Esta funcionalidade também está disponível na nossa <a href="{0}">página multi-ferramenta</a>. Experimente para uma interface melhorada página a página e funcionalidades adicionais! multiTool-advert.message=Esta funcionalidade também está disponível na nossa <a href="{0}">página multi-ferramenta</a>. Experimente para uma interface melhorada página a página e funcionalidades adicionais!
#view pdf #view pdf
viewPdf.title=Ver PDF viewPdf.title=View/Edit PDF
viewPdf.header=Ver PDF viewPdf.header=Ver PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Un singur punct de oprire găzduit local pentru toate nevoile tale leg
home.searchBar=Caută funcționalități... home.searchBar=Caută funcționalități...
home.viewPdf.title=Vizualizează PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Vizualizează, adnotează, adaugă text sau imagini home.viewPdf.desc=Vizualizează, adnotează, adaugă text sau imagini
viewPdf.tags=vizualizare,citește,adnotează,text,imagine viewPdf.tags=vizualizare,citește,adnotează,text,imagine
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Elimină Prima
pdfOrganiser.mode.8=Elimină Ultima pdfOrganiser.mode.8=Elimină Ultima
pdfOrganiser.mode.9=Elimină Prima și Ultima pdfOrganiser.mode.9=Elimină Prima și Ultima
pdfOrganiser.mode.10=Îmbinare Impar-Par pdfOrganiser.mode.10=Îmbinare Impar-Par
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(ex. 1,3,2 sau 4-8,2,10-12 sau 2n-1) pdfOrganiser.placeholder=(ex. 1,3,2 sau 4-8,2,10-12 sau 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Vizualizează PDF viewPdf.title=View/Edit PDF
viewPdf.header=Vizualizează PDF viewPdf.header=Vizualizează PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Ваше локальное решение для всех потре
home.searchBar=Поиск функций... home.searchBar=Поиск функций...
home.viewPdf.title=Просмотр PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Просмотр, аннотирование, добавление текста или изображений home.viewPdf.desc=Просмотр, аннотирование, добавление текста или изображений
viewPdf.tags=просмотр,чтение,аннотации,текст,изображение viewPdf.tags=просмотр,чтение,аннотации,текст,изображение
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Удалить первую
pdfOrganiser.mode.8=Удалить последнюю pdfOrganiser.mode.8=Удалить последнюю
pdfOrganiser.mode.9=Удалить первую и последнюю pdfOrganiser.mode.9=Удалить первую и последнюю
pdfOrganiser.mode.10=Объединение четных-нечетных pdfOrganiser.mode.10=Объединение четных-нечетных
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(например, 1,3,2 или 4-8,2,10-12 или 2n-1) pdfOrganiser.placeholder=(например, 1,3,2 или 4-8,2,10-12 или 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=Файл успешно расшифрован.
multiTool-advert.message=Эта функция также доступна на нашей <a href="{0}">странице мультиинструмента</a>. Попробуйте её для улучшенного постраничного интерфейса и дополнительных возможностей! multiTool-advert.message=Эта функция также доступна на нашей <a href="{0}">странице мультиинструмента</a>. Попробуйте её для улучшенного постраничного интерфейса и дополнительных возможностей!
#view pdf #view pdf
viewPdf.title=Просмотр PDF viewPdf.title=View/Edit PDF
viewPdf.header=Просмотр PDF viewPdf.header=Просмотр PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Vaša lokálne hostovaná jednorazová zástavka pre všetky potreby P
home.searchBar=Vyhľadať funkcie... home.searchBar=Vyhľadať funkcie...
home.viewPdf.title=Zobraziť PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Zobraziť, anotovať, pridať text alebo obrázky home.viewPdf.desc=Zobraziť, anotovať, pridať text alebo obrázky
viewPdf.tags=zobraziť,čítať,anotovať,text,obrázok viewPdf.tags=zobraziť,čítať,anotovať,text,obrázok
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Odstrániť prvú
pdfOrganiser.mode.8=Odstrániť poslednú pdfOrganiser.mode.8=Odstrániť poslednú
pdfOrganiser.mode.9=Odstrániť prvú aj poslednú pdfOrganiser.mode.9=Odstrániť prvú aj poslednú
pdfOrganiser.mode.10=Odd-Even Merge pdfOrganiser.mode.10=Odd-Even Merge
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(napr. 1,3,2 alebo 4-8,2,10-12 alebo 2n-1) pdfOrganiser.placeholder=(napr. 1,3,2 alebo 4-8,2,10-12 alebo 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Zobraziť PDF viewPdf.title=View/Edit PDF
viewPdf.header=Zobraziť PDF viewPdf.header=Zobraziť PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Vaša lokalna trgovina na enem mestu za vse vaše potrebe po PDF-jih.
home.searchBar=Išči funkcije... home.searchBar=Išči funkcije...
home.viewPdf.title=Ogled PDF-ja home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Oglejte si, komentirajte, dodajte besedilo ali slike home.viewPdf.desc=Oglejte si, komentirajte, dodajte besedilo ali slike
viewPdf.tags=ogled, branje, opomba, besedilo, slika viewPdf.tags=ogled, branje, opomba, besedilo, slika
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Najprej odstrani
pdfOrganiser.mode.8=Odstrani zadnjega pdfOrganiser.mode.8=Odstrani zadnjega
pdfOrganiser.mode.9=Odstrani prvega in zadnjega pdfOrganiser.mode.9=Odstrani prvega in zadnjega
pdfOrganiser.mode.10=Sodo-liho spajanje pdfOrganiser.mode.10=Sodo-liho spajanje
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(npr. 1,3,2 ali 4-8,2,10-12 ali 2n-1) pdfOrganiser.placeholder=(npr. 1,3,2 ali 4-8,2,10-12 ali 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=Datoteka uspešno dešifrirana.
multiTool-advert.message=Ta funkcija je na voljo tudi na naši <a href="{0}">strani z več orodji</a>. Oglejte si izboljšan uporabniški vmesnik od strani do strani in dodatne funkcije! multiTool-advert.message=Ta funkcija je na voljo tudi na naši <a href="{0}">strani z več orodji</a>. Oglejte si izboljšan uporabniški vmesnik od strani do strani in dodatne funkcije!
#view pdf #view pdf
viewPdf.title=Oglejte si PDF viewPdf.title=View/Edit PDF
viewPdf.header=Ogled PDF-ja viewPdf.header=Ogled PDF-ja
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Vaš lokalno hostovan jedinstveni alat za sve vaše potrebe vezane za
home.searchBar=Pretraži funkcije... home.searchBar=Pretraži funkcije...
home.viewPdf.title=Pregledaj PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Pregledaj, anotiraj, dodaj tekst ili slike home.viewPdf.desc=Pregledaj, anotiraj, dodaj tekst ili slike
viewPdf.tags=pregled,čitanje,anotiranje,tekst,slika viewPdf.tags=pregled,čitanje,anotiranje,tekst,slika
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remove First
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Remove Last
pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.9=Remove First and Last
pdfOrganiser.mode.10=Odd-Even Merge pdfOrganiser.mode.10=Odd-Even Merge
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Prikaz viewPdf.title=View/Edit PDF
viewPdf.header=Prikaz PDF-a viewPdf.header=Prikaz PDF-a
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Din lokala one-stop-shop för alla dina PDF-behov.
home.searchBar=Sök efter funktioner... home.searchBar=Sök efter funktioner...
home.viewPdf.title=Visa PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Visa, kommentera, lägg till text eller bilder home.viewPdf.desc=Visa, kommentera, lägg till text eller bilder
viewPdf.tags=visa,läs,kommentera,text,bild viewPdf.tags=visa,läs,kommentera,text,bild
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Ta bort första
pdfOrganiser.mode.8=Ta bort sista pdfOrganiser.mode.8=Ta bort sista
pdfOrganiser.mode.9=Ta bort första och sista pdfOrganiser.mode.9=Ta bort första och sista
pdfOrganiser.mode.10=Udda-jämn sammanslagning pdfOrganiser.mode.10=Udda-jämn sammanslagning
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(t.ex. 1,3,2 eller 4-8,2,10-12 eller 2n-1) pdfOrganiser.placeholder=(t.ex. 1,3,2 eller 4-8,2,10-12 eller 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=Fil avkrypterad.
multiTool-advert.message=Denna funktion finns också tillgänglig i vår <a href="{0}">multi-tool page</a>. Spana in den för bättre sida-för-sida anpassning och ytterligare funktioner! multiTool-advert.message=Denna funktion finns också tillgänglig i vår <a href="{0}">multi-tool page</a>. Spana in den för bättre sida-för-sida anpassning och ytterligare funktioner!
#view pdf #view pdf
viewPdf.title=Visa PDF viewPdf.title=View/Edit PDF
viewPdf.header=Visa PDF viewPdf.header=Visa PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=ศูนย์รวมทุกความต้องการข
home.searchBar=ค้นหาคุณสมบัติ... home.searchBar=ค้นหาคุณสมบัติ...
home.viewPdf.title=ดู PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=ดู เพิ่มคำอธิบาย เพิ่มข้อความหรือรูปภาพ home.viewPdf.desc=ดู เพิ่มคำอธิบาย เพิ่มข้อความหรือรูปภาพ
viewPdf.tags=ดู, อ่าน, เพิ่มคำอธิบาย, ข้อความ, รูปภาพ viewPdf.tags=ดู, อ่าน, เพิ่มคำอธิบาย, ข้อความ, รูปภาพ
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=ลบหน้าหมายเลขแรก
pdfOrganiser.mode.8=ลบหน้าหมายเลขสุดท้าย pdfOrganiser.mode.8=ลบหน้าหมายเลขสุดท้าย
pdfOrganiser.mode.9=ลบหน้าหมายเลขแรกและสุดท้าย pdfOrganiser.mode.9=ลบหน้าหมายเลขแรกและสุดท้าย
pdfOrganiser.mode.10=รวมหน้าแบบคี่-คู่ pdfOrganiser.mode.10=รวมหน้าแบบคี่-คู่
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(เช่น 1,3,2 หรือ 4-8,2,10-12 หรือ 2n-1) pdfOrganiser.placeholder=(เช่น 1,3,2 หรือ 4-8,2,10-12 หรือ 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=ดู PDF viewPdf.title=View/Edit PDF
viewPdf.header=ดู PDF viewPdf.header=ดู PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Yerel olarak barındırılan tüm PDF ihtiyaçlarınız için tek dura
home.searchBar=Özellikleri arayın... home.searchBar=Özellikleri arayın...
home.viewPdf.title=PDF Görüntüle home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Görüntüleyin, açıklama ekleyin, metin veya resim ekleyin home.viewPdf.desc=Görüntüleyin, açıklama ekleyin, metin veya resim ekleyin
viewPdf.tags=görüntüle,oku,açıklama ekle,metin,görüntü viewPdf.tags=görüntüle,oku,açıklama ekle,metin,görüntü
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=İlk Önce Kaldır
pdfOrganiser.mode.8=Sonuncuyu Kaldır pdfOrganiser.mode.8=Sonuncuyu Kaldır
pdfOrganiser.mode.9=İlk ve Sonu Kaldır pdfOrganiser.mode.9=İlk ve Sonu Kaldır
pdfOrganiser.mode.10=Tek-Çift Birleştirme pdfOrganiser.mode.10=Tek-Çift Birleştirme
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1) pdfOrganiser.placeholder=(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=PDF Görüntüle viewPdf.title=View/Edit PDF
viewPdf.header=PDF Görüntüle viewPdf.header=PDF Görüntüle
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Ваш локальний універсальний магазин д
home.searchBar=Пошук функцій... home.searchBar=Пошук функцій...
home.viewPdf.title=Перегляд PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Перегляд, анотація, додавання тексту або зображень home.viewPdf.desc=Перегляд, анотація, додавання тексту або зображень
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=view,read,annotate,text,image
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Видалити першу
pdfOrganiser.mode.8=Видалити останню pdfOrganiser.mode.8=Видалити останню
pdfOrganiser.mode.9=Видалити першу та останню pdfOrganiser.mode.9=Видалити першу та останню
pdfOrganiser.mode.10=Odd-Even Merge pdfOrganiser.mode.10=Odd-Even Merge
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(наприклад, 1,3,2 або 4-8,2,10-12 або 2n-1) pdfOrganiser.placeholder=(наприклад, 1,3,2 або 4-8,2,10-12 або 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Переглянути PDF viewPdf.title=View/Edit PDF
viewPdf.header=Переглянути PDF viewPdf.header=Переглянути PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Giải pháp toàn diện cho mọi nhu cầu về PDF ngay trên máy
home.searchBar=Tìm kiếm tính năng... home.searchBar=Tìm kiếm tính năng...
home.viewPdf.title=Xem PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=Xem, chú thích, thêm văn bản hoặc hình ảnh home.viewPdf.desc=Xem, chú thích, thêm văn bản hoặc hình ảnh
viewPdf.tags=xem,đọc,chú thích,văn bản,hình ảnh viewPdf.tags=xem,đọc,chú thích,văn bản,hình ảnh
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Xóa trang đầu
pdfOrganiser.mode.8=Xóa trang cuối pdfOrganiser.mode.8=Xóa trang cuối
pdfOrganiser.mode.9=Xóa trang đầu và cuối pdfOrganiser.mode.9=Xóa trang đầu và cuối
pdfOrganiser.mode.10=Trộn lẻ-chẵn pdfOrganiser.mode.10=Trộn lẻ-chẵn
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(ví dụ: 1,3,2 hoặc 4-8,2,10-12 hoặc 2n-1) pdfOrganiser.placeholder=(ví dụ: 1,3,2 hoặc 4-8,2,10-12 hoặc 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Xem PDF viewPdf.title=View/Edit PDF
viewPdf.header=Xem PDF viewPdf.header=Xem PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=ཁྱེད་ཀྱི་ PDF དགོས་མཁོ་ཚང་
home.searchBar=ནུས་པ་འཚོལ་བཤེར། home.searchBar=ནུས་པ་འཚོལ་བཤེར།
home.viewPdf.title=PDF ལྟ་བ། home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=ལྟ་བ། མཆན་འགྲེལ། ཡི་གེ་དང་པར་རིས་སྣོན་པ། home.viewPdf.desc=ལྟ་བ། མཆན་འགྲེལ། ཡི་གེ་དང་པར་རིས་སྣོན་པ།
viewPdf.tags=ལྟ་བ།,ཀློག་པ།,མཆན་འགྲེལ།,ཡི་གེ,པར་རིས། viewPdf.tags=ལྟ་བ།,ཀློག་པ།,མཆན་འགྲེལ།,ཡི་གེ,པར་རིས།
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remove First
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Remove Last
pdfOrganiser.mode.9=དང་པོ་དང་མཐའ་མ་སུབ་པ། pdfOrganiser.mode.9=དང་པོ་དང་མཐའ་མ་སུབ་པ།
pdfOrganiser.mode.10=ཡ་ཟུང་སྡེབ་སྦྱོར། pdfOrganiser.mode.10=ཡ་ཟུང་སྡེབ་སྦྱོར།
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(དཔེར་ན། 1,3,2 ཡང་ན་ 4-8,2,10-12 ཡང་ན་ 2n-1) pdfOrganiser.placeholder=(དཔེར་ན། 1,3,2 ཡང་ན་ 4-8,2,10-12 ཡང་ན་ 2n-1)
@@ -1034,7 +1035,7 @@ decrypt.success=ཡིག་ཆའི་གསང་སྡོམ་གྲོལ
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=PDF ལྟ་བ། viewPdf.title=View/Edit PDF
viewPdf.header=PDF ལྟ་བ། viewPdf.header=PDF ལྟ་བ།
#pageRemover #pageRemover

View File

@@ -76,11 +76,11 @@ donate=捐款
color=颜色 color=颜色
sponsor=赞助 sponsor=赞助
info=信息 info=信息
pro=Pro pro=专业版
page=Page page=页面
pages=Pages pages=页码
loading=加载中... loading=加载中...
addToDoc=Add to Document addToDoc=添加至文件
reset=重置 reset=重置
apply=应用 apply=应用
@@ -120,19 +120,19 @@ pipelineOptions.validateButton=验证
######################## ########################
enterpriseEdition.button=升级到 Pro 版本 enterpriseEdition.button=升级到 Pro 版本
enterpriseEdition.warning=此功能仅适用于 Pro 版本 enterpriseEdition.warning=此功能仅适用于 Pro 版本
enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. enterpriseEdition.yamlAdvert=Stirling PDF Pro支持YAML配置文件和其他SSO功能。
enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro enterpriseEdition.ssoAdvert=寻找更多的用户管理功能?查看Stirling PDF Pro
################# #################
# Analytics # # Analytics #
################# #################
analytics.title=Do you want make Stirling PDF better? analytics.title=你想协助改善Stirling PDF
analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. analytics.paragraph1=Stirling PDF有选择性分析功能,可以帮助我们改进产品。我们不跟踪任何个人信息或文件内容。
analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. analytics.paragraph2=请考虑启用分析来帮助Stirling-PDF的发展并让我们更好地了解我们的用户。
analytics.enable=Enable analytics analytics.enable=启用分析功能
analytics.disable=Disable analytics analytics.disable=禁用分析功能
analytics.settings=You can change the settings for analytics in the config/settings.yml file analytics.settings=您可以在 config/settings.yml 文件中变更分析功能的设定
############# #############
# NAVBAR # # NAVBAR #
@@ -240,17 +240,17 @@ database.creationDate=创建时间
database.fileSize=文件大小 database.fileSize=文件大小
database.deleteBackupFile=删除备份文件 database.deleteBackupFile=删除备份文件
database.importBackupFile=导入备份文件 database.importBackupFile=导入备份文件
database.createBackupFile=Create Backup File database.createBackupFile=创建备份文件
database.downloadBackupFile=下载备份文件 database.downloadBackupFile=下载备份文件
database.info_1=导入数据时,确保结构正确至关重要。如果您不确定自己在做什么,请寻求专业人士的建议和支持。结构错误会导致应用程序故障,甚至完全无法运行应用程序。 database.info_1=导入数据时,确保结构正确至关重要。如果您不确定自己在做什么,请寻求专业人士的建议和支持。结构错误会导致应用程序故障,甚至完全无法运行应用程序。
database.info_2=上传文件时,文件名并不重要。上传后,文件名将重命名为 backup_user_yyyyMMddHHmm.sql以确保命名规范的一致性。 database.info_2=上传文件时,文件名并不重要。上传后,文件名将重命名为 backup_user_yyyyMMddHHmm.sql以确保命名规范的一致性。
database.submit=导入备份 database.submit=导入备份
database.importIntoDatabaseSuccessed=导入数据库成功 database.importIntoDatabaseSuccessed=导入数据库成功
database.backupCreated=Database backup successful database.backupCreated=数据库备份成功
database.fileNotFound=未找到文件 database.fileNotFound=未找到文件
database.fileNullOrEmpty=文件不能为空 database.fileNullOrEmpty=文件不能为空
database.failedImportFile=导入文件失败 database.failedImportFile=导入文件失败
database.notSupported=This function is not available for your database connection. database.notSupported=此功能不适用于您的数据库连接。
session.expired=您的会话已过期。请刷新页面并重试。 session.expired=您的会话已过期。请刷新页面并重试。
session.refreshPage=刷新页面 session.refreshPage=刷新页面
@@ -262,13 +262,13 @@ home.desc=本地部署的一站式服务,满足您的所有 PDF 需求。
home.searchBar=搜索您需要的功能... home.searchBar=搜索您需要的功能...
home.viewPdf.title=浏览 PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=浏览、注释、添加文本或图像 home.viewPdf.desc=浏览、注释、添加文本或图像
viewPdf.tags=浏览、阅读、注释、文本、图像 viewPdf.tags=浏览、阅读、注释、文本、图像
home.setFavorites=编辑收藏夹 home.setFavorites=编辑收藏夹
home.hideFavorites=Hide Favourites home.hideFavorites=隐藏收藏夹
home.showFavorites=Show Favourites home.showFavorites=显示收藏夹
home.legacyHomepage=使用旧版主页 home.legacyHomepage=使用旧版主页
home.newHomePage=试用新版主页! home.newHomePage=试用新版主页!
home.alphabetical=按字母顺序 home.alphabetical=按字母顺序
@@ -462,9 +462,9 @@ home.MarkdownToPDF.title=Markdown 转 PDF
home.MarkdownToPDF.desc=将任何 Markdown 文件转换为 PDF home.MarkdownToPDF.desc=将任何 Markdown 文件转换为 PDF
MarkdownToPDF.tags=标记、网页内容、转换、转换 MarkdownToPDF.tags=标记、网页内容、转换、转换
home.PDFToMarkdown.title=PDF to Markdown home.PDFToMarkdown.title=PDF Markdown
home.PDFToMarkdown.desc=Converts any PDF to Markdown home.PDFToMarkdown.desc=将任何pdf文件转换为Markdown文件
PDFToMarkdown.tags=markup,web-content,transformation,convert,md PDFToMarkdown.tags=标记,网页内容,转换,转档,md
home.getPdfInfo.title=获取 PDF 的所有信息 home.getPdfInfo.title=获取 PDF 的所有信息
home.getPdfInfo.desc=获取 PDF 的所有可能的信息 home.getPdfInfo.desc=获取 PDF 的所有可能的信息
@@ -489,9 +489,9 @@ home.autoRedact.title=自动删除
home.autoRedact.desc=根据输入文本自动删除覆盖PDF 中的文本 home.autoRedact.desc=根据输入文本自动删除覆盖PDF 中的文本
autoRedact.tags=脱敏、隐藏、涂黑、标记、不可见 autoRedact.tags=脱敏、隐藏、涂黑、标记、不可见
home.redact.title=Manual Redaction home.redact.title=手动修订
home.redact.desc=Redacts a PDF based on selected text, drawn shapes and/or selected page(s) home.redact.desc=根据选定的文本、绘制的形状和/或选定的页面编辑PDF
redact.tags=Redact,Hide,black out,black,marker,hidden,manual redact.tags=涂改,隐藏,涂黑,黑色,标记,遮蔽,手动
home.tableExtraxt.title=PDF 转 CSV home.tableExtraxt.title=PDF 转 CSV
home.tableExtraxt.desc=从 PDF 中提取表格并将其转换为 CSV home.tableExtraxt.desc=从 PDF 中提取表格并将其转换为 CSV
@@ -542,19 +542,19 @@ replace-color.title=替换-反转-颜色
replace-color.header=替换-反转 PDF 颜色 replace-color.header=替换-反转 PDF 颜色
home.replaceColorPdf.title=替换和反转颜色 home.replaceColorPdf.title=替换和反转颜色
home.replaceColorPdf.desc=替换 PDF 中文本和背景的颜色并将PDF全色反转以减小文件大小 home.replaceColorPdf.desc=替换 PDF 中文本和背景的颜色并将PDF全色反转以减小文件大小
replaceColorPdf.tags=Replace Color,Page operations,Back end,server side replaceColorPdf.tags=更换颜色,页面操作,后端,服务器端
replace-color.selectText.1=替换或反转颜色选项 replace-color.selectText.1=替换或反转颜色选项
replace-color.selectText.2=Default(Default high contrast colors) replace-color.selectText.2=默认(默认高对比度颜色)
replace-color.selectText.3=Custom(Customized colors) replace-color.selectText.3=定制(定制的颜色)
replace-color.selectText.4=Full-Invert(Invert all colors) replace-color.selectText.4=全反转(反转所有颜色)
replace-color.selectText.5=High contrast color options replace-color.selectText.5=高对比度颜色选项
replace-color.selectText.6=white text on black background replace-color.selectText.6=黑底白字
replace-color.selectText.7=Black text on white background replace-color.selectText.7=白底黑字
replace-color.selectText.8=Yellow text on black background replace-color.selectText.8=黑底黄字
replace-color.selectText.9=Green text on black background replace-color.selectText.9=黑底绿字
replace-color.selectText.10=Choose text Color replace-color.selectText.10=选择文本颜色
replace-color.selectText.11=Choose background Color replace-color.selectText.11=选择背景颜色
replace-color.submit=Replace replace-color.submit=取代
@@ -599,31 +599,31 @@ autoRedact.convertPDFToImageLabel=将PDF转换为PDF-Image用于删除方框
autoRedact.submitButton=提交 autoRedact.submitButton=提交
#redact #redact
redact.title=Manual Redaction redact.title=手动纠正
redact.header=Manual Redaction redact.header=手动纠正
redact.submit=Redact redact.submit=纠正
redact.textBasedRedaction=Text based Redaction redact.textBasedRedaction=基于文本的纠正
redact.pageBasedRedaction=Page-based Redaction redact.pageBasedRedaction=基于页面的纠正
redact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) redact.convertPDFToImageLabel=将PDF转换为PDF图像用于删除框后的文本
redact.pageRedactionNumbers.title=Pages redact.pageRedactionNumbers.title=页面
redact.pageRedactionNumbers.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) redact.pageRedactionNumbers.placeholder=(例如 1,2,8 4,7,12-16 2n-1)
redact.redactionColor.title=Redaction Color redact.redactionColor.title=编辑颜色
redact.export=Export redact.export=导出
redact.upload=Upload redact.upload=上传
redact.boxRedaction=Box draw redaction redact.boxRedaction=框选区域涂黑
redact.zoom=Zoom redact.zoom=缩放
redact.zoomIn=Zoom in redact.zoomIn=放大
redact.zoomOut=Zoom out redact.zoomOut=缩小
redact.nextPage=Next Page redact.nextPage=下一页
redact.previousPage=Previous Page redact.previousPage=上一页
redact.toggleSidebar=Toggle Sidebar redact.toggleSidebar=切换侧边栏
redact.showThumbnails=Show Thumbnails redact.showThumbnails=显示缩略图
redact.showDocumentOutline=Show Document Outline (double-click to expand/collapse all items) redact.showDocumentOutline=显示文档大纲(双击展开/折叠所有项目)
redact.showAttatchments=Show Attachments redact.showAttatchments=显示附件
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=显示图层(双击将所有图层重置为默认状态)
redact.colourPicker=Colour Picker redact.colourPicker=颜色选择器
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=查找当前大纲项目
redact.applyChanges=Apply Changes redact.applyChanges=应用
#showJS #showJS
showJS.title=显示 JavaScript showJS.title=显示 JavaScript
@@ -661,9 +661,9 @@ MarkdownToPDF.credit=此服务使用 WeasyPrint 进行文件转换。
#pdf-to-markdown #pdf-to-markdown
PDFToMarkdown.title=PDF To Markdown PDFToMarkdown.title=PDFMarkdown
PDFToMarkdown.header=PDF To Markdown PDFToMarkdown.header=PDFMarkdown
PDFToMarkdown.submit=Convert PDFToMarkdown.submit=转换
#url-to-pdf #url-to-pdf
@@ -872,7 +872,7 @@ sign.add=添加
sign.saved=已保存签名 sign.saved=已保存签名
sign.save=保存签名 sign.save=保存签名
sign.personalSigs=个人签名 sign.personalSigs=个人签名
sign.sharedSigs=Shared Signatures sign.sharedSigs=共享签名
sign.noSavedSigs=未找到已保存的签名 sign.noSavedSigs=未找到已保存的签名
sign.addToAll=添加到所有页面 sign.addToAll=添加到所有页面
sign.delete=删除 sign.delete=删除
@@ -880,7 +880,7 @@ sign.first=首页
sign.last=末页 sign.last=末页
sign.next=下一页 sign.next=下一页
sign.previous=上一页 sign.previous=上一页
sign.maintainRatio=Toggle maintain aspect ratio sign.maintainRatio=切换保持长宽比
#repair #repair
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=删除第一页
pdfOrganiser.mode.8=删除最后一页 pdfOrganiser.mode.8=删除最后一页
pdfOrganiser.mode.9=删除第一页和最后一页 pdfOrganiser.mode.9=删除第一页和最后一页
pdfOrganiser.mode.10=奇偶合并 pdfOrganiser.mode.10=奇偶合并
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=例如1,3,2 或 4-8,2,10-12 或 2n-1 pdfOrganiser.placeholder=例如1,3,2 或 4-8,2,10-12 或 2n-1
@@ -1034,7 +1035,7 @@ decrypt.success=文件解密成功。
multiTool-advert.message=此功能也适用于我们的“<a href="{0}">多功能工具页面</a>”。查看它以获得增强的逐页 UI 以及其他功能! multiTool-advert.message=此功能也适用于我们的“<a href="{0}">多功能工具页面</a>”。查看它以获得增强的逐页 UI 以及其他功能!
#view pdf #view pdf
viewPdf.title=浏览 PDF viewPdf.title=View/Edit PDF
viewPdf.header=浏览 PDF viewPdf.header=浏览 PDF
#pageRemover #pageRemover
@@ -1328,18 +1329,18 @@ splitByChapters.header=按章节拆分 PDF
splitByChapters.bookmarkLevel=书签级别 splitByChapters.bookmarkLevel=书签级别
splitByChapters.includeMetadata=包含元数据 splitByChapters.includeMetadata=包含元数据
splitByChapters.allowDuplicates=允许重复 splitByChapters.allowDuplicates=允许重复
splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. splitByChapters.desc.1=此工具根据章节结构将PDF文件拆分为多个PDF。
splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). splitByChapters.desc.2=书签级别选择用于拆分的书签级别0表示顶级1表示二级等
splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.3=包含元数据如果选中原始PDF的元数据将包含在每个拆分的PDF中。
splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.desc.4=允许重复:如果选中,允许同一页面上的多个书签创建单独的PDF
splitByChapters.submit=拆分 PDF splitByChapters.submit=拆分 PDF
#File Chooser #File Chooser
fileChooser.click=单击 fileChooser.click=单击
fileChooser.or= fileChooser.or=
fileChooser.dragAndDrop=拖放文件 fileChooser.dragAndDrop=拖放文件
fileChooser.dragAndDropPDF=Drag & Drop PDF file fileChooser.dragAndDropPDF=拖放PDF文件
fileChooser.dragAndDropImage=Drag & Drop Image file fileChooser.dragAndDropImage=拖放图片文件
fileChooser.hoveredDragAndDrop=拖放文件到此处 fileChooser.hoveredDragAndDrop=拖放文件到此处
#release notes #release notes
@@ -1350,36 +1351,36 @@ releases.current.version=当前版本
releases.note=版本说明仅提供英文版本 releases.note=版本说明仅提供英文版本
#Validate Signature #Validate Signature
validateSignature.title=Validate PDF Signatures validateSignature.title=验证pdf签名
validateSignature.header=Validate Digital Signatures validateSignature.header=验证数字签名
validateSignature.selectPDF=Select signed PDF file validateSignature.selectPDF=选择已签名的pdf文件
validateSignature.submit=Validate Signatures validateSignature.submit=验证签名
validateSignature.results=Validation Results validateSignature.results=验证结果
validateSignature.status=Status validateSignature.status=状态
validateSignature.signer=Signer validateSignature.signer=签署者
validateSignature.date=Date validateSignature.date=日期
validateSignature.reason=Reason validateSignature.reason=原因
validateSignature.location=Location validateSignature.location=位置
validateSignature.noSignatures=No digital signatures found in this document validateSignature.noSignatures=此文件中未找到电子签名
validateSignature.status.valid=Valid validateSignature.status.valid=有效
validateSignature.status.invalid=Invalid validateSignature.status.invalid=无效
validateSignature.chain.invalid=Certificate chain validation failed - cannot verify signer's identity validateSignature.chain.invalid=证书链验证失败 - 无法验证签名者的身份
validateSignature.trust.invalid=Certificate not in trust store - source cannot be verified validateSignature.trust.invalid=证书不在信任存储区中 - 无法验证来源
validateSignature.cert.expired=Certificate has expired validateSignature.cert.expired=凭证已过期
validateSignature.cert.revoked=Certificate has been revoked validateSignature.cert.revoked=凭证已被撤销
validateSignature.signature.info=Signature Information validateSignature.signature.info=签名信息
validateSignature.signature=Signature validateSignature.signature=签名
validateSignature.signature.mathValid=Signature is mathematically valid BUT: validateSignature.signature.mathValid=签名在数学上有效,但:
validateSignature.selectCustomCert=Custom Certificate File X.509 (Optional) validateSignature.selectCustomCert=X.509 自签名证书(可选)
validateSignature.cert.info=Certificate Details validateSignature.cert.info=凭证信息
validateSignature.cert.issuer=Issuer validateSignature.cert.issuer=发行者
validateSignature.cert.subject=Subject validateSignature.cert.subject=主题
validateSignature.cert.serialNumber=Serial Number validateSignature.cert.serialNumber=序列号
validateSignature.cert.validFrom=Valid From validateSignature.cert.validFrom=有效期自
validateSignature.cert.validUntil=Valid Until validateSignature.cert.validUntil=有效期至
validateSignature.cert.algorithm=Algorithm validateSignature.cert.algorithm=算法
validateSignature.cert.keySize=Key Size validateSignature.cert.keySize=密钥长度
validateSignature.cert.version=Version validateSignature.cert.version=版本
validateSignature.cert.keyUsage=Key Usage validateSignature.cert.keyUsage=密钥用途
validateSignature.cert.selfSigned=Self-Signed validateSignature.cert.selfSigned=自签名
validateSignature.cert.bits=bits validateSignature.cert.bits=比特

View File

@@ -262,7 +262,7 @@ home.desc=您的本機一站式 PDF 解決方案。
home.searchBar=搜尋功能... home.searchBar=搜尋功能...
home.viewPdf.title=檢視 PDF home.viewPdf.title=View/Edit PDF
home.viewPdf.desc=檢視、註釋、新增文字或圖片 home.viewPdf.desc=檢視、註釋、新增文字或圖片
viewPdf.tags=檢視,閱讀,註釋,文字,圖片 viewPdf.tags=檢視,閱讀,註釋,文字,圖片
@@ -992,6 +992,7 @@ pdfOrganiser.mode.7=刪除第一頁
pdfOrganiser.mode.8=刪除最後一頁 pdfOrganiser.mode.8=刪除最後一頁
pdfOrganiser.mode.9=刪除第一頁和最後一頁 pdfOrganiser.mode.9=刪除第一頁和最後一頁
pdfOrganiser.mode.10=奇偶合併 pdfOrganiser.mode.10=奇偶合併
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(例如 1,3,2 或 4-8,2,10-12 或 2n-1 pdfOrganiser.placeholder=(例如 1,3,2 或 4-8,2,10-12 或 2n-1
@@ -1034,7 +1035,7 @@ decrypt.success=檔案已成功解密。
multiTool-advert.message=此功能也可以在我們的<a href="{0}">複合工具頁面</a>中使用。前往查看並體驗更強大的逐頁操作介面及其他進階功能! multiTool-advert.message=此功能也可以在我們的<a href="{0}">複合工具頁面</a>中使用。前往查看並體驗更強大的逐頁操作介面及其他進階功能!
#view pdf #view pdf
viewPdf.title=檢視 PDF viewPdf.title=View/Edit PDF
viewPdf.header=檢視 PDF viewPdf.header=檢視 PDF
#pageRemover #pageRemover

View File

@@ -3,14 +3,14 @@
{ {
"moduleName": "ch.qos.logback:logback-classic", "moduleName": "ch.qos.logback:logback-classic",
"moduleUrl": "http://www.qos.ch", "moduleUrl": "http://www.qos.ch",
"moduleVersion": "1.5.12", "moduleVersion": "1.5.15",
"moduleLicense": "GNU Lesser General Public License", "moduleLicense": "GNU Lesser General Public License",
"moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" "moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html"
}, },
{ {
"moduleName": "ch.qos.logback:logback-core", "moduleName": "ch.qos.logback:logback-core",
"moduleUrl": "http://www.qos.ch", "moduleUrl": "http://www.qos.ch",
"moduleVersion": "1.5.12", "moduleVersion": "1.5.15",
"moduleLicense": "GNU Lesser General Public License", "moduleLicense": "GNU Lesser General Public License",
"moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" "moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html"
}, },
@@ -560,7 +560,7 @@
{ {
"moduleName": "io.micrometer:micrometer-core", "moduleName": "io.micrometer:micrometer-core",
"moduleUrl": "https://github.com/micrometer-metrics/micrometer", "moduleUrl": "https://github.com/micrometer-metrics/micrometer",
"moduleVersion": "1.14.3", "moduleVersion": "1.14.4",
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
@@ -781,8 +781,8 @@
{ {
"moduleName": "org.apache.commons:commons-compress", "moduleName": "org.apache.commons:commons-compress",
"moduleUrl": "https://commons.apache.org/proper/commons-compress/", "moduleUrl": "https://commons.apache.org/proper/commons-compress/",
"moduleVersion": "1.21", "moduleVersion": "1.26.0",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache-2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
{ {
@@ -921,20 +921,6 @@
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
{
"moduleName": "org.bouncycastle:bcmail-jdk15on",
"moduleUrl": "https://www.bouncycastle.org/java.html",
"moduleVersion": "1.69",
"moduleLicense": "Bouncy Castle Licence",
"moduleLicenseUrl": "https://www.bouncycastle.org/licence.html"
},
{
"moduleName": "org.bouncycastle:bcpkix-jdk15on",
"moduleUrl": "https://www.bouncycastle.org/java.html",
"moduleVersion": "1.69",
"moduleLicense": "Bouncy Castle Licence",
"moduleLicenseUrl": "https://www.bouncycastle.org/licence.html"
},
{ {
"moduleName": "org.bouncycastle:bcpkix-jdk18on", "moduleName": "org.bouncycastle:bcpkix-jdk18on",
"moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/", "moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/",
@@ -949,13 +935,6 @@
"moduleLicense": "Bouncy Castle Licence", "moduleLicense": "Bouncy Castle Licence",
"moduleLicenseUrl": "https://www.bouncycastle.org/licence.html" "moduleLicenseUrl": "https://www.bouncycastle.org/licence.html"
}, },
{
"moduleName": "org.bouncycastle:bcutil-jdk15on",
"moduleUrl": "https://www.bouncycastle.org/java.html",
"moduleVersion": "1.69",
"moduleLicense": "Bouncy Castle Licence",
"moduleLicenseUrl": "https://www.bouncycastle.org/licence.html"
},
{ {
"moduleName": "org.bouncycastle:bcutil-jdk18on", "moduleName": "org.bouncycastle:bcutil-jdk18on",
"moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/", "moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/",
@@ -1441,7 +1420,7 @@
{ {
"moduleName": "org.springframework.boot:spring-boot-devtools", "moduleName": "org.springframework.boot:spring-boot-devtools",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.1", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
@@ -1455,14 +1434,14 @@
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-actuator", "moduleName": "org.springframework.boot:spring-boot-starter-actuator",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.1", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-data-jpa", "moduleName": "org.springframework.boot:spring-boot-starter-data-jpa",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.1", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
@@ -1476,7 +1455,7 @@
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-jetty", "moduleName": "org.springframework.boot:spring-boot-starter-jetty",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.1", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
@@ -1497,28 +1476,28 @@
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-oauth2-client", "moduleName": "org.springframework.boot:spring-boot-starter-oauth2-client",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.1", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-security", "moduleName": "org.springframework.boot:spring-boot-starter-security",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.1", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf", "moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.1", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-web", "moduleName": "org.springframework.boot:spring-boot-starter-web",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.1", "moduleVersion": "3.4.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
@@ -1651,7 +1630,7 @@
{ {
"moduleName": "org.springframework:spring-jdbc", "moduleName": "org.springframework:spring-jdbc",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.2", "moduleVersion": "6.2.3",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
@@ -1679,7 +1658,7 @@
{ {
"moduleName": "org.springframework:spring-webmvc", "moduleName": "org.springframework:spring-webmvc",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.2", "moduleVersion": "6.2.3",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },

View File

@@ -17,7 +17,7 @@ let fileInput = document.getElementById('fileInput-input');
let file; let file;
let pdfDoc = null; let pdfDoc = null;
let pageId = document.getElementById('pageId'); let pageNumbers = document.getElementById('pageNumbers');
let currentPage = 1; let currentPage = 1;
let totalPages = 0; let totalPages = 0;
@@ -31,7 +31,7 @@ let timeId = null; // timeout id for resizing canvases event
btn1Object.addEventListener('click', function (e) { btn1Object.addEventListener('click', function (e) {
if (currentPage !== 1) { if (currentPage !== 1) {
currentPage = currentPage - 1; currentPage = currentPage - 1;
pageId.value = currentPage; pageNumbers.value = currentPage;
if (file.type === 'application/pdf') { if (file.type === 'application/pdf') {
let reader = new FileReader(); let reader = new FileReader();
@@ -52,7 +52,7 @@ btn1Object.addEventListener('click', function (e) {
btn2Object.addEventListener('click', function (e) { btn2Object.addEventListener('click', function (e) {
if (currentPage !== totalPages) { if (currentPage !== totalPages) {
currentPage = currentPage + 1; currentPage = currentPage + 1;
pageId.value = currentPage; pageNumbers.value = currentPage;
if (file.type === 'application/pdf') { if (file.type === 'application/pdf') {
let reader = new FileReader(); let reader = new FileReader();
@@ -81,7 +81,7 @@ function renderPageFromFile(file) {
totalPages = pdf.numPages; totalPages = pdf.numPages;
renderPage(currentPage); renderPage(currentPage);
}); });
pageId.value = currentPage; pageNumbers.value = currentPage;
}; };
reader.readAsArrayBuffer(file); reader.readAsArrayBuffer(file);
document.getElementById('pagination-button-container').style.display = 'flex'; document.getElementById('pagination-button-container').style.display = 'flex';

View File

@@ -17,7 +17,7 @@
<span class="tool-header-text" th:text="#{PDFToCSV.header}"></span> <span class="tool-header-text" th:text="#{PDFToCSV.header}"></span>
</div> </div>
<form id="PDFToCSVForm" th:action="@{'/api/v1/convert/pdf/csv'}" method="post" enctype="multipart/form-data"> <form id="PDFToCSVForm" th:action="@{'/api/v1/convert/pdf/csv'}" method="post" enctype="multipart/form-data">
<input id="pageId" type="hidden" name="pageId"> <input id="pageNumbers" type="hidden" name="pageNumbers">
<div th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}"></div> <div th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}"></div>
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{PDFToCSV.submit}"></button> <button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{PDFToCSV.submit}"></button>
</form> </form>

View File

@@ -36,6 +36,7 @@
</option> </option>
<option value="ODD_EVEN_SPLIT" th:text="#{pdfOrganiser.mode.6}">Odd-Even Split</option> <option value="ODD_EVEN_SPLIT" th:text="#{pdfOrganiser.mode.6}">Odd-Even Split</option>
<option value="ODD_EVEN_MERGE" th:text="#{pdfOrganiser.mode.10}">Odd-Even Merge</option> <option value="ODD_EVEN_MERGE" th:text="#{pdfOrganiser.mode.10}">Odd-Even Merge</option>
<option value="DUPLICATE" th:text="#{pdfOrganiser.mode.11}">Duplicate all pages</option>
<option value="REMOVE_FIRST" th:text="#{pdfOrganiser.mode.7}">Remove First</option> <option value="REMOVE_FIRST" th:text="#{pdfOrganiser.mode.7}">Remove First</option>
<option value="REMOVE_LAST" th:text="#{pdfOrganiser.mode.8}">Remove Last</option> <option value="REMOVE_LAST" th:text="#{pdfOrganiser.mode.8}">Remove Last</option>
<option value="REMOVE_FIRST_AND_LAST" th:text="#{pdfOrganiser.mode.9}">Remove First and Last</option> <option value="REMOVE_FIRST_AND_LAST" th:text="#{pdfOrganiser.mode.9}">Remove First and Last</option>
@@ -51,7 +52,7 @@
<script> <script>
document.getElementById('customMode').addEventListener('change', function () { document.getElementById('customMode').addEventListener('change', function () {
var pageOrderInput = document.getElementById('pageOrder'); var pageOrderInput = document.getElementById('pageOrder');
if (this.value === "") { if (this.value === "" || this.value === "DUPLICATE") {
pageOrderInput.disabled = false; pageOrderInput.disabled = false;
} else { } else {
pageOrderInput.disabled = true; pageOrderInput.disabled = true;

Binary file not shown.

View File

@@ -205,6 +205,7 @@ Feature: API Validation
And the response file should have size greater than 100 And the response file should have size greater than 100
And the response file should have extension ".pdf" And the response file should have extension ".pdf"
@markdown @positive
Scenario: Convert PDF to Markdown format Scenario: Convert PDF to Markdown format
Given I generate a PDF file as "fileInput" Given I generate a PDF file as "fileInput"
And the pdf contains 3 pages with random text And the pdf contains 3 pages with random text
@@ -212,4 +213,18 @@ Feature: API Validation
Then the response status code should be 200 Then the response status code should be 200
And the response file should have size greater than 100 And the response file should have size greater than 100
And the response file should have extension ".md" And the response file should have extension ".md"
@positive @pdftocsv
Scenario: Convert PDF with tables to CSV format
Given I use an example file at "exampleFiles/tables.pdf" as parameter "fileInput"
And the request data includes
| parameter | value |
| outputFormat | csv |
| pageNumbers | all |
When I send the API request to the endpoint "/api/v1/convert/pdf/csv"
Then the response status code should be 200
And the response file should have size greater than 200
And the response file should have extension ".zip"
And the response ZIP should contain 3 files

View File

@@ -189,4 +189,4 @@ main() {
fi fi
} }
main main