pdf.js简介

PDF.js 是基于开放的 HTML5 及 JavaScript 技术实现的开源产品。简单说就是一个 PDF 解析器。运用HTML5JavaScript(即pdf.js仅使用安全的web语言,不包含任何攻击者可以用的本地代码块)的PDF阅读器pdf.js,直接在标准的HTML页面上载入和渲染PDF文件, 还可以提高安全性(不需要安装第三方插件,安全性由浏览器保证),浏览器所做的安全措施已经为pdf.js提供了安全的运行环境。其对IE和 FireFox浏览器的要求是IE9+, FireFox19+。

在线示例: http://jsbin.com/pdfjs-helloworld-v2/1/edit   , http://jsbin.com/pdfjs-prevnext-v2/1/edit

源码:https://github.com/mozilla/pdf.js

官网:http://mozilla.github.io/pdf.js/

pdf.js VS 传统浏览器读取pdf

一般來說,PDF档案格式都是在浏览器中由外挂程式來描绘,通常是Adobe自己的PDF reader或來自其他供应商的描绘工具,但這些外挂通常无法充分运用PDF的特点,而且由于含有大量的受信任代码,使得Google Chrome浏览器必须运用SandBox沙箱原理,來检查PDF描绘工具是否遭到未知病毒感染。

使用adobe,必须在本地安装软件才能使用,而pdf.js不依赖环境、渲染速度快(测试过,确实很快)、安全性高。

pdf.js渲染PDF文件

pdf.js渲染PDF文件的流程:Fetch pdf (url / buffer) ——> canvas ——> 渲染

如果要深入pdf的渲染,需要去研究pdf.js源代码。pdf.js可通过pdf文件的地址或pdf数据流获取pdf,具体实现是调用接口函数 PDFJs.getDoc(url/buffer)将pdf载入html,通过canvas处理, 然后渲染pdf文件。网上给出的都是通过url来获取pdf的例子,而我在做项目的时候,后台(Python)要求是发pdf的数据流给前台,前台接收pdf的buffer,然后通过pdf.js来渲染。当然最初尝试buffer出现了很多问题,具体问题总结如下:

1)如何通过$.ajax接收后台发给前台的buffer数据;

2)如何将buffer传给pdf.js来处理(这里我使用了viewer.js, 所以需要考虑的是如何将buffer传给viewer.js来处理);

3)如何将pdf.js转换成pdf.js可以接收的buffer格式;

(对应问题解决见代码注释)

注:viewer.js是pdf.js的扩展,其将打印、翻页、缩放等功能进行了实现,且界面非常好看。也就是说如果你引入了viewer.js,pdf的渲染和渲染之后的功能界面都已经帮你实现了,你不用自己去写界面。

先从官网:http://mozilla.github.io/pdf.js/下载代码,然后使用文件viewer.html , 我的html就是在viewer.html 的基础上修改的,下面我给出buffer的例子:

<!DOCTYPE html>
<html dir="ltr" mozdisallowselectionprint moznomarginboxes>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta name="google" content="notranslate">
    <title>在线预览</title>
    {% load static %}{% get_static_prefix as STATIC_URL %}
    <link href="{{STATIC_URL}}css/preview.css" rel="stylesheet" type="text/css" />
    <link rel="stylesheet" href="{{STATIC_URL}}pdfjs/web/viewer.css"/>
    <script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/compatibility.js"></script>
    <link rel="resource" type="application/l10n" href="{{STATIC_URL}}pdfjs/web/locale/locale.properties"/>
    <script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/l10n.js"></script>
    <script type="text/javascript" src="{{STATIC_URL}}pdfjs/build/pdf.js"></script>
    <script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/debugger.js"></script>
    <script src="{{STATIC_URL}}js/jQuery-1.8.3.js" type="text/javascript"></script>
    <script type="text/javascript">

//convertDataURIToBinary()

//不知道什么原因如果后台直接将pdf的数据流发给前台,得到的是乱码,将数据转换成 Uint8Array始终不成功

//所以就让后台将发送之前的数据流做 了base64编码发给前台,前台再解码得到的数据就不是乱码了。

var BASE64_MARKER = ';base64,';

var preFileId = {{mark}};

//viewer.js全局变量,传入buffer,回答问题2
          var DEFAULT_URL 
          
          $(document).ready(function(){
             $.ajax({
                type:"post",
                async: false,

//ajax接收pdf数据流,注意dataType值的设置是否有错,如果不指定,jQuery将自动根据HTTP包MIME信息返回

//responseXML或responseText .      回答问题1
                contentType:"application/pdf;charset=utf-8", 
                url:"{% url netPan.File.views.browserFuf%}",
                data:{
                    id: preFileId
                },
                success:function(data){
                    var pdfAsDataUri = data;

//如果引入了viewer.js , 处理方法
                    var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);
                    DEFAULT_URL = pdfAsArray;

//  只引入了pdf.js, 未引入viewer.js, 处理方法

// var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);

// PDFJS.getDocument(pdfAsArray).then();  自己写pdf的处理函数

}
            });
          });

