mirror of
https://github.com/arsvendg/Stirling-PDF.git
synced 2026-07-15 19:10:47 +02:00
# Description of Changes TLDR: - Implemented `ConvertFromCbzSettings` component for CBZ to PDF options - Added `ConvertToCbzSettings` component for PDF to CBZ options - Extended conversion constants with new CBZ-related formats and mappings - Updated `ConvertSettings` to include CBZ-specific configuration forms - Updated `useConvertOperation` to handle CBZ conversion parameters For backend reference see this PR: #4472 This pull request adds support for converting between CBZ (Comic Book Zip) and PDF formats in the frontend conversion tool. It introduces new UI components for CBZ-to-PDF and PDF-to-CBZ conversion options, updates the conversion parameters and form data logic, and integrates these formats into the available conversion options and endpoints. **CBZ/PDF Conversion Support:** * Added `ConvertFromCbzSettings` and `ConvertToCbzSettings` components to provide user options for CBZ-to-PDF and PDF-to-CBZ conversions, including "Optimize for ebook" and DPI settings. **Conversion Logic and Parameters:** * Extended the `ConvertParameters` interface and default parameters to include `cbzOptions` (for CBZ-to-PDF) and `cbzOutputOptions` (for PDF-to-CBZ). **Conversion Matrix and Endpoint Integration:** * Added CBZ to the supported "from" and "to" format lists, updated the conversion matrix to allow CBZ-to-PDF and PDF-to-CBZ, and mapped the new conversions to appropriate API endpoints. * Updated URL mapping to recognize `/cbz-to-pdf` and `/pdf-to-cbz` as conversion tool routes. ### Front-end <img width="1852" height="994" alt="image" src="https://github.com/user-attachments/assets/b902438a-8ce7-4eed-a4f8-d80677c0c796" /> <img width="270" height="994" alt="image" src="https://github.com/user-attachments/assets/87556380-e0c5-4974-93c2-d36f86268b49" /> <img width="417" height="389" alt="image" src="https://github.com/user-attachments/assets/1889a3ec-0c06-442a-b3bb-71e1a7c34e4c" /> <img width="1853" height="994" alt="image" src="https://github.com/user-attachments/assets/d6d68f5f-ed70-4be9-89b1-2e4b7cd90921" /> <img width="265" height="994" alt="image" src="https://github.com/user-attachments/assets/36a05dd5-164f-46a7-b8af-aa815d6c0767" /> <!-- 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 <[email protected]>
159 lines
6.6 KiB
TypeScript
159 lines
6.6 KiB
TypeScript
|
|
export const COLOR_TYPES = {
|
|
COLOR: 'color',
|
|
GRAYSCALE: 'grayscale',
|
|
BLACK_WHITE: 'blackwhite'
|
|
} as const;
|
|
|
|
export const OUTPUT_OPTIONS = {
|
|
SINGLE: 'single',
|
|
MULTIPLE: 'multiple'
|
|
} as const;
|
|
|
|
export const FIT_OPTIONS = {
|
|
FIT_PAGE: 'fitDocumentToPage',
|
|
MAINTAIN_ASPECT: 'maintainAspectRatio',
|
|
FILL_PAGE: 'fillPage'
|
|
} as const;
|
|
|
|
|
|
export const CONVERSION_ENDPOINTS = {
|
|
'office-pdf': '/api/v1/convert/file/pdf',
|
|
'pdf-image': '/api/v1/convert/pdf/img',
|
|
'image-pdf': '/api/v1/convert/img/pdf',
|
|
'cbz-pdf': '/api/v1/convert/cbz/pdf',
|
|
'pdf-cbz': '/api/v1/convert/pdf/cbz',
|
|
'pdf-office-word': '/api/v1/convert/pdf/word',
|
|
'pdf-office-presentation': '/api/v1/convert/pdf/presentation',
|
|
'pdf-office-text': '/api/v1/convert/pdf/text',
|
|
'pdf-csv': '/api/v1/convert/pdf/csv',
|
|
'pdf-markdown': '/api/v1/convert/pdf/markdown',
|
|
'pdf-html': '/api/v1/convert/pdf/html',
|
|
'pdf-xml': '/api/v1/convert/pdf/xml',
|
|
'pdf-pdfa': '/api/v1/convert/pdf/pdfa',
|
|
'html-pdf': '/api/v1/convert/html/pdf',
|
|
'markdown-pdf': '/api/v1/convert/markdown/pdf',
|
|
'eml-pdf': '/api/v1/convert/eml/pdf'
|
|
} as const;
|
|
|
|
export const ENDPOINT_NAMES = {
|
|
'office-pdf': 'file-to-pdf',
|
|
'pdf-image': 'pdf-to-img',
|
|
'image-pdf': 'img-to-pdf',
|
|
'cbz-pdf': 'cbz-to-pdf',
|
|
'pdf-cbz': 'pdf-to-cbz',
|
|
'pdf-office-word': 'pdf-to-word',
|
|
'pdf-office-presentation': 'pdf-to-presentation',
|
|
'pdf-office-text': 'pdf-to-text',
|
|
'pdf-csv': 'pdf-to-csv',
|
|
'pdf-markdown': 'pdf-to-markdown',
|
|
'pdf-html': 'pdf-to-html',
|
|
'pdf-xml': 'pdf-to-xml',
|
|
'pdf-pdfa': 'pdf-to-pdfa',
|
|
'html-pdf': 'html-to-pdf',
|
|
'markdown-pdf': 'markdown-to-pdf',
|
|
'eml-pdf': 'eml-to-pdf'
|
|
} as const;
|
|
|
|
|
|
// Grouped file extensions for dropdowns
|
|
export const FROM_FORMAT_OPTIONS = [
|
|
{ value: 'any', label: 'Any', group: 'Multiple Files' },
|
|
{ value: 'image', label: 'Images', group: 'Multiple Files' },
|
|
{ value: 'pdf', label: 'PDF', group: 'Document' },
|
|
{ value: 'cbz', label: 'CBZ', group: 'Archive' },
|
|
{ value: 'docx', label: 'DOCX', group: 'Document' },
|
|
{ value: 'doc', label: 'DOC', group: 'Document' },
|
|
{ value: 'odt', label: 'ODT', group: 'Document' },
|
|
{ value: 'xlsx', label: 'XLSX', group: 'Spreadsheet' },
|
|
{ value: 'xls', label: 'XLS', group: 'Spreadsheet' },
|
|
{ value: 'ods', label: 'ODS', group: 'Spreadsheet' },
|
|
{ value: 'pptx', label: 'PPTX', group: 'Presentation' },
|
|
{ value: 'ppt', label: 'PPT', group: 'Presentation' },
|
|
{ value: 'odp', label: 'ODP', group: 'Presentation' },
|
|
{ value: 'jpg', label: 'JPG', group: 'Image' },
|
|
{ value: 'jpeg', label: 'JPEG', group: 'Image' },
|
|
{ value: 'png', label: 'PNG', group: 'Image' },
|
|
{ value: 'gif', label: 'GIF', group: 'Image' },
|
|
{ value: 'bmp', label: 'BMP', group: 'Image' },
|
|
{ value: 'tiff', label: 'TIFF', group: 'Image' },
|
|
{ value: 'webp', label: 'WEBP', group: 'Image' },
|
|
{ value: 'svg', label: 'SVG', group: 'Image' },
|
|
{ value: 'html', label: 'HTML', group: 'Web' },
|
|
{ value: 'zip', label: 'ZIP', group: 'Web' },
|
|
{ value: 'md', label: 'MD', group: 'Text' },
|
|
{ value: 'txt', label: 'TXT', group: 'Text' },
|
|
{ value: 'rtf', label: 'RTF', group: 'Text' },
|
|
{ value: 'eml', label: 'EML', group: 'Email' },
|
|
];
|
|
|
|
export const TO_FORMAT_OPTIONS = [
|
|
{ value: 'pdf', label: 'PDF', group: 'Document' },
|
|
{ value: 'pdfa', label: 'PDF/A', group: 'Document' },
|
|
{ value: 'docx', label: 'DOCX', group: 'Document' },
|
|
{ value: 'odt', label: 'ODT', group: 'Document' },
|
|
{ value: 'cbz', label: 'CBZ', group: 'Archive' },
|
|
{ value: 'csv', label: 'CSV', group: 'Spreadsheet' },
|
|
{ value: 'pptx', label: 'PPTX', group: 'Presentation' },
|
|
{ value: 'odp', label: 'ODP', group: 'Presentation' },
|
|
{ value: 'txt', label: 'TXT', group: 'Text' },
|
|
{ value: 'rtf', label: 'RTF', group: 'Text' },
|
|
{ value: 'md', label: 'MD', group: 'Text' },
|
|
{ value: 'png', label: 'PNG', group: 'Image' },
|
|
{ value: 'jpg', label: 'JPG', group: 'Image' },
|
|
{ value: 'gif', label: 'GIF', group: 'Image' },
|
|
{ value: 'tiff', label: 'TIFF', group: 'Image' },
|
|
{ value: 'bmp', label: 'BMP', group: 'Image' },
|
|
{ value: 'webp', label: 'WEBP', group: 'Image' },
|
|
{ value: 'html', label: 'HTML', group: 'Web' },
|
|
{ value: 'xml', label: 'XML', group: 'Web' },
|
|
];
|
|
|
|
// Conversion matrix - what each source format can convert to
|
|
export const CONVERSION_MATRIX: Record<string, string[]> = {
|
|
'any': ['pdf'], // Mixed files always convert to PDF
|
|
'image': ['pdf'], // Multiple images always convert to PDF
|
|
'pdf': ['png', 'jpg', 'gif', 'tiff', 'bmp', 'webp', 'docx', 'odt', 'pptx', 'odp', 'csv', 'txt', 'rtf', 'md', 'html', 'xml', 'pdfa', 'cbz'],
|
|
'cbz': ['pdf'],
|
|
'docx': ['pdf'], 'doc': ['pdf'], 'odt': ['pdf'],
|
|
'xlsx': ['pdf'], 'xls': ['pdf'], 'ods': ['pdf'],
|
|
'pptx': ['pdf'], 'ppt': ['pdf'], 'odp': ['pdf'],
|
|
'jpg': ['pdf'], 'jpeg': ['pdf'], 'png': ['pdf'], 'gif': ['pdf'], 'bmp': ['pdf'], 'tiff': ['pdf'], 'webp': ['pdf'], 'svg': ['pdf'],
|
|
'html': ['pdf'],
|
|
'zip': ['pdf'],
|
|
'md': ['pdf'],
|
|
'txt': ['pdf'], 'rtf': ['pdf'],
|
|
'eml': ['pdf']
|
|
};
|
|
|
|
// Map extensions to endpoint keys
|
|
export const EXTENSION_TO_ENDPOINT: Record<string, Record<string, string>> = {
|
|
'any': { 'pdf': 'file-to-pdf' }, // Mixed files use file-to-pdf endpoint
|
|
'image': { 'pdf': 'img-to-pdf' }, // Multiple images use img-to-pdf endpoint
|
|
'pdf': {
|
|
'png': 'pdf-to-img', 'jpg': 'pdf-to-img', 'gif': 'pdf-to-img', 'tiff': 'pdf-to-img', 'bmp': 'pdf-to-img', 'webp': 'pdf-to-img',
|
|
'docx': 'pdf-to-word', 'odt': 'pdf-to-word',
|
|
'pptx': 'pdf-to-presentation', 'odp': 'pdf-to-presentation',
|
|
'csv': 'pdf-to-csv',
|
|
'txt': 'pdf-to-text', 'rtf': 'pdf-to-text', 'md': 'pdf-to-markdown',
|
|
'html': 'pdf-to-html', 'xml': 'pdf-to-xml',
|
|
'pdfa': 'pdf-to-pdfa',
|
|
'cbz': 'pdf-to-cbz'
|
|
},
|
|
'cbz': { 'pdf': 'cbz-to-pdf' },
|
|
'docx': { 'pdf': 'file-to-pdf' }, 'doc': { 'pdf': 'file-to-pdf' }, 'odt': { 'pdf': 'file-to-pdf' },
|
|
'xlsx': { 'pdf': 'file-to-pdf' }, 'xls': { 'pdf': 'file-to-pdf' }, 'ods': { 'pdf': 'file-to-pdf' },
|
|
'pptx': { 'pdf': 'file-to-pdf' }, 'ppt': { 'pdf': 'file-to-pdf' }, 'odp': { 'pdf': 'file-to-pdf' },
|
|
'jpg': { 'pdf': 'img-to-pdf' }, 'jpeg': { 'pdf': 'img-to-pdf' }, 'png': { 'pdf': 'img-to-pdf' },
|
|
'gif': { 'pdf': 'img-to-pdf' }, 'bmp': { 'pdf': 'img-to-pdf' }, 'tiff': { 'pdf': 'img-to-pdf' }, 'webp': { 'pdf': 'img-to-pdf' }, 'svg': { 'pdf': 'img-to-pdf' },
|
|
'html': { 'pdf': 'html-to-pdf' },
|
|
'zip': { 'pdf': 'html-to-pdf' },
|
|
'md': { 'pdf': 'markdown-to-pdf' },
|
|
'txt': { 'pdf': 'file-to-pdf' }, 'rtf': { 'pdf': 'file-to-pdf' },
|
|
'eml': { 'pdf': 'eml-to-pdf' }
|
|
};
|
|
|
|
export type ColorType = typeof COLOR_TYPES[keyof typeof COLOR_TYPES];
|
|
export type OutputOption = typeof OUTPUT_OPTIONS[keyof typeof OUTPUT_OPTIONS];
|
|
export type FitOption = typeof FIT_OPTIONS[keyof typeof FIT_OPTIONS];
|