From d2acde3e818bcc74659f337b8b9853160b5869d6 Mon Sep 17 00:00:00 2001 From: omenmn Date: Sat, 21 Jun 2025 14:40:01 +0530 Subject: [PATCH] created pdf to png tool --- package-lock.json | 8 +- package.json | 2 +- src/components/result/ToolMultiFileResult.tsx | 152 ++++++++++++++++++ src/pages/tools/pdf/pdf-to-png/index.tsx | 98 +++++------ .../pdf/pdf-to-png/pdf-to-png.service.test.ts | 6 - src/pages/tools/pdf/pdf-to-png/service.ts | 52 +++++- src/pages/tools/pdf/pdf-to-png/types.ts | 3 - 7 files changed, 259 insertions(+), 62 deletions(-) create mode 100644 src/components/result/ToolMultiFileResult.tsx delete mode 100644 src/pages/tools/pdf/pdf-to-png/pdf-to-png.service.test.ts delete mode 100644 src/pages/tools/pdf/pdf-to-png/types.ts diff --git a/package-lock.json b/package-lock.json index e501cc8..ff64e27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "notistack": "^3.0.1", "omggif": "^1.0.10", "pdf-lib": "^1.17.1", - "pdfjs-dist": "^5.2.133", + "pdfjs-dist": "^5.3.31", "playwright": "^1.45.0", "qrcode": "^1.5.4", "rc-slider": "^11.1.8", @@ -8680,9 +8680,9 @@ "license": "0BSD" }, "node_modules/pdfjs-dist": { - "version": "5.2.133", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.2.133.tgz", - "integrity": "sha512-abE6ZWDxztt+gGFzfm4bX2ggfxUk9wsDEoFzIJm9LozaY3JdXR7jyLK4Bjs+XLXplCduuWS1wGhPC4tgTn/kzg==", + "version": "5.3.31", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.3.31.tgz", + "integrity": "sha512-EhPdIjNX0fcdwYQO+e3BAAJPXt+XI29TZWC7COhIXs/K0JHcUt1Gdz1ITpebTwVMFiLsukdUZ3u0oTO7jij+VA==", "license": "Apache-2.0", "engines": { "node": ">=20.16.0 || >=22.3.0" diff --git a/package.json b/package.json index ed7ebcf..6adcd2e 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "notistack": "^3.0.1", "omggif": "^1.0.10", "pdf-lib": "^1.17.1", - "pdfjs-dist": "^5.2.133", + "pdfjs-dist": "^5.3.31", "playwright": "^1.45.0", "qrcode": "^1.5.4", "rc-slider": "^11.1.8", diff --git a/src/components/result/ToolMultiFileResult.tsx b/src/components/result/ToolMultiFileResult.tsx new file mode 100644 index 0000000..bba516b --- /dev/null +++ b/src/components/result/ToolMultiFileResult.tsx @@ -0,0 +1,152 @@ +import { + Box, + CircularProgress, + Typography, + useTheme, + Button +} from '@mui/material'; +import InputHeader from '../InputHeader'; +import greyPattern from '@assets/grey-pattern.png'; +import { globalInputHeight } from '../../config/uiConfig'; +import ResultFooter from './ResultFooter'; + +export default function ToolFileResult({ + title = 'Result', + value, + zipFile, + loading, + loadingText +}: { + title?: string; + value: File[]; + zipFile?: File | null; + loading?: boolean; + loadingText?: string; +}) { + const theme = useTheme(); + + const getFileType = ( + file: File + ): 'image' | 'video' | 'audio' | 'pdf' | 'unknown' => { + if (file.type.startsWith('image/')) return 'image'; + if (file.type.startsWith('video/')) return 'video'; + if (file.type.startsWith('audio/')) return 'audio'; + if (file.type.startsWith('application/pdf')) return 'pdf'; + return 'unknown'; + }; + + const handleDownload = (file: File) => { + const url = URL.createObjectURL(file); + const a = document.createElement('a'); + a.href = url; + a.download = file.name; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + }; + + return ( + + + + + {loading ? ( + + + + {loadingText}... This may take a moment. + + + ) : value.length > 0 ? ( + value.map((file, idx) => { + const preview = URL.createObjectURL(file); + const fileType = getFileType(file); + + return ( + + {fileType === 'image' && ( + {`Preview + )} + {fileType === 'video' && ( +