需求:在線瀏覽pdf文件,並且禁止掉用戶下載打印的效果。
分析:普通的iframe、embed標簽都只能實現在線瀏覽pdf的功能,無法禁止掉工具欄的下載打印功能。只能嘗試使用插件,pdfobject.js這個插件可以實現功能,而且操作簡單,但是兼容性不好,不兼容火狐、ie瀏覽器。於是替換成pdf.js
實現:因為不想在服務器放太多東西,所以引用pdf后的方法都是自己調用的api實現的。
以下僅是核心代碼,css就不展示了。
1.首先npm下載pdf.js
npm isntall --save pdfjs-dist
2.created中引入pdf.js (剛開始使用import引入本地的pfd.js文件,谷歌瀏覽器沒有問題。但是火狐無法正常顯示)
let PDFJS = require('pdfjs-dist').PDFJS //PDF.JS必須require引進去才不會有兼容問題
PDFJS.workerSrc = require('pdfjs-dist/build/pdf.worker.min');
3.頁面布局pdf的樣式和想要使用的功能 。這里是上一頁,下一頁,全屏功能
進入全屏
上一頁
Page:/
下一頁
4.一些方法。因為剛進頁面的時候是固定的一塊區域,還需要有全屏功能。於是按pdf的原來大小算出了比例,按比例計算的viewport。如果沒有這個需求,可以直接定義viewport
data中定義的變量
wid:645, //剛進入頁面中的pdf容器的寬度
pdfDoc:null,//pdfjs 生成的對象
pageNum:1,//
pageRendering:false,
pageNumPending:null,
scale:null,//放大倍數
page_num:0,//當前頁數
page_count:0,//總頁數
renderPage(num) {//渲染pdf
letvm=this
this.pageRendering=true;
letcanvas=this.$refs.canvas// Using promise to fetch the page
vm.pdfDoc.getPage(num).then(function(page) {
vm.scale=vm.wid/page.getViewport(1.0).width //vm.wid是在data中定義的一個變量,最初設置的pdf的寬度
varviewport=page.getViewport(vm.scale);
// var viewport = page.getViewport(vm.scale); //alert(vm.canvas.height)
canvas.height=viewport.height;
canvas.width=viewport.width;// Render PDF page into canvas context
console.log(vm.count)
varrenderContext= {
canvasContext:vm.ctx,
viewport:viewport
};
varrenderTask=page.render(renderContext);// Wait for rendering to finish
renderTask.promise.then(function() {
vm.pageRendering=false;
if(vm.pageNumPending!==null) {// New page rendering is pending
this.renderPage(vm.pageNumPending);
vm.pageNumPending=null;
}
});
});
vm.page_num=vm.pageNum;
},
上一頁:
prevpage() {//上一頁
letvm=this
if(vm.pageNum<=1) {
return;
}
vm.pageNum--;
this.queueRenderPage(vm.pageNum);
},
下一頁
nextpage() {//下一頁
letvm=this
if(vm.pageNum>=vm.page_count) {
return;
}
vm.pageNum++;
this.queueRenderPage(vm.pageNum);
},
queueRenderPage(num) {
if(this.pageRendering) {
this.pageNumPending=num;
}else{
this.renderPage(num);
}
},
渲染pdf文件。 this.pdf是服務器的pdf路徑。
PDFJS.getDocument(this.pdf).then(function(pdfDoc_) {//初始化pdf
that.pageNum=1
that.pdfDoc=pdfDoc_;
that.page_count=that.pdfDoc.numPages
that.renderPage(that.pageNum);
});
全屏:
this.winWidth=window.document.documentElement.clientWidth //改變pdf容器的寬高為全屏大小
this.winHeight=window.document.documentElement.clientHeight
letvm=this
vm.wid=window.document.documentElement.clientWidth-2 //重新復制viewport
// vm.wid= window.document.documentElement.clientHeight/vm.count
this.$refs.cpdf.style.width=window.document.documentElement.clientWidth
this.queueRenderPage(this.pageNum)
// 當用戶按esc鍵退回到之前的大小,監聽的退出全屏事件。重新wid變量,渲染viewport
document.addEventListener("webkitfullscreenchange",function() {
if(!document.webkitIsFullScreen){
vm.wid=645
vm.queueRenderPage(vm.pageNum)
}
},false)
document.addEventListener("fullscreenchange",function() {
if(!document.fullscreen){
vm.wid=645
vm.queueRenderPage(vm.pageNum)
}
},false);
document.addEventListener("mozfullscreenchange",function() {
if(!document.mozFullScreen){
vm.wid=645
vm.queueRenderPage(vm.pageNum)
}
},false);
document.addEventListener("msfullscreenchange",function() {
if(!document.msFullscreenElement){
vm.wid=645
vm.queueRenderPage(vm.pageNum)
}
fullscreenState.innerHTML= (document.msFullscreenElement)?"":"not ";
},false);
出處:https://www.jianshu.com/p/ecd34ab2cf55