前端预览PDF文件(使用PDFJS)

简介: 我准备出一篇文章来介绍一下如何使用 PDFJS 。

PDF.js 是什么?


PDF.js 由 Mozilla 提供支持。目标是创建一个通用的、基于 Web 标准的平台,用于解析和呈现 PDF。


预览 PDF


使用 iframe、embed、新窗口打开


测试地址,方案比较简单,属于看天吃饭,全靠浏览器爸爸赏。


使用方式

<embed src="https://www.lilnong.top/static/pdf/B-4-RxJS%E5%9C%A8React%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8-%E9%BE%99%E9%80%B8%E6%A5%A0_.pdf">


<iframe src="https://www.lilnong.top/static/pdf/B-4-RxJS%E5%9C%A8React%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8-%E9%BE%99%E9%80%B8%E6%A5%A0_.pdf"></iframe>


测试结果


浏览器 兼容性 配图
Chrome(PC)(Mac) 支持

1.png

safari(PC)(Mac) 支持

2.png

Firefox(PC)(Mac) 支持

3.png

Firefox(PC)(Windows) 支持

4.png

Edge(PC)(Windows) 支持

5.png

IE(PC)(Windows) 不支持

6.png

微信(Android)(vivo x27) 不支持

7.png

Chrome(Android)(vivo x27) 不支持

8.png

QQ浏览器(Android)(vivo x27) 不支持

9.png


优点:简单,支持大部分 PC 浏览器(IE 不支持)。跨域资源同样可以(无需 cors)

缺点:不支持移动端浏览器,不支持 IE 等低版本浏览器。样式无法自定义。


pdfjs-view


测试地址,方案兼容性比较好,需要资源同域 或者 cors跨域,可以自定义样式。


使用方式


  1. 自己部署一个 pdfjs-view。 (推荐,更稳定)


  1. 下载项目,然后项目分为两个版本/web/viewer-1.html/legacy/web/viewer.html 。legacy 支持低版本浏览器,使用 es5 编写,讲道理采用这个方案,你肯定也是为了兼容所有浏览器。(没有的话,就 gulp generic-legacy 生成一份)


       b.然后将相关内容复制到你的目录,上传 FTP。


       c.本质来讲他就是一个 HTML 文件,所以你可以针对他进行一些修改,比如说主题颜色隐藏下载按钮等等。


  1. 使用 CDN 或者官方提供的 pdfjs-view。(不推荐,不稳定,异常CORS)


  1. https://mozilla.github.io/pdf.js/legacy/web/viewer.html
  2. https://mozilla.github.io/pdf.js/web/viewer.html
<iframe src="https://www.lilnong.top/static/project?file=https://www.lilnong.top/static/pdf/B-4-RxJS%E5%9C%A8React%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8-%E9%BE%99%E9%80%B8%E6%A5%A0_.pdf"></iframe>


<iframe src="https://www.lilnong.top/static/project/pdfjs-es5-2.5.207/web/viewer-1.html?file=https://www.lilnong.top/static/pdf/B-4-RxJS%E5%9C%A8React%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8-%E9%BE%99%E9%80%B8%E6%A5%A0_.pdf"></iframe>


测试结果


浏览器 兼容性 兼容性 ES5 版本 配图
Chrome(PC)(Mac) 支持 支持

1.png

safari(PC)(Mac) 支持 支持

2.png

Firefox(PC)(Mac) 支持 支持

3.png

Firefox(PC)(Windows) 支持 支持

4.png

Edge(PC)(Windows) 支持 支持

5.png

IE(PC)(Windows) 不支持 支持

6.png

微信(Android)(vivo x27) 支持 支持

7.png

Chrome(Android)(vivo x27) 支持 支持

8.png

QQ浏览器(Android)(vivo x27) 支持 支持

9.png


同上,可以看到 IE 都支持,移动端也 OK。

优点:支持大部分浏览器(PC、M端都支持)。跨域资源需要 cors。样式可以自定义。

缺点:需要部署一个 view。


pdfjs-canvas


测试地址,方案比较复杂,需要自己实现一套预览配套的内容(分页、放大缩小)。


使用方式

(function() {
    let el = document.getElementById('canvasWrap');
    if (!el) {
        el = document.createElement('div')
        el.id = 'canvasWrap'
        document.body.appendChild(el)
    }
    el.innerHTML = ''
    let winW = document.documentElement.clientWidth
    // 加载 pdf 资源
    let loadingTask = pdfjsLib.getDocument('https://www.lilnong.top/static/pdf/B-4-RxJS%E5%9C%A8React%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8-%E9%BE%99%E9%80%B8%E6%A5%A0_.pdf')
    // PDF 加载完成的回调。
    loadingTask.promise.then(function(pdf) {
        console.log('pdf', pdf)
        // 可以获取到总页数。
        let pageNum = pdf.numPages
        var _pageNum = 1;
        var renderPageToCanvas = function(pageNum, auto=false) {
            // 获取其中的一个页面
            pdf.getPage(pageNum).then(function(page) {
                // you can now use *page* here
                _pageNum = pageNum
                // 获取原始大小的数据
                var viewport = page.getViewport({
                    scale: 1,
                });
                var scale = (500 / viewport.width).toFixed(2)
                viewport = page.getViewport({
                    scale: scale
                });
                var canvas = document.createElement('canvas');
                el.appendChild(canvas)
                var context = canvas.getContext('2d');
                canvas.height = viewport.height;
                canvas.width = viewport.width;
                // 创建了一个canvas画板用来存放
                var renderContext = {
                    canvasContext: context,
                    viewport: viewport
                };
                page.render(renderContext);
                if (auto)
                    renderPageToCanvas(pageNum + 1, auto);
            });
        }
        renderPageToCanvas(_pageNum, true);
        canvasPrev.onclick = function() {
            renderPageToCanvas(Math.max(_pageNum - 1, 1));
        }
        canvasNext.onclick = function() {
            renderPageToCanvas(Math.min(_pageNum + 1, pdf.numPages));
        }
    }, function(reason) {
        console.error(reason)
    })
}
)()


