diff --git a/src/js/logic/pdf-to-tiff.ts b/src/js/logic/pdf-to-tiff.ts index 09ce0fa..b50ffac 100644 --- a/src/js/logic/pdf-to-tiff.ts +++ b/src/js/logic/pdf-to-tiff.ts @@ -4,6 +4,7 @@ import { state } from '../state.js'; import JSZip from 'jszip'; import UTIF from 'utif'; 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,34 +14,23 @@ export async function pdfToTiff() { const pdf = await getPDFDocument( await readFileAsArrayBuffer(state.files[0]) ).promise; - const zip = new JSZip(); + + if(pdf.numPages === 1) { + const page = await pdf.getPage(1); + const tiffBuffer = await pageToBlob(page); + downloadFile(tiffBuffer, getCleanFilename(state.files[0].name) + '.tiff'); + } else { + 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 }); // Use 2x scale for high quality - const canvas = document.createElement('canvas'); - const context = canvas.getContext('2d'); - canvas.height = viewport.height; - canvas.width = viewport.width; + for (let i = 1; i <= pdf.numPages; i++) { + const page = await pdf.getPage(i); + const tiffBuffer = await pageToBlob(page); + zip.file(`page_${i}.tiff`, tiffBuffer); + } - await page.render({ - canvasContext: context, - viewport: viewport, - canvas: canvas, - }).promise; - const imageData = context.getImageData(0, 0, canvas.width, canvas.height); - const rgba = imageData.data; - const tiffBuffer = UTIF.encodeImage( - new Uint8Array(rgba), - canvas.width, - canvas.height - ); - - zip.file(`page_${i}.tiff`, tiffBuffer); + const zipBlob = await zip.generateAsync({ type: 'blob' }); + downloadFile(zipBlob, getCleanFilename(state.files[0].name) + '_tiffs.zip'); } - - const zipBlob = await zip.generateAsync({ type: 'blob' }); - downloadFile(zipBlob, 'converted_tiff_images.zip'); } catch (e) { console.error(e); showAlert( @@ -51,3 +41,34 @@ export async function pdfToTiff() { hideLoader(); } } + + +async function pageToBlob(page: PDFPageProxy): Promise { + const viewport = page.getViewport({ scale: 2.0 }); // Use 2x scale for high quality + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + canvas.height = viewport.height; + canvas.width = viewport.width; + + await page.render({ + canvasContext: context, + viewport: viewport, + canvas: canvas, + }).promise; + const imageData = context.getImageData(0, 0, canvas.width, canvas.height); + const rgba = imageData.data; + const tiffBuffer = UTIF.encodeImage( + new Uint8Array(rgba), + canvas.width, + canvas.height + ); + return new Blob([tiffBuffer]); +} + +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 395788b..80b4610 100644 --- a/src/js/ui.ts +++ b/src/js/ui.ts @@ -1294,7 +1294,7 @@ export const toolTemplates = {

Convert each page of a PDF file into a high-quality TIFF image. Your files will be downloaded in a ZIP archive.

${createFileInputHTML()}
- + `, 'split-in-half': () => `