pdf.js+turn.js实现电子书3d翻页效果

网上查了很多资料最后终于弄好了,记录一下 

<!DOCTYPE html>
<html>
<head>
    <title>电子书</title>
    <style>
        body,html{
            height: 100vh;
            width: 100vw;
            padding: 0;
            margin: 0;
            overflow: hidden;
        }
        #flipbook {
            height: 900px;
            margin: 0 auto !important;
        }

        #flipbook .turn-page {
            background-color: white;
        }

        #flipbook .cover {
            background: #333;
        }

        #flipbook .cover h1 {
            color: white;
            text-align: center;
            font-size: 50px;
            line-height: 500px;
            margin: 0px;
        }

       #flipbook .loader {
            /* background-image: url(loader.gif); */
            width: 24px;
            height: 24px;
            display: block;
            position: absolute;
            top: 238px;
            left: 188px;
        }

        #flipbook .data {
            text-align: center;
            font-size: 40px;
            color: #999;
            line-height: 500px;
        }

        #flipbook .odd {
            background-image: -webkit-linear-gradient(left, #FFF 95%, #ddd 100%);
            background-image: -moz-linear-gradient(left, #FFF 95%, #ddd 100%);
            background-image: -o-linear-gradient(left, #FFF 95%, #ddd 100%);
            background-image: -ms-linear-gradient(left, #FFF 95%, #ddd 100%);
            box-shadow: 0 3px 15px #4d4c4c;
        }

        #flipbook .even {
            background-image: -webkit-linear-gradient(right, #FFF 95%, #ddd 100%);
            background-image: -moz-linear-gradient(right, #FFF 95%, #ddd 100%);
            background-image: -o-linear-gradient(right, #FFF 95%, #ddd 100%);
            background-image: -ms-linear-gradient(right, #FFF 95%, #ddd 100%);
            box-shadow: 0 3px 15px #4d4c4c;
        }
        .page {
            background-color: #fff;
        }
        .he{
            width: 1200px;
            height: 850px;
            margin: 0 auto;
            box-shadow: 0 3px 15px #4d4c4c;
            margin-bottom: 20px;
            margin-top: 20px;
        }
    </style>
</head>
<body>
<div class="he">
    <!-- <h1>电子书</h1> -->
    <div style="width: 1200px;height:850px;text-align: center;background-color: #fff;">
        <div id="flipbook" style="margin-left: 20%;background-color: #fff;"></div>
    </div>
</div>
<script src="../../common/libs/jquery/jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="./js/pdf.js"></script>
<script src="./js/pdf.worker.js"></script>
<script src="./js/turnjs4/extras/modernizr.2.5.3.min.js"></script>
<script>
    //定义一些参数
	var flipbook=$("#flipbook")
	var pagestr = 1,bid= 1, scale = 1, rotate = 90;
    window.onload=function(){
        let url = window.location.search.split('&')[0].split('=')[1]
        console.log(url);
        if (url) {
            //此处传递pdf路径
    	    getpdf(url)
        }
        else{
            return
        }
    }
    let num = 0
    //获取pdf
    function getpdf(url){
    	var loadingTask=pdfjsLib.getDocument(url)//获取pdf的文件信息
    	loadingTask.promise
		.then(function(pdf){
            num = pdf.numPages
            // console.log('num',num);
    		//根据总页数添加固定的div和canvas
    		for (let i = 1; i <= pdf.numPages;i++) {
					var id = 'canvaspage' + i
					var div =  '<canvas id="' + id + '" class="page"></canvas>'
					flipbook.append(div)
					setcanvas(i,pdf,id)
			}
            //调用turn
			yepnope({
					test : Modernizr.csstransforms,
					yep: ['./js/turnjs4/lib/turn.js'],
					complete: loadApp
			})
    	})
    }
    function setcanvas(i,pdf,id){
		pdf.getPage(i).then(function(page) {
			    var viewport = page.getViewport({scale:scale})
                var canvas = document.getElementById(id)
			    var context = canvas.getContext('2d')
 
 
				//根据宽高判断是否需要旋转
				if (viewport.height / viewport.width >= 1.42) {
 
					var newScale = 1440 / viewport.height
					var newViewport = page.getViewport({scale:newScale,rotation:rotate})
					var outputScale = window.devicePixelRatio
 
					canvas.width = Math.floor(newViewport.width * outputScale);
					canvas.height = Math.floor(newViewport.height * outputScale);
					canvas.style.width = Math.floor(newViewport.width) + "px";
					canvas.style.height = Math.floor(newViewport.height) + "px";
 
					var transform = outputScale !== 1 ? [outputScale, 0, 0, outputScale, 0, 0] :
						null;
 
					var renderContext = {
						canvasContext: context,
						transform: transform,
						viewport: newViewport
			    	}
			   		page.render(renderContext)
 
					return ;
				}
 
				//根据每张图的宽高,按标准重新计算缩放比例
				var newScale = 900 / viewport.height
				
				var newViewport = page.getViewport({scale:newScale})
				var outputScale = window.devicePixelRatio
 
				canvas.width = Math.floor(newViewport.width * outputScale);
				canvas.height = Math.floor(newViewport.height * outputScale);
				canvas.style.width = Math.floor(newViewport.width) + "px";
				canvas.style.height = Math.floor(newViewport.height) + "px";
 
				var transform = outputScale !== 1 ? [outputScale, 0, 0, outputScale, 0, 0] :
					null;
 
			    var renderContext = {
			        canvasContext: context,
					transform: transform,
			        viewport: newViewport
			    }
			   page.render(renderContext)
		})
	}

    //turn.js
	function loadApp() {
		$("#flipbook").turn({
			  width: 1200,
			  height: 850,
			  elevation: 50,
			  display: 'double',
			  autoCenter: true,
			  duration:1000,
			  gradients:true,
		})
	}
</script>
</body>
</html>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值