vue 实现pdf预览
实现PDF预览的方法
在Vue中实现PDF预览可以通过多种方式完成,常见的方法包括使用第三方库或原生HTML5的<embed>或<iframe>标签。以下是几种常见实现方式:
使用PDF.js库
PDF.js是Mozilla开发的一个开源库,可以直接在浏览器中渲染PDF文件,无需插件。
安装PDF.js:
npm install pdfjs-dist
在Vue组件中使用:
<template>
<div>
<canvas ref="pdfCanvas"></canvas>
</div>
</template>
<script>
import * as pdfjsLib from 'pdfjs-dist';
export default {
props: {
pdfUrl: {
type: String,
required: true
}
},
mounted() {
this.renderPDF();
},
methods: {
async renderPDF() {
const loadingTask = pdfjsLib.getDocument(this.pdfUrl);
const pdf = await loadingTask.promise;
const page = await pdf.getPage(1);
const viewport = page.getViewport({ scale: 1.0 });
const canvas = this.$refs.pdfCanvas;
const context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
const renderContext = {
canvasContext: context,
viewport: viewport
};
await page.render(renderContext).promise;
}
}
};
</script>
使用vue-pdf库
vue-pdf是一个封装了PDF.js的Vue专用组件,使用更简单。

安装vue-pdf:
npm install vue-pdf
在Vue组件中使用:
<template>
<pdf :src="pdfUrl"></pdf>
</template>
<script>
import pdf from 'vue-pdf';
export default {
components: {
pdf
},
props: {
pdfUrl: {
type: String,
required: true
}
}
};
</script>
使用原生HTML标签
对于简单的PDF预览,可以直接使用HTML5的<embed>或<iframe>标签。

<template>
<div>
<embed :src="pdfUrl" type="application/pdf" width="100%" height="600px">
<!-- 或使用iframe -->
<iframe :src="pdfUrl" width="100%" height="600px"></iframe>
</div>
</template>
<script>
export default {
props: {
pdfUrl: {
type: String,
required: true
}
}
};
</script>
使用PDFObject库
PDFObject是一个轻量级库,可以智能地嵌入PDF文件。
安装PDFObject:
npm install pdfobject
在Vue组件中使用:
<template>
<div ref="pdfContainer"></div>
</template>
<script>
import PDFObject from 'pdfobject';
export default {
props: {
pdfUrl: {
type: String,
required: true
}
},
mounted() {
PDFObject.embed(this.pdfUrl, this.$refs.pdfContainer);
}
};
</script>
注意事项
- 跨域问题:如果PDF文件存储在外部服务器,可能需要处理CORS问题。
- 性能优化:对于大型PDF文件,建议实现分页加载功能。
- 移动端适配:在移动设备上测试PDF显示效果,可能需要调整视口设置。
- 错误处理:添加适当的错误处理机制,应对PDF加载失败的情况。
以上方法可以根据项目需求选择最适合的方案。对于需要高度定制化的PDF查看器,PDF.js提供了最灵活的选择;对于简单需求,原生HTML标签或vue-pdf可能是更快捷的解决方案。






