vue3+pdf.js实现pdf预览(pdfjs部署到线上也能运行)

vue3使用pdf.js实现pdf预览

前言

高版本的pdf.js本地运行没有问题,但是部署到线上会报错

Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.

经研究发现是由于nginx无法识别mjs文件,从而在http header中错误的使用 Content-Type:application/octet-stream 来传输mjs文件,导致浏览器端认为它不是一个合法的js脚本

解决办法

  • 1.编辑nginx的MIME type文件,修改对应的MIME type与mjs的映射,涉及到服务器知识,并且如果进行docker部署啥的,改起来比较麻烦
  • 2.较低pdf.js的版本,低版本的文件里没有.mjs格式的文件

这里我们使用第二种办法

下载插件

通过网盘分享的文件:DPFjs.zip
链接: https://pan.baidu.com/s/1LbFpLpqJsw8S5GFN5q70Fw?pwd=6666 提取码: 6666

解压后,将其复制到我们的vue项目中:public/pdfjs

在这里插入图片描述

解决跨域

进入到pdfjs/web/viewer.js,全局搜索并注释掉下面的代码

  // if (origin !== viewerOrigin && protocol !== "blob:") {
  //   throw new Error("file origin does not match viewer's");
  // }

组件封装

<script setup lang="ts">
import { ref } from 'vue';

const pdfUrl = ref(''); // pdf文件地址
const fileUrl = '/pdfjs/web/viewer.html?file='; // pdfjs文件地址,这里因为我们放到了public文件夹下面,所以直接/开头,如果你将下载的文件放到了其他位置,这个位置也要变化

let visible = ref(false);


const openDialog = (url: string) => {
	visible.value = true;
	nextTick(() => {
		pdfUrl.value = fileUrl + encodeURIComponent(url);
	})
};

// 暴露变量
defineExpose({
	openDialog,
});
</script>

<template>
	<el-dialog
		:close-on-click-modal="false"
		title="图纸预览"
		draggable
		width="80%"
		v-model="visible">
		<div class="container">
			<iframe :src="pdfUrl" width="100%" height="100%"></iframe>
		</div>
	</el-dialog>
</template>

<style scoped lang="scss">
.container {
	width: 100%;
	height: 700px;
}
</style>

使用

let PDFSrc = ref();  // pdf地址

const handlePreview = (url: string) => {
    pdfViewerRef.value.openDialog(PDFSrc.value);
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值