<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      ……

      js vue中pdf與img互轉(zhuǎn)

      Posted on 2023-12-01 15:22  WALL*E  閱讀(382)  評論(0)    收藏  舉報

      需要 npm install vue-pdfnpm install pdfjs-dist,新建js文件 pdtToImg.js:

      import pdf from "vue-pdf";
      import JsPDF from 'pdfjs-dist';
      const PDFJS = require('pdfjs-dist/build/pdf.js'); // import 會報錯
      window.pdfjsWorker=require('pdfjs-dist/build/pdf.worker') 
      import { changeUrl } from "./changeUrl";//同目錄下新建changeUrl.js文件
      export function pdf_canvas(file,type,fileForm){
        // pdf轉(zhuǎn)canvas
        const onloadFile = {};
        const canvasArr = [];
        let numPages = 0;
        changeUrl(file,type,fileForm + '_url').then(perfix64 => {
          const CMAP_URL = "https://unpkg.com/pdfjs-dist@2.0.943/cmaps/";
          const src = pdf.createLoadingTask({
            url: perfix64,
            withCredentials: false,
            cMapUrl: CMAP_URL,
            cMapPacked: true
          });
          src.promise.then(pdf => {
            for(let i = 1,l = pdf.numPages; i <= l; i++) {
              numPages = pdf.numPages;
              pdf.getPage(i).then((page) => {
                const canvas = document.createElement("canvas");
                const ctx = canvas.getContext('2d');
                const viewport = page.getViewport({ scale: 1.5 });
                canvas.height = viewport.height;
                canvas.width = viewport.width;
                canvas.style.width = viewport.width + 'px';
                canvas.style.height = viewport.height + 'px';
                page.render({
                  canvasContext: ctx,
                  viewport,
                });
                canvasArr.push(canvas);
                if(numPages == i){
                  onloadFile.Callback ? onloadFile.Callback(canvasArr) : '';
                }
              });
            }
          })
          .catch(err => {
            console.error("pdf 加載失敗", err);
          });
        });
        return onloadFile
      }
      export function pdf_img(file,type,fileForm){
        // pdf轉(zhuǎn)img
        const onloadFile = {};
        const imgList = [];
        const canvas = pdf_canvas(file,type,fileForm);
        canvas.Callback = function (canvasArr){
          setTimeout(() => {
            for(let i = 0 ;i < canvasArr.length;i++){
              imgList.push(canvasArr[i].toDataURL("image/png"));
            }
            onloadFile.Callback ? onloadFile.Callback(imgList) : '';
          },1000);
        }
        console.log(imgList,'onloadFileonloadFileonloadFile')
        return imgList;
      }
       
      export function img_canvas(file,fileForm){
        // img轉(zhuǎn)canvas
        const onloadFile = {};
        changeUrl(file,fileForm,fileForm + '_url').then(url => {
          const img = new Image();  //創(chuàng)建一個臨時存儲
          img.src = url //將圖片數(shù)據(jù)賦值即可
          img.onload = function(){  //定義加載圖片后彈出顯示
            const canvas = document.createElement("canvas");
            canvas.width = img.width;
            canvas.height = img.height;
            this.ctx = canvas.getContext("2d");
            this.ctx.drawImage(img,0,0,img.width,img.height);
            onloadFile.Callback ? onloadFile.Callback(canvas) : '';
            img.remove();
          };
        })
        return onloadFile;
      }
       
      export function img_pdf(file,fileForm){
        // img轉(zhuǎn)pdf
        const onloadFile = {};
        const canvas = img_canvas(file,fileForm);
        canvas.Callback = function(canvas){
          const base64pdf = canvas_pdf(canvas);
          onloadFile.Callback ? onloadFile.Callback(base64pdf) : '';
        }
        return onloadFile;
      }
       
      export function canvas_pdf(canvas){
        // canvas轉(zhuǎn)pdf
        const canvasUrl = canvas.toDataURL('image/jpeg');
        const pdf = new JsPDF('x', 'px', [canvas.width, canvas.height]);
        pdf.addImage(canvasUrl, 'PNG', 0, 0, canvas.width, canvas.height);
        let base64pdf = pdf.output('datauristring');
        base64pdf = base64pdf.replace('data:application/pdf;filename=generated.pdf;base64,', 'data:application/pdf;base64,');
        return base64pdf;
      }
      

      changeUrl.js文件:

      const fileType = {
        "pdf":{
            type:"application/pdf;charset=utf-8",// 文件轉(zhuǎn)換類型
            base64Type:"data:application/pdf;base64,",// base64前綴
        },
        "img":{
            // img適用所有通用圖片格式
            type:"image/png",
            base64Type:"data:image/png;base64,",
        },
        "gif":{
            type:"image/gif",
            base64Type:"data:image/gif;base64,",
        },
        "doc":{
            type:"application/msword",
            base64Type:"data:application/msword;base64,"
        },
        "docx":{
            type:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
            base64Type:"data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,"
        },
        "xls":{
            type:"application/vnd.ms-excel",
            base64Type:"data:application/vnd.ms-excel;base64,"
        },
        "xlsx":{
            type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            base64Type:"data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,"
        },
        "ppt":{
            type:"application/vnd.ms-powerpoint",
            base64Type:"data:application/vnd.ms-powerpoint;base64,"
        },
        "pptx":{
            type:"application/vnd.openxmlformats-officedocument.presentationml.presentation",
            base64Type:"data:application/vnd.openxmlformats-officedocument.presentationml.presentation;base64,"
        },
        "txt":{
            type:"text/plain",
            base64Type:"data:text/plain;base64,"
        },
      };
      let files,types,changeTypes;
      
      // file 附件
      // type 文件類型(img,pdf)
      // changeType 附件轉(zhuǎn)換類型(base64 blob url),三者互轉(zhuǎn)(列如:base64_url)
      export async function changeUrl(file,type,changeType) { 
        if(!file || !type || !changeType || !fileFun[changeType]) {
            return file;
        }
        files = file;
        types = type;
        changeTypes = changeType;
        const fileWj = await fileFun[changeType](file);
        return fileWj;
      }
      function base64_url(file){
        // base64轉(zhuǎn)url
        const blob = base64_blob(file);
        return window.URL.createObjectURL(blob);
      }
      function base64_blob(file){
        // base64轉(zhuǎn)blob
        const arr = file.split(",");
        const mime = arr[0].match(/:(.*?);/)[1];
        const bstr = atob(arr[1]);
        let n = bstr.length;
        const u8arr = new Uint8Array(n);
        while (n--) {
            u8arr[n] = bstr.charCodeAt(n);
        }
        return new Blob([u8arr], { type: mime });
      }
      function blob_url(file){
         // blob轉(zhuǎn)url
        const blob = new Blob([file], {type: fileType[types].type});
        return URL.createObjectURL(blob);
      }
      function blob_base64(file){
        // blob轉(zhuǎn)base64
        return new Promise((resolve) => {
            const reader = new FileReader();
            reader.readAsDataURL(file);
            reader.onload = () => {
                const arr = reader.result.split(",");
                resolve(fileType[types].base64Type + arr[1]);
            };
        });
      }
      async function url_blob(url) {
        // url轉(zhuǎn)blob
        return new Promise((resolve) => {
            const xhr = new XMLHttpRequest();
            xhr.open('GET',url,true);
            xhr.responseType = 'blob';
            xhr.onload = function(e) {
                const myBlob = this.response;
                // let files = new window.File([myBlob], myBlob.type, {type:myBlob.type}) // myBlob.type 自定義文件名
                resolve(myBlob);
            };
            xhr.send();
        })
      }
      async function url_base64(url){
        // url轉(zhuǎn)base64
        const blob = await url_blob(url);
        return new Promise((resolve) => {
            blob_base64(blob).then(res => {
                resolve(res);
            });
        })
      }
      
      const fileFun = {
        "base64_url":base64_url,
        "blob_url":blob_url,
        "base64_blob":base64_blob,
        "blob_base64":blob_base64,
        "url_blob":url_blob,
        "url_base64":url_base64,
      }
      

      頁面使用: this.urlList = pdf_img('data:application/pdf;base64,' + res.data.pdf_base64,'pdf','base64');
      接收較慢可能是轉(zhuǎn)換慢 通過使用setTimeout再次獲取到setTimeout(()=>{ this.url = this.urlList},2000)

      主站蜘蛛池模板: 国产毛片三区二区一区| 蜜臀视频在线观看一区二区| 亚洲人成电影在线天堂色| 在线人人车操人人看视频| 亚洲色婷婷综合久久| 综合激情亚洲丁香社区| 久久亚洲国产品一区二区| 久久久久国产一级毛片高清版A | 中文字幕一区二区人妻电影| 老司机精品成人无码AV| 丁香五月亚洲综合深深爱| 在线视频一区二区三区色| 精品日韩人妻中文字幕| 粉嫩国产一区二区三区在线| 丰满高跟丝袜老熟女久久| 97人妻免费碰视频碰免| 国产91精品调教在线播放| A男人的天堂久久A毛片| 国产在线精品中文字幕| 人妻精品动漫h无码| 国产99视频精品免费视频6| 国产性色av高清在线观看| 国产精品日韩深夜福利久久| 国产精品中文字幕综合| 欧美野外伦姧在线观看| 国产激情无码一区二区三区| 欧美极品色午夜在线视频| 丰满熟妇人妻中文字幕| 亚洲av本道一区二区| 象山县| 国精品91人妻无码一区二区三区| 久久人人爽人人爽人人av| 亚洲综合色婷婷中文字幕| 久久精产国品一二三产品| 午夜天堂av天堂久久久| 国产黄色一区二区三区四区| 久久综合亚洲色一区二区三区| 亚洲欧洲美洲在线观看| 成人午夜污一区二区三区| 国产高潮刺激叫喊视频| 毛片亚洲AV无码精品国产午夜|