当前位置: 首页 > article >正文

纯前端实现将pdf转为图片(插件pdfjs)

需求来源

预览简历功能在移动端,由于用了一层iframe把这个功能嵌套在了app端,再用一个iframe来预览,只有ios能看到,安卓就不支持,查了很多资料和插件,原理基本上都是用iframe实现的。最终转换思路,将pdf下载转为图片然后绘制到canvans中也是一样的效果。

实现步骤

先安装pdfjs插件,插件开源免费
官网:
https://github.com/mozilla/pdf.js

在vue或react项目中使用
https://github.com/mozilla/pdf.js/wiki/Setup-pdf.js-in-a-website

npm install pdfjs-dist --save

**安装完后一定要去看使用示例**

在这里插入图片描述
上面几步完成后就完成80%了,剩下的就是把图片绘制到canvans了

这里我直接贴源码了,注意一点,官方的示例中没有import 'pdfjs-dist/build/pdf.worker.mjs'; 这一段导入,会有一个报错
在这里插入图片描述
gihub上有解释
https://github.com/mozilla/pdf.js/issues/10478
在这里插入图片描述

<template>
  <div ref="showpdfRef"></div>
</template>

<script setup>
import { ref } from 'vue';
import { getDocument } from 'pdfjs-dist/legacy/build/pdf.mjs';
import 'pdfjs-dist/build/pdf.worker.mjs';

const showpdfRef = ref(null);

const pdfPath ='xxxxxxxx'

const loadingTask = getDocument(pdfPath);
loadingTask.promise
  .then(async (pdf) => {
    const canvas = document.createElement('canvas');
    const context = canvas.getContext('2d');
    // 循环遍历每一页pdf,将其转成图片
    for (let i = 1; i <= pdf._pdfInfo.numPages; i++) {
      // 获取pdf页
      const page = await pdf.getPage(i);
      // 获取页的尺寸
      const viewport = page.getViewport({ scale: 1 });
      // 设置canvas的尺寸
      canvas.width = viewport.width;
      canvas.height = viewport.height;
      // 将pdf页渲染到canvas上
      await page.render({ canvasContext: context, viewport: viewport }).promise;
      // 将canvas转成图片,并添加到页面上
      const img = document.createElement('img');
      img.src = canvas.toDataURL('image/png');
      showpdfRef.value.appendChild(img);
    }
   
  })
  .then(
    function () {
      console.log('# End of Document');
    },
    function (err) {
      console.error('Error: ' + err);
    },
  );
</script>

<style scoped></style>

最终效果:
在这里插入图片描述


http://www.kler.cn/a/460492.html

相关文章:

  • 物联网开发利器:基于web的强大的可拖拽组态软件
  • springboot集成qq邮箱服务
  • Linux -- 单例模式
  • DevOps工程技术价值流:Ansible自动化与Semaphore集成
  • Wireshark和科来网络分析系统
  • 重装操作系统后 Oracle 11g 数据库数据还原
  • 优化大肠杆菌菌株和发酵工艺以提高L-赖氨酸生产-文献精读94
  • 如何修复 WordPress 中的“Error establishing a database connection”问题
  • DeepSeek-V3-Base 模型技术解析
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之10 方案再探:特定于领域的模板 之1 随想交流
  • 口语笔记——感官+花费
  • MySQL数据库的锁
  • ubuntu 使用samba与windows共享文件[注意权限配置]
  • 留学生该如何进行文学分析类的essay写作
  • 分析电控发动机常见故障原因
  • vue使用el-select下拉框自定义复选框
  • IDEA修改编译版本
  • [2025] 如何在 Windows 计算机上轻松越狱 IOS 设备
  • 什么是 GPT?Transformer 工作原理的动画展示
  • TP 钱包插件版本的使用
  • 假设与思想实验:我们能否编写具有感知基础的人工智能形式来保护人类?
  • 数据库中的锁应用
  • SwiftUI:多语言实现富文本插值
  • DeepSeek:AI 领域的新兴力量
  • phpIPAM容器化部署场景下从1.5.x更新到1.7.0提示禁用安装脚本配置的处理
  • Cesium 实战 27 - 三维视频融合(视频投影)