import * as pdfjsLib from './pdf.min.mjs'; pdfjsLib.GlobalWorkerOptions.workerSrc = new URL('./pdf.worker.min.mjs',import.meta.url).href; const input=document.querySelector('#image-input'),drop=document.querySelector('#dropzone'),editor=document.querySelector('#editor'),preview=document.querySelector('#preview-image'),details=document.querySelector('#file-details'),result=document.querySelector('#result'),button=document.querySelector('#process');let file=null,doc=null,urls=[];function clear(){urls.forEach(URL.revokeObjectURL);urls=[];result.textContent='';preview.removeAttribute('src');editor.hidden=true;drop.hidden=false;input.value='';doc?.destroy();doc=null}function error(message){result.textContent=message;result.className='error'}async function load(f){clear();if(!f)return;if(f.size>25*1024*1024||f.type!=='application/pdf'){error('Choose a PDF no larger than 25 MB.');return}try{file=f;const data=new Uint8Array(await f.arrayBuffer());doc=await pdfjsLib.getDocument({data}).promise;if(doc.numPages>20)throw Error('This tool supports up to 20 pages per PDF.');drop.hidden=true;editor.hidden=false;details.textContent=`${f.name} · ${doc.numPages} page${doc.numPages===1?'':'s'}`;const page=await doc.getPage(1),viewport=page.getViewport({scale:Math.min(2,600/page.getViewport({scale:1}).width)}),canvas=document.createElement('canvas');canvas.width=Math.ceil(viewport.width);canvas.height=Math.ceil(viewport.height);await page.render({canvasContext:canvas.getContext('2d'),viewport}).promise;preview.src=canvas.toDataURL('image/png');page.cleanup()}catch(e){clear();error(e.message||'Could not read this PDF.')}}input.addEventListener('change',()=>load(input.files[0]));['dragover','dragenter'].forEach(t=>drop.addEventListener(t,e=>{e.preventDefault();drop.classList.add('drag')}));['drop','dragleave'].forEach(t=>drop.addEventListener(t,e=>{e.preventDefault();drop.classList.remove('drag');if(t==='drop')load(e.dataTransfer.files[0])}));document.querySelector('#reset').addEventListener('click',clear);button.addEventListener('click',async()=>{if(!doc)return;button.disabled=true;result.textContent='Rendering pages…';try{const output=document.createDocumentFragment();for(let i=1;i<=doc.numPages;i++){const page=await doc.getPage(i),base=page.getViewport({scale:1}),scale=Math.min(2,3200/Math.max(base.width,base.height)),viewport=page.getViewport({scale}),canvas=document.createElement('canvas');canvas.width=Math.ceil(viewport.width);canvas.height=Math.ceil(viewport.height);if(canvas.width*canvas.height>4e7)throw Error('Page is too large to render.');await page.render({canvasContext:canvas.getContext('2d'),viewport}).promise;const blob=await new Promise((ok,no)=>canvas.toBlob(b=>b?ok(b):no(Error('PNG encoding failed')),'image/png')),url=URL.createObjectURL(blob),a=document.createElement('a');urls.push(url);a.className='download';a.href=url;a.download=`${file.name.replace(/\.pdf$/i,'')}-page-${i}.png`;a.textContent=`Download page ${i} (${Math.round(blob.size/1024)} KB) ↓`;output.append(a,document.createElement('br'));page.cleanup()}result.textContent='';result.append(output)}catch(e){error(e.message||'Rendering failed.')}finally{button.disabled=false}});