基于pdf.js简单在线pdf文件预览跨域解决方案,兼容性好!

基于pdf.js简单在线pdf文件预览跨域解决方案,兼容性好!


主要内容

基于pdf.js的移动端在线pdf文件预览,支持跨域的源码,兼容性强,不受浏览器约束,还可以将pdf转成图片。

前提条件

  1. 必须拥有两个域的支配权,这个非常重要!(之所以存在跨域这个问题,我查了查,感觉主要也是为了网络的安全,毕竟现实中也有划分界限的说法,但是同样也有牛逼的人可以占有两个领域的,所以就要解决跨域了)
  2. 本文是建立在PHP的基础上的,但是其他语言同样可行;

具体实现

1.引入pdf.js

例如:

<script src="pdf.js" type="text/javascript"></script>
<script src="pdf.worker.js" type="text/javascript"></script>

2.获取pdf文件总页数

例如:

PDFJS.getDocument(url).then(function getPdfHelloWorld(pdf) {
                pages = pdf.numPages;//获取总页数
                for(var i = 1;i < pdf.numPages;i++){//循环输出
                	
                }
            });

3.获取每页的内容

例如(具体1参数详见官方API):

function showall(url,page,id){
    
    
    		PDFJS.getDocument(url).then(function getPdfHelloWorld(pdf) {
    
    
                pdf.getPage(page).then(function getPageHelloWorld(page) {
    
    
                    var scale = 1.0;
                    var viewport = page.getViewport(scale);
                    var canvas = document.getElementById(id);
                    var context = canvas.getContext('2d');
                    canvas.height = viewport.height;
                    canvas.width = viewport.width;
                    var renderContext = {
    
    
                        canvasContext: context,
                        viewport: viewport
                    };
                    page.render(renderContext);
                });
            });
    	}

4.跨域问题(重要)

对于pdf.js单方面想要解决跨域问题只能说能力有限,想要解决还要从服务器端下手,通过修改http报头为header(‘Access-Control-Allow-Origin:*’),为什么这样可以自行百度。

PHP服务端配置test.php

function sendfile( $fullPath ){
    
    
        $fsize = filesize($fullPath);
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private",false);
        header("Content-Type: application/pdf");
        header('Access-Control-Allow-Origin:*');
        header("Content-Disposition: attachment; filename=\"".basename($fullPath)."\";" );
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: ".$fsize);
        ob_clean();
        flush();
        readfile( $fullPath );
}

客户端配置

<html>
	<head>
		<meta charset="UTF-8">
		<title>Document</title>
		<style type="text/css">
			.lightbox {
     
     
				position: fixed;
				top: 0px;
				left: 0px;
				height: 100%;
				width: 100%;
				z-index: 7;
				opacity: 0.3;
				display: block;
				background-color: rgb(0, 0, 0);
			}
			
			.close {
     
     
				position: relative;
				z-index: 10;
				text-align: center;
				color: red;
				font-size: 18px;
			}
			
			.pop {
     
     
				position: relative;
				text-align: center;
				z-index: 9;
			}
			
			.pop canvas {
     
     
				margin: 20px auto;
				display: block;
			}
		</style>
	</head>

	<body>
		<h1><a href="javascript:void(0)" target="_blank" onclick="showPdf()">显示pdf文档</a></h1>
		<h1><a href="http://XXXXXXXXXXX/test.php">下载pdf文档</a></h1>
		<div id="container" style="display: none;">
			<div class="lightbox"></div>
			<div id="close" class="close">关闭</div>
			<div id="pop" class="pop"></div>
		</div>
	</body>
	<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
	<script src="pdf.js" type="text/javascript"></script>
	<script src="pdf.worker.js" type="text/javascript"></script>
	<script type="text/javascript">
		function showall(url, page, id) {
     
     
			PDFJS.getDocument(url).then(function getPdfHelloWorld(pdf) {
     
     
				console.log(pdf.numPages);
				pdf.getPage(page).then(function getPageHelloWorld(page) {
     
     
					var scale = 1.0;
					var viewport = page.getViewport(scale);
					var canvas = document.getElementById(id);
					var context = canvas.getContext('2d');
					canvas.height = viewport.height;
					canvas.width = viewport.width;
					var renderContext = {
     
     
						canvasContext: context,
						viewport: viewport
					};
					page.render(renderContext);
				});
			});
		}

		function showPdf() {
     
     
			var url = 'http://XXXXXXXXXXX/test.php';//pdf文件地址
			$("#container").show();
			$("#pop").empty();
			PDFJS.getDocument(url).then(function getPdfHelloWorld(pdf) {
     
     
				pages = pdf.numPages;
				for(var i = 1; i < pdf.numPages; i++) {
     
     
					var id = 'page-id-' + i;
					$("#pop").append('<canvas id="' + id + '"></canvas>');
					showall(url, i, id);
				}
			});
		}
		$("#close").click(function() {
     
     
			$("#container").hide();
		});
	</script>

</html>

5.效果预览

单页显示
多页显示

猜你喜欢

转载自blog.csdn.net/xiao_bin_shen/article/details/77778514