vue-pdf-embed预览PDF

一、vue-pdf-embed

链接:Yarn

1、安装插件

npm install vue-pdf-embed

2、文件中引入(分页效果已实现,样式请自行修改)

<template>
	<div class="download-pdf-preview" style="height: 450px; border:10px solid #D4D4D7;overflow: hidden; overflow-y: scroll">
		<!-- <vue-pdf-app style="height: 430px;" :pdf="pdfURL"></vue-pdf-app> -->
		<vue-pdf-embed ref="morePDF" :source="pdfURL" :page="currentPage" ></vue-pdf-embed>
	    <div class="ins-pdf-button-box">
			<span @click.stop="prePage">上一页</span>
			<span>{{currentPage}}/{{pages}}</span>
			<span @click.stop="nextPage">下一页</span>
		</div>
    </div>
	<div style="text-align: right; margin-top: 10px;">
		<Button type="text" v-if="back" style="color: #FF7D48; width: 100px;" @click="handleBack()">返回列表</Button>
		<Button style="color: #FF7D48; width: 100px; border-color: #FF7D48;" @click="handleDownload()">下载</Button>
	</div>
</template>

<script>
import {downloadBlob,base64ToBlob,blobToUrl} from '@/utils/index.js'
import VuePdfEmbed from "vue-pdf-embed"

export default {
	components: {
		VuePdfEmbed
	},
	emits : ['on-back'],
	props : {
		info : {
			type : Object,
			default : {}
		},
		back : {
            type:Boolean,
            default : false
        }
	},
	data(){
		return {	
	       pdfURL : ''	,//PDF URL
		   pages: [],
           numPages : 0,		//分页
		   currentPage : 1, //当前显示页数
		}
	},
	computed : {
		
	},
	watch: {
		info : {
			handler(data) {
				if(data?.base64Str){
					const blob = base64ToBlob(data.base64Str);  
	                this.pdfURL= blobToUrl(blob)
				}
			},
			deep: true,
			immediate: true
        }
	},
	methods : {
		//返回列表
		handleBack(){
			this.$emit('on-back')
		},
		//下载
		handleDownload(){
			downloadBlob(this.pdfURL,this.info.fileName)
		},
		async getPDFnums(url) {
			const page = await VuePdfEmbed.getDocument(url).promise
            this.pages = page.numPages
			this.currentPage = 1
		},
        // 上一页
		prePage() {
			var page = this.currentPage
			page = page > 1 ? page - 1 : this.numPages
			this.currentPage = page
		},

		// 下一页
		nextPage() {
			var page = this.currentPage
			page = page < this.numPages ? page + 1 : 1
			this.currentPage = page
		}
	},
	created(){
	},
	mounted () {
	}
}	
</script>

<style>
</style>

3、插件支持PDF地址,base64或二进制数据需要生成PDF地址

// PDF base64 转地址
export function base64ToBlob(base64Data){
    const binary = atob(base64Data);  
    const len = binary.length;  
    const buffer = new Uint8Array(len);  
    for (let i = 0; i < len; i++) {  
        buffer[i] = binary.charCodeAt(i);  
    }  
    return new Blob([buffer], { type: 'application/pdf' });  
}

// PDF base64 转地址
export function blobToUrl(blob) {  
    return URL.createObjectURL(blob);  
}

4、插件支持预览CA电子签名及腾讯电子签名,可兼容PC和移动端的PDF预览。 

注意:如果安装完毕并正确引用后无法加载PDF文件,且控制台无报错原因,请降低改插件的版本例:1.2.1

### 如何在HTML前端通过`<embed>`标签正确加载和展示PDF文档 为了在HTML页面上使用 `<embed>` 标签来加载并展示PDF文件,可以按照以下方法实现: #### 使用 `<embed>` 标签的基本结构 以下是 `<embed>` 标签用于加载PDF文件的标准写法: ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Embed PDF 示例</title> </head> <body> <!-- 嵌入PDF --> <embed src="example.pdf" type="application/pdf" width="600px" height="400px"> <!-- 如果浏览器不支持,则显示此内容 --> <p>您的浏览器可能无法直接查看PDF文件,请<a href="example.pdf">点击这里下载</a>.</p> </body> </html> ``` 上述代码中包含了几个重要属性: - `src`: 定义要嵌入的PDF文件路径[^3]。 - `type`: 指定文件的内容类型,在这里是 `"application/pdf"` 表明这是一个PDF文件。 - `width` 和 `height`: 设置嵌入对象的宽度和高度,通常以像素为单位[^2]。 如果用户的浏览器不具备内置PDF阅读器功能或者该功能被禁用,那么会跳过 `<embed>` 的部分而渲染其内部替代文本或链接。 #### 考虑跨平台兼容性和用户体验优化 虽然现代主流浏览器普遍支持直接预览PDF文件,但在某些情况下仍需注意一些细节问题: 1. **确保服务器配置正确**: 对于远程URL地址指向的PDF资源,确认Web服务器已设置正确的MIME类型响应头 (`Content-Type: application/pdf`) ,以便客户端能够识别所请求的是一个PDF文件。 2. **提供备用方案**: 当目标设备上的软件环境不足以满足即时浏览需求时(比如移动设备),应向用户提供其他访问方式,例如提示他们保存副本至本地再打开[^4]。 3. **调整大小适应不同屏幕尺寸**: 可利用CSS媒体查询技术动态改变嵌套区域参数,从而让最终效果更加友好地适配各种终端条件下的视觉呈现。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值