说明

其实实现这个预览代码量很少,核心代码就一行,接下来我介绍一下这个实现过程

准备工作

你首先得准备一个 pdf 插件包,比如:我这边的项目包里的 public 文件夹的 lib 文件夹下面就有一个 pdf 的插件包,里面包含 build 以及 web 两个文件夹。这里我选择是 ​​pdfjs-2.14.305-legacy​​ 版本

vue里怎么使用pdf.js实现pdf文件的预览功能_pdf.js

自己去 ​​http://mozilla.github.io/pdf.js/getting_started/#download​​ 下载一个稳定版本的就行,目录大致如下

├── build/
│ ├── pdf.js - display layer
│ ├── pdf.js.map - display layer's source map
│ ├── pdf.worker.js - core layer
│ └── pdf.worker.js.map - core layer's source map
├── web/
│ ├── cmaps/ - character maps (required by core)
│ ├── compressed.tracemonkey-pldi-09.pdf - PDF file for testing purposes
│ ├── debugger.js - helpful debugging features
│ ├── images/ - images for the viewer and annotation icons
│ ├── locale/ - translation files
│ ├── viewer.css - viewer style sheet
│ ├── viewer.html - viewer layout
│ ├── viewer.js - viewer layer
│ └── viewer.js.map - viewer layer's source map
└── LICENSE

核心代码实现

1、启动vue项目的服务,打开浏览器访问 viewer.html 文件

vue里怎么使用pdf.js实现pdf文件的预览功能_html_02

http://localhost:8081/kaimo-vue-demo/lib/pdfjs-2.14.305-legacy-dist/web/viewer.html

vue里怎么使用pdf.js实现pdf文件的预览功能_html_03

页面预览的 pdf 文件正是 ​​compressed.tracemonkey-pldi-09.pdf​

vue里怎么使用pdf.js实现pdf文件的预览功能_pdf预览_04

我们打开 viewer.js,有个默认的配置项

vue里怎么使用pdf.js实现pdf文件的预览功能_html_05

通过这个 defaultUrl 参数,我们可以快速找到 ​​2851​​ 行,从而确定链接的参数 file 参数就是我们需要的 pdf 文件路径参数

vue里怎么使用pdf.js实现pdf文件的预览功能_vue_06

2、访问自己包的写法

比如:我这边的写法就是下面的样子,这个就是预览的核心代码

<template>
<div class="home">
<iframe
width="100%"
height="700px"
frameborder="0"
:src="`/kaimo-vue-demo/lib/pdfjs-2.14.305-legacy-dist/web/viewer.html?file=${encodeURIComponent(previewUrl)}`">
</iframe>
</div>
</template>

<script>export default {
name: 'home',
data() {
return {
previewUrl: "/kaimo-vue-demo/lib/pdfjs-2.14.305-legacy-dist/web/compressed.tracemonkey-pldi-09.pdf"
}
}
}</script>

vue里怎么使用pdf.js实现pdf文件的预览功能_html_07

3、访问接口包的写法

比如:访问接口包这个 pdf 下载链接 ​​http://127.0.0.1:6666/kaimoApi/download?path=2b3a9f44cfc640ec93fdd81d40f0989e​​,直接访问浏览器就会下载该 pdf。

vue里怎么使用pdf.js实现pdf文件的预览功能_pdf.js_08

我们应该怎么预览?

如果写成下面这个:

<template>
<div class="home">
<iframe
width="100%"
height="700px"
frameborder="0"
:src="`/kaimo-vue-demo/lib/pdfjs-2.14.305-legacy-dist/web/viewer.html?file=${encodeURIComponent(previewUrl)}`">
</iframe>
</div>
</template>

<script>export default {
name: 'home',
data() {
return {
// previewUrl: "/kaimo-vue-demo/lib/pdfjs-2.14.305-legacy-dist/web/compressed.tracemonkey-pldi-09.pdf",
previewUrl: "http://127.0.0.1:6666/kaimoApi/download?path=2b3a9f44cfc640ec93fdd81d40f0989e",
}
}
}</script>

就会报错 ​​file origin does not match viewer's​​​,我在 viewer.js 的源码处打印了日志 ​​console.log("kaimo313---->", fileOrigin, viewerOrigin)​

validateFileURL = function validateFileURL(file) {
if (!file) {
return;
}

try {
var viewerOrigin = new URL(window.location.href).origin || "null";

if (HOSTED_VIEWER_ORIGINS.includes(viewerOrigin)) {
return;
}

var fileOrigin = new URL(file, window.location.href).origin;
console.log("kaimo313---->", fileOrigin, viewerOrigin)
if (fileOrigin !== viewerOrigin) {
throw new Error("file origin does not match viewer's");
}
} catch (ex) {
PDFViewerApplication.l10n.get("loading_error").then(function (msg) {
PDFViewerApplication._documentError(msg, {
message: ex === null || ex === void 0 ? void 0 : ex.message
});
});
throw ex;
}
};

说明 fileOrigin 跟 viewerOrigin 必须要相同,所以 previewUrl 就不能配置 origin。

vue里怎么使用pdf.js实现pdf文件的预览功能_sed_09

我们可以修改成下面这样:

<template>
<div class="home">
<iframe
width="100%"
height="700px"
frameborder="0"
:src="`/kaimo-vue-demo/lib/pdfjs-2.14.305-legacy-dist/web/viewer.html?file=${encodeURIComponent(previewUrl)}`">
</iframe>
</div>
</template>

<script>export default {
name: 'home',
data() {
return {
// previewUrl: "/kaimo-vue-demo/lib/pdfjs-2.14.305-legacy-dist/web/compressed.tracemonkey-pldi-09.pdf",
previewUrl: "/kaimoApi/download?path=2b3a9f44cfc640ec93fdd81d40f0989e",
}
}
}</script>

然后通过代理 kaimoApi 接口包即可:

module.exports = {
publicPath: process.env.NODE_ENV === 'production' ? '/kaimo-vue-demo/' : '/kaimo-vue-demo',

devServer: {
proxy: {
'^/kaimoApi': {
target: 'http://127.0.0.1:6666',
ws: true,
changeOrigin: true
},
}
}
}

vue里怎么使用pdf.js实现pdf文件的预览功能_sed_10

这样就解决了我们的问题。

参考