pdf.js可以实现在html下直接浏览pdf文档,是一款开源的pdf文档读取解析插件

pdf.js主要包含两个库文件,一个pdf.js和一个pdf.worker.js,一个负责API解析,一个负责核心解析。

我发现pdf.js就是把pdf以图片形式展示在页面上的。

所以在使用之前需要导入这两个jar包,具体使用最好查看Github上的开源项目(https://github.com/mozilla/pdf.js),上面的文档也很详细,在examples文件夹下有示例可以参照。

在我们的项目中,经过测试发现可能由于生成PDF文件工具的不同,所以PDF文档的宽度也可能会有所不同,所以在项目中需要能自适应文件文档宽度,按比例缩放显示。

实现代码如下:

<script type="text/javascript">
var pdfName="<%=parturl%>";
var curWwwPath = window.document.location.href;
var pathName = window.document.location.pathname;
var pos = curWwwPath.indexOf(pathName);
//获取主机地址,如: http://localhost:8083
var localhostPath = curWwwPath.substring(0, pos);
//获取带"/"的项目名,如:/uimcardprj
var projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1);
/* var url=localhostPath + projectName+'/WEB-INF/adminUpload/pdfFile/'+pdfName; */
var url=localhostPath + projectName+'/fileUpload/adminFile/'+pdfName;
var pdfDoc = null,
pageNum = 1,
pageRendering = false,
pageNumPending = null,
scale = 1.5;//定义缩放比
/**
* Get page info from document, resize canvas accordingly, and render page.
* @param num Page number.
*/
function renderPage(num) {
pageRendering = true;
// Using promise to fetch the page
pdfDoc.getPage(num).then(function(page) {
var canvasList = document.getElementById('canvas_list');
var canvas = document.createElement('canvas');
canvasList.appendChild(canvas);
var ctx = canvas.getContext('2d');
var viewport = page.getViewport(scale);
canvas.height = viewport.height;
canvas.width = viewport.width;
// Render PDF page into canvas context
var renderContext = {
canvasContext: ctx,
viewport: viewport
};
var renderTask = page.render(renderContext);
// Wait for rendering to finish
renderTask.promise.then(function() {
pageRendering = false;
if (pageNumPending !== null) {
// New page rendering is pending
renderPage(pageNumPending);
pageNumPending = null;
}
});
});
}
/**
* If another page rendering in progress, waits until the rendering is
* finised. Otherwise, executes rendering immediately.
*/
function queueRenderPage(num) {
if (pageRendering) {
pageNumPending = num;
} else {
renderPage(num);
}
}
/**
* Asynchronously downloads PDF.
*/
PDFJS.getDocument(url).then(function(pdfDoc_) {
pdfDoc = pdfDoc_;
pdfDoc.getPage(1).then(function(page) {
var viewport = page.getViewport(scale);
//根据PDF宽度大小设置自适应缩放比
var temp = 3674.7-viewport.width;
if(temp>0){
scale=Math.abs(3674.7-viewport.width)/1854.5;
}else{
scale=Math.abs(6587-viewport.width)/7894.7;
}
//alert(scale+","+viewport.width);
});
for(var i = 1 ; i <= pdfDoc.numPages; i++) {
queueRenderPage(i);
}
});
</script>

代码中的scale 变量是定义缩放比,默认是1.5倍显示,定义viewport :

viewport = page.getViewport(scale);

此时viewport.width用来判断在1.5倍缩放后PDF的宽度(以px为单位),大部分在这个比例下宽度大约为900px,显示正常,但是也有特别大的,测试过程中发现最大(宽)的一个PDF在1.5倍缩放下宽度约为3900px,此时在页面上只能显示部分,于是调缩放比为0.32的时候显示正常,大约为900px,根据这个关系,我列了一个二元一次方程组,试图根据pdf在1.5倍缩放下的宽度(px),求出一个合理的缩放比(scale),使PDF的宽度都以900px显示。因为测量的不准确,求出的参数差距很大,在最后不得已采用两组参数混合使用,才起到了对PDF很好的兼容。

由于所有的PDF文档是上传到服务器上而不是本地,所以上面的代码中有一部分是为了获取到PDF文件的地址。可以对比官方示例进行学习。

官方helloworld.html代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>'Hello, world!' example</title>
</head>
<body> <h1>'Hello, world!' example</h1> <canvas id="the-canvas" style="border:1px solid black"></canvas> <script src="pdf.js"></script> <script id="script">
//
// If absolute URL from the remote server is provided, configure the CORS
// header on that server.
//
var url = './helloworld.pdf'; //
// The workerSrc property shall be specified.
//
pdfjsLib.GlobalWorkerOptions.workerSrc =
'pdf.worker.js'; //
// Asynchronous download PDF
//
var loadingTask = pdfjsLib.getDocument(url);
loadingTask.promise.then(function(pdf) {
//
// Fetch the first page
//
pdf.getPage(1).then(function(page) {
var scale = 1.5;
var viewport = page.getViewport({ scale: scale, }); //
// Prepare canvas using PDF page dimensions
//
var canvas = document.getElementById('the-canvas');
var context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width; //
// Render PDF page into canvas context
//
var renderContext = {
canvasContext: context,
viewport: viewport,
};
page.render(renderContext);
});
});
</script> <hr>
<h2>JavaScript code:</h2>
<pre id="code"></pre>
<script>
document.getElementById('code').textContent =
document.getElementById('script').text;
</script>
</body>
</html>

