@pardnchiu/pdf2image
Version:
pdf2image is a lightweight JavaScript library to convert PDF pages into images (PNG, JPG, WebP) with real-time progress tracking and optional ZIP compression.
2 lines (1 loc) • 3.2 kB
JavaScript
!function(){const e="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.min.js",t="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.worker.min.js",s="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.min.js",n=document,a=Promise,r=setTimeout,o=console,l=navigator,c="createElement",p="setAttribute",d="appendChild",h="script",f="link",m="head",u="body",g="href",w="dataset",j="percent",y="remove",b="file",v="width",x="height",D="catch",M="then",$="promise",k="error",z="message",P="numPages",L="length",T="type",U="replace",A="push",C="slice",F="innerText",R="prepare",E="process",O=l.language||l.userLanguage,S=/^zh/i.test(O);(()=>{for(let e of["https://cdnjs.cloudflare.com"]){let t=n[c](f);t[p]("rel","preconnect"),t[g]=e,n[m][d](t)}for(let a of[e,t,s]){let e=n[c](f);e[p]("rel","preload"),e[p]("as",h),e[g]=a,n[m][d](e)}for(let t of[e,s]){let e=n[c](h);e.src=t,n[m][d](e)}let a=n[c](f);a[p]("rel","stylesheet"),a[g]="https://cdn.jsdelivr.net/npm/@pardnchiu/pdf2image@latest/dist/pdf2image.css",n[m][d](a)})();class W{constructor(){const e=n[c]("div");e.className="pdf2image-loading",e[w][j]=0;const t=n[c]("p");return t[F]=this.#e(),e[d](t),this[u]=e,this}percent(e,t,s){const n=Math.round(e/t*100);this[u][w][j]=n,this[u].children[0][F]=this.#e(n,s)}remove(){this[u][y]()}#e(e=0,t){return{zh:{[R]:"準備壓縮檔 ",[E]:"解析中 "},en:{[R]:"Preparing zip ",[E]:"Processing "}}[S?"zh":"en"][t?R:E]+e+"%"}}window.pdf2image=class{#t;#s;#n;#a;#i=[];constructor(e={}){this.#t=(e.filename||"").trim()[U](/\.pdf/,""),this.#s=e[b],this.#n={png:1,jpg:1,webp:1}[e[T]]?e[T]:"jpg",this.#a=e.scale||1.5}get images(){return this.#i}convert(){return new a(((e,s)=>{pdfjsLib.GlobalWorkerOptions.workerSrc=t,pdfjsLib.getDocument({data:new Uint8Array(this.#s),cMapUrl:"//cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/cmaps/",cMapPacked:!0,useWorkerFetch:!0,verbosity:0})[$][M]((async t=>{const s=new W;n[u][d](s[u]);try{const i=[],o=t[P];let l=0;for(let e=1;e<=t[P];e++)i[A]((async()=>{const a=await t.getPage(e),i=a.getViewport({scale:this.#a}),r=n[c]("canvas");r[v]=i[v],r[x]=i[x];const p=r.getContext("2d");await a.render({canvasContext:p,viewport:i})[$];const d=r.toDataURL(`image/${this.#n}`);this.#i[A](d),l+=1,s[j](l,o)})());await a.all(i),r((t=>{e(this.#i),s[y]()}),500)}catch(e){throw s[y](),new Error(`${k} Page ${i} ${e[z]}`)}}))[D]((e=>{o[k](k,e),s(`${k} ${e[z]}`)}))}))}#r(e){const t=new Date;return e[U](/yyyy|MM|DD|hh|mm/g,(e=>({yyyy:t.getFullYear(),MM:("0"+(t.getMonth()+1))[C](-2),DD:("0"+t.getDate())[C](-2),hh:("0"+t.getHours())[C](-2),mm:("0"+t.getMinutes())[C](-2)}[e])))}async download(){if(null==this.#s)return;this.#i[L]<1&&await this.convert();const e=new W;return n[u][d](e[u]),new a(((t,s)=>{const a=new JSZip,i=this.#r(this.#t);for(let e=0;e<this.#i[L];e++){const t=`${i} ${e}.`+this.#n,s=this.#i[e].split(",")[1];a[b](t,s,{base64:!0})}a.generateAsync({[T]:"blob",streamFiles:!0},(t=>{e[j](t[j],100,!0)}))[M]((s=>{const a=n[c]("a");a[g]=URL.createObjectURL(s),a.download=`${i}.zip`,n[u][d](a),r((s=>{t(),a.click(),a[y](),e[y]()}),500)}))[D]((e=>{o[k](k,e),s([])}))}))}}}("undefined"==typeof window?window={}:window);export const pdf2image = window.pdf2image;