如何用VanillaJS/Node.js获取本地PDF书签页码(无依赖)
用VanillaJS/Node.js无库提取PDF书签页码的可行性及工具推荐
需求可行性分析
直接用纯VanillaJS/Node.js(无第三方库)提取PDF书签对应的页码几乎不可行,原因如下:
- PDF并非纯文本格式,它是包含二进制结构、压缩流、交叉引用表的复合文档,书签(PDF术语为「大纲」)的信息存储在专门的大纲字典中,关联页码需要解析PDF内部对象引用、目标(Dest)或动作(A)字段才能获取。
- 你当前用正则匹配的方式只能抓取PDF中零散的文本片段,根本无法定位结构化的大纲数据,修改正则后返回大量字符数组,本质是匹配了PDF中无意义的文本内容,完全无法提取有效书签信息。
- 若要纯手写代码实现,需要完整实现PDF解析逻辑:处理二进制文件读取、解码压缩内容、解析交叉引用表、遍历大纲树节点、解析页码映射——这相当于从零开发一个简易PDF解析器,工作量极大,完全不现实。
推荐工具库
如果要实现该需求,推荐以下成熟的Node.js库:
pdf-lib:纯JavaScript实现的PDF操作库,支持读取PDF大纲(书签),可直接获取每个大纲节点对应的目标页码,API设计友好,无需依赖外部工具。pdf-parse:轻量级PDF解析库,除提取文本和基础元数据外,还支持获取PDF大纲结构,能拿到书签对应的页码信息。pdfjs-dist:Mozilla官方的PDF解析库,原本用于浏览器端,也可在Node.js环境中配置使用,能完整解析PDF大纲和页码映射,功能强大。
你的现有尝试代码
const fs = require('fs').promises let rawData = await fs.readFile(fullPath, 'utf8', (err, data) => { if (err) { console.error('test error', err); return; } }); async function pdfDetails(data) { return new Promise(done => { let Pages2 = data.match(/[a-zA-Z]/g); let regex = /<xmp.*?:(.*?)>(.*?)</g; let meta = [{ Pages }]; let matches = regex.exec(data); while (matches != null) { matches.shift(); meta.push({ [matches.shift()]: matches.shift() }); matches = regex.exec(data); } done(meta); }); } let details = await pdfDetails(rawData) console.log(details)
内容的提问来源于stack exchange,提问作者Andreas C
相关产品推荐
相关产品推荐