效果图如下所示:

pdf.js使用总结#如何在网页读取并显示PDF格式文档的更多相关文章

  1. 从多个XML文档中读取数据用于显示webapi帮助文档

    前言: 你先得知道HelpPageConfig文件,不知道说明你现在不需要这个,所以下文就不用看了,等知道了再看也不急.当然如果你很知道这个,下文也不用看了,因为你会了. 方法一: new XmlDo ...

  2. Node.js的下载、安装、配置、Hello World、文档阅读

    Node.js的下载.安装.配置.Hello World.文档阅读

  3. CEBX格式的文档如何转换为PDF格式文档、DOCX文档?

    方正阿帕比CEBX格式的文档如何转换为PDF格式文档.DOCX文档? 简介: PDF.Doc.Docx格式的文档使用的非常普遍,金山WPS可以直接打开PDF和Doc.Docx文档,使用也很方便. CE ...

  4. 【ABAP系列】SAP 读取生产订单 记入文档的货物移动明细

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 读取生产订单 记入文档的 ...

  5. 从隔壁兄弟那爬点网页数据,整理成word文档

    package com.parse_report; import com.report.utils.ParseUrl; /** * Create by JIUN 2018/7/14 */ public ...

  6. 如何用代码读取Office Online Server2016的文档的备注信息

    前言 在一个项目上客户要求读取office online server 2016的对文档的备注信息,如下图: 以前思路老纠结在OOS这个在线上,总有以为这个信息存储在某个列表中,其实错了,这个备注信息 ...

  7. PDF 补丁丁 0.4.2.1218 测试版发布:新增拆分文档功能

    新的测试版的“提取页面”功能增加了拆分文档的选项. 可按照指定的页码范围(用“:”分号分割).顶层书签或指定页数三种方式,将一个 PDF 文档拆分成多个文档. 此功能还支持多个文档批量操作. 欢迎各位 ...

  8. 用Word收集网页中的内容,用文档结构图整理

    如何用Word保存网页中的内容 网页中的内容,用什么保存好? 用笔记类软件是个不错的选择,还可以用 Word 保存,这样方便用“文档结构图”来整理网页. 如图:网页收集后用文档结构图进行整理. (图一 ...

  9. js 和 jquery 获取页面和滚动条的高度 视口高度文档高度

    js 和 jquery 获取页面和滚动条的高度 //页面位置及窗口大小 function GetPageSize() { var scrW, scrH; if(window.innerHeight & ...

随机推荐

  1. shell date命令

    date命令的语法结构: date [-d][时间运算] [+FORMAT] 先说简单的,[+FORMAT] 部分,主要有如下输出格式: 时间方面: %H : 小时(00..23) %I : 小时(0 ...

  2. 稠州银行数字化转型:打造银行数据大脑,建立全新数字化DNA

    数字经济时代,银行如何进行数字化转型?业务模式转型与科技转型如何协同并进? 2019年1月4日,在上海蚂蚁金服ATEC城市峰会上,浙江稠州商业银行(以下简称“稠州银行”)副行长兼首席信息官程杰分享了稠 ...

  3. css3 calc()的用法

    转载自:css3 calc()的用法 说明:calc(四则运算):任何长度值都可以使用calc()函数进行计算:和平时的加减乘除优先顺序一样一样的: 特别注意:calc()里面的运算符必须前后都留一个 ...

  4. 20175317 《Java程序设计》第六周学习总结

    20175317 <Java程序设计>第六周学习总结 教材学习内容总结 第六周我学习了教材第七章与第十章的内容,了解了内部类.异常类与输入输出流的知识,学到了以下内容: 什么是内部类 如何 ...

  5. regression | p-value | Simple (bivariate) linear model | 线性回归 | 多重检验 | FDR | BH | R代码

    P122, 这是IQR method课的第一次作业,需要统计检验,x和y是否显著的有线性关系. Assignment 1 1) Find a small bivariate dataset (pref ...

  6. @RequestMapping的Ant风格URL

    Ant风格资源地址支持3中匹配符 ? 匹配文件名中一个字符. *   匹配 文件名中任意字符 **  匹配多层路径 例如 /hello/*/myspring 匹配 /hello/abc/mysprin ...

  7. English Voice of <<Way Back Into Love>>

    I have been living with a shadow overhead我一直生活在阴影中I have been sleeping with a cloud above my bed睡梦中床 ...

  8. spoj839Optimal Marks

    题意:略 怎样判断属于S,T集合. 如果从S出发到不了某点,该点出发也到不了T,那么割给那边都行. 如果S出发能到该点,该点出发也能到T,这种情况下dinic没结束. 只能从S到该点:只能分到S集.只 ...

  9. 一些重要的k8s概念

    1. Pause容器是什么 作为init pod存在,其他pod都会从pause 容器中fork出来 由pause容器管理 pause容器的工作 可知kubernetes的pod抽象基于Linux的n ...

  10. 【C/C++】C++11 Lambda

    Lambda C++11 中 lambda 是一个匿名函数对象 最简形式 []{ cout << "lambda" << endl; }(); // pri ...