关于pdf.js获取不到文本的问题

在使用pdf.js获取PDF文本时,发现有部分文件获取不到文本(另:vue-pdf依赖于pdf.js,所以也会出现这个问题)。

此时,控制台其实给出了警告提示信息,只不过是用console.log打印的,容易被忽视。

Warning: Error during font loading: CMap baseUrl must be specified, see "PDFJS.cMapUrl" (and also "PDFJS.cMapPacked").

**警告:**字体加载过程中发生错误:必须指定CMap的"baseUrl"参数,请确保提供了"cMapUrl"和"cMapPacked"API参数。

**原因:**PDF文档中包含有pdf.js不支持的字体格式。

**解决方法:**网上粗略搜了下,可能不同版本配置cMapUrl的方式不同,不容易找到适合自己的,不过在源码中稍加搜索还是可以很快找到的。

我这里控制台输出PDFJS.version得到的版本号是1.10.88,解决办法是:在引入完pdf.js以后,为其cMapUrl赋值即可。

PDFJS.cMapUrl='/lib/CMap/'; // CMap文件路径

设置完成后,再次刷新页面,可以发现文件已经正常显示了(pdf.js处理PDF文件时会自动从设置的CMap文件路径中获取所需的字体文件)。

附注1:字体文件的获取

1)官方在github上提供了一些:https://github.com/adobe-type-tools/cmap-resources

2)我在网上搜集了一些:https://download.csdn.net/download/xueshen1106/89220133

附注2:cMapPacked的配置

网上下载的字体文件有很多可能是带着bcmap后缀的,这意味着它是一个打包的cmap文件,那么在使用时可以将 PDFJS.cMapPacked 设置为 true。这时,pdf.js在获取字体文件时也会自动增加bcmap后缀。

但这里有个需要注意的地方:如果直接将带bcmap后缀的文件去掉后缀(同时不设置cMapPacked),这时字体文件仍然可以正常加载使用;但如果是将未打包的字体文件直接人为添加bcmap后缀(同时cMapPacked设置为true),经测试,这样字体文件不能被正确使用,是获取不到PDF文本的。

最后,对比下同一个字体打包和不打包的内容差异:

相关推荐
hedley(●'◡'●)5 小时前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
百思可瑞教育5 小时前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
CappuccinoRose6 小时前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
全栈前端老曹6 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
NCDS程序员7 小时前
v-model: /v-model/ :(v-bind)三者核心区别
前端·javascript·vue.js
小杨同学呀呀呀呀7 小时前
Ant Design Vue <a-timeline>时间轴组件失效解决方案
前端·javascript·vue.js·typescript·anti-design-vue
qq_532453537 小时前
使用 Three.js 构建沉浸式全景图AR
开发语言·javascript·ar
Mr Xu_16 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠16 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
sleeppingfrog16 小时前
zebra通过zpl语言实现中文打印(二)
javascript