Angualr1 简单使用PDF.js查看字节流PDF文件

怕你不是斯巴达!!

需求介绍

    前端请求并在线查看PDF文件,PDF文件通过后台以字节流返回

一,导入PDF.JS

    将下载的pdf.js中的pdf.js和pdf.worker.js复制到项目中的

插件文件夹(如:lib),然后在项目的入口文件中注册

入口文件中注册

二,控制器请求文件,并通过PDF.JS打开

define(
  ['app', 'pdfjs','ngDraggable',], function(app,pdfjs) {
    var deps = ['$modal', '$rootScope'];
    function directive($modal ,$rootScope) {
        return {
            templateUrl: "views/chat/ChatMsgContent.html",
            replace: true,
            link: function($scope, elem, attrs) {
                $scope.pdfPage = 1;
                $scope.pdfPageMax = 1;
                $scope.pdfscale = 1;
                $scope.saveURL = 'saveURL';
                window.openPDF =  function openPDF(attachId){
                    var getattachId = attachId;
                    var url = $scope.baseUrl + "fileUploadController/downFile?fileId=" + getattachId;
                        if (/-pdf/g.test(getattachId)) {
                            var str = getattachId;
                            var replacestr = str.substring(0,str.length-4);
                            $("#downLoadPDF").attr('href',$scope.baseUrl + "fileUploadController/downFile?fileId=" + replacestr);
                        }else{
                            $("#downLoadPDF").attr('href',url);
                        }
                        
                        $scope.pdfscale = 1;     $scope.pdfPage = 1;    $scope.saveURL = url;  //初始话数据
                       
                        $("#pdfPage").val(1);
                         
                        pdfjs.getDocument(url).then(function getPdfHelloWorld(pdf) {
                            var container = document.getElementById("PDFcontainer");
                            container.style.display = "flex"; 
                            $scope.pdfPageMax = pdf.pdfInfo.numPages;
                        
                            pdf.getPage($scope.pdfPage).then(function getPageHelloWorld(page) {
                                var scale = 1;
                                var viewport = page.getViewport(scale);
                                var canvas = document.getElementById('the-canvas');
                                var canvas_box = document.getElementById('the-canvas_box');
                                var context = canvas.getContext('2d');
                                canvas.height = viewport.height;
                                canvas.width = viewport.width;
                                
                                if((viewport.height > window.innerHeight * 0.85 || viewport.height > window.innerHeight - 165) && window.innerHeight <= 900){
                                    var initNum = window.innerHeight / viewport.height * 0.85;
                                    //canvas.style.transform = 'scale('+initNum+','+initNum+')';
                                    canvas_box.style.position = "relative";
                                    canvas_box.style.height = viewport.height*initNum + "px";
                                    canvas_box.style.width = viewport.width*initNum+ "px";
                                    
                                    canvas.style.position="absolute";
                                    canvas.style.left = "0px";
                                    canvas.style.top = "0px";
                                    
                                    $scope.pdfSetLeft = 0;
                                    $scope.pdfSetTop = 0;
                                    $scope.pdfoX = 0;
                                    $scope.pdfoY = 0;
                                    
                                    canvas_box.onmousedown=function(ev){
                                       var e=window.event || ev;
                                       //var Mydiv=document.getElementById("div");
                                       //获取到鼠标点击的位置距离div左侧和顶部边框的距离;
                                       var oX=e.clientX-canvas_box.offsetLeft;
                                       var oY=e.clientY-canvas_box.offsetTop;
                                       $scope.pdfoX = $scope.pdfoX == 0?oX:$scope.pdfoX;
                                       $scope.pdfoY = $scope.pdfoY == 0?oY:$scope.pdfoY;
                                       
                                       var maxOY = viewport.height - viewport.height*initNum;
                                       var maxOX = viewport.width - viewport.width*initNum;
                                       
                                       //当鼠标移动,把鼠标的偏移量付给div
                                       document.onmousemove=function(ev){
                                           //计算出鼠标在XY方向上移动的偏移量,把这个偏移量加给DIV的左边距和上边距,div就会跟着移动
                                           var e= window.event|| ev;
                                           var theLeft = e.clientX-$scope.pdfoX;
                                           var theTop = e.clientY-$scope.pdfoY;
                                           if(theLeft <= 0 && Math.abs(theLeft) <= maxOX ) $scope.pdfSetLeft = theLeft;
                                           if(theTop <= 0 && Math.abs(theTop) <= maxOY ) $scope.pdfSetTop = theTop;
                                           
                                           canvas.style.left = $scope.pdfSetLeft+"px";
                                           canvas.style.top = $scope.pdfSetTop+"px";
                                       }
                                       //当鼠标按键抬起,清除移动事件
                                       document.onmouseup=function(){
                                           document.onmousemove=null;
                                           document.onmouseup=null;
                                       }
                                      }
                                }
                                var renderContext = {
                                    canvasContext: context,
                                    viewport: viewport
                                };
                                page.render(renderContext);
                            });
                        }).catch(v=>{
                            console.warn(v);
                            var a = document.createElement('a');
                            if (/-pdf/g.test(getattachId)) {
                                var str = getattachId;
                                var replacestr = str.substring(0,str.length-4);
                                 a.href = $scope.baseUrl +  "fileUploadController/downFile?fileId=" + replacestr;
                            }else{
                                 a.href = url;
                            }
                            a.click();
                        });
                }
                $('#PDFlightbox').bind('click',function(){
                    var container = document.getElementById("PDFcontainer");
                    container.style.display = "none";
                });
                window.PDFDAO = function PDFDAO(daotype){
                     if(daotype == 'prev' && $scope.pdfPage != 1)$scope.pdfPage--;
                     if(daotype == 'next' && $scope.pdfPage != $scope.pdfPageMax)$scope.pdfPage++;
                     
                     if(daotype == 'big' && $scope.pdfscale < 2) $scope.pdfscale = $scope.pdfscale+0.1;
                     if(daotype == 'small' && $scope.pdfscale > 1) $scope.pdfscale = $scope.pdfscale-0.1;
                     
                     var gotoPage = parseInt($("#pdfPage").val());
                     if(daotype == 'go' && gotoPage >= 1 && gotoPage <= $scope.pdfPageMax) {
                        $scope.pdfPage = gotoPage;
                     }
                     $("#pdfPage").val($scope.pdfPage);
                     if($scope.pdfPage != 0 && $scope.pdfPage != $scope.pdfPageMax){
                         pdfjs.getDocument($scope.saveURL).then(function getPdfHelloWorld(pdf) {
                             pdf.getPage($scope.pdfPage).then(function getPageHelloWorld(page) {
                                 var scale = $scope.pdfscale;
                                 var viewport = page.getViewport(scale);
                                 var canvas = document.getElementById('the-canvas');
                                 var context = canvas.getContext('2d');
                                 canvas.height = viewport.height;
                                 canvas.width = viewport.width;
                                 var renderContext = {
                                     canvasContext: context,
                                     viewport: viewport
                                 };
                                 page.render(renderContext);
                             });
                         });
                     }   
                }
               
            }
        }
    }
    directive.$inject = deps;
    return app.lazy.directive('fcPdf', directive);
});

