【HTML/JS】Pdf.js使用教程

本文详细介绍如何使用PDF.js在网页上展示PDF文档,并实现跨浏览器兼容,包括IE在内的主流浏览器。文章分享了从获取源码、构建到实际部署的全过程,并提供了一个简单的示例。

http://www.th7.cn/web/js/201505/103416.shtml


pdf.js框架的魅力所在,为其为HTML5实现的,无需任何本地支持,而且对浏览器的兼容性也是比较好,要求只有一个:浏览器支持HTML5就好了!(不过对于低版本的IE,就只能节哀了!)

据说IE9以上是OK的,因为我本地是IE11,所以我只在IE11上测试过,是通过的(当然火狐,360,我也测了一下,是可以的)。

 

因为项目开发需要,在线展示PDF,而且要兼容IE,所以就选择了pdf.js,但是网上对他的教程很少,我花了一天时间才搞定,回头看了一下,也没有想象中那么困难,所以决定写一篇博客,以便大家参考!

以下是pdf.js相关的网址:

GitHub: https://github.com/mozilla/pdf.js/

 

上面这个网址,有pdf.js的基本简介,以及如何获取源码,之后如何进行构建!

 

但是他的获取源码使用:

 

$ git clone git://github.com/mozilla/pdf.js.git

 

 

 

构建使用:

 

$ node make generic

 

 

 

不知道在Windows7上该怎么用git、node(如果有知道的,可以告诉我下,在此谢过!),所以我就改用linux进行构建(期间有很多心酸历程,感觉都可以拍成电影了!!!比如说我用git获取源码时,系统提示我git没有安装,我用node时,提示我ShellJs没有安装,安装ShellJS,他告诉我要使用npm,意料之中,npm我也没有安装...),其实,我们使用pdf.js,最终只需要构建后的内容,大家可以通过这里进行下载:

http://yunpan.cn/cwmjKF6jKY6Kb  访问密码 c14a

 

构建后的目录结构为:

 

有了构建后的build内容,我们就可以做一个简单的测试,把generic拷贝到Tomcat的webapps中

启动Tomcat后,就可以通过:

http://localhost:8080/generic/web/viewer.html

进行访问!可以看到一个很帅气的界面:

generic/web/viewer.html主要是渲染pdf阅读器的样式,而generic/web/viewer.js则是指定打开的pdf文件(当然还有其他功能,不过这些都不是我们关心的),我们看位于generic/web/viewer.js的一段代码:

我们可以看到,他默认打开generic/web/compressed.tracemonkey-pldi-09.pdf文件,再来看下面这段代码:

这就告诉我们,可以通过传递file形参来动态指定打开的pdf文件!如:

http://localhost:8080/generic/web/viewer.html?file=qbs.pdf

 

 

下面我就介绍下,具体嵌入项目中是如何运用的!

可以把generic中的内容作为第三方插件进行使用,在项目中可以像如下存放:

然后页面可以使用<iframe>标签来加载pdf

1 <iframe src="<c:url value="/resources/plugin/pdfJs/generic/web/viewer.html" />?file=<c:url value="/publicity/displayPDF.do" />" width="100%" height="800"></iframe>

效果图,如下:

实质就是我们直接访问generic/web/viewer.html,然后为其指定一个file形参,用于指定打开的pdf文件!我上面使用的流的方式进行指定的。

 

 

 

至此,pdf.js插件的介绍就告一段落了,第一次写博客,如有不到之处,希望大家可以不吝赐教,谢谢!

在此感谢pdf.js的两位作者!(真心佩服这些外国大师,2个人可以写一个这么好的框架,而且还是开源的!)。

感谢hyhbyl先生!他的文章指引了我!附网址一份:

http://blog.youkuaiyun.com/hyhbyl/article/details/20994945





