import {awaitWithAbort} from './abortable.js'; /** Read every requested page in order, retaining text/OCR provenance per page. */ export async function readPdfPages(doc, {maxPages=Infinity, ocrPage, forceOcr=false, onProgress, signal}={}) { if (!(maxPages === Infinity || (Number.isInteger(maxPages) && maxPages > 0))) throw new Error('Geçersiz sayfa sınırı.'); signal?.throwIfAborted(); const pages = Math.min(doc.numPages,maxPages); const results=[]; for(let number=1;number<=pages;number++) { signal?.throwIfAborted(); onProgress?.({sayfa:number,toplam:pages}); const page=await awaitWithAbort(doc.getPage(number).then(page=>{if(signal?.aborted){page.cleanup?.();signal.throwIfAborted();}return page;}),signal); try { const content=await awaitWithAbort(page.getTextContent(),signal); let text=content.items.map(item=>item.str + (item.hasEOL ? '\n' : ' ')).join('').trim(); let method='text'; if(ocrPage && (forceOcr || text.replace(/\s/g,'').length < 100)) { try { text=await awaitWithAbort(ocrPage(page),signal); method='ocr'; } catch { signal?.throwIfAborted(); throw new Error(`${number}. sayfada OCR tamamlanamadı. Okunabilir belgeyle yeniden deneyin.`); } } signal?.throwIfAborted(); results.push({page:number,text,method}); } finally { page.cleanup?.(); } } return {text:results.map(p=>p.text).join('\n\n').replace(/[ \t]+/g,' ').trim(), pageCount:doc.numPages,usedPages:pages,pages:results,ocr:results.some(p=>p.method==='ocr'), complete:pages===doc.numPages}; }