1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-ocr-DFExT_HV.js","assets/vendor-react-C_xdI0Ng.js","assets/vendor-excel--wYEJF5V.js","assets/vendor-pdflib-BC_rCeQu.js"])))=>i.map(i=>d[i]); 2var Oe=Object.defineProperty;var Ie=(t,e,o)=>e in t?Oe(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o;var ce=(t,e,o)=>Ie(t,typeof e!="symbol"?e+"":e,o);import{_ as U}from"./index-DbFRh42P.js";import{f as ve}from"./fontkit.es-MhQaB983.js";import{c as Ue}from"./pdf-rasterizer-CXotTZT5.js";import{extractPdfTextSegments as Ne}from"./pdf-content-stream-parser-DVMg55u3.js";import"./vendor-react-C_xdI0Ng.js";import"./vendor-pdflib-BC_rCeQu.js";class Y extends Error{constructor(e,o){super(o),this.code=e}}const De={eng:{script:"latin",stopwords:["the","and","for","with","from","this","that","will","your","is"]},rus:{script:"cyrillic",stopwords:["и","в","на","Ñ","по","длÑ","оÑ","ÑÑо","ÑÑо","как"]},ukr:{script:"cyrillic",stopwords:["Ñ","в","на","з","длÑ","Ñо","Ñе","Ñк","до","Ñа"]},deu:{script:"latin",stopwords:["und","der","die","das","mit","für","auf","ist","von","den"]},fra:{script:"latin",stopwords:["le","la","les","de","des","et","pour","avec","est","dans"]},spa:{script:"latin",stopwords:["el","la","los","las","de","del","para","con","que","en"]},ita:{script:"latin",stopwords:["il","la","gli","le","di","per","con","che","nel","una"]},por:{script:"latin",stopwords:["o","a","os","as","de","do","para","com","que","em"]},jpn:{script:"japanese",stopwords:["ã®","ã«","ã¯","ã","ã","ã§ã","ã¾ã","ã§","ã¦","ã¨"]},chi_sim:{script:"han",stopwords:["ç","æ¯","äº","å¨","å","æ","为","ä¸","å","æ¬"]},hin:{script:"devanagari",stopwords:["à¤à¥","मà¥à¤","à¤à¤°","à¤à¤¾","हà¥","सà¥","यह","à¤à¥","पर","à¤à¥"]},ara:{script:"arabic",stopwords:["ÙÙ","Ù Ù","عÙÙ","Ø¥ÙÙ","ÙØ§","Ø£Ù","٠ا","ÙÙ","٠ع","عÙ"]}};function Be(t){return Array.from(t.toLowerCase().matchAll(new RegExp("\\p{L}+","gu")),e=>e[0]??"").filter(Boolean)}function je(t){let e=0,o=0,r=0,n=0,a=0,i=0;for(const h of t)new RegExp("\\p{Script=Latin}","u").test(h)?e+=1:new RegExp("\\p{Script=Cyrillic}","u").test(h)?o+=1:new RegExp("\\p{Script=Devanagari}","u").test(h)?r+=1:new RegExp("\\p{Script=Arabic}","u").test(h)?i+=1:new RegExp("\\p{Script=Han}","u").test(h)?n+=1:new RegExp("\\p{Script=Hiragana}|\\p{Script=Katakana}","u").test(h)&&(a+=1);const s=e+o+r+n+a+i;if(s===0)return"unknown";const c=e/s,l=o/s,d=r/s,g=n/s,u=i/s,f=(n+a)/s,y=a/s;return c>.8?"latin":l>.8?"cyrillic":d>.6?"devanagari":u>.6?"arabic":f>.7&&y>.04?"japanese":g>.7?"han":"mixed"}function v(t){const e=Be(t),o=je(t),r=Object.entries(De).map(([s,c])=>{let l=0;for(const d of e){if(c.stopwords.includes(d)){l+=1;continue}(s==="jpn"||s==="chi_sim")&&c.stopwords.some(g=>d.includes(g))&&(l+=.45)}return o===c.script&&(l+=1.5),s==="ukr"&&/[ÑÑÑÒ]/u.test(t.toLowerCase())&&(l+=2),s==="rus"&&/[ÑÑÑ]/u.test(t.toLowerCase())&&(l+=1.5),{language:s,score:l}});r.sort((s,c)=>c.score-s.score);const n=r[0]??{language:"eng",score:0},a=r.reduce((s,c)=>s+c.score,0),i=a>0?n.score/a:0;return{primaryLanguage:n.language,confidence:Number(i.toFixed(3)),dominantScript:o,candidates:r.slice(0,3).map(s=>({language:s.language,score:Number(s.score.toFixed(3))}))}}function be(t){const e=t.candidates[0];if(!e)return t.primaryLanguage;const o=e.score>0?e.score*.45:0,r=[e.language];for(const n of t.candidates.slice(1))n.score<o||r.includes(n.language)||r.push(n.language);return r.join("+")}class ye{async recognize(){throw new Y("OCR_ENGINE_UNAVAILABLE","OCR engine is unavailable")}}const ze="indexeddb",We="/";function fe(t){return`${We}${t.replace(/^\//,"")}`}const Ge=fe("vendor/tesseract/worker.min.js"),He=fe("vendor/tesseract/core"),$e=fe("vendor/tesseract/lang");function Ve(t){const e=t instanceof Error?t.message:String(t??"");return/language|traineddata|load|fetch|worker|network|import/i.test(e)}function qe(t){const e=t.split("+").map(n=>n.trim()).filter(Boolean),o=Array.from(new Set(e));if(o.length===0)return["eng"];const r=[];if(r.push(o.join("+")),o.length>1){o.includes("eng")&&r.push("eng");for(const a of o)r.push(a);const n=o.filter(a=>a!=="eng");n.length>0&&r.push(n[0])}else r.push("eng");return Array.from(new Set(r.filter(Boolean)))}function Je(t){return Array.isArray(t)?t.map(e=>{var s,c,l,d;
2const o=(e.text??"").trim(),r=Number((s=e.bbox)==null?void 0:s.x0),n=Number((c=e.bbox)==null?void 0:c.y0),a=Number((l=e.bbox)==null?void 0:l.x1),i=Number((d=e.bbox)==null?void 0:d.y1);return!o||!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(a)||!Number.isFinite(i)?null:{text:o,confidence:typeof e.confidence=="number"?Number(e.confidence.toFixed(2)):null,bbox:{x0:r,y0:n,x1:a,y1:i}}}).filter(e=>e!==null):[]}class Ye{constructor(e){ce(this,"worker",null);ce(this,"currentLanguage",null);this.tesseract=e}async getWorker(e){if(this.worker)return this.currentLanguage!==e&&(await this.worker.reinitialize(e,1),this.currentLanguage=e),this.worker;const o=await this.tesseract.createWorker(e,1,{workerPath:Ge,corePath:He,langPath:$e,workerBlobURL:!1,cacheMethod:ze});return this.worker=o,this.currentLanguage=e,o}async runRecognize(e,o){var a,i,s;const n=await(await this.getWorker(o)).recognize(e);return{text:((a=n.data)==null?void 0:a.text)??"",confidence:typeof((i=n.data)==null?void 0:i.confidence)=="number"?Number(n.data.confidence.toFixed(2)):null,requestedLanguage:o,usedLanguage:o,languageFallbackUsed:!1,words:Je((s=n.data)==null?void 0:s.words)}}async recognize(e,o={}){var i;if(e.type==="application/pdf")throw new Y("OCR_UNSUPPORTED_INPUT","OCR engine does not accept PDF blob directly");const r=((i=o.language)==null?void 0:i.trim())||"eng",n=qe(r);let a=null;for(let s=0;s<n.length;s+=1){const c=n[s];try{const l=await this.runRecognize(e,c);return o.detectLanguage&&(l.detectedLanguage=v(l.text)),{...l,requestedLanguage:r,languageFallbackUsed:c!==r}}catch(l){if(!Ve(l))throw new Y("OCR_RECOGNITION_FAILED",`OCR failed: ${l instanceof Error?l.message:"unknown error"}`);a=l}}throw new Y("OCR_LANGUAGE_PACK_UNAVAILABLE",`OCR language pack "${r}" is unavailable${a instanceof Error&&a.message?`: ${a.message}`:""}`)}async terminate(){this.worker&&(await this.worker.terminate(),this.worker=null,this.currentLanguage=null)}}async function Ke(){try{const t=await U(()=>import("./vendor-ocr-DFExT_HV.js").then(e=>e.i),__vite__mapDeps([0,1,2]));return typeof t.createWorker!="function"?new ye:new Ye(t)}catch{return new ye}}const Xe="'Inter', 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif",Qe="'Noto Sans', 'Segoe UI', 'Arial Unicode MS', Arial, sans-serif",Ze="'Noto Sans', 'Inter', 'Segoe UI', 'Arial Unicode MS', Arial, sans-serif",et="'JetBrains Mono', 'Fira Code', 'Consolas', monospace",tt="'Noto Sans Mono', 'JetBrains Mono', 'Consolas', monospace",nt="'Noto Sans Mono', 'JetBrains Mono', 'Fira Code', 'Consolas', monospace";function at(t,e){const o=new RegExp("\\p{Script=Latin}","u").test(t),r=new RegExp("\\p{Script=Cyrillic}","u").test(t),n=[];return(o||(e==null?void 0:e.dominantScript)==="latin")&&n.push("latin"),(r||(e==null?void 0:e.dominantScript)==="cyrillic")&&n.push("cyrillic"),n.length===0&&n.push("latin"),n.includes("latin")&&n.includes("cyrillic")?{requiredScripts:n,recommendedSansSerifStack:Ze,recommendedMonospaceStack:nt}:n[0]==="cyrillic"?{requiredScripts:n,recommendedSansSerifStack:Qe,recommendedMonospaceStack:tt}:{requiredScripts:n,recommendedSansSerifStack:Xe,recommendedMonospaceStack:et}}function me(t){if(t.length===0)return 0;const e=[...t].sort((r,n)=>r-n),o=Math.floor(e.length/2);return e.length%2===0?(e[o-1]+e[o])/2:e[o]}function ot(t){const e=[...t].filter(a=>a.text.trim().length>0).sort((a,i)=>{const s=(a.bbox.y0+a.bbox.y1)/2,c=(i.bbox.y0+i.bbox.y1)/2;return s-c||a.bbox.x0-i.bbox.x0}),o=e.map(a=>Math.max(1,a.bbox.y1-a.bbox.y0)),r=Math.max(8,me(o)*.65),n=[];for(const a of e){const i=(a.bbox.y0+a.bbox.y1)/2,s=n[n.length-1];if(!s||Math.abs(i-s.centerY)>r){n.push({words:[a],y0:a.bbox.y0,y1:a.bbox.y1,centerY:i});continue}s.words.push(a),s.y0=Math.min(s.y0,a.bbox.y0),s.y1=Math.max(s.y1,a.bbox.y1),s.centerY=(s.y0+s.y1)/2}for(const a of n)a.words.sort((i,s)=>i.bbox.x0-s.bbox.x0);return n}function rt(t){const e=t.words.map(s=>Math.max(1,s.bbox.x1-s.bbox.x0)),o=t.words.reduce((s,c)=>Math.max(s,c.bbox.x1),0),r=Math.max(18,me(e)*1.35,o*.035),n=[];let a=[];const i=()=>{a.length!==0&&(n.push({text:a.map(s=>s.text.trim()).join(" ").replace(/\s+/g," ").trim(),x0:a[0].bbox.x0,x1:a[a.length-1].bbox.x1}),a=[])};for(let s=0;s<t.words.length;s+=1){const c=t.words[s],l=t.words[s-1];l&&c.bbox.x0-l.bbox.x1>=r&&i(),a.push(c)}return i(),n.length<2?null:{cells:n,y0:t.y0,y1:t.y1}}function st(t,e){if(t.cells.length!==e.cells.length)return!1;const o=t.cells.map(n=>Math.max(1,n.x1-n.x0)),r=Math.max(18,me(o)*1.8);for(let n=0;n<t.cells.length;n+=1){const a=(t.cells[n].x0+t.cells[n].x1)/2,i=(e.cells[n].x0+e.cells[n].x1)/2;if(Math.abs(a-i)>r)return!1}return!0}function it(t){const o=t.cells.map(r=>r.text).filter(r=>r.length>=24).length;return t.cells.length===2&&o===2}function ct(t){const e=ot(t).map(a=>rt(a)).filter(a=>a!==null&&!it(a)),o=[];let r=[];const n=()=>
2{if(r.length>=2){const a=r.reduce((i,s)=>Math.min(i,s.cells.length),r[0].cells.length);a>=2&&o.push({columns:a,rows:r.map(i=>({...i,cells:i.cells.slice(0,a)}))})}r=[]};for(const a of e){const i=r[r.length-1];if(!i){r.push(a);continue}if(st(i,a)){r.push(a);continue}n(),r.push(a)}return n(),o}function lt(t){return t.replace(/\|/g,"\\|").replace(/\n+/g," ").trim()}function ut(t){return t.map(e=>{const o=e.rows.map(i=>{const s=i.cells.slice(0,e.columns).map(c=>lt(c.text));for(;s.length<e.columns;)s.push("");return s});if(o.length===0)return"";const r=o[0],n=Array.from({length:e.columns},()=>"---"),a=o.slice(1);return[`| ${r.join(" | ")} |`,`| ${n.join(" | ")} |`,...a.map(i=>`| ${i.join(" | ")} |`)].join(` 3`)}).filter(Boolean).join(` 4 5`)}async function dt(t){if(typeof createImageBitmap=="function"){const e=await createImageBitmap(t),o={width:e.width,height:e.height};return e.close(),o}if(typeof Image<"u"&&typeof URL<"u"){const e=URL.createObjectURL(t);try{return await new Promise((r,n)=>{const a=new Image;a.onload=()=>r({width:a.naturalWidth,height:a.naturalHeight}),a.onerror=()=>n(new Error("Failed to decode OCR page image")),a.src=e})}finally{URL.revokeObjectURL(e)}}throw new Error("Image decoding is unavailable in this runtime")}function V(t,e,o){return Math.min(o,Math.max(e,t))}async function xe(t){const e=await fetch(t);if(!e.ok)throw new Error(`Failed to load font: ${t}`);return new Uint8Array(await e.arrayBuffer())}async function gt(){const[t,e]=await Promise.all([U(()=>import("./noto-sans-latin-400-normal-DZbyGt1h.js"),[]),U(()=>import("./noto-sans-cyrillic-ext-400-normal-B_TeKTr_.js"),[])]);return{latinUrl:t.default,cyrillicUrl:e.default}}function ft(t){return new RegExp("\\p{Script=Cyrillic}","u").test(t)}async function mt(t){const{PDFDocument:e,StandardFonts:o,rgb:r}=await U(async()=>{const{PDFDocument:d,StandardFonts:g,rgb:u}=await import("./vendor-pdflib-BC_rCeQu.js").then(f=>f.c);return{PDFDocument:d,StandardFonts:g,rgb:u}},__vite__mapDeps([3,1])),n=await e.create();let a=await n.embedFont(o.Helvetica),i=a,s=a;try{if(typeof document<"u"){n.registerFontkit(ve);const{latinUrl:d,cyrillicUrl:g}=await gt(),[u,f]=await Promise.all([xe(d),xe(g)]);i=await n.embedFont(u,{subset:!0}),s=await n.embedFont(f,{subset:!0})}}catch{}for(const d of t){const g=new Uint8Array(await d.imageBlob.arrayBuffer()),u=d.imageBlob.type,f=u==="image/png";if(!f&&!(u==="image/jpeg"||u==="image/jpg"))throw new Error(`Searchable PDF supports PNG/JPEG image pages, received: ${u||"unknown"}`);const h=f?await n.embedPng(g):await n.embedJpg(g),L=await dt(d.imageBlob),k=n.addPage([L.width,L.height]);k.drawImage(h,{x:0,y:0,width:L.width,height:L.height});for(const p of d.words){const x=V(p.bbox.x1-p.bbox.x0,1,L.width),m=V(p.bbox.y1-p.bbox.y0,1,L.height),_=V(p.bbox.x0,0,L.width-1),E=V(L.height-p.bbox.y1,0,L.height-1),j=V(m*.85,6,48);try{const F=ft(p.text)?s:i;k.drawText(p.text,{x:_,y:E,size:j,font:F,maxWidth:x,color:r(1,1,1),opacity:.02})}catch{}}}const c=await n.save(),l=new Uint8Array(c.byteLength);return l.set(c),new Blob([l],{type:"application/pdf"})}const Se=.85;async function pt(t){if(typeof createImageBitmap=="function"){const e=await createImageBitmap(t);return{width:e.width,height:e.height,drawTo:(o,r,n)=>{o.drawImage(e,0,0,r,n),e.close()}}}if(typeof document<"u"){const e=URL.createObjectURL(t);try{const o=await new Promise((r,n)=>{const a=document.createElement("img");a.onload=()=>r(a),a.onerror=()=>n(new Error("Failed to decode image input")),a.src=e});return{width:o.naturalWidth||o.width,height:o.naturalHeight||o.height,drawTo:(r,n,a)=>{r.drawImage(o,0,0,n,a)}}}finally{URL.revokeObjectURL(e)}}throw new Error("Image decoding unavailable in this runtime")}function ge(t,e,o){return Math.max(e,Math.min(o,t))}function ht(t,e,o){return .299*t+.587*e+.114*o}function wt(t,e){if(e<=0)return{low:0,high:255};const o=e*.02,r=e*.98;let n=0,a=0;for(let s=0;s<256;s+=1)if(n+=t[s],n>=o){a=s;break}n=0;let i=255;for(let s=0;s<256;s+=1)if(n+=t[s],n>=r){i=s;break}return{low:a,high:Math.max(a+1,i)}}function bt(t,e,o,r){const n=new Uint8ClampedArray(t.length),a=e*o;if(a===0)return n;if(a>1e7){let d=0;for(let u=0;u<t.length;u+=1)d+=t[u];d/=t.length;const g=ge(d-6-r*8,32,224);for(let u=0;u<t.length;u+=1)n[u]=t[u]<g?0:255;return n}const s=new Float64Array((e+1)*(o+1));for(let d=1;d<=o;d+=1){let g=0;for(let u=1;u<=e;u+=1)g+=t[(d-1)*e+(u-1)],s[d*(e+1)+u]=s[(d-1)*(e+1)+u]+g}const c=ge(Math.round(Math.min(e,o)/48),8,26),l=.1+r*.045;for(let d=0;d<o;d+=1){const g=Math.max(0,d-c),u=Math.min(o-1,d+c);for(let f=0;f<e;f+=1){const y=Math.max(0,f-c),h=Math.min(e-1,f+c),L=(h-y+1)*(u-g+1),x=(s[(u+1)*(e+1)+(h+1)]-s[g*(e+1)+(h+1)]-s[(u+1)*(e+1)+y]+s[g*(e+1)+y])/L*(1-l);n[d*e+f]=t[d*e+f]<x?0:255}}return n}function yt(t,e,o){if(e<3||o<3)return;
5const r=new Uint8ClampedArray(t);for(let n=1;n<o-1;n+=1)for(let a=1;a<e-1;a+=1){const i=n*e+a,s=r[i];let c=0;for(let l=-1;l<=1;l+=1)for(let d=-1;d<=1;d+=1)d===0&&l===0||r[(n+l)*e+(a+d)]===0&&(c+=1);s===0&&c<=1?t[i]=255:s===255&&c>=7&&(t[i]=0)}}async function q(t,e="balanced"){if(e==="none"||!t.type.startsWith("image/")||!(typeof OffscreenCanvas<"u"||typeof document<"u"))return t;try{const r=await pt(t),n=r.width<1600?2:1,a=e==="aggressive"?Math.max(n,r.width<2100?2:1):n,i=Math.max(1,Math.round(r.width*a)),s=Math.max(1,Math.round(r.height*a)),c=typeof OffscreenCanvas<"u"?new OffscreenCanvas(i,s):typeof document<"u"?document.createElement("canvas"):null;if(!c)return t;"width"in c&&"height"in c&&(c.width=i,c.height=s);const l=c.getContext("2d",{willReadFrequently:!0});if(!l)return t;l.imageSmoothingEnabled=!0,l.imageSmoothingQuality=e==="aggressive"?"high":"medium",r.drawTo(l,i,s);const d=l.getImageData(0,0,i,s),g=d.data,u=new Uint8ClampedArray(i*s),f=new Uint32Array(256);let y=0;for(let m=0,_=0;m<g.length;m+=4,_+=1){const E=ht(g[m],g[m+1],g[m+2]);y+=E,u[_]=E,f[Math.round(E)]+=1}if(y/=Math.max(1,u.length),y<120)for(let m=0;m<u.length;m+=1)u[m]=255-u[m];const L=wt(f,u.length),k=Math.max(1,L.high-L.low);for(let m=0;m<u.length;m+=1){const _=(u[m]-L.low)*255/k;u[m]=ge(_,0,255)}const p=bt(u,i,s,e==="aggressive"?1:0);e==="aggressive"&&yt(p,i,s);for(let m=0,_=0;m<g.length;m+=4,_+=1){const E=p[_];g[m]=E,g[m+1]=E,g[m+2]=E,g[m+3]=255}l.putImageData(d,0,0);let x=null;return typeof OffscreenCanvas<"u"&&c instanceof OffscreenCanvas?x=await c.convertToBlob({type:"image/jpeg",quality:Se}):"toBlob"in c&&typeof c.toBlob=="function"&&(x=await new Promise(m=>c.toBlob(m,"image/jpeg",Se))),x??t}catch{return t}}async function xt(t){const e=async(r,n)=>{let a=null;try{return await Promise.race([r,new Promise((i,s)=>{a=setTimeout(()=>s(new Error("INFLATE_TIMEOUT")),n)})])}finally{a&&clearTimeout(a)}},o=new TextDecoder("latin1").decode(t);if(/\b(Tj|TJ)\b/u.test(o))return o;if(typeof DecompressionStream>"u")return"";for(const r of["deflate","deflate-raw"])try{const n=await e((async()=>{const i=new DecompressionStream(r),s=i.writable.getWriter();return await s.write(new Uint8Array(t)),await s.close(),new Uint8Array(await new Response(i.readable).arrayBuffer())})(),180),a=new TextDecoder("latin1").decode(n);if(/\b(Tj|TJ)\b/u.test(a))return a}catch{}return""}async function le(t){try{const{PDFDocument:e,PDFName:o}=await U(async()=>{const{PDFDocument:a,PDFName:i}=await import("./vendor-pdflib-BC_rCeQu.js").then(s=>s.c);return{PDFDocument:a,PDFName:i}},__vite__mapDeps([3,1])),r=await e.load(t),n=[];for(let a=0;a<r.getPageCount();a+=1){const s=r.getPage(a).node.get(o.of("Contents"));if(!s){n.push("");continue}const c=r.context.lookup(s),l=[];if(c&&typeof c.size=="function"&&typeof c.get=="function"){const g=Number(c.size());for(let u=0;u<g;u+=1)l.push(r.context.lookup(c.get(u)))}else l.push(c);const d=[];for(const g of l){if(!g||typeof g.getContents!="function")continue;const u=await xt(g.getContents());u&&d.push(...Ne(u))}n.push(d.join(" ").trim())}return{text:n.join(` 6 7`).trim(),pageCount:r.getPageCount()}}catch{return null}}async function St(t){var o;const e=new Uint8Array(await t.arrayBuffer());try{let r=null;const n=[()=>U(()=>import("./vendor-pdfjs-Oio34r9s.js").then(l=>l.p),[]),()=>U(()=>import("./vendor-pdfjs-Oio34r9s.js").then(l=>l.c),[]),()=>U(()=>import("./vendor-pdfjs-Oio34r9s.js").then(l=>l.c),[])];for(const l of n)try{const d=await l();if(d&&typeof d.getDocument=="function"){r=d;break}}catch{}if(!r)return le(e);const a=((o=r.VerbosityLevel)==null?void 0:o.ERRORS)??0,i=await r.getDocument({data:e.buffer,disableWorker:!0,verbosity:a}).promise,s=[];for(let l=1;l<=i.numPages;l+=1){const u=((await(await i.getPage(l)).getTextContent()).items??[]).map(f=>
7typeof f.str=="string"?f.str:"").filter(Boolean);s.push(u.join(" "))}const c={text:s.join(` 8 9`).trim(),pageCount:i.numPages};return c.text.length>0?c:le(e)}catch{return le(e)}}async function Ce(t){if(typeof createImageBitmap=="function")try{const e=await createImageBitmap(t),o={width:e.width,height:e.height};return e.close(),o}catch{return null}if(typeof Image<"u"&&typeof URL<"u"){const e=URL.createObjectURL(t);try{return await new Promise((r,n)=>{const a=new Image;a.onload=()=>r({width:a.naturalWidth,height:a.naturalHeight}),a.onerror=()=>n(new Error("Failed to decode image")),a.src=e})}catch{return null}finally{URL.revokeObjectURL(e)}}return null}async function ue(t,e,o){const[r,n]=await Promise.all([Ce(e),Ce(o)]);if(!r||!n||r.width<=0||r.height<=0||r.width===n.width&&r.height===n.height)return t;const a=n.width/r.width,i=n.height/r.height;return t.map(s=>({...s,bbox:{x0:s.bbox.x0*a,y0:s.bbox.y0*i,x1:s.bbox.x1*a,y1:s.bbox.y1*i}}))}const Ct=["eng","rus","ukr","deu","fra","spa","ita","por","jpn","chi_sim","hin","ara"],oe="eng",Lt="eng",Et=1.25,_t=2,Le=78,Ee=40,At=6,Pt=5;async function de(t,e){const o=new Blob([e],{type:"text/plain"});return(await t.write(o)).id}function Rt(t){return t==="fast"?Et:_t}function J(t,e=!1){return t==="fast"?"none":e?"aggressive":"balanced"}function kt(t){const e=(t??"").trim().toLowerCase();if(!e)return oe;const o=e.split("+").map(n=>n.trim()).filter(Boolean),r=Array.from(new Set(o)).filter(n=>Ct.includes(n));return r.length===0?oe:r.join("+")}function _e(t,e){const o=new Set(t.split("+").map(r=>r.trim()).filter(Boolean));return new RegExp("\\p{Script=Latin}","u").test(e)&&o.add("eng"),new RegExp("\\p{Script=Cyrillic}","u").test(e)&&o.add("rus"),new RegExp("\\p{Script=Hiragana}|\\p{Script=Katakana}","u").test(e)&&o.add("jpn"),new RegExp("\\p{Script=Han}","u").test(e)&&o.add("chi_sim"),new RegExp("\\p{Script=Devanagari}","u").test(e)&&o.add("hin"),Array.from(o).join("+")||oe}function Mt(t){const e=(t==null?void 0:t.languageMode)==="manual"?"manual":"auto",o=kt(typeof(t==null?void 0:t.language)=="string"?t.language:oe),r=(t==null?void 0:t.outputFormat)==="json"?"json":(t==null?void 0:t.outputFormat)==="searchable-pdf"?"searchable-pdf":"txt",n=(t==null?void 0:t.mode)==="fast"?"fast":"accurate",a=(t==null?void 0:t.preserveFormatting)!==!1,i=(t==null?void 0:t.detectTables)===!0;return{languageMode:e,language:o,outputFormat:r,mode:n,preserveFormatting:a,detectTables:i}}function ae(t,e){return t.map(o=>{const r=e.detectTables?ct(o.words):[],n=r.length>0?ut(r):"";return{text:e.detectTables&&n?e.preserveFormatting?[o.text.trim(),n].filter(Boolean).join(` 10 11`):[o.text.trim(),n.replace(/\|/g," ").replace(/^\s*---.*$/gm,"").replace(/\n{3,}/g,` 12 13`).trim()].filter(Boolean).join(` 14 15`):o.text,words:o.words,tables:r}})}function T(t){const e=t.text.trim().length;return typeof t.confidence!="number"?e<Ee:t.confidence<Le?!0:t.confidence<Le+5&&e<Ee*2}function G(t){const e=typeof t.confidence=="number"?t.confidence:0,o=Math.min(t.text.trim().length/10,24),r=Math.min(t.words.length/6,16);return e+o+r}function Tt(t,e,o,r,n){const a=Math.max(0,Math.min(100,r)),i=Math.round((e+a/100)/o*100),s=Math.max(0,Math.min(100,i));t&&t(n?{progress:s,detail:n}:s)}const Wt=async({inputIds:t,options:e,fs:o,emitProgress:r})=>{var s,c,l,d;if(t.length===0)throw new Error("OCR PDF requires at least one input file");const n=Mt(e),a=[],i=await Ke();try{const g=async(u,f)=>{const y=await i.recognize(u,{language:f,detectLanguage:!0});return{text:y.text,confidence:y.confidence,usedLanguage:y.usedLanguage,languageFallbackUsed:y.languageFallbackUsed,words:y.words}};for(let u=0;u<t.length;u+=1){const f=(b,A)=>{Tt(r,u,t.length,b,A)};f(2);const y=await o.read(t[u]),h=await y.getBlob(),L=h.size,k=await y.getType();f(8);let p="";const x=n.languageMode==="manual"?n.language:Lt;let m=x,_=!1,E=!1,j=0;const F=[],K=new Set;let X=!1,z=v(""),H=[],O=[],re=!1;if(k==="application/pdf"){const b=await St(h),A=(b==null?void 0:b.text)??"",R=(A.match(new RegExp("\\p{L}","ug"))||[]).length,S=A.split(/\s+/).filter(Boolean).length;if(R>=100||R>=20&&S>=8)f(26),p=(b==null?void 0:b.text)??"",O=[{text:p,words:[],tables:[]}],z=v(p),re=!0,f(78,{pageIndex:0,pageCount:1,completedPages:1,partialText:p,partialOutputId:await de(o,p)});else{f(20),f(22);const C=await Ue();if(!C)throw new Y("OCR_PDF_RASTERIZER_MISSING","PDF OCR pipeline requires rasterizer integration (pdf.js -> image)");const N={scale:Rt(n.mode),imageFormat:"image/jpeg"},Q=J(n.mode),M=[],Z=[],ee=[];let he=!1,se=0;
15if(await C.forEachPage(h,N,async te=>{const{pageIndex:w,pageCount:D,blob:$}=te;f(24+w/Math.max(1,D)*14);const ne=await q($,Q);ee.push($),Z.push(ne);let B;if(n.languageMode==="auto"&&!he){const P=await g(ne,x),ie=v(P.text),I=_e(be(ie),P.text);m=I,_=I!==x,he=!0,B=I!==x?await g(ne,I):P}else{const P=n.languageMode==="auto"?m:x;B=await g(ne,P)}if(n.mode==="accurate"&&D>1&&T(B)&&se<At){const P=await q($,J(n.mode,!0)),ie=n.languageMode==="auto"?m:x,I=await g(P,ie),Fe=G(B);(G(I)>=Fe+2||!T(I)&&T(B))&&(B=I,Z[Z.length-1]=P),E=!0,se+=1,j=se}M.push(B);const we=ae(M.map(P=>({text:P.text,words:P.words})),n).map(P=>P.text).join(` 16 17`),Te=(w+1)%Pt===0||w+1===D?await de(o,we):void 0;f(38+(w+1)/Math.max(1,D)*50,{pageIndex:w,pageCount:D,completedPages:w+1,partialText:we,partialOutputId:Te})})===0)p="";else{O=ae(M.map(w=>({text:w.text,words:w.words})),n),p=O.map(w=>w.text).join(` 18 19`);const te=[];for(let w=0;w<ee.length;w+=1){const D=((s=M[w])==null?void 0:s.words)??[],$=await ue(D,Z[w],ee[w]);te.push({imageBlob:ee[w],words:$})}H=te,z=v(p);for(const w of M)K.add(w.usedLanguage),typeof w.confidence=="number"&&F.push(w.confidence),X||(X=w.languageFallbackUsed)}}}else{const b=await q(h,J(n.mode)),A=h.type==="image/png"||h.type==="image/jpeg"||h.type==="image/jpg"?h:b;let R=b;if(f(24),n.languageMode==="auto"){const S=await g(b,x);f(48);const W=v(S.text);m=_e(be(W),S.text);let C=m!==x?await g(b,m):S;if(_=m!==x,n.mode==="accurate"&&T(C)){const Q=await q(h,J(n.mode,!0)),M=await g(Q,m);(G(M)>=G(C)+2||!T(M)&&T(C))&&(C=M,R=Q),E=!0,j=1,f(72)}f(80),O=ae([{text:C.text,words:C.words}],n),p=((c=O[0])==null?void 0:c.text)??C.text;const N=await ue(C.words,R,A);H=[{imageBlob:A,words:N}],z=v(p),K.add(C.usedLanguage),typeof C.confidence=="number"&&F.push(C.confidence),X=C.languageFallbackUsed}else{let S=await g(b,x);if(n.mode==="accurate"&&T(S)){const C=await q(h,J(n.mode,!0)),N=await g(C,x);(G(N)>=G(S)+2||!T(N)&&T(S))&&(S=N,R=C),E=!0,j=1,f(70)}f(80),O=ae([{text:S.text,words:S.words}],n),p=((l=O[0])==null?void 0:l.text)??S.text;const W=await ue(S.words,R,A);H=[{imageBlob:A,words:W}],z=v(p),K.add(S.usedLanguage),typeof S.confidence=="number"&&F.push(S.confidence),X=S.languageFallbackUsed}f(88,{pageIndex:0,pageCount:1,completedPages:1,partialText:p,partialOutputId:await de(o,p)})}const Ae=at(p,z),Pe=F.length>0?Number((F.reduce((b,A)=>b+A,0)/F.length).toFixed(2)):null,pe={sourceFileId:y.id,sourceMime:k,sourceBytes:L,ocr:{mode:n.mode,languageMode:n.languageMode,preserveFormatting:n.preserveFormatting,detectTables:n.detectTables,requestedLanguage:x,suggestedLanguagePack:n.languageMode==="auto"?m:null,autoSecondPassApplied:n.languageMode==="auto"?_:!1,lowConfidenceRetryApplied:E,lowConfidenceRetryCount:j,usedLanguages:Array.from(K),averageConfidence:Pe,languageFallbackUsed:X,usedEmbeddedText:re},languageDetection:z,fontSupport:Ae,recognizedText:p,pages:O.map((b,A)=>({index:A,text:b.text,tables:b.tables.map(R=>({columns:R.columns,rows:R.rows.map(S=>S.cells.slice(0,R.columns).map(W=>W.text))}))}))},Re=new Blob([pe.recognizedText],{type:"text/plain"}),ke=n.outputFormat==="searchable-pdf"?await(async()=>{if(re&&k==="application/pdf")return h;if(H.length===0)throw new Error("Cannot create Searchable PDF: no page layers available from OCR");try{return await mt(H)}catch(b){throw new Error(`Failed to build Searchable PDF: ${b instanceof Error?b.message:"unknown error"}`)}})():n.outputFormat==="json"?new Blob([JSON.stringify(pe,null,2)],{type:"application/json"}):Re;f(92);const Me=await o.write(ke);a.push(Me.id),f(100)}return{outputIds:a}}finally{await((d=i.terminate)==null?void 0:d.call(i))}};export{Wt as run};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.