您现在的位置是:首页 > 技术教程 正文

前端如何预览pdf文件流

admin 阅读: 2024-03-30
后台-插件-广告管理-内容页头部广告(手机)

1. PDF组件选型

通过查找资料,可以找到如下几种方案,其中最为成熟的方案是vue-pdf

1. iframe 既可以用来浏览本地static下的文档,也可以预览后端返回的文件流文档

2. vue-pdf 较为完善的vue预览pdf的方案

3. vueshowpdf 网络上找到的一个他人封装的pdf组件

优点

缺点原理

iframe/object/embed

简单易用,包含了翻页,打印,缩放等内嵌功能无法禁止打印将pdf作为插件内嵌再这三个HTML标签内
vueshowpdf样式简单清爽,包含翻页,缩放功能,可以禁止打印在不修改源码的情况下无法自定义相关样式,无进度加载提示,加载完成前会出现白屏基于底层pdf.js实现

vue-pdf

样式组件可自定义,包含加载进度,翻页,页内元素可交互等固定宽高的比例,需要将包裹pdf的父容器尽可能调大才能显示完全基于pdf.js实现

总结下来,

  • 如果只想 简单在页面嵌套PDF,使用iframe/object/embed是最好的选择,它不需要你自己去编写翻页组件,不需要去调整样式,用户体验佳。
  • 如果对 样式没有定制化  的需求,使用 vueshowpdf 也是非常不错,弹窗式的UI看起来会更加高大上。
  • 如果对 权限控制,样式定制需求高,使用 vue-pdf 是最好的选择,接口和属性较全,扩展能力强,自由度高。

2. Iframe使用步骤

2.1 使用与逻辑

逻辑:将后端返回的看不懂的文件流,设置成reponseType="arraybuffer",然后读取到返回的blob,再使用createObjectURL读取出url即可

 2.2 代码示例

  1. <script>
  2. import { mapState } from 'vuex'
  3. import { getNodeObjectData } from '@/modules/viewer/apis/service'
  4. export default {
  5. name: 'pdfPanel',
  6. props: {
  7. node: {
  8. type: Object,
  9. default: () => {}
  10. }
  11. },
  12. data() {
  13. return {
  14. src: ''
  15. }
  16. },
  17. computed: {
  18. ...mapState({
  19. innerHeight: (state) => state.viewerStore.setting['innerHeight']
  20. }),
  21. iframeStyle() {
  22. return {
  23. width: '100%',
  24. height: `${this.innerHeight - 130}px`
  25. }
  26. }
  27. },
  28. mounted() {
  29. return getNodeObjectData({
  30. meta_id: this.node.id
  31. })
  32. .then((res) => {
  33. const blob = new Blob([res], { type: 'application/pdf' })
  34. const url = window.URL.createObjectURL(blob)
  35. this.src = url
  36. })
  37. },
  38. methods: {
  39. handleFullScreen() {
  40. window.open(`${this.src}#filename=${this.node.name}`, "_blank")
  41. }
  42. }
  43. }
  44. script>>

2.3 图文详解

 

1. 后端返回的是文件流,如下:

2. 接口请求设置responseType="arraybuffer"

  1. export function getNodeObjectData(params) {
  2. return axios({
  3. url: `${apiPrefix}/pdf`,
  4. method: 'GET',
  5. params: params,
  6. responseType: 'arraybuffer'
  7. })
  8. }

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