Commit Graph

211 Commits

Author SHA1 Message Date
Ludy
886f9b379e
feat(docker-runtime): unified Debian-based images, dynamic path resolution & enhanced UNO/LibreOffice handling (#4880)
# Description of Changes

### What was changed

This PR introduces a major refinement to the Docker runtime, system path
resolution, conversion tooling, and integration logic across the
codebase. Key improvements include:

- Migration of **Dockerfile**, **Dockerfile.fat** to a unified
Debian-based environment.
- Introduction of **RuntimePathConfig** enhancements to dynamically
resolve:
  - `weasyprint`, `unoconvert`, `calibre`, `ocrmypdf`, `soffice`
  - Tesseract `tessdata` paths with Docker-aware defaults.
- Support for **UNO server (unoserver/unoconvert)** as primary document
converter with automatic fallback to `soffice`.
- Isolation of Python environments for WeasyPrint and UNO tooling.
- Updated controllers and services to correctly inject
`RuntimePathConfig`.
- Improved process execution logic in converters and OCR handling.
- Major updates to `init.sh` and `init-without-ocr.sh`:
  - Unified environment initialization
  - Proper UID/GID remapping
  - Safer permissions handling
  - Automatic Tesseract path detection
  - Reliable startup of headless LibreOffice + Xvfb + UNO server
- Full test suite updates:
  - Adaptation to new conversion paths
  - Mocking of UNO and LibreOffice commands
  - More robust Docker test logic
- Updated example docker-compose files referencing GHCR test images.
- Expanded configuration schema for new operations paths.

### Why the change was made

These changes address long-standing issues around:

- Inconsistent or missing binary paths between image variants.
- Reduced reliability of document conversions (UNO vs. soffice).
- Lack of uniform runtime initialization across Docker images.
- Repetitive environment setup logic split across multiple scripts.
- Fragile test scenarios tied to Alpine-based images.

Switching to a unified Debian-based runtime significantly improves:

- Compatibility with LibreOffice, Calibre, WebEngine and graphics stack.
- UNO stability for document conversions.
- Tesseract deterministic behavior.
- Debuggability and reliability of CI/CD Docker-based tests.

The improvements to `RuntimePathConfig` ensure all system binaries are
fully configurable and correctly detected at runtime.

---

## 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/devGuide/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/devGuide/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/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### Translations (if applicable)

- [ ] I ran
[`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md)

### 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/devGuide/DeveloperGuide.md#6-testing)
for more details.
2025-11-24 23:07:54 +00:00
Balázs Szücs
43345021bf
refactor(exceptions): RFC 7807 Problem Details, ResourceBundle i18n, and error factory pattern (#4791)
# Description of Changes

Implemented RFC 7807 problem-details standard to provide consistent,
structured error responses across the application. All exceptions now
flow through a centralized `GlobalExceptionHandler` with tailored
handlers for password-protected files, corruption, validation, and
Spring framework errors. Every response includes localized `errorCode`,
contextual hints, actionable guidance, timestamps, and request paths.

**Key improvements:**
- Unified error handling prevents inconsistent response formats across
services
- Localized error messages support multiple languages at runtime
- Error context (hints, actionRequired field) improves user experience
- Structured metadata enables programmatic error handling on client side

Reference:
https://www.baeldung.com/spring-boot-return-errors-problemdetail

### Exception Handling

- Centralized all exception handling in `GlobalExceptionHandler` with
specific handlers for password protection, file corruption, validation
errors, and Spring exceptions
- Refactored `ExceptionUtils` to generate consistent `ProblemDetail`
responses with error metadata
- Introduced `ErrorCode` enum to centralize error identification and
metadata (supports localization)
- Added helper methods for creating standardized exceptions across
services

### Implementation Details

- **Replaced generic exceptions** with `ExceptionUtils` methods across
utility classes (`CbrUtils`, `CbzUtils`, `PdfToCbrUtils`,
`EmlProcessingUtils`, `ImageProcessingUtils`) for consistent error
handling of invalid formats, empty files, and missing resources
- **Improved method signatures** in `JobExecutorService` and
`AutoJobAspect` by explicitly declaring thrown exceptions
- **Refined job execution error handling** by removing unnecessary catch
blocks in synchronous execution, allowing exceptions to propagate to the
centralized handler
- **Enhanced error messages** for unsupported formats (e.g., RAR5
limitations, PDF-to-CBR constraints) with clearer user guidance

### Response Format

All errors now include:
- `errorCode`: Machine-readable error identifier (localized at runtime)
- `title`: Localized error title
- `detail`: Context-specific error message
- `hints`: Array of actionable suggestions
- `actionRequired`: Boolean flag indicating if user action is needed
- `timestamp`: Error occurrence time
- `path`: Request path where error occurred

**Error examples shown in PR include:** corrupt files, invalid
passwords, unsupported formats (RAR5), missing images, OOM conditions,
and invalid HTML

### Why This Change

- Eliminates ad-hoc error handling patterns scattered across services
- Provides actionable guidance instead of technical stack traces
- Supports error messages in multiple languages without code changes
- Aligns with RFC 7807, improving API interoperability
- Error context reduces time to diagnose issues


### Error sample (note the unformatted JSON is NOT visible by default
but for presenting purposes I clicked on show stack on each error. By
default only error banner (top part of error) visible)
Corrupt file:
<img width="1912" height="568" alt="image"
src="https://github.com/user-attachments/assets/fc6c9dd6-4929-49ab-8e44-bd79c59d875a"
/>
Password-protected file (invalid password):
<img width="1912" height="757" alt="image"
src="https://github.com/user-attachments/assets/31632271-8b2f-45c5-ad4a-dff51e085ea0"
/>
Unsupported RAR:
<img width="1912" height="636" alt="image"
src="https://github.com/user-attachments/assets/d13cd521-4b07-4399-b97b-4defa842fc05"
/>
No images in RAR/ZIP:
<img width="1912" height="642" alt="image"
src="https://github.com/user-attachments/assets/f02999ed-7a56-4e34-9a95-df50c77012cf"
/>

OOM:
<img width="1912" height="714" alt="image"
src="https://github.com/user-attachments/assets/3aaf491a-fe42-4831-b905-a4d248e34860"
/>
Invalid html (on the html to pdf endpoint)
<img width="1912" height="577" alt="image"
src="https://github.com/user-attachments/assets/584ec7c8-f14c-4eb1-a6b2-cf7812ae8f0a"
/>

GS conversion fail:
<img width="1912" height="674" alt="image"
src="https://github.com/user-attachments/assets/8504a876-75e6-40ef-891b-4ee2b3bbdb0a"
/>

 


<!--
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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-11-21 21:08:56 +00:00
stirlingbot[bot]
d39cc7f8ff
🌐 Sync Translations + Update README Progress Table (#4878)
### 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-11-18 12:14:11 +00:00
dependabot[bot]
184bb82aaa
build(deps): bump com.google.zxing:core from 3.5.3 to 3.5.4 (#4925)
Bumps [com.google.zxing:core](https://github.com/zxing/zxing) from 3.5.3
to 3.5.4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/zxing/zxing/releases">com.google.zxing:core's
releases</a>.</em></p>
<blockquote>
<h2>ZXing 3.5.4</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix container inefficiency in RSSExpandedReader.java by <a
href="https://github.com/cinsttool"><code>@​cinsttool</code></a> in <a
href="https://redirect.github.com/zxing/zxing/pull/1782">zxing/zxing#1782</a></li>
<li>Fix SYMBOLOGY_IDENTIFIER Loss in QRCodeMultiReader to Ensure Data
Integrity and Functional Consistency with QRCodeReader by <a
href="https://github.com/xiebaiyuan"><code>@​xiebaiyuan</code></a> in <a
href="https://redirect.github.com/zxing/zxing/pull/1839">zxing/zxing#1839</a></li>
<li>Be more stringent on email validation rules by <a
href="https://github.com/ftiercelin"><code>@​ftiercelin</code></a> in <a
href="https://redirect.github.com/zxing/zxing/pull/1870">zxing/zxing#1870</a></li>
<li>PDF417: Check that input is made of 0...127 chars when using
Compaction.TEXT, throw an explicit exception if not the case by <a
href="https://github.com/ftiercelin"><code>@​ftiercelin</code></a> in <a
href="https://redirect.github.com/zxing/zxing/pull/1878">zxing/zxing#1878</a></li>
<li>Fixing issue <a
href="https://redirect.github.com/zxing/zxing/issues/1831">#1831</a> by
<a href="https://github.com/ftiercelin"><code>@​ftiercelin</code></a> in
<a
href="https://redirect.github.com/zxing/zxing/pull/1879">zxing/zxing#1879</a></li>
<li>Add hint to correct wrong dimension by <a
href="https://github.com/magethle"><code>@​magethle</code></a> in <a
href="https://redirect.github.com/zxing/zxing/pull/1901">zxing/zxing#1901</a></li>
<li>Fix distortion calculation for isosceles right triangles by <a
href="https://github.com/magethle"><code>@​magethle</code></a> in <a
href="https://redirect.github.com/zxing/zxing/pull/1908">zxing/zxing#1908</a></li>
<li>Add input validation for pixel array length in RGBLuminanceSource to
avoid ArrayIndexOutOfBoundsException by <a
href="https://github.com/leofernandesmo"><code>@​leofernandesmo</code></a>
in <a
href="https://redirect.github.com/zxing/zxing/pull/1961">zxing/zxing#1961</a></li>
<li>Add 90-degree rotation support to RGBLuminanceSource by <a
href="https://github.com/gredler"><code>@​gredler</code></a> in <a
href="https://redirect.github.com/zxing/zxing/pull/2012">zxing/zxing#2012</a></li>
<li>Add GrayscaleLuminanceSource by <a
href="https://github.com/gredler"><code>@​gredler</code></a> in <a
href="https://redirect.github.com/zxing/zxing/pull/2013">zxing/zxing#2013</a></li>
<li>Loosen ITF max variance for 3x module widths by <a
href="https://github.com/gredler"><code>@​gredler</code></a> in <a
href="https://redirect.github.com/zxing/zxing/pull/2014">zxing/zxing#2014</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/zxing/zxing/compare/zxing-3.5.3...zxing-3.5.4">https://github.com/zxing/zxing/compare/zxing-3.5.3...zxing-3.5.4</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f651b0a037"><code>f651b0a</code></a>
[maven-release-plugin] prepare release zxing-3.5.4</li>
<li><a
href="6d66bd9643"><code>6d66bd9</code></a>
Restore 3.5.4-SNAPSHOT</li>
<li><a
href="c65c5506a7"><code>c65c550</code></a>
[maven-release-plugin] prepare release zxing-3.5.4</li>
<li><a
href="00ff3cb500"><code>00ff3cb</code></a>
Add new Sonatype repo</li>
<li><a
href="4a160986ef"><code>4a16098</code></a>
[maven-release-plugin] rollback the release of zxing-3.5.4</li>
<li><a
href="7c58665161"><code>7c58665</code></a>
[maven-release-plugin] prepare for next development iteration</li>
<li><a
href="b36e149816"><code>b36e149</code></a>
[maven-release-plugin] prepare release zxing-3.5.4</li>
<li><a
href="8536950144"><code>8536950</code></a>
[maven-release-plugin] rollback the release of zxing-3.5.4</li>
<li><a
href="1fe940f091"><code>1fe940f</code></a>
[maven-release-plugin] prepare release zxing-3.5.4</li>
<li><a
href="6cf1062646"><code>6cf1062</code></a>
Manually update secondary packages to 3.5.4. parent</li>
<li>Additional commits viewable in <a
href="https://github.com/zxing/zxing/compare/zxing-3.5.3...zxing-3.5.4">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=com.google.zxing:core&package-manager=gradle&previous-version=3.5.3&new-version=3.5.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-11-17 23:47:20 +00:00
Balázs Szücs
bdd8d2e6d4
feat(pdf-conversion): add support for PDF/A-3b, PDF/X formats improve current PDF/A conversion (#4844)
# Description of Changes

TLDR
- Updated `PdfToPdfARequest` to include PDF/X in supported output
formats
- Expanded input handling and model validation for PDF/A and PDF/X
- Added Ghostscript as a preferred backend for PDF/A and PDF/X
conversions
- Implemented PDF/X-specific conversion logic with detailed validation
- Updated UI templates to separate PDF/A and PDF/X format options
- Updated error handling and warnings during conversion processes


This PR replaces the PDF/A conversion system with Ghostscript as the
primary method, which less warning prone output compared to the previous
LibreOffice approach. It also adds PDF/X format support for print
production workflows.


### Better PDF/A Compliance
- Ghostscript produces standards-compliant PDF/A with fewer validation
errors
- Previous LibreOffice method generates files with structural errors and
validation warnings
- Automatic fallback to PDFBox/LibreOffice if Ghostscript unavailable
- Built-in validation using PDFBox Preflight catches issues early

### New PDF/X Support
Print production workflows now supported with PDF/X-1, PDF/X-3, and
PDF/X-4 formats for professional printing requirements.

### More Reliable Output
- Deterministic conversion results
- Better font embedding and subsetting
- Proper ICC profile and color space handling
- Improved resource cleanup prevents memory leaks

### Ghostscript Integration
- `buildGhostscriptCommand()` / `buildGhostscriptCommandX()` -
Constructs CLI arguments
- `convertWithGhostscript()` / `convertWithGhostscriptX()` - Executes
conversion
- `isGhostscriptAvailable()` - Checks installation
- `prepareColorProfiles()` - Sets up ICC profiles
- `createPdfaDefFile()` - Generates PostScript definitions

### Conversion Flow
- `handlePdfAConversion()` - Routes PDF/A with Ghostscript primary,
PDFBox fallback
- `handlePdfXConversion()` - Routes PDF/X using Ghostscript
- `convertWithPdfBoxMethod()` - Refactored fallback method

### Validation
- `validatePdfaOutput()` - Validates using PDFBox Preflight
- `validateAndWarnPdfA()` - Logs warnings instead of failing
- `buildPreflightErrorMessage()` - Formats detailed errors

### Font Handling
Updated `embedMissingFonts()` prevents stream exhaustion by loading font
bytes once and creating fresh InputStreams for multiple load attempts.

### Utilities
- `findUnembeddedFontNames()` - Identifies unembedded fonts
- `deleteQuietly()` - Recursively deletes temp directories
- `sanitizePdfA()` - Removes incompatible elements
- `removeElementsForPdfA()` - Removes Optional Content and transparency
- `mergeAndAddXmpMetadata()` - Handles XMP metadata
- `preProcessHighlights()` - Pre-processes annotations
- Transparency detection: `isTransparencyGroup()`,
`hasTransparentImages()`, `detectTransparentXObjects()`



### PDF/A
- PDF/A-1b: Strict compliance
- PDF/A-2b: Extended features (default)
- PDF/A-3b: Embedded files support

### PDF/X
- PDF/X-1: Standard print exchange
- PDF/X-3: Color-managed with ICC profiles
- PDF/X-4: Transparency support

As mentioned greatest benefit is the new Ghostscript conversion is able
to deliver fewer warning/zero error PDF/A files compared to the
LibreOffice. Sometimes however, both succeed without warnings. Here are
some samples:

<img width="1876" height="675" alt="image"
src="https://github.com/user-attachments/assets/ee71c2f3-e5ee-45ec-ba61-8d0ffc53b386"
/>
<img width="1876" height="675" alt="image"
src="https://github.com/user-attachments/assets/d620402b-cced-47b2-808d-01bde80eceb2"
/>
<img width="1876" height="675" alt="image"
src="https://github.com/user-attachments/assets/e3052d23-883b-43fc-9953-603067bee8bf"
/>
<img width="1876" height="675" alt="image"
src="https://github.com/user-attachments/assets/13251ab9-c449-4c4a-a326-521ef1929ad2"
/>

There is also some size difference, (not sure why) but generally that
also favors Ghostscript:

<img width="978" height="340" alt="image"
src="https://github.com/user-attachments/assets/5ccf4ea2-c6ef-4751-abd0-5b8445c90861"
/>


### Front-end

<img width="978" height="632" alt="image"
src="https://github.com/user-attachments/assets/74789d20-fb79-48d6-a35b-19f519a9f898"
/>


<!--
Please provide a summary of the changes, including:

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

Closes #(issue_number)
-->

---

## 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/devGuide/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/devGuide/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/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### Translations (if applicable)

- [ ] I ran
[`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md)

### UI Changes (if applicable)

- [X] 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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-11-17 14:38:28 +00:00
dependabot[bot]
5b16e4e701
build(deps): bump io.micrometer:micrometer-core from 1.15.5 to 1.16.0 (#4856)
Bumps
[io.micrometer:micrometer-core](https://github.com/micrometer-metrics/micrometer)
from 1.15.5 to 1.16.0.
<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.16.0</h2>
<p>We upgraded the Prometheus Java Client to <code>1.4.x</code> (<a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6830">#6830</a>)
which brings support for Unicode which includes some behavioral change
in naming conventions, see the <a
href="https://github.com/micrometer-metrics/micrometer/wiki/1.16-Migration-Guide">1.16
Migration-Guide</a>.</p>
<h2>⚠️ Noteworthy</h2>
<ul>
<li>Deprecate the Wavefront module <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6328">#6328</a></li>
<li>Remove deprecated io.micrometer.core.lang annotations <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6407">#6407</a></li>
<li>Register JCache <code>cache.removals</code> as a FunctionCounter by
default <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/2754">#2754</a></li>
<li>Improve no-op behavior of the Observation API <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6700">#6700</a></li>
</ul>
<h2> New Features</h2>
<ul>
<li>Support KeyValues with annotations when using
<code>ObservedAspect</code>/<code>@Observed</code> <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/4030">#4030</a></li>
<li>Validate low cardinality keys <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6713">#6713</a></li>
<li>Add counter for total loaded classes <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/3561">#3561</a></li>
<li>Add eventexecutor.workers metrics for Netty <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6375">#6375</a></li>
<li>Avoid DistributionStatisticsConfig creation when retrieving timers
<a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6661">#6661</a></li>
<li>Avoid capturing lambda allocation when retrieving existing meters <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6670">#6670</a></li>
<li>Introduce MeterConvention <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6710">#6710</a></li>
<li>OpenTelemetry Semantic Conventions for JVM metrics <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5286">#5286</a></li>
<li>Add MeterFilter.forMeters utility method <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6594">#6594</a></li>
<li>Apache HC 5 OTel semantic convention <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6591">#6591</a></li>
<li>Improve nullability for gauges <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6546">#6546</a></li>
<li>Metrics for Generational Shenandoah GC <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/4259">#4259</a></li>
<li>Support custom tags in NettyEventExecutorMetrics <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6592">#6592</a></li>
<li>Support newsgroups KeyValue for Jakarta Mail instrumentation <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6558">#6558</a></li>
<li>Add KeyName.withNoneValue() <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6125">#6125</a></li>
<li>Add getAll to Getter for repeated metadata <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6312">#6312</a></li>
<li>Enhance logging of negative amount in AbstractTimer.record() by
printing stack trace <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6530">#6530</a></li>
<li>Flag to register JCache cache.removals as FunctionCounter <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6471">#6471</a></li>
<li>Improved Meter.Id#getTags() performance <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6182">#6182</a></li>
<li>Jakarta Mail instrumentation <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5985">#5985</a></li>
<li>Log requests as trace level for OtlpMeterRegistry <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6514">#6514</a></li>
<li>Make KafkaMetrics refresh interval configurable <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6319">#6319</a></li>
<li>Migrate to JSpecify annotations for nullability constraints <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/5547">#5547</a></li>
<li>Provide meter count in HighCardinalityTagsDetector <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6510">#6510</a></li>
<li>StackdriverConfig option to not create metric descriptors <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6281">#6281</a></li>
<li>Use String.replace() where possible <a
href="https://redirect.github.com/micrometer-metrics/micrometer/pull/6449">#6449</a></li>
</ul>
<h2>🐞 Bug Fixes</h2>
<ul>
<li>Exclude java.* from OSGI Import-Package <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6810">#6810</a></li>
<li>Distribution without percentiles always has value 0 in Stackdriver
<a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6401">#6401</a></li>
<li>Incompatible with slf4j 2 in OSGi <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6406">#6406</a></li>
<li>LongTaskTimer#measure does not return max duration <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6421">#6421</a></li>
<li>Return NaN for null KafkaMetrics values <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6324">#6324</a></li>
<li>Scrape failure when conflicting meter types are registered <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6434">#6434</a></li>
<li>ValueResolver and ValueExpressionResolver nullability is
inconsistent <a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6280">#6280</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3360d05dc5"><code>3360d05</code></a>
Upgrade Micrometer Context Propagation to 1.2.0</li>
<li><a
href="8ae2387048"><code>8ae2387</code></a>
Merge branch '1.15.x'</li>
<li><a
href="521f15109c"><code>521f151</code></a>
Merge branch '1.14.x' into 1.15.x</li>
<li><a
href="162876235a"><code>1628762</code></a>
Setup continuous builds for Antora (<a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6858">#6858</a>)</li>
<li><a
href="65031eafe0"><code>65031ea</code></a>
Bump software.amazon.awssdk:cloudwatch from 2.37.4 to 2.37.5 (<a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6859">#6859</a>)</li>
<li><a
href="df18b91459"><code>df18b91</code></a>
Bump software.amazon.awssdk:cloudwatch from 2.37.3 to 2.37.4 (<a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6856">#6856</a>)</li>
<li><a
href="4cb7563085"><code>4cb7563</code></a>
Bump com.uber.nullaway:nullaway from 0.12.11 to 0.12.12 (<a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6854">#6854</a>)</li>
<li><a
href="064d159b4b"><code>064d159</code></a>
Bump activemq-artemis from 2.42.0 to 2.44.0 (<a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6850">#6850</a>)</li>
<li><a
href="4d9ec6eea6"><code>4d9ec6e</code></a>
Bump software.amazon.awssdk:cloudwatch from 2.37.2 to 2.37.3 (<a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6849">#6849</a>)</li>
<li><a
href="698d39406f"><code>698d394</code></a>
Bump spring-io/spring-github-workflows (<a
href="https://redirect.github.com/micrometer-metrics/micrometer/issues/6848">#6848</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/micrometer-metrics/micrometer/compare/v1.15.5...v1.16.0">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.15.5&new-version=1.16.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-11-17 12:49:56 +00:00
Victor Villarreal
430be21786
[Fix] Spanish (es_ES) Translation Improvements and Fixes (#4838)
# Description of Changes

A comprehensive review of the `messages_es_ES.properties` localization
file has been completed to correct inconsistencies, address translation
errors, and improve overall style, significantly enhancing the user
experience for Spanish users.

After incorporating these changes, the percentage of strings translated
into Spanish goes from 93 to 99%:

### What was changed
* **Missing Translations and Terminology Fixes:** Corrected multiple
strings that were left in English or mistranslated. Examples include:
    * Translating tool titles and descriptions.
    * Fixing key technical terms.
* Correcting the language name "Hindi" to **"Hindú"** for consistency.
* Fixing the compound word "EmailCorreo a HTML" to **"Correo electrónico
a HTML"**.
* Translating various error and login messages (e.g.,
`error.disallowedUrlContent`, `login.logoutMessage`).

* **Consistent Styling:** Ensured consistent use of capital letters and
punctuation, and standardized terms like DPI.
* **Exclusion File Update:** Added several technical keys related to
auditing, file choosers, and updates to the
`scripts/ignore_translation.toml` file to prevent incorrect automatic
translations for the `es_ES` locale.

### Why the change was made
To ensure the Spanish user interface is completely legible and
professional, eliminating *Spanglish* and machine-like translations for
a more coherent user experience.

### Any challenges encountered
None in particular. The tags were intentionally left untranslated.

Closes #4829

---

## 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/devGuide/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/devGuide/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)
- [x] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### Translations (if applicable)

- [x] I ran
[`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md)

```
> py .\scripts\counter_translation.py --lang messages_es_ES.properties --show-missing-keys
 Missing keys: ['endpointStatistics.top10', 'endpointStatistics.top20', 'cbzToPdf.tags', 'cbrToPdf.tags', 'pdfToCbz.tags', 'pdfToCbr.tags', 'PDFToVideo.tags', 'attachments.tags', 'extractAttachments.tags', 'unlockPDFForms.tags', 'pdfToVector.tags', 'vectorToPdf.tags']
es_ES: 12 out of 1606 lines are not translated.
es_ES: 99% translated
```

### 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/devGuide/DeveloperGuide.md#6-testing)
for more details.
2025-11-17 12:49:36 +00:00
Balázs Szücs
80206eaf07
feat(config): enforce minimum qpdf version requirement (#4907)
# Description of Changes


- Added validation to ensure qpdf version is at least 12.0.0
- Disabled corresponding groups if the installed version is below the
requirement
- Logged warnings for unsupported or undetermined versions
<!--
Please provide a summary of the changes, including:

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

Closes #(issue_number)
-->

---

## 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/devGuide/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/devGuide/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/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### Translations (if applicable)

- [ ] I ran
[`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md)

### 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/devGuide/DeveloperGuide.md#6-testing)
for more details.

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-11-17 11:58:07 +00:00
Balázs Szücs
c895b09142
feat(crop): add auto-crop functionality to detect and remove white space (#4847)
# Description of Changes

TLDR:
- Implemented automatic content bounds detection in CropController
- Added new auto-crop option in CropPdfForm and HTML template
- Updated JavaScript for better PDF rendering and interaction handling
- Also updated error handling and resource management in cropping
functions

Introduces auto-crop feature for automatic whitespace detection and
removal, plus resource management improvements.

### Auto-Crop Detection
- Automatically detects and removes whitespace using content boundary
detection
- Adaptive pixel sampling for images >2000px
- Sequential page processing for memory efficiency
- New opt-in checkbox in crop interface
- 150 DPI rendering for accurate detection

### Resource Management
- Fixed document lifecycle to prevent resource access violations
- Source documents remain open during LayerUtility operations
- Proper nested try-with-resources implementation
- Prevents crashes with `LayerUtility.importPageAsForm()`

### Memory Optimization
- Early exit for images <1px
- Adaptive sampling: O(n) instead of O(n²) for large pages
- Explicit BufferedImage nulling after processing

### Error Handling
- Proper try-with-resources for temporary files
- Defensive null checks and interrupt handling
- Updated exception messages

### CropPdfForm
- Changed coordinates from primitive to wrapper types (Float) for
nullable support
- Added `autoCrop` boolean field (default false)
- Maintains backward compatibility


### crop.js
- Track and cancel render tasks to prevent memory leaks
- Improved resize handling without file reloading
- Fixed nested event listeners
- Canvas clearing before rendering prevents artifacts
- DOM layout stability improvements


### Front-end

<img width="956" height="802" alt="image"
src="https://github.com/user-attachments/assets/2e8e5bd2-4948-4df1-9937-3358b36d03a0"
/>


### Samples:

<img width="960" height="775" alt="image"
src="https://github.com/user-attachments/assets/b27d3c65-1517-4318-b3d2-ca2d9864abf9"
/>


[test_cropped-2.pdf](https://github.com/user-attachments/files/23436674/test_cropped-2.pdf)

<img width="960" height="775" alt="image"
src="https://github.com/user-attachments/assets/095374fb-9e89-4ea1-a5c7-4287c909e20a"
/>


[pdf_hyperlink_example_cropped.pdf](https://github.com/user-attachments/files/23436678/pdf_hyperlink_example_cropped.pdf)

<img width="960" height="775" alt="image"
src="https://github.com/user-attachments/assets/b01e3633-15b7-4eea-a99b-09d875a380b4"
/>


[Sample-Fillable-PDF_cropped.pdf](https://github.com/user-attachments/files/23436680/Sample-Fillable-PDF_cropped.pdf)

<img width="960" height="858" alt="image"
src="https://github.com/user-attachments/assets/74824e8f-2f45-4e9d-9bd3-ed1248146f81"
/>


[sample-2_cropped.pdf](https://github.com/user-attachments/files/23436684/sample-2_cropped.pdf)

Closes: #1351

<!--
Please provide a summary of the changes, including:

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

Closes #(issue_number)
-->

---

## 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/devGuide/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/devGuide/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/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### Translations (if applicable)

- [ ] I ran
[`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md)

### UI Changes (if applicable)

- [X] 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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2025-11-17 11:53:15 +00:00
Balázs Szücs
7acc716b80
feat(compress): expose linearize PDF option on the UI (#4843)
# Description of Changes

TLDR:


- Added a new checkbox in the UI for linearizing PDFs
- Updated `CompressController` to support PDF linearization
- Added new localization key for linearize option in messages properties
file

<img width="604" height="858" alt="image"
src="https://github.com/user-attachments/assets/3e7fb3c1-247d-45b1-b00b-fd19a9888d28"
/>




<!--
Please provide a summary of the changes, including:

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

Closes #(issue_number)
-->

---

## 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/devGuide/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/devGuide/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/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### Translations (if applicable)

- [ ] I ran
[`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md)

### UI Changes (if applicable)

- [X] 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/devGuide/DeveloperGuide.md#6-testing)
for more details.

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-11-17 11:39:05 +00:00
Balázs Szücs
3fdfb9632b
refactor(core): simplify resource management with try-with-resources (#4873)
# Description of Changes
TLDR:
- Replaced manual resource handling with try-with-resources in multiple
controllers
- Eliminated redundant `finally` blocks for improved readability
- Added missing resource closures to ensure proper cleanup
- Updated `ScalePagesController` with static utility improvements and
logging annotation

This pull request focuses on improving resource management and code
clarity across several PDF processing controllers. The main changes
involve refactoring to use try-with-resources for automatic resource
cleanup, removing manual close calls and finally blocks, and
restructuring helper methods for better organization. These updates
enhance code safety, maintainability, and performance.

**Resource Management Improvements:**
- Refactored multiple controllers (`EditTableOfContentsController`,
`PdfOverlayController`, `ScalePagesController`, `SplitPDFController`,
and `ScannerEffectController`) to use try-with-resources for managing
`PDDocument`, `ByteArrayOutputStream`, and other closable resources,
eliminating the need for manual close calls and finally blocks. This
reduces the risk of resource leaks and simplifies the code.

**Code Organization and Clarity:**
- Moved and consolidated helper methods (`getTargetSize`, `getSizeMap`)
in `ScalePagesController` for better encapsulation and static usage, and
added the `@Slf4j` annotation for logging
- Removed redundant imports and unused variables to clean up the
codebase.

**Performance Enhancements:**
- Optimized object instantiation by creating reusable objects (e.g.,
`LayerUtility` in `ScalePagesController`) outside of loops to improve
performance.


<!--
Please provide a summary of the changes, including:

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

Closes #(issue_number)
-->

---

## 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/devGuide/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/devGuide/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/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### Translations (if applicable)

- [ ] I ran
[`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md)

### 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/devGuide/DeveloperGuide.md#6-testing)
for more details.

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-11-17 10:47:54 +00:00
FdaSilvaYY
be824b126f
Fix French translations and formatting in properties file (#4842)
Corrected translations and formatting in French properties file.
2025-11-14 00:40:18 +00:00
Ludy
19aef5e034
feat(conversion): add eBook to PDF via Calibre (EPUB/MOBI/AZW3/FB2/TXT/DOCX) (#4644)
This pull request adds support for converting common eBook formats
(EPUB, MOBI, AZW3, FB2, TXT, DOCX) to PDF using Calibre. It introduces a
new API endpoint and updates the configuration, dependency checks, and
documentation to support this feature. Additionally, it includes related
UI and localization changes.

**New eBook to PDF conversion feature:**

* Added `ConvertEbookToPDFController` with a new
`/api/v1/convert/ebook/pdf` endpoint to handle eBook to PDF conversion
using Calibre, supporting options like embedding fonts, including table
of contents, and page numbers.
* Introduced `ConvertEbookToPdfRequest` model for handling conversion
requests and options.

**Configuration and dependency management:**

* Updated `RuntimePathConfig`, `ApplicationProperties`, and
`ExternalAppDepConfig` to support Calibre's executable path
configuration and dependency checking, ensuring Calibre is available and
correctly integrated.
[[1]](diffhunk://#diff-68c561052c2376c3d494bf11dd821958acd9917b1b2d33a7195ca2d6df7ec517R24)
[[2]](diffhunk://#diff-68c561052c2376c3d494bf11dd821958acd9917b1b2d33a7195ca2d6df7ec517R61)
[[3]](diffhunk://#diff-68c561052c2376c3d494bf11dd821958acd9917b1b2d33a7195ca2d6df7ec517R72-R74)
[[4]](diffhunk://#diff-1c357db0a3e88cf5bedd4a5852415fadad83b8b3b9eb56e67059d8b9d8b10702R359)
[[5]](diffhunk://#diff-8932df49d210349a062949da2ed43ce769b0f107354880a78103664f008f849eR26-R34)
[[6]](diffhunk://#diff-8932df49d210349a062949da2ed43ce769b0f107354880a78103664f008f849eR48)
[[7]](diffhunk://#diff-8932df49d210349a062949da2ed43ce769b0f107354880a78103664f008f849eR63-R68)
[[8]](diffhunk://#diff-8932df49d210349a062949da2ed43ce769b0f107354880a78103664f008f849eR132)
* Registered the new endpoint and tool group in `EndpointConfiguration`,
including logic to enable/disable the feature based on Calibre's
presence.
[[1]](diffhunk://#diff-3cddb66d1cf93eeb8103ccd17cee8ed006e0c0ee006d0ee1cf42d512f177e437R260)
[[2]](diffhunk://#diff-3cddb66d1cf93eeb8103ccd17cee8ed006e0c0ee006d0ee1cf42d512f177e437R440-R442)
[[3]](diffhunk://#diff-3cddb66d1cf93eeb8103ccd17cee8ed006e0c0ee006d0ee1cf42d512f177e437L487-R492)

**Documentation and localization:**

* Updated the `README.md` to mention eBook to PDF conversion support.
* Added UI route and form for eBook to PDF conversion in the web
controller.
* Added English and German localization strings for the new feature,
including descriptions, labels, and error messages.
[[1]](diffhunk://#diff-ee1c6999a33498cfa3abba4a384e73a8b8269856899438de80560c965079a9fdR617-R620)
[[2]](diffhunk://#diff-482633b22866efc985222c4a14efc5b7d2487b59f39b953f038273a39d0362f7R617-R620)
[[3]](diffhunk://#diff-482633b22866efc985222c4a14efc5b7d2487b59f39b953f038273a39d0362f7R1476-R1485)


## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2025-11-11 21:44:18 +00:00
Ludy
e932ca01f3
refactor(common, core, proprietary): migrate boxed Booleans to primitive booleans and adopt is* accessors to reduce null checks/NPE risk (#4153)
# Description of Changes

**What was changed**
- Switched multiple nullable `Boolean` fields to primitive `boolean` in
`ApplicationProperties`:
  - `Security.enableLogin`, `Security.csrfDisabled`
- `System.googlevisibility`, `System.showUpdateOnlyAdmin`,
`System.enableAlphaFunctionality`, `System.disableSanitize`,
`System.enableUrlToPDF`
  - `Metrics.enabled`
- Updated all consumers to use Lombok’s `is*` accessors instead of
`get*`:
- `AppConfig`, `PostHogService`, `CustomHtmlSanitizer`,
`EndpointConfiguration`, `InitialSetup`, `OpenApiConfig`,
`ConvertWebsiteToPDF`, `HomeWebController`, `MetricsController`,
proprietary `SecurityConfiguration`, `AccountWebController`
- Tests adjusted to mock `isDisableSanitize()` instead of
`getDisableSanitize()`
- Logic simplifications:
- Removed redundant null-handling/ternaries now that primitives have
defaults (e.g., `enableAlphaFunctionality` bean)
  - Replaced `Boolean.TRUE.equals(...)` with direct primitive checks
  - Used constant-first `equals` for NPE safety in string comparisons

**Why the change was made**
- Primitive booleans eliminate ambiguity, cut down on
`NullPointerException` risks, and simplify conditions
- Aligns with Java/Lombok conventions (`isX()` for `boolean`) for
clearer, more consistent APIs
- Spring provides sane defaults for missing booleans (`false`), reducing
boilerplate and cognitive load

---

## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.
2025-11-11 17:16:48 +00:00
stirlingbot[bot]
5535e5003d
🤖 format everything with pre-commit by stirlingbot (#4839)
Auto-generated by [create-pull-request][1] with **stirlingbot**

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

Signed-off-by: stirlingbot[bot] <stirlingbot[bot]@users.noreply.github.com>
Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-11-10 16:19:44 +00:00
dependabot[bot]
de27ea02c5
build(deps): bump commons-io:commons-io from 2.20.0 to 2.21.0 (#4852)
Bumps [commons-io:commons-io](https://github.com/apache/commons-io) from
2.20.0 to 2.21.0.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/apache/commons-io/blob/master/RELEASE-NOTES.txt">commons-io:commons-io's
changelog</a>.</em></p>
<blockquote>
<p>Apache Commons IO 2.21.0 Release Notes</p>
<p>The Apache Commons IO team is pleased to announce the release of
Apache Commons IO 2.21.0.</p>
<h2>Introduction</h2>
<p>The Apache Commons IO library contains utility classes, stream
implementations, file filters,
file comparators, endian transformation classes, and much more.</p>
<p>Version 2.21.0: Java 8 or later is required.</p>
<h2>New features</h2>
<p>o FileUtils#byteCountToDisplaySize() supports Zettabyte, Yottabyte,
Ronnabyte and Quettabyte <a
href="https://redirect.github.com/apache/commons-io/issues/763">#763</a>.
Thanks to strangelookingnerd, Gary Gregory.
o Add org.apache.commons.io.FileUtils.ONE_RB <a
href="https://redirect.github.com/apache/commons-io/issues/763">#763</a>.
Thanks to strangelookingnerd, Gary Gregory.
o Add org.apache.commons.io.FileUtils.ONE_QB <a
href="https://redirect.github.com/apache/commons-io/issues/763">#763</a>.
Thanks to strangelookingnerd, Gary Gregory.
o Add org.apache.commons.io.output.ProxyOutputStream.writeRepeat(byte[],
int, int, long). Thanks to Gary Gregory.
o Add org.apache.commons.io.output.ProxyOutputStream.writeRepeat(byte[],
long). Thanks to Gary Gregory.
o Add org.apache.commons.io.output.ProxyOutputStream.writeRepeat(int,
long). Thanks to Gary Gregory.
o Add length unit support in FileSystem limits. Thanks to Piotr P.
Karwasz.
o Add IOUtils.toByteArray(InputStream, int, int) for safer chunked
reading with size validation. Thanks to Piotr P. Karwasz.
o Add org.apache.commons.io.file.PathUtils.getPath(String, String).
Thanks to Gary Gregory.
o Add org.apache.commons.io.channels.ByteArraySeekableByteChannel.
Thanks to Gary Gregory.
o          Add IOIterable.asIterable(). Thanks to Gary Gregory.
o Add NIO channel support to <code>AbstractStreamBuilder</code>. Thanks
to Piotr P. Karwasz.
o Add CloseShieldChannel to close-shielded NIO Channels <a
href="https://redirect.github.com/apache/commons-io/issues/786">#786</a>.
Thanks to Piotr P. Karwasz.
o Added IOUtils.checkFromIndexSize as a Java 8 backport of
Objects.checkFromIndexSize <a
href="https://redirect.github.com/apache/commons-io/issues/790">#790</a>.
Thanks to Piotr P. Karwasz.</p>
<h2>Fixed Bugs</h2>
<p>o When testing on Java 21 and up, enable
-XX:+EnableDynamicAgentLoading. Thanks to Gary Gregory.
o When testing on Java 24 and up, don't fail FileUtilsListFilesTest for
a different behavior in the JRE. Thanks to Gary Gregory.
o ValidatingObjectInputStream does not validate dynamic proxy
interfaces. Thanks to Stanislav Fort, Gary Gregory.
o BoundedInputStream.getRemaining() now reports Long.MAX_VALUE instead
of 0 when no limit is set. Thanks to Piotr P. Karwasz.
o BoundedInputStream.available() correctly accounts for the maximum read
limit. Thanks to Piotr P. Karwasz.
o Deprecate IOUtils.readFully(InputStream, int) in favor of
toByteArray(InputStream, int). Thanks to Gary Gregory, Piotr P. Karwasz.
o IOUtils.toByteArray(InputStream) now throws IOException on byte array
overflow. Thanks to Piotr P. Karwasz.
o Javadoc general improvements. Thanks to Gary Gregory, Piotr P.
Karwasz.
o IOUtils.toByteArray() now throws EOFException when not enough data is
available <a
href="https://redirect.github.com/apache/commons-io/issues/796">#796</a>.
Thanks to Piotr P. Karwasz.
o Fix IOUtils.skip() usage in concurrent scenarios. Thanks to Piotr P.
Karwasz.
o [javadoc] Fix XmlStreamReader Javadoc to indicate the correct class
that is built <a
href="https://redirect.github.com/apache/commons-io/issues/806">#806</a>.
Thanks to J Hawkins.</p>
<h2>Changes</h2>
<p>o Bump org.apache.commons:commons-parent from 85 to 91 <a
href="https://redirect.github.com/apache/commons-io/issues/774">#774</a>,
<a
href="https://redirect.github.com/apache/commons-io/issues/783">#783</a>,
<a
href="https://redirect.github.com/apache/commons-io/issues/808">#808</a>.
Thanks to Gary Gregory, Dependabot.</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="54073d3b5f"><code>54073d3</code></a>
Prepare for the release candidate 2.21.0 RC1</li>
<li><a
href="f141f09d91"><code>f141f09</code></a>
Prepare for the next release candidate</li>
<li><a
href="adcf135015"><code>adcf135</code></a>
Add license header</li>
<li><a
href="0f499d060a"><code>0f499d0</code></a>
Use new oak logo</li>
<li><a
href="34a961c3ed"><code>34a961c</code></a>
Use HTTPS in URL</li>
<li><a
href="9e511181a0"><code>9e51118</code></a>
Use HTTPS in URL</li>
<li><a
href="d715865ee7"><code>d715865</code></a>
Add dependabot email [skip ci]</li>
<li><a
href="3d6a7e1136"><code>3d6a7e1</code></a>
Javadoc</li>
<li><a
href="ad875d566f"><code>ad875d5</code></a>
Bump actions/upload-artifact from 4.6.2 to 5.0.0 (<a
href="https://redirect.github.com/apache/commons-io/issues/810">#810</a>)</li>
<li><a
href="bc01dee31e"><code>bc01dee</code></a>
Bump github/codeql-action from 4.30.9 to 4.31.2 (<a
href="https://redirect.github.com/apache/commons-io/issues/811">#811</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/apache/commons-io/compare/rel/commons-io-2.20.0...rel/commons-io-2.21.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=commons-io:commons-io&package-manager=gradle&previous-version=2.20.0&new-version=2.21.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-11-10 15:03:16 +00:00
Balázs Szücs
abd1ae1bf2
feat(sort): enhance file sorting and order handling (#4813)
# Description of Changes

- Added async support to sorting functions for improved UI
responsiveness in merge.js.
- Enhanced logging for debugging file orders in both JavaScript and
Java.
- Improved file order validation and handling in the backend, ensuring
consistent sorting and upload order.
- Refactored file order processing with better trimming, handling for
empty entries, and logging unmatched filenames.

Closes: #4810


<!--
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/devGuide/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/devGuide/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/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### Translations (if applicable)

- [ ] I ran
[`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md)

### 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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-11-07 13:35:18 +00:00
Ludy
2acb3aa6e5
chore(tests): add comprehensive web/controller and security service tests; stabilize AttemptCounter timing (#4822)
# Description of Changes

- **What was changed**
  - Added new MVC tests:
- `ConverterWebControllerTest` covering simple converter routes,
`/pdf-to-cbr` enable/disable behavior via `EndpointConfiguration`,
Python availability flag, and `maxDPI` defaults/overrides for
`/pdf-to-img` and `/pdf-to-video`.
- `GeneralWebControllerTest` covering many editor/organizer routes’
view/model mapping, `/sign` font discovery from classpath and
`/opt/static/fonts`, handling of missing `UserService`, robust filtering
of malformed font entries, and `/pipeline` JSON config discovery with
graceful fallback on `Files.walk` errors.
- `HomeWebControllerTest` covering `/about`, `/releases`, legacy
redirects, root page’s `SHOW_SURVEY` behavior, `/robots.txt` for
`googlevisibility` true/false/null, and `/licenses` JSON parsing with
IOException fallback.
  - Extended proprietary security tests:
- `LoginAttemptServiceTest` (reflective construction) validating
`getRemainingAttempts(...)` for disabled/blank keys, empty cache,
decreasing logic, and intentionally negative values when over the limit
(documented current behavior).
  - Hardened `AttemptCounterTest`:
- Eliminated timing flakiness by using generous windows and setting
`lastAttemptTime` to “now”.
- Added edge-case assertions for zero/negative windows to document
current semantics after switching comparison to `elapsed >=
attemptIncrementTime`.
- **Why the change was made**
- To increase test coverage across critical web endpoints and security
logic, document current edge-case behavior, and prevent regressions
around view resolution, environment/property-driven flags, resource
discovery, and timing-sensitive logic.


---

## 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/devGuide/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/devGuide/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/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### Translations (if applicable)

- [ ] I ran
[`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md)

### 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/devGuide/DeveloperGuide.md#6-testing)
for more details.
2025-11-05 14:34:12 +00:00
Balázs Szücs
d673670ebc
refactor(tests): Eliminate test flakiness through deterministic implementation (#4708)
# Description of Changes

Updated test files to use fixed string identifiers and timestamps
instead of random UUIDs and system-dependent times. These changes make
the tests more deterministic and easier to debug.

**Test determinism and clarity improvements:**

* Replaced randomly generated UUIDs with fixed string identifiers in
test cases for `FileStorageTest.java` and `TaskManagerTest.java` to
ensure predictable test data.
* Changed usages of `System.currentTimeMillis()` and `Instant.now()` to
fixed values in tests for `TempFileCleanupServiceTest.java`,
`FileMonitorTest.java`, and `TextFinderTest.java` to avoid flakiness due
to timing issues.
* Improved code clarity by adding explanatory comments for time offsets
and by using direct string comparisons instead of `equals()` where
appropriate.
* Refactored a timeout simulation in `JobExecutorServiceTest.java` to
use busy-waiting instead of `Thread.sleep`, reducing test flakiness and
improving reliability.



<!--
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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-05 12:43:21 +00:00
Ludy
6e82f124a4
refactor(common,core,proprietary): standardize Locale.ROOT usage for case/format & safer string handling (#4628)
# Description of Changes

- Standardized all locale-sensitive operations to use `Locale.ROOT`:
- Replaced `toLowerCase()/toUpperCase()` and `String.format(...)` with
`Locale.ROOT` variants across services, controllers, utils, and tests
(e.g., `InstallationPathConfig`, `ApplicationProperties`,
`ResourceMonitor`, `ChecksumUtils`, `PdfUtils`, `UploadLimitService`).
- Hardened comparisons and parsing:
- Normalized host/domain and file-extension checks with
`toLowerCase(Locale.ROOT)`; switched several `equals` calls to
constant-first style (e.g., content types, security domain checks).
- Logging & formatting improvements:
- Ensured percent/size values and hex formatting use root-locale
formatting to avoid locale-dependent output.
- Code quality & readability:
  - Converted multiple if/else ladders to modern `switch` expressions.
- Minor refactors (method references, early returns), removed redundant
returns, and clarified log messages.
- Minor fixes/behavioral nits:
- Normalized printer selection by lowercasing the searched name once;
made some equality checks null-safe/constant-first; added missing
`@Override` annotations where appropriate.

## Why

- Consistent use of `Locale.ROOT` avoids surprises in different
user/system locales (e.g., Turkish-I issues), makes string comparisons
deterministic, and keeps numeric/hex formatting stable across
environments.

---

## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
Co-authored-by: James Brunton <jbrunton96@gmail.com>
2025-11-04 10:30:51 +00:00
Ludy
60b522f1be
fix(ui): correct CSS visibility typo; clean up spelling/grammar across codebase (#4661)
# Description of Changes

**What was changed**
- Fixed a CSS typo in `imageHighlighter.css` (`visbility` →
`visibility`) to restore the intended transition behavior.
- Corrected spelling/grammar in logs, comments, and console messages:
  - `PdfUtils.java`: log message “overlayed” → “overlaid”.
  - `CustomPDFDocumentFactoryTest.java`: comment typo “neeed” → “need”.
  - `FlattenController.java`: comment “readd” → “re-add”.
  - `PdfContainer.js`: console log “Hidding” → “Hiding”.
  - `navbar.js`: clarified tooltip comment wording.
  - `languages.html`: corrected Vietnamese label to “Tiếng Việt”.
- `ConvertWebsiteToPdfTest.java`: converted/de-duplicated comments to
clear English and improved assertion messages.
- No functional code paths altered except the CSS fix; the rest are
non-functional text improvements (logs/comments/tests/labels).

**Why the change was made**
- The CSS typo prevented the `visibility` transition from working as
intended.
- Consistent, correct wording improves developer experience, test
readability, and UI polish (language list).

---

## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Reece Browne <74901996+reecebrowne@users.noreply.github.com>
2025-11-03 17:14:44 +01:00
Stephan Paternotte
759d172bd7
Update messages_nl_NL.properties (#4811)
# Description of Changes
Translations updated to best of abilities
2025-11-02 20:54:38 +00:00
stirlingbot[bot]
69ae2d89e9
🤖 format everything with pre-commit by stirlingbot (#4807)
Auto-generated by [create-pull-request][1] with **stirlingbot**

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

Signed-off-by: stirlingbot[bot] <stirlingbot[bot]@users.noreply.github.com>
Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-11-02 20:52:08 +00:00
IT Creativity + Art Team
407903a332
Bulgarian lang update/optimizations (#4705)
# Description of Changes

<!--
Please provide a summary of the changes, including:

- What was changed - Bulgarian language optimizations and new
translations
- Why the change was made - to keep the language up-to-date towards the
new versions/improvements
- Any challenges encountered

Closes #(issue_number)
-->

---

## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
Co-authored-by: Ludy <Ludy87@users.noreply.github.com>
2025-11-02 20:01:54 +00:00
hamza khalem
727ef4483f
Update messages_ar_AR.properties : enhace arabic translation (#4414)
# 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

Co-authored-by: Ludy <Ludy87@users.noreply.github.com>
2025-11-02 19:59:18 +00:00
Leonardo Santos Paulucio
7ca0981642
feat: Update Brazilian Portuguese translation (#4198)
# Description of Changes

Update Brazilian Portuguese translation:
- messages_pt_BR.properties

---

## 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 [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md)
- [x] I have performed a self-review of my own code
- [x] My changes generate no new warnings

### Documentation

- [x] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

Co-authored-by: Ludy <Ludy87@users.noreply.github.com>
2025-11-02 19:56:34 +00:00
Stephan Paternotte
02d6b9967f
Update messages_nl_NL.properties (#4519)
Dutch translations completed, corrected and made consistent. 
(Additional line at the end of the file removed. Hope this one passes
well.)
(Really; as translators shouldn't code like coders shouldn't translate,
projects would do well to move their translation work off to seperate
online localisation platforms such as Crowdin, Transifex, or Weblate.)

Co-authored-by: Ludy <Ludy87@users.noreply.github.com>
2025-11-02 17:17:38 +00:00
Ludy
c6b8434e0d
feat(i18n): add German translations (#4796)
# Description of Changes

This pull request makes minor improvements to the German localization
and translation management. The changes primarily update UI strings for
clarity and consistency and adjust the translation ignore list.

Localization improvements:

* Updated urgent update notification and related UI strings in
`messages_de_DE.properties` for better clarity and consistency.
* Improved analytics labels and translated "Scarf Pixel" to
"Schal-Pixel" in `messages_de_DE.properties`.

Translation management:

* Removed `scannerEffect.quality.medium` from the translation ignore
list in `ignore_translation.toml`.

---

## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.
2025-11-02 16:06:48 +00:00
Dawid Urbański
8d4bf15ce4
feat(i18n): update Polish translations (#4659)
# Description of Changes

- What was changed

Updated and refined the Polish (pl_PL) translation file to improve
linguistic accuracy, consistency, and terminology alignment with the UI.
Corrected minor spelling and grammatical issues.
Standardized phrasing to ensure a more natural and user-friendly
experience.

- Why the change was made

To align the translation with recent UI/feature updates and improve
overall user experience for native speakers.

- 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Co-authored-by: Ludy <Ludy87@users.noreply.github.com>
2025-11-02 16:02:32 +00:00
FdaSilvaYY
e8472ed0b3
Improve French translations and update ignore_translation.toml (#4799)
# Description of Changes
- add French translations of last added items in
messages_fr_FR.properties
- translate most of the language names 
-  Update ignore_translation.toml to exclude untranslated messages.

I hope this PR will reach the 98 % Progress score for fr_FR translation.
2025-11-02 15:55:57 +00:00
Balázs Szücs
ebe3f59ce1
feat(localization): update Hungarian translations (#4798)
- Localized English strings in `messages_hu_HU.properties` to Hungarian
- Updated UI labels, descriptions, tags, and tooltips for consistency
- Improved wording for better native understanding

# 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-11-02 15:51:18 +00:00
Luis Antonio Argüelles González
970f3ea37b
[#4262] Added date and time to a stamp (#4431)
# Description of Changes

Changed `addTextStamp` method to automatically add time and date when
stamping a file

Closes #4262 
---

## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2025-11-02 15:40:55 +00:00
albanobattistella
c858c131a3
Update messages_it_IT.properties (#4793)
# 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.
2025-10-31 17:45:46 +00:00
Ludy
9f00335258
test(core): add comprehensive unit tests for controllers, services, models, and utilities (#4160)
# Description of Changes

- **What was changed**
- **CI**: Enhanced `build.yml` to publish JaCoCo coverage and post a PR
summary comment per matrix job (Spring Security/JDK). Also archives
JaCoCo XML reports alongside existing test results.
- **Tests (new & expanded)**: Added a broad set of unit tests across
`app/common`, `app/core`, and `app/proprietary` modules, e.g.:
- Common: `ShowAdminInterfaceTest`, `UnsupportedClaimExceptionTest`,
`ExceptionUtilsTest`, `TempDirectoryTest`, etc.
- Core: `ConnectedInputStreamTest`, `ReplaceAndInvertColorFactoryTest`,
controller/model/service tests (e.g. `SettingsControllerTest`,
`ApiEndpointTest`, `FlexibleCSVWriterTest`,
`MetricsAggregatorServiceTest`, etc.).
- Proprietary: security/database/model/web tests (e.g.
`H2SQLConditionTest`, `JPATokenRepositoryImplTest`,
`AuditWebFilterTest`, `CorrelationIdFilterTest`, etc.).
- **JUnit 5 cleanup**: Consolidated assertion imports (`import static
org.junit.jupiter.api.Assertions.*`), standardized on Jupiter APIs, and
minor Mockito/Jupiter setup tweaks.
- **Fix**: `ReplaceAndInvertColorFactory` now safely returns `null` when
`replaceAndInvertOption` is `null` to avoid NPEs.
- **Testability refactor**: Broadened visibility of
`SPDFApplication#getActiveProfile(String[] args)` (from `private` to
`protected`) to enable direct unit testing.
  - **Chore**: Removed obsolete `ValidationUtil` from `app/common`.

- **Why the change was made**
  - Improve **signal in PRs** via automatic coverage summaries.
- Increase **test coverage** and reduce regressions across core and
proprietary modules.
- Eliminate a potential **NullPointerException** in color strategy
selection.
- Enable targeted testing of application startup/profile resolution
logic.

---

## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.
2025-10-31 16:58:19 +00:00
Ludy
ad002a6129
feat(i18n): add German translations (#4786)
# 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.
2025-10-30 23:36:48 +00:00
Ricardo Catarino
c933d248a3
Updated pt_PT translation (#4655)
# Description of Changes

**Summary**

- Updated and refined the Portuguese (Portugal) (pt_PT) translation file
to improve linguistic accuracy, consistency, and terminology alignment
with the UI.
- Corrected minor spelling and grammatical issues.
- Standardized phrasing to ensure a more natural and user-friendly
experience.

**Reason for Change**

- To enhance the quality and clarity of the Portuguese (Portugal)
localization.
- To align the translation with recent UI/feature updates and improve
overall user experience for native speakers.

**Challenges Encountered**

- Ensuring contextual consistency across multiple translation keys and
avoiding conflicts with the Portuguese (Brazil) translation.
- Verifying terminology alignment with existing technical terms and
interface patterns.


---

## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2025-10-30 22:55:29 +00:00
Ludy
7f7d6fd1c9
feat(convert): add PDF to Video converter (FFmpeg) with MP4/WebM support (#4704)
# Description of Changes

This pull request introduces support for FFmpeg as a new external tool
in the application. It adds configuration options for FFmpeg session
limits and timeouts, updates the process execution and tool-checking
utilities to handle FFmpeg, and expands endpoint configuration to
include FFmpeg-dependent features. Corresponding unit tests have also
been added to ensure FFmpeg detection works as expected.

**FFmpeg Integration and Configuration:**

* Added FFmpeg session limit and timeout configuration options to
`ApplicationProperties`, with default values and getter methods.
[[1]](diffhunk://#diff-1c357db0a3e88cf5bedd4a5852415fadad83b8b3b9eb56e67059d8b9d8b10702R631)
[[2]](diffhunk://#diff-1c357db0a3e88cf5bedd4a5852415fadad83b8b3b9eb56e67059d8b9d8b10702R672-R675)
[[3]](diffhunk://#diff-1c357db0a3e88cf5bedd4a5852415fadad83b8b3b9eb56e67059d8b9d8b10702R702)
[[4]](diffhunk://#diff-1c357db0a3e88cf5bedd4a5852415fadad83b8b3b9eb56e67059d8b9d8b10702R743-R746)
* Updated `ProcessExecutor` to recognize FFmpeg as a process type, and
to use the new session limit and timeout configuration for FFmpeg
processes.
[[1]](diffhunk://#diff-8424a11112fff55cc28467c4d531e451a485911ed1aeb0aea772c9fa7dc3aa6aL305-R316)
[[2]](diffhunk://#diff-8424a11112fff55cc28467c4d531e451a485911ed1aeb0aea772c9fa7dc3aa6aR74-R78)
[[3]](diffhunk://#diff-8424a11112fff55cc28467c4d531e451a485911ed1aeb0aea772c9fa7dc3aa6aR133-R137)

**Tool Detection and Exception Handling:**

* Implemented `isFfmpegAvailable()` in `CheckProgramInstall` to detect
FFmpeg installation, with caching for efficiency.
[[1]](diffhunk://#diff-7b61807107c689e3824a5f8fd42c27ab072a67a5666f24445bd6895937351690R14)
[[2]](diffhunk://#diff-7b61807107c689e3824a5f8fd42c27ab072a67a5666f24445bd6895937351690R60-R78)
* Added a specific exception factory method for missing FFmpeg in
`ExceptionUtils`.

**Endpoint Configuration:**

* Registered the new `pdf-to-video` endpoint under the "Convert",
"Java", and "FFmpeg" groups, and updated the tool group logic to include
"FFmpeg".
[[1]](diffhunk://#diff-3cddb66d1cf93eeb8103ccd17cee8ed006e0c0ee006d0ee1cf42d512f177e437R265)
[[2]](diffhunk://#diff-3cddb66d1cf93eeb8103ccd17cee8ed006e0c0ee006d0ee1cf42d512f177e437R395)
[[3]](diffhunk://#diff-3cddb66d1cf93eeb8103ccd17cee8ed006e0c0ee006d0ee1cf42d512f177e437R452-R454)
[[4]](diffhunk://#diff-3cddb66d1cf93eeb8103ccd17cee8ed006e0c0ee006d0ee1cf42d512f177e437L496-R502)

**Testing Enhancements:**

* Added and updated unit tests in `CheckProgramInstallTest` to verify
FFmpeg detection, including scenarios for installed, not installed, and
caching behavior.
[[1]](diffhunk://#diff-0eaf917d935710f0f5e18f12db600be47b8439d628d65a97a3db34133231790eR29)
[[2]](diffhunk://#diff-0eaf917d935710f0f5e18f12db600be47b8439d628d65a97a3db34133231790eR38-R45)
[[3]](diffhunk://#diff-0eaf917d935710f0f5e18f12db600be47b8439d628d65a97a3db34133231790eR67-R75)
[[4]](diffhunk://#diff-0eaf917d935710f0f5e18f12db600be47b8439d628d65a97a3db34133231790eR222-R262)

---

## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.
2025-10-30 22:54:33 +00:00
albanobattistella
43e0d73338
Update messages_it_IT.properties (#4697)
# 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.
2025-10-30 21:17:09 +00:00
Balázs Szücs
11bb8bf1fd
Update Hungarian translations (#4698)
# 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2025-10-30 21:09:33 +00:00
stirlingbot[bot]
85ccf502a8
🤖 format everything with pre-commit by stirlingbot (#4771)
Auto-generated by [create-pull-request][1] with **stirlingbot**

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

Signed-off-by: stirlingbot[bot] <stirlingbot[bot]@users.noreply.github.com>
Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-10-30 21:08:38 +00:00
Ludy
14e3819945
🌐 Sync Translations + Update README Progress Table (#4783)
# Description of Changes


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.


---

## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.
2025-10-30 20:48:15 +00:00
Balázs Szücs
a7900aead8
refactor(tests): replaced redundant setups, simplified exception handling, and optimized code readability. (#4710)
# Description of Changes

This pull request primarily refactors and improves the test code across
several modules, focusing on modernization, simplification, and
consistency of assertions and test setup. The changes include formatting
updates and improvements to utility methods. These updates help make the
tests easier to maintain and read, and ensure they use current best
practices.

**Test code modernization and assertion improvements:**

* Replaced legacy assertion methods such as `assertTrue(x instanceof Y)`
with more specific `assertInstanceOf` assertions in multiple test files,
improving clarity and type safety.
* Updated exception assertion checks to use `assertInstanceOf` for error
types instead of `assertTrue`, ensuring more precise test validation.
* Refactored test setup in `ResourceMonitorTest` to use `final` for
`AtomicReference` fields, clarifying intent and thread safety.
* Changed some test method signatures to remove unnecessary `throws
Exception` clauses, simplifying the test code.

**Test code simplification and cleanup:**

* Removed unused mock fields and simplified array initializations in
`AutoJobPostMappingIntegrationTest`, streamlining test setup and
reducing clutter.
* Updated YAML string initialization in
`ApplicationPropertiesDynamicYamlPropertySourceTest` to use Java text
blocks for improved readability.
* Improved null handling in assertions for collection validity checks.
* Updated byte array encoding to use `StandardCharsets.UTF_8` for
reliability and clarity.

**PDF document factory test refactoring:**

* Refactored `CustomPDFDocumentFactoryTest` to move helper methods for
inflating PDFs and writing temp files to the top of the class, and
restructured parameterized tests for better organization and
maintainability.



<!--
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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-10-30 19:39:55 +00:00
Balázs Szücs
83922c4131
feat(compress): add advanced compression parameters and better optimization levels (#4703)
# Description of Changes

This PR reworks the compression endpoints, to be more consistent and
apply better compression on higher levels. Some improvement on lower is
also expected.

### Overview:
- Added new global flags: --recompress-flate --compress-streams=y
--object-streams=generate
- Added --decode-level=generalized, so that if the original PDF was
poorly compressed then, it can re-compress it better
- Added --stream-data=compress for better compression of vector/text
parts
- Now conditional: --preserve-unreferenced kept only for safe levels ≤3
- Added --optimize-images --jpeg-quality 35–75 depending on level (this
brings significant drop in file size, compared to earlier.)
- Added QPDF_ZOPFLI for level ≥8 which is better algorithm for
compressing JPEG. Comes with approx 5% gain per JPEG on PDFs. See here
for details:
https://qpdf.readthedocs.io/en/stable/cli.html#zopfli-compression-algorithm
- level 9, Ghostscript uses strongest downsampling (72/72/150) and CMYK
-> RGB

### Images:
- Scale factor now ramps 1 -> 9: 0.98, 0.95, 0.88, 0.78, 0.68, 0.58,
0.48, 0.38, 0.28.
- JPEG quality ramps 1 -> 9: 0.92, 0.88, 0.85, 0.80, 0.72, 0.65, 0.55,
0.45, 0.35.

### Results:
<img width="1491" height="731" alt="create-ms_pdf_sizes"
src="https://github.com/user-attachments/assets/43ed2ce2-7524-4c03-8689-96a6cb68d046"
/>

<img width="1481" height="731" alt="img-doc_pdf_sizes"
src="https://github.com/user-attachments/assets/3a217c33-3551-44ac-b499-8283cb36cf5d"
/>

<img width="1470" height="731" alt="lorem-ipsum_pdf_sizes"
src="https://github.com/user-attachments/assets/12a6bc07-1d4b-4648-a66e-ba22d21a1202"
/>
<img width="1482" height="731" alt="pdf-dev-example_pdf_sizes"
src="https://github.com/user-attachments/assets/00632d91-f7b9-4310-a283-f0fca9c922d5"
/>
<img width="1470" height="731" alt="sample-1_pdf_sizes"
src="https://github.com/user-attachments/assets/317a26c2-dd1a-4d63-a578-279b14fd9f37"
/>

Sample files used:


[image-doc.pdf](https://github.com/user-attachments/files/22984417/image-doc.pdf)

[lorem-ipsum.pdf](https://github.com/user-attachments/files/22984418/lorem-ipsum.pdf)
[Create Microsoft Word Document
Templates.pdf](https://github.com/user-attachments/files/22984419/Create.Microsoft.Word.Document.Templates.pdf)

[sample-1.pdf](https://github.com/user-attachments/files/22984420/sample-1.pdf)

### But is it better than the old? (On level 9)
#### Old vs new:
- image-doc: 1.0 MB vs 454 KB
- create-word: 426 KB vs 247 KB
- lorem-ipsum: 44.7 KB vs 44.4


Most of changes are focused on images, so more images = better gains.
Even on lorem-ipsum text PDF (with no images) there still some gains but
not significant.

(so, it is better)

Closes: #4442
Closes: #4720


<!--
Please provide a summary of the changes, including:

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

Closes #(issue_number)
-->

---

## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-10-30 18:13:11 +00:00
Balázs Szücs
9197c24606
test: Add comprehensive unit tests for GetInfoOnPDF, covering metadata extraction, encryption, permissions, compliance, validation, and error handling scenarios (#4706)
# Description of Changes


Added 27 JUnit tests for getInfoOnPDF covering the following
functionality:

### Basic Functionality
- Valid PDF processing
- Basic info extraction (file size, page count, word count)
- Multi-page PDF handling

### Metadata Extraction
- All metadata fields (title, author, dates, etc.)
- Missing metadata handling

### Encryption & Permissions
- Encryption detection
- All permission types

### Form Fields
- Form field structure
- PDFs without forms

### Per-Page Information
- Page dimensions and standard sizes (A4, Letter, etc.)
- Page rotation

### Validation & Error Handling
- Null file rejection
- Empty file rejection
- File size limit (100MB) validation

### Static Helper Methods
- Page orientation detection (Landscape/Portrait/Square)
- Page size identification (parameterized tests)
- PDF/A standard checking
- Conformance level extraction

### Real PDF Files
- Testing with actual PDF files from resources

### Compliance Testing
- PDF/A, PDF/X, PDF/E, PDF/UA compliance detection

### Image Statistics
- Image statistics extraction



<!--
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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-10-30 18:03:34 +00:00
Balázs Szücs
311f6c8a3a
fix(pipeline): Update isZip method to validate against filename extensions, and keep comic archives zipped (#4741)
# Description of Changes

This pull request updates the logic for detecting and handling zip files
in the `PipelineProcessor` to distinguish between standard zip files and
comic book archive formats (CBZ/CBR). The changes ensure that files with
`.cbz` extensions are not treated as zip files for unzipping purposes.

**Update to zip file detection and extraction:**

* Modified the `isZip` method to take an optional `filename` parameter
and treat files ending with `.cbz` or as non-zip, preventing them from
being unzipped automatically.
* Updated all usages of `isZip` to pass the filename where available,
ensuring the new logic is applied during output file processing and
nested unzipping.

Closes: #4740


<!--
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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
2025-10-30 17:59:43 +00:00
FdaSilvaYY
76d767e038
Improve French translations and update ignore_translation.toml (#4780)
# Description of Changes
- Update French translations in messages_fr_FR.properties
- Update ignore_translation.toml for various languages, in order to
improve fr_FR translation progress.
- Fix some few typos in messages_en_GB.properties

I hope this PR will reach more than 95% Progress in fr_FR translation.
2025-10-30 17:58:37 +00:00
Ludy
0f7ea1aed1
feat(signature): add SVG file support for saved signatures (#4742)
This update adds full support for SVG signature files within the **Sign
module**.
Previously, SVG images could be uploaded and used directly but did not
appear under the “Saved Signatures” section.

### What was changed
- **`SignatureService`**:  
Extended `isImageFile()` method to include `.svg` file extension,
ensuring SVGs are recognized as valid image files.
- **`SignatureController`**:  
Enhanced response handling using `MediaTypeFactory` to dynamically
determine and return the correct `MediaType` based on the file name.
This allows serving `image/svg+xml` for SVG files instead of the
previous hardcoded `image/jpeg`.

### Why the change was made
SVG signature files were not appearing in “Saved Signatures” even though
they could be uploaded and used manually.
This fix ensures consistent handling and display of SVG images alongside
other image types (JPG, PNG, GIF).

Closes #4731

---

## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.
2025-10-30 10:09:52 +00:00
Angel
e715f14c0a
🌐 Update messages_ru_RU.properties (#4774)
Updated Russian translation
2025-10-30 09:48:31 +00:00
OteJlo
7c5ee4fac6
Fix French formatting and grammar (#4775)
Correction and improvement of some errors in the French translations
2025-10-30 09:48:01 +00:00
Ludy
56afa9e21a
refactor(api): adjust default values and extend schema for stamp and watermark requests (#4632)
# Description of Changes

This refactor updates several API request models to better align with
expected defaults and extend supported options:

- **SplitPdfByChaptersRequest**
  - `includeMetadata`: default changed from `true` → `false`
  - `allowDuplicates`: default changed from `true` → `false`
  - `bookmarkLevel`: default changed from `2` → `0`

- **SplitPdfBySectionsRequest**
  - `merge`: default changed from `true` → `false`

- **AddStampRequest**
  - Added `"thai"` to `allowableValues` for the `alphabet` field
- Updated default `position` from `5` (middle-center) → `8` (top-center)

- **AddWatermarkRequest**
  - Added `"thai"` to `allowableValues` for the `alphabet` field

**Reason for change:**
These modifications bring the API defaults in line with real-world usage
expectations and improve multilingual support (adding Thai alphabet).


---

## 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/devGuide/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/devGuide/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/devGuide/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/devGuide/DeveloperGuide.md#6-testing)
for more details.
2025-10-29 23:38:10 +00:00