pdfjs-dist预览pdf文件

pdfjs-dist预览pdf

<template>
  <div class="view">
    <template v-for="item in pageNum" :key="item">
      <canvas :id="`pdf-canvas-${item}`" class="pdf-page" />
    </template>
  </div>
  <!-- <div class="footer">
    <Button color="#006BE1" type="primary" @click="downLoadPDF" class="btn">
      下载文件
    </Button>
  </div> -->
</template>

<script setup lang="ts">
import { reactive, toRefs, nextTick, watchEffect, defineProps } from "vue";
//@ts-ignore
import * as pdfjs from "pdfjs-dist";
//@ts-ignore
import pdfjsWorker from "pdfjs-dist/build/pdf.worker.entry";
import { Toast, Button } from "vant";
// import { downloadFile } from "@/utils";
pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;
const props = defineProps({
  url: { type: String, default: "" }, // pdf文件路径
});

const emit = defineEmits(["onRendered"]);
const state = reactive<any>({
  pageNum: 0,
  pdfCtx: null,
});

const resolvePdf = (url: string) => {
  const loadingTask = pdfjs.getDocument(url);
  loadingTask.promise.then((pdf: any) => {
    state.pdfCtx = pdf;
    state.pageNum = pdf.numPages;
    nextTick(() => {
      renderPdf();
    });
  });
};

const renderPdf = (num = 1) => {
  state.pdfCtx.getPage(num).then((page: any) => {
    const canvas: any = document.getElementById(`pdf-canvas-${num}`);
    const ctx = canvas.getContext("2d");
    const viewport = page.getViewport({ scale: 1 });
    // 画布大小,默认值是width:300px,height:150px
    canvas.height = viewport.height;
    canvas.width = viewport.width;
    // 画布的dom大小, 设置移动端,宽度设置铺满整个屏幕
    const clientWidth = document.body.clientWidth;
    canvas.style.width = clientWidth + "px";
    // 根据pdf每页的宽高比例设置canvas的高度
    canvas.style.height =
      clientWidth * (viewport.height / viewport.width) + "px";
    page.render({
      canvasContext: ctx,
      viewport,
    });
    if (num < state.pageNum) {
      renderPdf(num + 1);
    } else {
      emit("onRendered");
      Toast.clear(); // 取消加载loading
    }
  });
};

watchEffect(() => {
  if (props.url) {
    // 展示加载loading
    Toast.loading({
      message: "加载中...",
      overlay: true,
      forbidClick: true,
      duration: 0,
    });

    resolvePdf(props.url);
  }
});

const { pageNum, pdfCtx } = toRefs(state);
</script>
<style scoped>
 .view {
  padding-bottom: 1.5rem;
}
.footer {
  position: fixed;
  bottom: 0;
  width: 100%;
  padding: 0.16rem 0.4rem 0.6rem;
  display: flex;
  align-items: center;
  height: 1.5rem;
  box-shadow: 0px -1px 0px rgba(49, 69, 106, 0.164254);
  background-color: #fff;
}
.btn {
  width: 100%;
}
.van-button {
  border-radius: 0.1rem;
} 
</style>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 `pdfjs-dist` 库来预览 PDF 文件流。首先,确保你已经安装了该库的依赖项。然后,按照以下步骤进行操作: 1. 导入 `pdfjs-dist` 库: ```javascript import * as pdfjsLib from 'pdfjs-dist'; ``` 2. 创建一个用于渲染 PDF 的容器元素: ```html <div id="pdf-container"></div> ``` 3. 获取 PDF 文件的字节数组(文件流),并将其转换为 `Uint8Array` 类型: ```javascript const pdfData = /* 从服务器或其他地方获取的文件流 */; const pdfDataArray = new Uint8Array(pdfData); ``` 4. 加载 PDF 文件: ```javascript const loadingTask = pdfjsLib.getDocument({ data: pdfDataArray }); loadingTask.promise.then((pdf) => { // PDF 加载完成后的处理逻辑 }).catch((error) => { // 处理加载失败的情况 }); ``` 5. 在加载完成后,你可以选择渲染 PDF 的特定页码或全部页码。以下示例渲染了第一页: ```javascript pdf.getPage(1).then((page) => { const scale = 1.5; const viewport = page.getViewport({ scale }); const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; const renderContext = { canvasContext: context, viewport, }; page.render(renderContext).promise.then(() => { document.getElementById('pdf-container').appendChild(canvas); }); }); ``` 这样,你就可以将 PDF 文件预览在指定的容器元素中了。请注意,这只是一个简单的示例,你可以根据需要进行自定义和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值