`

使用pdf.js在web页面展示pdf文件

阅读更多

最近弄的项目中需要在线展示PDF文件,以前用的是Adobe PDF阅读器直接在浏览器端打开的,这要求客户端必须安装这个软件,若是没有安装就不能在线预览了。为了解决这个问题,最终决定用pdf.js来实现预览功能。

 

1、PDF.js下载

下载链接:http://mozilla.github.io/pdf.js/

下载下来的压缩包包含两个文件夹:build和web,打开web文件夹下的viewer.html,就能看到PDF的预览效果了。

预览的PDF文件是位于viewer.html同目录下的compressed.tracemonkey-pldi-09.pdf,

而设置加载这个文件的地方是:与viewer.html同目录下的viewer.js的DEFAULT_URL属性,修改这个属性的值就能够预览不同的文件,中英文的pdf文件都能成功预览

 

2、功能使用

使用pdf.js在web页展示pdf文件的关键是打开viewer.html,也就是在web页打开一个html,可以用的方法至少有两三种:

a、a标签:<a href="PDFJS\web\viewer.html">使用pdf.js展示pdf文件</>

b、window.open:window.open("PDFJS\web\viewer.html");

c、iframe:<iframe  src="PDFJS\web\viewer.html" />

 

3、在客户端预览服务器端的文件:使用文件流进行解决

以我此次使用的情况为例,我使用的iframe进行展示:

第一步:设置iframe的请求路径

var src="pdfjs/web/viewer.html?file=/testWeb/fileRouter!openDocInPdf.action";

 

说明:

a、pdfjs/web/viewer.html这个必须带,没什么可说的

 

b、若是从服务器端请求文件,必须使用file这个关键字,用来告知pdf.js你这个是文件流。我是怎么知道的?百度+源码。看网上的demo时说要用这个关键字,我也纳闷你怎么知道要用这个关键字,就去看源码了,跟踪的过程中,发现viewer.js的webViewerInitialized()的方法中有这么一句

file = 'file' in params ? params.file : appConfig.defaultUrl;

这就很明显了,你要是没有file我就使用默认值。所以必须用file关键字。

 

c、testWeb是我的项目名称,在此处请求action时必须加上:/项目名称。不这么处理会报404(至少我这块儿是这样子)。

怎么个404??假设我的项目访问路径为:http://127.0.0.1:8080/testWeb,

若写成 file=/testWeb/fileRouter!openDocInPdf.action,(上面说的写法)

那么请求路径就是:http://127.0.0.1:8080/testWeb/fileRouter!openDocInPdf.action,正确

若写成 file=fileRouter!openDocInPdf.action (不加上/testWeb)

那么请求路径:http://127.0.0.1:8080/fileRouter!openDocInPdf.action (404)

或者写成:file=/fileRouter!openDocInPdf.action(不加上testWeb,只加了/)

请求路径:http://127.0.0.1:8080/fileRouter!openDocInPdf.action (404)

 

第二步: 使用iframe进行请求

$("body").append("<iframe  width=\"100%\" height=\"100%\" src='"+src+"' />");

 

第三步:action请求

HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("application/pdf");
FileInputStream in = new FileInputStream(pdfFile);
OutputStream out = response.getOutputStream();

byte[] b = new byte[1024];
while ((in.read(b)) != -1) {
	out.write(b);
}
out.flush();
in.close();
out.close();

当然在实际应用中,经常牵涉到带参数的问题,这就是后面要说的第四个点了。

 

4、带参数进行文件请求

带参数的URL通常都这么写: fileRouter!openDocInPdf.action?id=123,

按照一般情况处理,此处应该是:var src="pdfjs/web/viewer.html?file=/testWeb/fileRouter!openDocInPdf.action?id=123";

按照这个路径去请求最后的请求链接会变成:http://127.0.0.1:8080/testWeb/fileRouter!openDocInPdf.action?id,这样子的请求路径必然会报错,那么为什么会这样子呢?还是viewer.js的webViewerInitialized(),里面处理链接的代码是这样子的:

var appConfig = PDFViewerApplication.appConfig;
var file = void 0;
var queryString = document.location.search.substring(1);
//alert(queryString);//结果:file=/testWeb/fileRouter!openDocInPdf.action?id=123,
var params = (0, _ui_utils.parseQueryString)(queryString);
//alert(params.file);//结果:testWeb/fileRouter!openDocInPdf.action?id
file = 'file' in params ? params.file : appConfig.defaultUrl;
validateFileURL(file);

 看结果就知道问题出在第四行,第四行的parseQueryString方法如下:

function parseQueryString(query) {
  var parts = query.split('&');
  var params = Object.create(null);
  for (var i = 0, ii = parts.length; i < ii; ++i) {
    var param = parts[i].split('=');
    var key = param[0].toLowerCase();
    var value = param.length > 1 ? param[1] : null;
    params[decodeURIComponent(key)] = decodeURIComponent(value);
  }
  return params;
}

这下应该知道请求链接为什么会变成那个样子了。

 

其实上面的例子存在一个问题,细心的可能已经发现了,那就是请求链接的问题:var src="pdfjs/web/viewer.html?file=/testWeb/fileRouter!openDocInPdf.action?id=123",一个url中不可能存在多个?,只有第一个参数用?其他的都用&,如果这个请求换成&号会怎么样,会不会就没有问题了呢??

假设请求是这个样子的:var src="pdfjs/web/viewer.html?file=/testWeb/fileRouter!openDocInPdf.action&id=123",viewer.js的webViewerInitialized()的执行结果就是:

var appConfig = PDFViewerApplication.appConfig;
var file = void 0;
var queryString = document.location.search.substring(1);
//alert(queryString);//结果:file=/testWeb/fileRouter!openDocInPdf.action&id=123
var params = (0, _ui_utils.parseQueryString)(queryString);
//alert(params.file);//结果:testWeb/fileRouter!openDocInPdf.action
file = 'file' in params ? params.file : appConfig.defaultUrl;
validateFileURL(file);

最后就变成了没有参数。

 

接下来说解决办法,我觉得至少有两种

第一种: parseQueryString()方法中起关键作用的是split("="),带参数的时候因为有多个等号除第一个之外的其他都没干掉了,那么我若是保证这个url中只有file=这儿的一个等号呢,于是就可以改成:

var src = "pdfjs/web/viewer.html?file="+encodeURIComponent("/testWeb/fileRouter!openDocInPdf.action?id=123");

如此就会变成:file=%2FtestWeb%2FfileRouter!openDocInPdf.action%3Fid%3D123

最后的请求链接就是:http://127.0.0.1:8080/testWeb/fileRouter!openDocInPdf.action?id=123,这样子的请求是正确的。

 

第二种:改处理方法,人为的定义file中的值

将webViewerInitialized()中处理参数的代码改成:

  var appConfig = PDFViewerApplication.appConfig;
  var file = void 0;
  var queryString = document.location.search.substring(1);
  /*注释掉原来的参数处理方法
  var params = (0, _ui_utils.parseQueryString)(queryString);
  file = 'file' in params ? params.file : appConfig.defaultUrl;
  */
  //使用一下的代码进行处理
  if(queryString.split("file2=").length>0){
  	file = queryString.split("file2=")[1];
  }else{
  	file = appConfig.defaultUrl;
  }
  validateFileURL(file);

然后iframe的src改成: var src="pdfjs/web/viewer.html?file2=/testWeb/fileRouter!openDocInPdf.action?id=123";

如此请求就会变成:http://127.0.0.1:8080/testWeb/fileRouter!openDocInPdf.action?id=123

至此,带参数的问题解决。

分享到:
评论

相关推荐

    Java web使用pdf.js在线预览远程服务器上的pdf文件

    Java web使用pdf.js在线预览远程服务器上的pdf文件,包里有pdf.js资源文件以及使用文档

    pdf.js使用文件流预览pdf

    网上大部分pdf.js都是用url方式预览pdf,此处给出pdf.js使用文件流预览pdf的Web工程; 此是maven工程; 100%能运行;

    基于HTML的PDF展示 pdf.js 兼容旧版浏览器

    pdf.js 是一个技术原型主要用于在 HTML5 平台上展示 PDF 文档,无需任何本地技术支持。pdf.js是一个HTML5技术的实验,探索实现一个没有本地代码支持,有效率的PDF渲染。 pdf.js是社区驱动和Mozilla Labs的支持。我们...

    pdf.js在web项目中的使用

    该文件包主要介绍pdf.js在web项目中的具体使用方法,本资源包主要分为三个部分,第一部分:bulid文件夹,第二部分web文件夹第三部分word操作图解

    pdf.worker.js

    前端预览pdf pdf.js中代码文件pdf.worker.js,文件过大,可修改web/viewer.js中的workerSrc路径,改为对应版本地址

    web在线查看PDF文件 PDF.JS

    web在线查看PDF文件,PDF.js文件,网页开发时需要预览pdf文件时可以用这个JS,很方便,通俗易懂,很强大的一个pdf插件

    pdf.js打包文件

    pdf.js的源码通过gulp generic打包生成后,直接可以在web项目中使用的文件。

    pdf.js在java web项目中远程预览ftp上的pdf文件.docx

    看了很多大神的博客,自己改造了下,终于做出了可以在线预览远程FTP服务器上的PDF文件的功能。大概花了1天时间,遇到很多坑。所以总结下,写了个文档,很详细,一步一步来就行了

    pdf.js显示PDF文件

    将generic文件夹拷贝到项目中,再建一个页面,然后用~/Content/generic/web/viewer.html?file=测试文件.pdf&watermark_txt=元宝182" width="800" height="550"&gt;到显示页面去,file=要显示的pdf文件,watermark_txt=...

    pdf.js前端插件,用于在线预览pdf文件

    pdf.js前端插件,通过window.open(basePath + '/pdfjs/web/viewer.html?file=' + fileUrl);即可在线预览pdf文件

    基于PDF.js的pdf文件预览.rar

    pdf文件预览,ie中pdf预览,下载,打印;浏览器中预览pdf,支持ie,基于pdf.js开发的demo,下载即用。

    pdf.js插件实现在线预览pdf文件.zip

    pdf.js插件实现在线预览pdf文件。直接利用这个插件放在项目里。然后使用./js/pdf/web/viewer.html?file=' + pdf的文件地址。可以看介绍文章在这里啊https://blog.csdn.net/qq_33769914/article/details/108223002

    web前端,pdf预览功能兼容火狐,IE,谷歌等浏览器,pdf.js

    1. 解压 PDF前端预览功能.zip 压缩包,复制到网站开发目录; 2. 调用方式:window.open("Scripts/lib/PDF/web/viewer.html?file=" + window.location.protocol + "//" + window.location.host + "/test.pdf"); 3....

    Web端pdf.js学习资料.zip

    pdf.js框架的魅⼒所在,为其为HTML5实现的,⽆需任何本地⽀持,⽽且对浏览器的兼容性也是⽐较好, 要求只有⼀个:浏览器⽀持HTML5就好了 以下是Web端pdf.js学习资料.zip

    PDF.js 是一个用 HTML5 构建的 PDF 查看器

    PDF.js 是社区驱动的,由 Mozilla Labs 支持。我们的目标是创建一个通用的,基于web标准的用于转换和渲染 PDF平台。 用法 1.引入 pdf.js 文件 2.定义一个 canvas 标签 3.调用 pdf.js

    pdfjs最新稳定版

    web目录是PDF.js的配置与显示文件。 viewer.html是负责显示PDF的, viewer.js是负责配置的文件。 pdf.js-master 目录是源码 目录里的examples文件下的mobile-viewer对手机端开发是很好的例子

    PDF.js-master.rar

    我们可以使用pdf.js自带的预览界面viewer.html,只需传入pdf文件的url即可。 如果要打开一个pdf文件,直接这样写就可以了: &lt;a href="/pdf/web/viewer.html?file=file.pdf"&gt;Open&lt;/a&gt; 如果想在弹窗打开: window....

    web前端js显示后台接口pdf二进制流文件

    web前端js显示后台接口pdf二进制流文件,可以直接在idea运行。包含PDFJS 等相关js。详细参考readme

    浅谈PDF.js使用心得

    一次在开发微信预览保单的时候所使用到的,由于安卓手机浏览器不支持解析PDF,所以才用了PDF.js来解析PDF并展示。 pdf.js 是一个技术原型主要用于在 HTML5 平台上展示 PDF 文档,无需任何本地技术支持。 在线演示...

Global site tag (gtag.js) - Google Analytics