53 lines
2.1 KiB
JavaScript
53 lines
2.1 KiB
JavaScript
import { readPdfPages } from './pdfDocumentReader.js';
|
||
|
||
async function openPdf(file) {
|
||
const pdfjs = await import('pdfjs-dist');
|
||
pdfjs.GlobalWorkerOptions.workerSrc = (await import('pdfjs-dist/build/pdf.worker.min.mjs?url')).default;
|
||
let task;
|
||
try {
|
||
task = pdfjs.getDocument({data:await file.arrayBuffer()});
|
||
return {doc:await task.promise,task};
|
||
}
|
||
catch(error) {
|
||
await task?.destroy();
|
||
if(error.name === 'InvalidPDFException') throw new Error('PDF dosyası bozuk veya geçerli PDF biçiminde değil.');
|
||
if(error.name === 'PasswordException') throw new Error('PDF parola korumalı; okunabilir bir kopyasını yükleyin.');
|
||
throw new Error('PDF okunamadı. Dosyayı kontrol edip yeniden deneyin.');
|
||
}
|
||
}
|
||
|
||
async function readPdf(file,{ocr=false,forceOcr=false,maxPages=Infinity,onProgress}={}) {
|
||
const {doc,task}=await openPdf(file);
|
||
let worker;
|
||
try {
|
||
const result=await readPdfPages(doc,{maxPages,forceOcr,onProgress,ocrPage:ocr ? async(page)=>{
|
||
if(!worker) {
|
||
const {createWorker}=await import('tesseract.js');
|
||
worker=await createWorker('tur');
|
||
}
|
||
const viewport=page.getViewport({scale:2});
|
||
const canvas=document.createElement('canvas');
|
||
canvas.width=viewport.width;canvas.height=viewport.height;
|
||
try {
|
||
await page.render({canvasContext:canvas.getContext('2d'),viewport}).promise;
|
||
return (await worker.recognize(canvas)).data.text;
|
||
} finally { canvas.width=0;canvas.height=0; }
|
||
} : undefined});
|
||
return result;
|
||
} finally {
|
||
try { if(worker) await worker.terminate(); }
|
||
finally { await task.destroy(); }
|
||
}
|
||
}
|
||
|
||
export const extractPdfText=(file,options={})=>readPdf(file,{...options,ocr:false});
|
||
export const ocrPdfText=(file,options={})=>readPdf(file,{...options,ocr:true,forceOcr:true});
|
||
export async function extractPlainText(file) {
|
||
return {text:(await file.text()).trim(),pageCount:1,usedPages:1,complete:true};
|
||
}
|
||
export async function extractText(file,{ocr=true,onProgress}={}) {
|
||
if((file.name || '').toLowerCase().endsWith('.pdf') || file.type==='application/pdf')
|
||
return readPdf(file,{ocr,onProgress});
|
||
return extractPlainText(file);
|
||
}
|