H5 页面如何查看 PDF 文件

我们知道在 Chrome、Firefox 等浏览器可以查看 PDF 文件,不需要额外安装什么插件,这是由于 pdf.js 被预置到了这些浏览器中。

pdf.js 是一款使用 HTML5 Canvas 安全地渲染 PDF 文件以及遵从网页标准的网页浏览器渲染 PDF 文件的JavaScript库。Mozilla基金会主导。

pdf.js 可以作为浏览器或网站的一部分运行。原本是一个Firefox扩展[2],自2012年开始,它被纳入Mozilla Firefox(15版本)[3][4],并从2013年开始默认启用(19版本)成为基本功能[5][6] 。它还是ownCloud的一部分,并可用作Chrome、Chromium[7]、Firefox for Android[8]、Pale Moon[9]及SeaMonkey[10]的附加组件。

以上引用摘自维基百科 PDF.js

在手机浏览器中,如 QQ浏览器、UC 浏览器、Safari 浏览器,打开一个 PDF 是一个下载页面,无法查看。分别使用手机浏览器和桌面浏览器查看 pdf 文件

手机浏览器查看 PDF 文件

桌面浏览器查看 PDF 文件

手机端浏览器想要查看 PDF 文件可以使用 PDF.js 插件。在线演示地址


一、下载 PDF.js 插件

下载PDF.js插件。如果是下载的压缩包,解压之后,将整个文件夹拷贝到项目中。

项目目录

二、测试 PDF 文件是否可查看

在服务器中打开 /pdfjs-2.5.207-dist/web/viewer.html 文件。通过 http-server 运行 /web/viewer.html 文件。

http-server -p 10086 以 10086 端口启动服务器。打开手机浏览器访问:http://ip:10086/pdfjs-2.5.207-dist/web/viewer.html (ip改成 127.0.0.1 或本机 ip)。

本地测试 PDF 文件是否可以打开

三、项目中测试 PDF 是否可查看

在 /pdfjs-2.5.207-dist/web/ 下添加一个 flask入门教程.pdf 和新增 pdf-viewer.html

项目目录和pdf-viewer.html文件

注意

在项目中测试时,我们是以 /web/viewer.html 文件为基础,后接 '?file=',再接 pdf 文件地址。注意这里的 pdf 文件和 html 文件的相对路径。

打开手机浏览器访问:http://ip:10086/pdfjs-2.5.207-dist/web/pdf-viewer.html (ip改成 127.0.0.1 或本机 ip)。

项目中测试 PDF 文件是否可用

四、跨域访问 PDF

通常,我们访问的 PDF 不是一个静态文件,而是接口返回一个 PDF 存放地址,这时,使用 ./viewer.html?file=${pdfUrl} 匹配地址会存在跨域问题。

我们可以使用 webpack 开发服务器中的代理支持来把特定的 URL 转发给后端服务器。以angular工程为例

只要传入 --proxy-config 选项就可以了。 比如,要把所有到 http://localhost:10086/file 的调用都转给运行在 http://192.168.8.184:7600/file 上的服务器,可采取如下步骤。

  1. 在项目的 src/ 目录下创建一个 proxy.conf.json 文件。

  2. 往这个新的代理配置文件中添加如下内容:

...
"/file": {
    "target": "http://192.168.8.184:7600",
    "secure": true,
    "changeOrigin": true,
    "logLevel": "debug"
}
...
  1. 在 CLI 配置文件 angular.json 中为 serve 目标添加 proxyConfig 选项:
...
"architect": {
  "serve": {
    "builder": "@angular-devkit/build-angular:dev-server",
    "options": {
      "browserTarget": "your-application-name:build",
      "proxyConfig": "src/proxy.conf.json"
    },
...
  1. 要使用这个代理选项启动开发服务器,请运行 ng serve 命令。

五、其他问题

  1. pdf 访问抛错

当跨域访问时,pdf.js 会抛出错误 file origin does not match viewer's,这时只需要将 viewer.js 中相应提示注释即可:

注释抛错代码

  1. Angular 防止 XSS 攻击安全问题

当给 <iframe[src]="someValue"> 中绑定一个 URL,someValue 将会被净化, 以防范攻击者注入 javascript: 之类的 URL,并借此在网站上执行代码。

可使用 bypassSecurityTrustResourceUrl 绕过安全检查,并信任给定的值是一个安全的资源 URL。也就是说该地址可以安全的用于加载可执行代码,比如 <script src> 或 <iframe src>

...
<iframe
    id="iframe"
    [src]="iframeSrc"
    width="100%"
    height="100%"
    frameborder="0"
></iframe>
...

...
constructor(
  private sanitizer: DomSanitizer,
) {}

this.viewerUrl = '../../../../assets/pdfjs-2.5.207-dist/web/viewer.html';
this.iframeSrc = this.sanitizer.bypassSecurityTrustResourceUrl(`${this.viewerUrl}?file=/${this.pdfUrl}`);
...

欢迎写出你的看法,一起成长!

H5HTML5)是一种用于构建网页和应用程序的技术标准,而JS(JavaScript)是一种脚本语言,用于为网页添加交互效果和功能。在H5和JS的结合下,我们可以实现在网页上直接查看PDF文件的功能。 要实现在H5 JS页面查看PDF文件,我们通常使用一些开源的PDF库,如pdf.js。pdf.js是一个由Mozilla开发的库,可以在浏览器中直接加载和渲染PDF文档。 具体步骤如下: 1. 引入pdf.js库:在HTML页面的`<head>`标签中,添加引入pdf.js库的代码。可以通过在CDN上获取最新版本的库文件,例如: ```html <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.min.js"></script> ``` 2. 创建容器元素:在HTML页面中,创建一个用于显示PDF内容的容器元素,例如一个`<div>`元素,同时为其指定一个id,例如`pdfContainer`: ```html <div id="pdfContainer"></div> ``` 3. 编写JavaScript代码:在HTML页面的`<script>`标签中,编写JavaScript代码来加载和渲染PDF文档: ```javascript // 创建PDF渲染器 const pdfContainer = document.getElementById('pdfContainer'); const pdfRenderer = pdfjsLib.getDocument('path/to/pdf/file.pdf'); // 渲染PDF页面 pdfRenderer.promise.then(function(pdf) { for (let i = 1; i <= pdf.numPages; i++) { pdf.getPage(i).then(function(page) { const canvas = document.createElement("canvas"); const canvasContext = canvas.getContext('2d'); const viewport = page.getViewport({scale: 1.5}); // 设置缩放比例 canvas.height = viewport.height; canvas.width = viewport.width; page.render({ canvasContext, viewport }); pdfContainer.appendChild(canvas); }); } }); ``` 以上代码会将PDF的每一页渲染成一个画布元素,并将其添加到`pdfContainer`容器中显示。 通过上述步骤,我们就可以在H5 JS页面中直接查看PDF文件了。虽然这只是一个简单的演示示例,但通过使用pdf.js库,我们可以实现更多高级的PDF处理功能,如搜索、缩放和导航等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值