function convertDataURIToBinary(dataURI) {   //编码转换,回答问题3

var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
          var base64 = dataURI.substring(base64Index);
          var raw = window.atob(base64);
          var rawLength = raw.length;

//转换成pdf.js能直接解析的Uint8Array类型,见pdf.js-4068
          var array = new Uint8Array(new ArrayBuffer(rawLength));

for(i = 0; i < rawLength; i++) {
            array[i] = raw.charCodeAt(i);
          }
          return array;
     }
    </script>

<!--先设置全局变量DEFAULT_URL 的值,所以要后调入viewer.js -->
    <script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/viewer.js"></script>
  </head>

<body>

省略内容

</body>

</html>

JAVA常用API或编程工具003--实现pdf在线阅读功能之pdf.js相关推荐

  1. JAVA常用API或编程工具002---SpringSource Tool Suite:基于Eclipse的Spring应用开发环境

    Spring Tool Suite(STS) 是一个基于Eclipse针对Spring应用量身定制的开发环境.提供了开发 Spring 应用必须的编码.调试.运行和部署功能.STS 在最新的 Ecli ...

  2. JAVA常用API或编程工具001---ITEXT把html转换成pdf的jar包,使用Java将HTML转换为PDF

    iText "XML Worker"允许开发人员以一种程序员友好的方式将XML文件转换成PDF文件.iText还可以将包含CSS样式的HTML转换为PDF格式的文档. 目标: 实现 ...

  3. Java | Java常用API方法总结

    Java常用API方法总结 常用API JavaAPI 1 java.lang String StringBuilder Integer parseXxx Math Object System Thr ...

  4. Java 常用API

    Java 常用API JFC(Java类库) 是系统提供的已实现的标准类的集合,是Java编程的API(Application Program Interface) 可帮助开发者方便.快捷地进行软件开 ...

  5. java常用地图坐标系转换工具类,支持谷歌,腾讯,百度等主流的地理坐标转换

    package com.shen.springboot.redis.util;import java.util.ArrayList; import java.util.HashMap; import ...

  6. Java 常用API的运用,效率及技巧

    1.     Java面向对象基本概念 2.     System 3.     String, StringBuffer 4.     数值,字符,布尔对象与简单类型的操作 5.     Class ...

  7. Java --- 常用API

    常用API 方法重载: 方法名相同,方法接收的参数不同 static: 修饰的类,可以直接使用类名进行调用 方法名 说明 public static abs(int a) 返回参数的绝对值 publi ...

  8. 7.Java常用API(String、ArrayList)

    API(Application Programming Interface, 应用程序编程接口) Java写好的技术(功能代码),可以直接调用 1.String String类定义的变量可以用于存储字 ...

  9. JAVA常用API的笔记

    常用API 1.定义: 指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来 2.String String 类代表字符串,Java 程序中的所有字符串文字(例如" ...

最新文章

  1. 只因“薪水过高”!被欠薪三个月后遭解雇,程序员删库反击
  2. robot连PCwifi、PC开Shell连robot
  3. android device action and adb command
  4. php论坛有哪些_2020面向PHP的5个最佳框架,解释了为什么选择它们
  5. 牛客网Java刷题知识点之调用线程类的start()方法和run()方法的区别
  6. Linux vim编辑器在哪,【Linux】Linux中VIM编辑器的使用
  7. leetcode 经典动态规划DP算法题目(思路、方法、code)
  8. 计算机桌面上的声音图标没了怎么办,右下角小喇叭不见了-电脑桌面右下角有一个调整声音的小喇叭图标没有了,怎么能调出来,电? 爱问知识人...
  9. Linux批量操作------mov转MP4
  10. 浅述Docker的容器编排
  11. keygen_Laravel随机密钥与Keygen
  12. XAMPP下载速度太慢了
  13. 【深度】分化人类行为和认知能力的6个评估函数
  14. 如何计算每月还多少房贷
  15. 颜色迁移之一——基础知识(色彩空间及其转换)
  16. 平板安装Ubuntu18.04教程
  17. 如何求地球上两点之间的最短距离_初中数学求线段之和最小的问题,知识点题型汇总...
  18. 【MVC】MVC分页
  19. 【STM32】SPI协议通信详解
  20. 视频教程-JAVAEE真实课堂之MySQL数据库-云计算基础架构

热门文章

  1. 什么是Java Marker Interface(标记接口) 1
  2. MySQL的SQL 语句:根据从表记录个数对主表排序
  3. Direct2D教程(十二)图层
  4. Maven + Docker
  5. javax.servlet.http.HttpServlet was not found
  6. VirtualBox的四种网络接入模式
  7. Linux系列-Red Hat5平台下的DHCP服务搭建
  8. DNSPod揭6省断网重大事故内幕:网游私服恶斗
  9. Asp.Net Forums研究文章集合(收藏)
  10. 无法打开包括文件:“afxcontrolbars.h”