pdf.js 预览文件缺失

推荐俩款使用预判pdf的插件,一个是vue-pdf,一个是pdf-dist

如果是pdf-dist
需要更改一下node_modules下的pdf.js文件

params.rangeChunkSize = params.rangeChunkSize || 
DEFAULT_RANGE_CHUNK_SIZE;
params.CMapReaderFactory = params.CMapReaderFactory || 
_display_utils.DOMCMapReaderFactory;
params.ignoreErrors = params.stopAtErrors !== true;
params.fontExtraProperties = params.fontExtraProperties === true;
params.pdfBug = params.pdfBug === true;

//解决文字缺少问题
params.cMapPacked = true
params.cMapUrl = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.2.228/cmaps/'

可以搜素一下pdfBug定位一下,新增两行代码即可

如果使用vue-pdf,引入node_modules下的

 import CMapReaderFactory from "vue-pdf/src/CMapReaderFactory.js";
  that.url = pdf.createLoadingTask({
          url: e.target.result,
          CMapReaderFactory
        });

但是CMapReaderFactory存在缓存 也就是你发现打开一次后效果就没了,文字还是缺失或者乱码,

在 vue-pdf/src/CMapReaderFactory.js中,增加一行代码即可

        delete require.cache[require.resolve('./buffer-loader!pdfjs-dist/cmaps/'+query.name+'.bcmap')];

完整代码

    import { CMapCompressionType } from 'pdfjs-dist/es5/build/pdf.js'

    // see https://github.com/mozilla/pdf.js/blob/628e70fbb5dea3b9066aa5c34cca70aaafef8db2/src/display/dom_utils.js#L64

    export default function() {

        this.fetch = function(query) {
            delete require.cache[require.resolve('./buffer-loader!pdfjs-dist/cmaps/'+query.name+'.bcmap')];
            return import('./buffer-loader!pdfjs-dist/cmaps/'+query.name+'.bcmap' /* webpackChunkName: "noprefetch-[request]" */)
            .then(function(bcmap) {

                return {
                    cMapData: bcmap.default,
                    compressionType: CMapCompressionType.BINARY,
                };
            });
        }
    };

如果你是做在移动端的页面,可引入hammerjs进行双指缩放

npm i hammjs -S

新建一个export的功能js

    import Hammer from 'hammerjs'//引用hammerjs
    
    //定义缩放方法,接收一个element参数:使用export暴露该方法
    export function zoomElement(el){
    
        var x = 0;//x轴偏移
        var y = 0;//y轴偏移
        var lastScale = 1;//上次缩放值
        var currentScale = 1;//当前缩放值
        var center;//双指中心点
        
        //初始化hammer
        var hammer = new Hammer(el);
        //缩放事件默认是关闭的,需要设置启用
        hammer.get('pinch').set({ enable: true });
        
        //监听缩放事件
        hammer.on("pinchmove pinchstart pinchin pinchout",e => {
            //缩放开始时获取上一次缩放值与双指中心点
            if(e.type == "pinchstart"){
                lastScale = currentScale || 1;
                center = e.center;
            }
            //当前缩放值 = 上一次缩放值 * 缩放比例
            currentScale = lastScale * e.scale;
            
            //如果缩放值小于1,重置为1
            if (currentScale < 1){
                currentScale = 1;
            }
            
            //偏移量 = 双指中心点 - 当前缩放值 * 双指中心点 = 双指中心点 *(1-当前缩放值)
            x = center.x * (1-currentScale)
            y = center.y * (1-currentScale)
            
            //设置transform
            el.style.transform="translateX("+(x)+"px)"+"translateY("+(y)+"px)"+"scale(" + (currentScale)+ ")"
        });
        //监听滑动事件
        hammer.on('panright panleft panup pandown',(e)=>{
            //滑动时:偏移量 = 滑动距离 + 当前偏移量
            var translateX = e.deltaX + x
            var translateY = e.deltaY + y
            //如果偏移X值大于0:表示视图已经滑到最左侧,重置为0
            if (translateX > 0){
                translateX = 0
            }
            //如果偏移Y值大于0:表示视图已经滑到最顶部,重置为0
            if (translateY > 0){
                translateY = 0
            }
            //如果偏移X值小于(屏幕宽度-元素宽度):表示视图已经滑到最左侧,重置为0
            //屏幕宽度 = el.clientWidth
            //元素宽度 = el.getBoundingClientRect().width
            if (translateX < el.clientWidth - el.getBoundingClientRect().width){
                translateX = el.clientWidth - el.getBoundingClientRect().width
            }
            //如果偏移Y值大于(屏幕高度-元素高度):表示视图已经滑到最左侧,重置为0
            //屏幕高度 = el.clientHeight
            //元素高度 = el.getBoundingClientRect().height
            if (translateY < el.clientHeight - el.getBoundingClientRect().height){
                translateY = el.clientHeight - el.getBoundingClientRect().height
            }
            //设置transform
            el.style.transform="translateX("+(translateX)+"px)"+"translateY("+(translateY)+"px)"+"scale(" + (currentScale)+ ")"
        });
        hammer.on('panend',(e)=>{
            //滑动结束:记录当前偏移量 
            x = e.deltaX + x;
            y = e.deltaY + y;
        
        })
    }

使用方法,引入该暴露的js

import { zoomElement } from "./zoom.js";

 <div style="height: 100%" ref="test" class="test"></div>

.test {
  transform-origin: 0 0;
  touch-action: pan-x pan-y pinch-zoom;
}
mounted(){
let zoomEl = this.$refs.test;
zoomElement(zoomEl);
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,858评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,372评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,282评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,842评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,857评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,679评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,406评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,311评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,767评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,090评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,785评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,420评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,988评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,101评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,298评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,033评论 2 355

推荐阅读更多精彩内容