feat:(pdfa-conversion) Implement Strict PDF/A Mode with Verification (#5663)

# Description of Changes


This PR introduces a new "Strict Mode" for the PDF to PDF/A conversion
tool. When enabled, the application will use VeraPDF to verify that the
resulting file is perfectly compliant with the selected PDF/A standard.
If validation fails, the system will return a descriptive error instead
of a non-compliant file.



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

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

Closes #(issue_number)
-->
<img width="371" height="993" alt="image"
src="https://github.com/user-attachments/assets/a22d50b0-ad7c-46b0-be79-b79c2bc80d92"
/>

---

## 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 <[email protected]>
This commit is contained in:
Balázs Szücs
2026-02-06 10:38:39 +00:00
committed by GitHub
parent 00136f9e20
commit 0f5a0e694a
11 changed files with 102 additions and 27 deletions
@@ -146,7 +146,8 @@ const ConvertSettings = ({
includeAllRecipients: false,
});
onParameterChange('pdfaOptions', {
outputFormat: 'pdfa-1',
outputFormat: 'pdfa-2b',
strict: false,
});
onParameterChange('pdfxOptions', {
outputFormat: 'pdfx',
@@ -234,7 +235,8 @@ const ConvertSettings = ({
includeAllRecipients: false,
});
onParameterChange('pdfaOptions', {
outputFormat: 'pdfa-1',
outputFormat: 'pdfa-2b',
strict: false,
});
onParameterChange('pdfxOptions', {
outputFormat: 'pdfx',
@@ -1,4 +1,4 @@
import { Stack, Text, Select, Alert } from '@mantine/core';
import { Stack, Text, Select, Alert, Checkbox } from '@mantine/core';
import { useTranslation } from 'react-i18next';
import { ConvertParameters } from '@app/hooks/tools/convert/useConvertParameters';
import { usePdfSignatureDetection } from '@app/hooks/usePdfSignatureDetection';
@@ -23,8 +23,8 @@ const ConvertToPdfaSettings = ({
const pdfaFormatOptions = [
{ value: 'pdfa-1', label: 'PDF/A-1b' },
{ value: 'pdfa', label: 'PDF/A-2b' },
{ value: 'pdfa-3', label: 'PDF/A-3b' }
{ value: 'pdfa-2b', label: 'PDF/A-2b' },
{ value: 'pdfa-3b', label: 'PDF/A-3b' }
];
return (
@@ -45,7 +45,7 @@ const ConvertToPdfaSettings = ({
value={parameters.pdfaOptions.outputFormat}
onChange={(value) => onParameterChange('pdfaOptions', {
...parameters.pdfaOptions,
outputFormat: value || 'pdfa-1'
outputFormat: value || 'pdfa-2b'
})}
data={pdfaFormatOptions}
disabled={disabled || isChecking}
@@ -56,6 +56,17 @@ const ConvertToPdfaSettings = ({
{t("convert.pdfaNote", "PDF/A-1b is more compatible, PDF/A-2b supports more features, PDF/A-3b supports embedded files.")}
</Text>
</Stack>
<Checkbox
label={t("convert.strictMode", "Strict Mode")}
description={t("convert.strictModeDesc", "Error if conversion is not perfect (uses VeraPDF verification)")}
checked={parameters.pdfaOptions.strict}
onChange={(event) => onParameterChange('pdfaOptions', {
...parameters.pdfaOptions,
strict: event.currentTarget.checked
})}
disabled={disabled || isChecking}
/>
</Stack>
);
};