三,view层定义模块
1.模版样式

#PDFcontainer{position: fixed;top: 0px;left: 0px;height: 100%;width: 100%; z-index: 6;}
.lightboxCover{position: fixed;top: 0px;left: 0px;height: 100%;width: 100%; z-index: 7;opacity: 0.4;display: block;background-color: rgb(0, 0, 0);}
.lightbox{z-index: 8;}
.itermText_Center { display: flex; -webkit-box-align: center;-webkit-align-items: center;-ms-flex-align: center;align-items: center;-webkit-box-pack: center;-webkit-justify-content: center;-ms-flex-pack: center;justify-content: center;}
#Dao{padding-top: 20px; position: fixed; bottom: 20px; width: 500px;left: 50%; margin-left: -250px;}
#Dao a{display: inline-block; padding: 3px;margin: 5px;background: #fff; text-align: center; overflow: hidden; border-radius: 2px; box-shadow: 0 0 5px #eee;}
#pop{position: relative;}

#the-canvas_box{background-color: #fff;  }
/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/  
#the-canvas_box::-webkit-scrollbar  
{ width: 5px;   height: 5px;   background-color: #F5F5F5;  }  
  
/*定义滚动条轨道 内阴影+圆角*/  
#the-canvas_box::-webkit-scrollbar-track  
{  -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);  border-radius: 10px;   background-color: #F5F5F5;  }  
  
/*定义滑块 内阴影+圆角*/  
#the-canvas_box::-webkit-scrollbar-thumb  
{  border-radius: 10px;  -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);  background-color: #555;  }  
    2.HTML模版
         <div id="PDFcontainer" class="itermText_Center" style="display: none;">
          
            <div class="lightboxCover" id="PDFlightbox"></div>
            
            <div class="lightbox itermText_Center" >
                <div id="pop" class="pop">
                    <div id="the-canvas_box" style="overflow:auto;">
                         <canvas id="the-canvas"></canvas>
                    </div>
                    <div id="Dao" class="pop" ng-show="pdfPageMax != 1">
                        <a href="javascript:PDFDAO('prev');">上一页</a>
                        <a href="javascript:PDFDAO('next');">下一页</a>
                        
                        <a href="javascript:PDFDAO('big');" style="width:20px;">+</a>
                        <a href="javascript:PDFDAO('small');" style="width:20px;">-</a>
                        
                        <a href="" id="downLoadPDF" style="float:right;">下载 </a>
                        
                        <div class="itermText_Center" style="float:right;">
                          <input type="text" id="pdfPage" style="display: inline-block; padding: 3px;margin: 5px;width:25px;height:24px;">
                          <a href="javascript:PDFDAO('go');">GO</a>
                        </div>
                    </div>
                </div>
            </div>
            
        </div>

四,PDF.JS内配置路径修改

原文件workerSrc
修改后workerSrc

注意:PDF.JS有多个workerSrc都要修改成导入项目后的路径

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

推荐阅读更多精彩内容

  • 1、垂直对齐 如果你用CSS,则你会有困惑:我该怎么垂直对齐容器中的元素?现在,利用CSS3的Transform,...
    kiddings阅读 3,148评论 0 11
  • 这篇文字里我会介绍50 个便于使用的 CSS2/CSS3 代码片段给所有的WEB专业人员. 选择IDE开发环境来存...
    JamHsiao_aaa4阅读 1,099评论 0 3
  • 各种纯css图标 CSS3可以实现很多漂亮的图形,我收集了32种图形,在下面列出。直接用CSS3画出这些图形,要比...
    剑残阅读 9,472评论 0 8
  • 《如何阅读一本书》读后感 这是一本实用型的图书,主要内容就如同书名所诉,是教你如何去阅读一本书。很有意思的是,知道...
    奕风少年520阅读 139评论 0 0
  • 虹影成诗 【孤独感】 孤独感这东西没由来已久,似乎与灵魂共生。我很孤独,从头发到脚趾头。害怕一个人的时候,更害怕明...
    猪二十四阅读 285评论 0 0