zhengyiming
17 小时以前 745f1e2ee7072731611391b89c5c0020783828bf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { BoleOss, Message } from '@bole-core/core';
import { RichEditorUtils } from '@bole-core/components';
import { OssManager } from '../oss';
import { ElLoading } from 'element-plus';
 
pdfjsLib.GlobalWorkerOptions.workerSrc =
  'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.worker.js';
 
export async function resolvePdfByUrl(url: string) {
  let pdf = await pdfjsLib.getDocument(url).promise;
 
  return pdf;
}
 
export type ConvertPdfToImageItem = BoleOss.PutObjectResult & {
  width: number;
  height: number;
};
 
export async function convertPdfToImage(pdfUrl: string) {
  let loadingInstance: ReturnType<typeof ElLoading.service>;
  try {
    loadingInstance = ElLoading.service({
      fullscreen: true,
      lock: false,
      background: 'transparent',
    });
    const pdf = await resolvePdfByUrl(pdfUrl);
    let tasks: Promise<ConvertPdfToImageItem>[] = [];
    for (let i = 0; i < pdf.numPages; i++) {
      const page = await pdf.getPage(i + 1);
      const viewport = page.getViewport({ scale: 1 });
      tasks.push(
        new Promise(async (resolve, reject) => {
          try {
            let base64 = await generateBase64ByPage(page);
            let file = RichEditorUtils.base64ToFile(base64);
            let res = await OssManager.asyncUpload({
              file: file,
            });
            resolve({
              ...res,
              width: viewport.width,
              height: viewport.height,
            });
          } catch (error) {
            reject(error);
          }
        })
      );
    }
    return Promise.all(tasks);
  } catch (error) {
    Message.errorMessage(error);
    throw new Error(error);
  } finally {
    if (loadingInstance) {
      loadingInstance.close();
    }
  }
}
 
async function generateBase64ByPage(page) {
  const viewport = page.getViewport({ scale: 1 });
  let canvas = document.createElement('canvas');
  const context = canvas.getContext('2d');
  canvas.height = viewport.height;
  canvas.width = viewport.width;
  const renderContext = {
    canvasContext: context,
    viewport: viewport,
  };
  await page.render(renderContext).promise;
  let base64 = canvas.toDataURL('image/png');
  canvas = null;
  return base64;
}