Angualr1 簡單使用PDF.js查看字節(jié)流PDF文件

怕你不是斯巴達(dá)!!

需求介紹

    前端請(qǐng)求并在線查看PDF文件,PDF文件通過后臺(tái)以字節(jié)流返回

一,導(dǎo)入PDF.JS

    將下載的pdf.js中的pdf.js和pdf.worker.js復(fù)制到項(xiàng)目中的

插件文件夾(如:lib),然后在項(xiàng)目的入口文件中注冊(cè)

入口文件中注冊(cè)

二,控制器請(qǐng)求文件,并通過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;  //初始話數(shù)據(jù)
                       
                        $("#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");
                                       //獲取到鼠標(biāo)點(diǎn)擊的位置距離div左側(cè)和頂部邊框的距離;
                                       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;
                                       
                                       //當(dāng)鼠標(biāo)移動(dòng),把鼠標(biāo)的偏移量付給div
                                       document.onmousemove=function(ev){
                                           //計(jì)算出鼠標(biāo)在XY方向上移動(dòng)的偏移量,把這個(gè)偏移量加給DIV的左邊距和上邊距,div就會(huì)跟著移動(dòng)
                                           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";
                                       }
                                       //當(dāng)鼠標(biāo)按鍵抬起,清除移動(dòng)事件
                                       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;  }
/*定義滾動(dòng)條高寬及背景 高寬分別對(duì)應(yīng)橫豎滾動(dòng)條的尺寸*/  
#the-canvas_box::-webkit-scrollbar  
{ width: 5px;   height: 5px;   background-color: #F5F5F5;  }  
  
/*定義滾動(dòng)條軌道 內(nèi)陰影+圓角*/  
#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;  }  
  
/*定義滑塊 內(nèi)陰影+圓角*/  
#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內(nèi)配置路徑修改

原文件workerSrc
修改后workerSrc

注意:PDF.JS有多個(gè)workerSrc都要修改成導(dǎo)入項(xiàng)目后的路徑

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、垂直對(duì)齊 如果你用CSS,則你會(huì)有困惑:我該怎么垂直對(duì)齊容器中的元素?現(xiàn)在,利用CSS3的Transform,...
    kiddings閱讀 3,297評(píng)論 0 11
  • 這篇文字里我會(huì)介紹50 個(gè)便于使用的 CSS2/CSS3 代碼片段給所有的WEB專業(yè)人員. 選擇IDE開發(fā)環(huán)境來存...
    JamHsiao_aaa4閱讀 1,575評(píng)論 0 3
  • 各種純css圖標(biāo) CSS3可以實(shí)現(xiàn)很多漂亮的圖形,我收集了32種圖形,在下面列出。直接用CSS3畫出這些圖形,要比...
    劍殘閱讀 9,979評(píng)論 0 8
  • 《如何閱讀一本書》讀后感 這是一本實(shí)用型的圖書,主要內(nèi)容就如同書名所訴,是教你如何去閱讀一本書。很有意思的是,知道...
    奕風(fēng)少年520閱讀 210評(píng)論 0 0
  • 虹影成詩 【孤獨(dú)感】 孤獨(dú)感這東西沒由來已久,似乎與靈魂共生。我很孤獨(dú),從頭發(fā)到腳趾頭。害怕一個(gè)人的時(shí)候,更害怕明...
    豬二十四閱讀 349評(píng)論 0 0

友情鏈接更多精彩內(nèi)容