测试结果


浏览器 兼容性 配图
Chrome(PC)(Mac) 支持

1.png

safari(PC)(Mac) 支持

2.png

Firefox(PC)(Mac) 支持

3.png

Firefox(PC)(Windows) 支持

4.png

Edge(PC)(Windows) 支持

5.png

IE(PC)(Windows) 不支持

6.png

微信(Android)(vivo x27) 支持

7.png

Chrome(Android)(vivo x27) 支持

8.png

QQ浏览器(Android)(vivo x27) 支持

9.png


兼容性也还可以,需要依赖canvas。


下载 PDF


  1. 下载头


  1. 直接打开


  1. 如果浏览器不支持解析 PDF 那么可以触发下载。
  2. 如果浏览器支持解析 PDF,那么会变成预览。
  3. 这个时候我们可以给 a 标签加上 download 来触发下载。(需要同域)


总结一下


通过上面的内容我们可以实现前端预览PDF功能了,我们来总结一下各个方案的特征。


方案 移动端 PC端(高版本浏览器) PC端(IE、低版本浏览器) 跨域 复制内容 自定义样式(分页、下载等等)
iframe ❌(平台不支持) ❌(平台不支持)
embed ❌(平台不支持) ❌(平台不支持) ✅(CORS)
pdfjs-view ❌(ES6 新特性) ✅(CORS) ✅(基于原有基础去修改)
pdfjs-view-es5 ✅(CORS) ✅(基于原有基础去修改)
pdfjs-canvas ❌(canvas) ✅(CORS) ❌(canvas) ✅(完全需要自己去实现一整套操作)
相关文章
|
2天前
|
Dart 前端开发
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
102 75
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
3天前
|
机器学习/深度学习 人工智能 文字识别
Zerox:AI驱动的万能OCR工具,精准识别复杂布局并输出Markdown格式,支持PDF、DOCX、图片等多种文件格式
Zerox 是一款开源的本地化高精度OCR工具,基于GPT-4o-mini模型,支持PDF、DOCX、图片等多种格式文件,能够零样本识别复杂布局文档,输出Markdown格式结果。
37 4
Zerox:AI驱动的万能OCR工具,精准识别复杂布局并输出Markdown格式,支持PDF、DOCX、图片等多种文件格式
|
1月前
|
人工智能 文字识别 数据挖掘
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
MarkItDown 是微软开源的多功能文档转换工具,支持将 PDF、PPT、Word、Excel、图像、音频等多种格式的文件转换为 Markdown 格式,具备 OCR 文字识别、语音转文字和元数据提取等功能。
238 9
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
|
1月前
|
JavaScript
jquery图片和pdf文件预览插件
EZView.js是一款jquery图片和pdf文件预览插件。EZView.js可以为图片和pdf格式文件生成在线预览效果。支持的文件格式有pdf、jpg、 png、jpeg、gif。
56 16
|
2月前
|
前端开发 JavaScript
除了 jsPDF,还有哪些前端库可以用于生成 PDF?
【10月更文挑战第21天】这些前端库都有各自的特点和优势,你可以根据具体的项目需求、技术栈以及对功能的要求来选择合适的库。不同的库在使用方法、性能表现以及功能支持上可能会有所差异,需要根据实际情况进行评估和选择。
|
2月前
|
前端开发 API
前端界面生成PDF并导出下载
【10月更文挑战第21天】利用合适的第三方库,你可以在前端轻松实现界面生成 PDF 并导出下载的功能,为用户提供更方便的文档分享和保存方式。你还可以根据具体的需求进一步优化和定制生成的 PDF 文件,以满足不同的业务场景要求。
|
3月前
|
Java Apache Maven
将word文档转换成pdf文件方法
在Java中,将Word文档转换为PDF文件可采用多种方法:1) 使用Apache POI和iText库,适合处理基本转换需求;2) Aspose.Words for Java,提供更高级的功能和性能;3) 利用LibreOffice命令行工具,适用于需要开源解决方案的场景。每种方法都有其适用范围,可根据具体需求选择。
|
3月前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
1053 1
|
3月前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
252 0
|
3月前
|
前端开发 JavaScript API
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
297 0

热门文章

最新文章