PDF.js 的上手
PDF.js 是前端展示 PDF 文件非常常用的工具库。可是它的文档写的过于简单,很难直接进行参考。本系列文章就来把我学习了解到的 API 的使用方法罗列出来。
要注意的是,PDF.js 更多用于展示 PDF,如果是需要进行创建、编辑 PDF,则需要考虑使用 pdf-lib
这个库。
安装
- 方法一,直接下载资源包。访问 官方文档的起始页,找到 Download 部分进行下载。
- 方法二,使用 CDN 方式引入。因为国内的 CDN 只能提供 js 文件,不提供字体文件,会导致部分 PDF 功能异常。使用这种方式,还需要自备字体文件等,比较麻烦。我不推荐这种方式。
- 方法三,使用
npm
安装,npm i pdfjs-dist
即可。此方法也需要自备字体文件等,暂时还没能解决直接引用npm
包中的文件。
需要注意的是,本系列撰写时的最新版 V4 只提供 mjs
格式的文件(浏览器需要支持模块引入),要想使用 js
格式,需要下载 V2 版本。
如果需要下载其他版本,可以访问 GitHub 上 pdf.js 的 tag 页面 查找并下载。
本系列撰写,按照 V4 版本 API 来实现,其他版本估计大同小异,请参考对应官方文档。
注意
由于 PDF.js
需要加载一些资源,故需要启动一个服务来访问对应的页面,而不是直接双击 index.html
打开页面文件。
我使用的 是 WebStorm
,可以自动创建一个 localhost:63342/pdfjs-demo
服务。后续代码中的路径等,需要与你的服务相匹配。后续我使用本地资源包形式来做说明。
资源要全部引入,否则可能因为缺少字体导致解析的数据有缺失。下面的例子中,不导入字体等文件依然可以正常运行,因为仅仅是加载 PDF,还没有做其他复杂操作。
资源包方式下载和 npm 方式获取的包,目录结构是有差异的,注意关注你选用方式的路径。
使用
下面两种方案,都是实现读取 PDF,并获取页数。
本地资源包形式
需要先到 官方文档的起始页 下载好资源包,再创建如下 index.html
文件。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>PDF</title>
<script type="module" src="./pdfjs-4.3.136-dist/build/pdf.mjs"></script>
</head>
<body>
<script>
document.addEventListener('DOMContentLoaded', () => {
main()
})
function main() {
pdfjsLib.GlobalWorkerOptions.workerSrc = './pdfjs-4.3.136-dist/build/pdf.worker.mjs'
const pdfDocumentLoadingTask = pdfjsLib.getDocument({
url: './demo.pdf',
cMapUrl: './pdfjs-4.3.136-dist/web/cmaps/',
cMapPacked: true,
standardFontDataUrl: './pdfjs-4.3.136-dist/web/standard_fonts/',
})
pdfDocumentLoadingTask.promise.then(pdfDocumentProxy => {
console.log('pdf page count:', pdfDocumentProxy.numPages)
})
}
</script>
</body>
</html>
访问后,日志中展示了解析后的页数数据。
npm 包形式
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>PDF</title>
</head>
<body>
<script src="./dist.js"></script>
</body>
</html>
import {getDocument, GlobalWorkerOptions} from 'pdfjs-dist'
const PDF_URL = './demo.pdf'
const PDF_WORKER_PATH = '/pdfjs-demo/npm/pdfjs/pdf.worker.mjs'
const PDF_CMAP_PATH = '/pdfjs-demo/npm/pdfjs/cmaps/'
const PDF_STANDARD_FONT_PATH = '/pdfjs-demo/npm/pdfjs/standard_fonts/'
// 设置 workerSrc 的路径
GlobalWorkerOptions.workerSrc = PDF_WORKER_PATH
const pdfDocumentLoadingTask = getDocument({
url: PDF_URL,
cMapUrl: PDF_CMAP_PATH,
cMapPacked: true,
standardFontDataUrl: PDF_STANDARD_FONT_PATH
})
pdfDocumentLoadingTask.promise.then(pdfDocumentProxy => {
console.log('pdf page count:', pdfDocumentProxy.numPages)
})
同样的,访问后,日志中展示了解析后的页数数据。