你遇到的错误信息如下: ``` pdf.js:1256 Warning: Setting up fake worker. Failed to load resource: net::ERR_CONNECTION_REFUSED PDFshow.html?file=...:39 UnknownErrorException: Failed to fetch ``` 这是 PDF.js 在加载 PDF 文件时遇到的常见错误,下面我来逐一分析这些错误的含义和解决方案。 --- ## 🚫 错误分析 ### 1. `Warning: Setting up fake worker.` 这是 PDF.js 的一个警告信息,表示当前没有使用 `worker` 模式加载 PDF,而是使用了 **fake worker(模拟 worker)**。 - **原因**:`pdf.worker.js` 路径不正确,或浏览器不支持 Web Worker。 - **影响**:PDF 仍可能加载,但性能下降。 - **解决方法**: - 确保 `pdf.worker.js` 文件路径正确。 - 在 `pdf.js` 中设置 worker 路径: ```javascript pdfjsLib.GlobalWorkerOptions.workerSrc = '/path/to/pdf.worker.js'; ``` --- ### 2. `Failed to load resource: net::ERR_CONNECTION_REFUSED` 这个错误说明浏览器尝试访问某个 URL(PDF 文件或脚本),但服务器没有响应。 - **可能原因**: - 你传入的 PDF 地址是 `http://10.226.51.210:8087/...`,但该服务器未运行或端口未开放。 - 服务器拒绝连接(防火墙、服务未启动等)。 - **解决方法**: - 检查服务器是否运行。 - 使用浏览器访问该 PDF 地址确认是否能正常下载。 - 如果是局域网地址,确保你和服务器在同一个网络环境。 --- ### 3. `UnknownErrorException: Failed to fetch` 这是 PDF.js 报出的错误,表示它无法通过网络请求获取 PDF 文件。 - **可能原因**: - PDF 地址不可达(服务器宕机、路径错误) - 存在跨域限制(CORS) - 浏览器安全策略阻止了请求(如 HTTPS 页面请求 HTTP 资源) --- ## ✅ 排查和解决方案 | 步骤 | 检查内容 | 方法 | |------|----------|------| | 1 | PDF 地址是否可访问 | 在浏览器地址栏直接输入 PDF 地址,看是否能下载 | | 2 | `pdf.worker.js` 是否正确加载 | 打开开发者工具(F12) → Network → 查看是否加载成功 | | 3 | 设置 worker 路径 | 在 JS 中添加 `pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdf.worker.js';` | | 4 | 检查服务器是否运行 | `ping 10.226.51.210` 或尝试访问其他资源 | | 5 | 检查跨域问题 | 查看 Network 请求 → 查看响应头是否有 `Access-Control-Allow-Origin` | | 6 | 使用本地服务器代理 PDF | 后端中转下载 PDF,再提供给前端访问(解决跨域) | --- ## ✅ 示例修复代码 ```html <script src="pdf.js"></script> <script> // 设置 worker 路径 pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdf.worker.js'; // 获取 URL 中的 PDF 文件地址 const urlParams = new URLSearchParams(window.location.search); const pdfFile = urlParams.get('file'); if (pdfFile) { pdfjsLib.getDocument(pdfFile).promise.then(pdf => { console.log('PDF 加载成功,页数:', pdf.numPages); // 渲染第一页 pdf.getPage(1).then(page => { const canvas = document.getElementById('pdfCanvas'); const context = canvas.getContext('2d'); const viewport = page.getViewport({ scale: 1.5 }); canvas.height = viewport.height; canvas.width = viewport.width; page.render({ canvasContext: context, viewport }); }); }).catch(err => { console.error('加载 PDF 出错:', err); }); } </script> <canvas id="pdfCanvas"></canvas> ``` --- ## ✅ 总结 | 问题 | 原因 | 解决方案 | |------|------|-----------| | `Setting up fake worker` | `pdf.worker.js` 路径错误 | 设置 `workerSrc`,确保路径正确 | | `Failed to fetch` | PDF 地址无法访问或跨域 | 检查服务器是否运行,使用代理 | | `ERR_CONNECTION_REFUSED` | 服务器未运行或网络不通 | ping 地址、确认服务启动 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值