diff --git a/src/js/logic/pdf-to-webp.ts b/src/js/logic/pdf-to-webp.ts index fe47b0a..a8479ee 100644 --- a/src/js/logic/pdf-to-webp.ts +++ b/src/js/logic/pdf-to-webp.ts @@ -3,6 +3,7 @@ import { downloadFile, readFileAsArrayBuffer, getPDFDocument } from '../utils/he import { state } from '../state.js'; import JSZip from 'jszip'; import * as pdfjsLib from 'pdfjs-dist'; +import { PDFPageProxy } from 'pdfjs-dist'; pdfjsLib.GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/build/pdf.worker.min.mjs', import.meta.url).toString(); @@ -13,25 +14,21 @@ export async function pdfToWebp() { const pdf = await getPDFDocument( await readFileAsArrayBuffer(state.files[0]) ).promise; - const zip = new JSZip(); - for (let i = 1; i <= pdf.numPages; i++) { - const page = await pdf.getPage(i); - const viewport = page.getViewport({ scale: 2.0 }); - const canvas = document.createElement('canvas'); - canvas.height = viewport.height; - canvas.width = viewport.width; - const context = canvas.getContext('2d'); - await page.render({ canvasContext: context, viewport: viewport, canvas }).promise; - const qualityInput = document.getElementById('webp-quality') as HTMLInputElement; - const quality = qualityInput ? parseFloat(qualityInput.value) : 0.9; - const blob = await new Promise((resolve) => - canvas.toBlob(resolve, 'image/webp', quality) - ); - zip.file(`page_${i}.webp`, blob as Blob); + if(pdf.numPages === 1) { + const page = await pdf.getPage(1); + const blob = await pageToBlob(page); + downloadFile(blob, getCleanFilename(state.files[0].name) + '.webp'); + } else { + const zip = new JSZip(); + for (let i = 1; i <= pdf.numPages; i++) { + const page = await pdf.getPage(i); + const blob = await pageToBlob(page); + zip.file(`page_${i}.webp`, blob as Blob); + } + const zipBlob = await zip.generateAsync({ type: 'blob' }); + downloadFile(zipBlob, getCleanFilename(state.files[0].name) + '_webps.zip'); } - const zipBlob = await zip.generateAsync({ type: 'blob' }); - downloadFile(zipBlob, 'converted_webp.zip'); } catch (e) { console.error(e); showAlert('Error', 'Failed to convert PDF to WebP.'); @@ -39,3 +36,27 @@ export async function pdfToWebp() { hideLoader(); } } + +async function pageToBlob(page: PDFPageProxy): Promise { + const viewport = page.getViewport({ scale: 2.0 }); + const canvas = document.createElement('canvas'); + canvas.height = viewport.height; + canvas.width = viewport.width; + const context = canvas.getContext('2d'); + await page.render({ canvasContext: context, viewport: viewport, canvas }).promise; + const qualityInput = document.getElementById('webp-quality') as HTMLInputElement; + const quality = qualityInput ? parseFloat(qualityInput.value) : 0.9; + + const blob = await new Promise((resolve) => + canvas.toBlob(resolve, 'image/webp', quality) + ); + return blob as Blob; +} + +function getCleanFilename(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/js/ui.ts b/src/js/ui.ts index 80b4610..8787f21 100644 --- a/src/js/ui.ts +++ b/src/js/ui.ts @@ -868,8 +868,7 @@ export const toolTemplates = {

Higher quality = larger file size

-

Your file is ready. Click the button to download a ZIP file containing all WebP images.

- + `, 'webp-to-pdf': () => `