((resolve) =>
+ canvas.toBlob(resolve, 'image/webp', quality)
+ );
+ return blob;
}
document.addEventListener('DOMContentLoaded', () => {
- const fileInput = document.getElementById('file-input') as HTMLInputElement;
- const dropZone = document.getElementById('drop-zone');
- const processBtn = document.getElementById('process-btn');
- const backBtn = document.getElementById('back-to-tools');
- const qualitySlider = document.getElementById('webp-quality') as HTMLInputElement;
- const qualityValue = document.getElementById('webp-quality-value');
+ const fileInput = document.getElementById('file-input') as HTMLInputElement;
+ const dropZone = document.getElementById('drop-zone');
+ const processBtn = document.getElementById('process-btn');
+ const backBtn = document.getElementById('back-to-tools');
+ const qualitySlider = document.getElementById(
+ 'webp-quality'
+ ) as HTMLInputElement;
+ const qualityValue = document.getElementById('webp-quality-value');
- if (backBtn) {
- backBtn.addEventListener('click', () => {
- window.location.href = import.meta.env.BASE_URL;
- });
+ if (backBtn) {
+ backBtn.addEventListener('click', () => {
+ window.location.href = import.meta.env.BASE_URL;
+ });
+ }
+
+ if (qualitySlider && qualityValue) {
+ qualitySlider.addEventListener('input', () => {
+ qualityValue.textContent = `${Math.round(parseFloat(qualitySlider.value) * 100)}%`;
+ });
+ }
+
+ const handleFileSelect = (newFiles: FileList | null) => {
+ if (!newFiles || newFiles.length === 0) return;
+ const validFiles = Array.from(newFiles).filter(
+ (file) => file.type === 'application/pdf'
+ );
+
+ if (validFiles.length === 0) {
+ showAlert('Invalid File', 'Please upload a PDF file.');
+ return;
}
- if (qualitySlider && qualityValue) {
- qualitySlider.addEventListener('input', () => {
- qualityValue.textContent = `${Math.round(parseFloat(qualitySlider.value) * 100)}%`;
- });
- }
+ files = [validFiles[0]];
+ updateUI();
+ };
- const handleFileSelect = (newFiles: FileList | null) => {
- if (!newFiles || newFiles.length === 0) return;
- const validFiles = Array.from(newFiles).filter(
- (file) => file.type === 'application/pdf'
- );
+ if (fileInput && dropZone) {
+ fileInput.addEventListener('change', (e) => {
+ handleFileSelect((e.target as HTMLInputElement).files);
+ });
- if (validFiles.length === 0) {
- showAlert('Invalid File', 'Please upload a PDF file.');
- return;
- }
+ dropZone.addEventListener('dragover', (e) => {
+ e.preventDefault();
+ dropZone.classList.add('bg-gray-700');
+ });
- files = [validFiles[0]];
- updateUI();
- };
+ dropZone.addEventListener('dragleave', (e) => {
+ e.preventDefault();
+ dropZone.classList.remove('bg-gray-700');
+ });
- if (fileInput && dropZone) {
- fileInput.addEventListener('change', (e) => {
- handleFileSelect((e.target as HTMLInputElement).files);
- });
+ dropZone.addEventListener('drop', (e) => {
+ e.preventDefault();
+ dropZone.classList.remove('bg-gray-700');
+ handleFileSelect(e.dataTransfer?.files ?? null);
+ });
- dropZone.addEventListener('dragover', (e) => {
- e.preventDefault();
- dropZone.classList.add('bg-gray-700');
- });
+ fileInput.addEventListener('click', () => {
+ fileInput.value = '';
+ });
+ }
- dropZone.addEventListener('dragleave', (e) => {
- e.preventDefault();
- dropZone.classList.remove('bg-gray-700');
- });
-
- dropZone.addEventListener('drop', (e) => {
- e.preventDefault();
- dropZone.classList.remove('bg-gray-700');
- handleFileSelect(e.dataTransfer?.files ?? null);
- });
-
- fileInput.addEventListener('click', () => {
- fileInput.value = '';
- });
- }
-
- if (processBtn) {
- processBtn.addEventListener('click', convert);
- }
+ if (processBtn) {
+ processBtn.addEventListener('click', convert);
+ }
});
diff --git a/src/js/utils/helpers.ts b/src/js/utils/helpers.ts
index b5afd5f..7ec12f2 100644
--- a/src/js/utils/helpers.ts
+++ b/src/js/utils/helpers.ts
@@ -29,7 +29,7 @@ export function getStandardPageName(width: any, height: any) {
}
export function convertPoints(points: any, unit: any) {
- let result = 0;
+ let result: number;
switch (unit) {
case 'in':
result = points / 72;
@@ -460,3 +460,22 @@ export function formatRawDate(raw: string): string {
}
return raw;
}
+
+/**
+ * Returns a sanitized PDF filename.
+ *
+ * The provided filename is processed as follows:
+ * - Removes a trailing `.pdf` file extension (case-insensitive)
+ * - Trims leading and trailing whitespace
+ * - Truncates the name to a maximum of 80 characters
+ *
+ * @param filename The original filename (including extension)
+ * @returns The sanitized filename without the `.pdf` extension, limited to 80 characters
+ */
+export function getCleanPdfFilename(filename: string): string {
+ let clean = filename.replace(/\.pdf$/i, '').trim();
+ if (clean.length > 80) {
+ clean = clean.slice(0, 80);
+ }
+ return clean;
+}
diff --git a/src/pages/pdf-to-bmp.html b/src/pages/pdf-to-bmp.html
index da12340..31c8c87 100644
--- a/src/pages/pdf-to-bmp.html
+++ b/src/pages/pdf-to-bmp.html
@@ -160,7 +160,7 @@
diff --git a/src/pages/pdf-to-jpg.html b/src/pages/pdf-to-jpg.html
index 9b6aec2..dcee91c 100644
--- a/src/pages/pdf-to-jpg.html
+++ b/src/pages/pdf-to-jpg.html
@@ -190,7 +190,7 @@
diff --git a/src/pages/pdf-to-png.html b/src/pages/pdf-to-png.html
index 964026a..0853293 100644
--- a/src/pages/pdf-to-png.html
+++ b/src/pages/pdf-to-png.html
@@ -187,7 +187,7 @@
diff --git a/src/pages/pdf-to-tiff.html b/src/pages/pdf-to-tiff.html
index 75bec6c..f4292dc 100644
--- a/src/pages/pdf-to-tiff.html
+++ b/src/pages/pdf-to-tiff.html
@@ -155,7 +155,7 @@
diff --git a/src/pages/pdf-to-webp.html b/src/pages/pdf-to-webp.html
index 253d1f6..0501482 100644
--- a/src/pages/pdf-to-webp.html
+++ b/src/pages/pdf-to-webp.html
@@ -187,7 +187,7 @@