zoukankan      html  css  js  c++  java
  • H5 页面如何查看 PDF 文件

    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}`);
    ...
    
  • 相关阅读:
    UVa 568 Just the Facts
    UVa 253 Cube painting
    百钱买百鸡问题Java
    jsp-4 用cookie实现记住密码
    (动态规划)有 n 个学生站成一排,每个学生有一个能力值,从这 n 个学生中按照顺序选取kk 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 kk 个学生的能力值的乘积最大,返回最大的乘积
    c++ 根据生产日期,保质期求出过期时间
    汉诺塔的非递归解决办法
    链表实现多项式的加法和乘法
    暗时间--刘未鹏
    hdoj1013(数根,大数,九余数算法)
  • 原文地址:https://www.cnblogs.com/xinjie-just/p/13902909.html
Copyright © 2011-2022 走看看