PageSourceSearch

https://localpdf.online/app/assets/index-BrCUuDJO.js

js localpdf.online collected 2026-10-02 01:08:45 UTC 25,175 bytes, 18 lines download raw bytes

1var Oe=Object.defineProperty;var Ue=(t,e,o)=>e in t?Oe(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o;var ie=(t,e,o)=>Ue(t,typeof e!="symbol"?e+"":e,o);import{f as Ie,l as ve}from"./worker-entrypoint-Cpi_3YOf.js";import{c as Ne}from"./pdf-rasterizer-GZcp8Twj.js";class Y extends Error{constructor(e,o){super(o),this.code=e}}const Be={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 _e(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,u=o/s,d=r/s,g=n/s,l=i/s,f=(n+a)/s,y=a/s;return c>.8?"latin":u>.8?"cyrillic":d>.6?"devanagari":l>.6?"arabic":f>.7&&y>.04?"japanese":g>.7?"han":"mixed"}function v(t){const e=_e(t),o=je(t),r=Object.entries(Be).map(([s,c])=>{let u=0;for(const d of e){if(c.stopwords.includes(d)){u+=1;continue}(s==="jpn"||s==="chi_sim")&&c.stopwords.some(g=>d.includes(g))&&(u+=.45)}return o===c.script&&(u+=1.5),s==="ukr"&&/[іїєґ]/u.test(t.toLowerCase())&&(u+=2),s==="rus"&&/[ыэъ]/u.test(t.toLowerCase())&&(u+=1.5),{language:s,score:u}});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 we(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 be{async recognize(){throw new Y("OCR_ENGINE_UNAVAILABLE","OCR engine is unavailable")}}const De="indexeddb",ze="/";function ge(t){return`${ze}${t.replace(/^\//,"")}`}const We=ge("vendor/tesseract/worker.min.js"),Ge=ge("vendor/tesseract/core"),He=ge("vendor/tesseract/lang");function $e(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,u,d;const 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((u=e.bbox)==null?void 0:u.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){ie(this,"worker",null);ie(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:We,corePath:Ge,langPath:He,workerBlobURL:!1,cacheMethod:De});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 u=await this.runRecognize(e,c);return o.detectLanguage&&(u.detectedLanguage=v(u.text)),{...u,requestedLanguage:r,languageFallbackUsed:c!==r}}catch(u){if(!$e(u))throw new Y("OCR_RECOGNITION_FAILED",`OCR failed: ${u instanceof Error?u.message:"unknown error"}`);a=u}}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 import("./index-TC7YGpMm.js").then(function(e){return e.i});return typeof t.createWorker!="function"?new be:new Ye(t)}catch{return new be}}const Ve="'Inter', 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif",Xe="'Noto Sans', 'Segoe UI', 'Arial Unicode MS', Arial, sans-serif",Qe="'Noto Sans', 'Inter', 'Segoe UI', 'Arial Unicode MS', Arial, sans-serif",Ze="'JetBrains Mono', 'Fira Code', 'Consolas', monospace",et="'Noto Sans Mono', 'JetBrains Mono', 'Consolas', monospace",tt="'Noto Sans Mono', 'JetBrains Mono', 'Fira Code', 'Consolas', monospace";function nt(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:Qe,recommendedMonospaceStack:tt}:n[0]==="cyrillic"?{requiredScripts:n,recommendedSansSerifStack:Xe,recommendedMonospaceStack:et}:{requiredScripts:n,recommendedSansSerifStack:Ve,recommendedMonospaceStack:Ze}}function fe(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 at(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,fe(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}
1for(const a of n)a.words.sort((i,s)=>i.bbox.x0-s.bbox.x0);return n}function ot(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,fe(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],u=t.words[s-1];u&&c.bbox.x0-u.bbox.x1>=r&&i(),a.push(c)}return i(),n.length<2?null:{cells:n,y0:t.y0,y1:t.y1}}function rt(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,fe(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 st(t){const o=t.cells.map(r=>r.text).filter(r=>r.length>=24).length;return t.cells.length===2&&o===2}function it(t){const e=at(t).map(a=>ot(a)).filter(a=>a!==null&&!st(a)),o=[];let r=[];const n=()=>
1{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(rt(i,a)){r.push(a);continue}n(),r.push(a)}return n(),o}function ct(t){return t.replace(/\|/g,"\\|").replace(/\n+/g," ").trim()}function lt(t){return t.map(e=>{const o=e.rows.map(i=>{const s=i.cells.slice(0,e.columns).map(c=>ct(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(`
2`)}).filter(Boolean).join(`
3
4`)}async function ut(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 $(t,e,o){return Math.min(o,Math.max(e,t))}async function ye(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 dt(){const[t,e]=await Promise.all([import("./noto-sans-latin-400-normal-DgXudELe.js"),import("./noto-sans-cyrillic-ext-400-normal-DaPpRN-b.js")]);return{latinUrl:t.default,cyrillicUrl:e.default}}function gt(t){return new RegExp("\\p{Script=Cyrillic}","u").test(t)}async function ft(t){const{PDFDocument:e,StandardFonts:o,rgb:r}=await import("./worker-entrypoint-Cpi_3YOf.js").then(function(d){return d.r}),n=await e.create();let a=await n.embedFont(o.Helvetica),i=a,s=a;try{if(typeof document<"u"){n.registerFontkit(Ie);const{latinUrl:d,cyrillicUrl:g}=await dt(),[l,f]=await Promise.all([ye(d),ye(g)]);i=await n.embedFont(l,{subset:!0}),s=await n.embedFont(f,{subset:!0})}}catch{}for(const d of t){const g=new Uint8Array(await d.imageBlob.arrayBuffer()),l=d.imageBlob.type,f=l==="image/png";if(!f&&!(l==="image/jpeg"||l==="image/jpg"))throw new Error(`Searchable PDF supports PNG/JPEG image pages, received: ${l||"unknown"}`);const h=f?await n.embedPng(g):await n.embedJpg(g),L=await ut(d.imageBlob),P=n.addPage([L.width,L.height]);P.drawImage(h,{x:0,y:0,width:L.width,height:L.height});for(const p of d.words){const x=$(p.bbox.x1-p.bbox.x0,1,L.width),m=$(p.bbox.y1-p.bbox.y0,1,L.height),A=$(p.bbox.x0,0,L.width-1),k=$(L.height-p.bbox.y1,0,L.height-1),j=$(m*.85,6,48);try{const O=gt(p.text)?s:i;P.drawText(p.text,{x:A,y:k,size:j,font:O,maxWidth:x,color:r(1,1,1),opacity:.02})}catch{}}}const c=await n.save(),u=new Uint8Array(c.byteLength);return u.set(c),new Blob([u],{type:"application/pdf"})}const xe=.85;async function mt(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 de(t,e,o){return Math.max(e,Math.min(o,t))}function pt(t,e,o){return .299*t+.587*e+.114*o}function ht(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 wt(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 l=0;l<t.length;l+=1)d+=t[l];d/=t.length;const g=de(d-6-r*8,32,224);for(let l=0;l<t.length;l+=1)n[l]=t[l]<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 l=1;l<=e;l+=1)g+=t[(d-1)*e+(l-1)],s[d*(e+1)+l]=s[(d-1)*(e+1)+l]+g}const c=de(Math.round(Math.min(e,o)/48),8,26),u=.1+r*.045;for(let d=0;d<o;d+=1){const g=Math.max(0,d-c),l=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)*(l-g+1),x=(s[(l+1)*(e+1)+(h+1)]-s[g*(e+1)+(h+1)]-s[(l+1)*(e+1)+y]+s[g*(e+1)+y])/L*(1-u);n[d*e+f]=t[d*e+f]<x?0:255}}return n}function bt(t,e,o){if(e<3||o<3)return;
4const 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 u=-1;u<=1;u+=1)for(let d=-1;d<=1;d+=1)d===0&&u===0||r[(n+u)*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 mt(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 u=c.getContext("2d",{willReadFrequently:!0});if(!u)return t;u.imageSmoothingEnabled=!0,u.imageSmoothingQuality=e==="aggressive"?"high":"medium",r.drawTo(u,i,s);const d=u.getImageData(0,0,i,s),g=d.data,l=new Uint8ClampedArray(i*s),f=new Uint32Array(256);let y=0;for(let m=0,A=0;m<g.length;m+=4,A+=1){const k=pt(g[m],g[m+1],g[m+2]);y+=k,l[A]=k,f[Math.round(k)]+=1}if(y/=Math.max(1,l.length),y<120)for(let m=0;m<l.length;m+=1)l[m]=255-l[m];const L=ht(f,l.length),P=Math.max(1,L.high-L.low);for(let m=0;m<l.length;m+=1){const A=(l[m]-L.low)*255/P;l[m]=de(A,0,255)}const p=wt(l,i,s,e==="aggressive"?1:0);e==="aggressive"&&bt(p,i,s);for(let m=0,A=0;m<g.length;m+=4,A+=1){const k=p[A];g[m]=k,g[m+1]=k,g[m+2]=k,g[m+3]=255}u.putImageData(d,0,0);let x=null;return typeof OffscreenCanvas<"u"&&c instanceof OffscreenCanvas?x=await c.convertToBlob({type:"image/jpeg",quality:xe}):"toBlob"in c&&typeof c.toBlob=="function"&&(x=await new Promise(m=>c.toBlob(m,"image/jpeg",xe))),x??t}catch{return t}}async function yt(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 ce(t){try{const{PDFDocument:e,PDFName:o}=await import("./worker-entrypoint-Cpi_3YOf.js").then(function(a){return a.r}),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),u=[];if(c&&typeof c.size=="function"&&typeof c.get=="function"){const g=Number(c.size());for(let l=0;l<g;l+=1)u.push(r.context.lookup(c.get(l)))}else u.push(c);const d=[];for(const g of u){if(!g||typeof g.getContents!="function")continue;const l=await yt(g.getContents());l&&d.push(...ve(l))}n.push(d.join(" ").trim())}return{text:n.join(`
5
6`).trim(),pageCount:r.getPageCount()}}catch{return null}}async function xt(t){var o;const e=new Uint8Array(await t.arrayBuffer());try{let r=null;const n=[()=>import("./pdf-CgeV8iME.js"),()=>import("./pdf-CE_K4jFx.js"),()=>import("./pdf-CE_K4jFx.js")];for(const u of n)try{const d=await u();if(d&&typeof d.getDocument=="function"){r=d;break}}catch{}if(!r)return ce(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 u=1;u<=i.numPages;u+=1){const l=((await(await i.getPage(u)).getTextContent()).items??[]).map(f=>
6typeof f.str=="string"?f.str:"").filter(Boolean);s.push(l.join(" "))}const c={text:s.join(`
7
8`).trim(),pageCount:i.numPages};return c.text.length>0?c:ce(e)}catch{return ce(e)}}async function Se(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 le(t,e,o){const[r,n]=await Promise.all([Se(e),Se(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 St=["eng","rus","ukr","deu","fra","spa","ita","por","jpn","chi_sim","hin","ara"],ae="eng",Ct="eng",Lt=1.25,kt=2,Ce=78,Le=40,At=6,Et=5;async function ue(t,e){const o=new Blob([e],{type:"text/plain"});return(await t.write(o)).id}function Mt(t){return t==="fast"?Lt:kt}function J(t,e=!1){return t==="fast"?"none":e?"aggressive":"balanced"}function Rt(t){const e=(t??"").trim().toLowerCase();if(!e)return ae;const o=e.split("+").map(n=>n.trim()).filter(Boolean),r=Array.from(new Set(o)).filter(n=>St.includes(n));return r.length===0?ae:r.join("+")}function ke(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("+")||ae}function Pt(t){const e=(t==null?void 0:t.languageMode)==="manual"?"manual":"auto",o=Rt(typeof(t==null?void 0:t.language)=="string"?t.language:ae),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 ne(t,e){return t.map(o=>{const r=e.detectTables?it(o.words):[],n=r.length>0?lt(r):"";return{text:e.detectTables&&n?e.preserveFormatting?[o.text.trim(),n].filter(Boolean).join(`
9
10`):[o.text.trim(),n.replace(/\|/g,"	").replace(/^\s*---.*$/gm,"").replace(/\n{3,}/g,`
11
12`).trim()].filter(Boolean).join(`
13
14`):o.text,words:o.words,tables:r}})}function T(t){const e=t.text.trim().length;return typeof t.confidence!="number"?e<Le:t.confidence<Ce?!0:t.confidence<Ce+5&&e<Le*2}function W(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 Ft(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 Bt=async({inputIds:t,options:e,fs:o,emitProgress:r})=>{var s,c,u,d;if(t.length===0)throw new Error("OCR PDF requires at least one input file");const n=Pt(e),a=[],i=await Ke();try{const g=async(l,f)=>{const y=await i.recognize(l,{language:f,detectLanguage:!0});return{text:y.text,confidence:y.confidence,usedLanguage:y.usedLanguage,languageFallbackUsed:y.languageFallbackUsed,words:y.words}};for(let l=0;l<t.length;l+=1){const f=(b,E)=>{Ft(r,l,t.length,b,E)};f(2);const y=await o.read(t[l]),h=await y.getBlob(),L=h.size,P=await y.getType();f(8);let p="";const x=n.languageMode==="manual"?n.language:Ct;let m=x,A=!1,k=!1,j=0;const O=[],K=new Set;let V=!1,D=v(""),G=[],U=[],oe=!1;if(P==="application/pdf"){const b=await xt(h),E=(b==null?void 0:b.text)??"",R=(E.match(new RegExp("\\p{L}","ug"))||[]).length,S=E.split(/\s+/).filter(Boolean).length;if(R>=100||R>=20&&S>=8)f(26),p=(b==null?void 0:b.text)??"",U=[{text:p,words:[],tables:[]}],D=v(p),oe=!0,f(78,{pageIndex:0,pageCount:1,completedPages:1,partialText:p,partialOutputId:await ue(o,p)});else{f(20),f(22);const C=await Ne();if(!C)throw new Y("OCR_PDF_RASTERIZER_MISSING","PDF OCR pipeline requires rasterizer integration (pdf.js -> image)");const N={scale:Mt(n.mode),imageFormat:"image/jpeg"},X=J(n.mode),F=[],Q=[],Z=[];let pe=!1,re=0;
14if(await C.forEachPage(h,N,async ee=>{const{pageIndex:w,pageCount:B,blob:H}=ee;f(24+w/Math.max(1,B)*14);const te=await q(H,X);Z.push(H),Q.push(te);let _;if(n.languageMode==="auto"&&!pe){const M=await g(te,x),se=v(M.text),I=ke(we(se),M.text);m=I,A=I!==x,pe=!0,_=I!==x?await g(te,I):M}else{const M=n.languageMode==="auto"?m:x;_=await g(te,M)}if(n.mode==="accurate"&&B>1&&T(_)&&re<At){const M=await q(H,J(n.mode,!0)),se=n.languageMode==="auto"?m:x,I=await g(M,se),Te=W(_);(W(I)>=Te+2||!T(I)&&T(_))&&(_=I,Q[Q.length-1]=M),k=!0,re+=1,j=re}F.push(_);const he=ne(F.map(M=>({text:M.text,words:M.words})),n).map(M=>M.text).join(`
15
16`),Fe=(w+1)%Et===0||w+1===B?await ue(o,he):void 0;f(38+(w+1)/Math.max(1,B)*50,{pageIndex:w,pageCount:B,completedPages:w+1,partialText:he,partialOutputId:Fe})})===0)p="";else{U=ne(F.map(w=>({text:w.text,words:w.words})),n),p=U.map(w=>w.text).join(`
17
18`);const ee=[];for(let w=0;w<Z.length;w+=1){const B=((s=F[w])==null?void 0:s.words)??[],H=await le(B,Q[w],Z[w]);ee.push({imageBlob:Z[w],words:H})}G=ee,D=v(p);for(const w of F)K.add(w.usedLanguage),typeof w.confidence=="number"&&O.push(w.confidence),V||(V=w.languageFallbackUsed)}}}else{const b=await q(h,J(n.mode)),E=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 z=v(S.text);m=ke(we(z),S.text);let C=m!==x?await g(b,m):S;if(A=m!==x,n.mode==="accurate"&&T(C)){const X=await q(h,J(n.mode,!0)),F=await g(X,m);(W(F)>=W(C)+2||!T(F)&&T(C))&&(C=F,R=X),k=!0,j=1,f(72)}f(80),U=ne([{text:C.text,words:C.words}],n),p=((c=U[0])==null?void 0:c.text)??C.text;const N=await le(C.words,R,E);G=[{imageBlob:E,words:N}],D=v(p),K.add(C.usedLanguage),typeof C.confidence=="number"&&O.push(C.confidence),V=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);(W(N)>=W(S)+2||!T(N)&&T(S))&&(S=N,R=C),k=!0,j=1,f(70)}f(80),U=ne([{text:S.text,words:S.words}],n),p=((u=U[0])==null?void 0:u.text)??S.text;const z=await le(S.words,R,E);G=[{imageBlob:E,words:z}],D=v(p),K.add(S.usedLanguage),typeof S.confidence=="number"&&O.push(S.confidence),V=S.languageFallbackUsed}f(88,{pageIndex:0,pageCount:1,completedPages:1,partialText:p,partialOutputId:await ue(o,p)})}const Ae=nt(p,D),Ee=O.length>0?Number((O.reduce((b,E)=>b+E,0)/O.length).toFixed(2)):null,me={sourceFileId:y.id,sourceMime:P,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"?A:!1,lowConfidenceRetryApplied:k,lowConfidenceRetryCount:j,usedLanguages:Array.from(K),averageConfidence:Ee,languageFallbackUsed:V,usedEmbeddedText:oe},languageDetection:D,fontSupport:Ae,recognizedText:p,pages:U.map((b,E)=>({index:E,text:b.text,tables:b.tables.map(R=>({columns:R.columns,rows:R.rows.map(S=>S.cells.slice(0,R.columns).map(z=>z.text))}))}))},Me=new Blob([me.recognizedText],{type:"text/plain"}),Re=n.outputFormat==="searchable-pdf"?await(async()=>{if(oe&&P==="application/pdf")return h;if(G.length===0)throw new Error("Cannot create Searchable PDF: no page layers available from OCR");try{return await ft(G)}catch(b){throw new Error(`Failed to build Searchable PDF: ${b instanceof Error?b.message:"unknown error"}`)}})():n.outputFormat==="json"?new Blob([JSON.stringify(me,null,2)],{type:"application/json"}):Me;f(92);const Pe=await o.write(Re);a.push(Pe.id),f(100)}return{outputIds:a}}finally{await((d=i.terminate)==null?void 0:d.call(i))}};export{Bt 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.