Browse Source

为提高大数据量下的预览速度,尝试重写预览页面

sunyj 9 years ago
parent
commit
c99b96d4a1

+ 50 - 0
src/main/webapp/WEB-INF/views/preview2.html

@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<title>Preview2</title>
+<link rel="stylesheet" href="static/css/preview2.css">
+<link rel="stylesheet"
+	href="static/lib/fontawesome/css/font-awesome.min.css">
+</head>
+<body>
+
+	<div id="toolbarContainer">
+		<div id="toolbarViewerLeft">
+			<button id="prev">Previous</button>
+			<button id="next">Next</button>
+			&nbsp; &nbsp; <span>Page: <span id="page_index"></span> / <span
+				id="page_size"></span></span>
+		</div>
+
+
+		<div id="toolbarViewerRight">
+			<button id="download_pdf" class="toolbarButton hiddenMediumView"
+				title="下载PDF" tabindex="35">
+				<i class="fa fa-file-pdf-o fa-lg"></i>
+			</button>
+			<div class="splitToolbarButtonSeparator"></div>
+			<button id="download_excel" class="toolbarButton hiddenMediumView"
+				title="下载Excel" tabindex="36" hidden="true">
+				<i class="fa fa-file-excel-o fa-lg"></i>
+			</button>
+			<button id="download_excel_with_only_data"
+				class="toolbarButton hiddenMediumView" title="下载Excel(仅数据)"
+				tabindex="37">
+				<i class="fa fa-file-excel-o fa-lg"></i>
+			</button>
+		</div>
+	</div>
+
+	<div id="viewerContainer" style="text-align: center">
+		<canvas id="the-canvas"></canvas>
+	</div>
+
+	<iframe id="hiddenframe" hidden='true'></iframe>
+</body>
+
+<script src="static/lib/pdf.js/build/pdf.js"></script>
+<script src="static/lib/jquery/jquery.min.js"></script>
+<script src="static/js/preview/utils.js"></script>
+<script src="static/js/preview2/app.js"></script>
+</html>

+ 1 - 1
src/main/webapp/WEB-INF/views/prevnext.html

@@ -21,7 +21,7 @@
 	<!--<script src="../compatibility.js"></script>-->
 
 	<script src="static/lib/pdf.js/build/pdf.js"></script>
-
+	<script src="static/js/preview/utils.js"></script>
 	<script src="static/js/prevnext/app.js"></script>
 
 

+ 1 - 0
src/main/webapp/WEB-INF/webmvc.xml

@@ -34,4 +34,5 @@
 	<mvc:view-controller path="/fileUpload" view-name="fileUpload" />
 	<mvc:view-controller path="/prevnext" view-name="prevnext" />
 	<mvc:view-controller path="preview" view-name="preview" />
+	<mvc:view-controller path="preview2" view-name="preview2" />
 </beans>

+ 0 - 0
src/main/webapp/resources/css/preview.css


+ 43 - 0
src/main/webapp/resources/css/preview2.css

@@ -0,0 +1,43 @@
+body {
+	background-color: #404040;
+	height: 32px;
+}
+
+button {
+	border: 0;
+	background-color: #474747;
+	color: #fff;
+	cursor: pointer;
+}
+
+#viewerContainer {
+	position: relative;
+	top: 34px;
+	margin: 2px;
+}
+
+#toolbarContainer {
+	width: 100%;
+	background-color: #fff;
+	color: #fff;
+	cursor: default;
+}
+
+#toolbarViewerLeft {
+	margin-left: 20px;
+	float: left;
+}
+
+#toolbarViewerRight {
+	margin-right: 20px;
+	float: right;
+}
+
+.splitToolbarButtonSeparator {
+  padding: 8px 0;
+  width: 1px;
+  background-color: hsla(0,0%,0%,.5);
+  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
+  display: inline-block;
+  margin: -5px 0;
+}

+ 108 - 0
src/main/webapp/resources/js/preview2/app.js

@@ -0,0 +1,108 @@
+//pdf文件的路径
+var url;
+var pdfDoc = null;
+var pageIndex = 1;
+var pageSize = 1;
+var scale = 1;
+var canvas = document.getElementById('the-canvas');
+var ctx = canvas.getContext('2d');
+// 隐藏的iframe,用于加载pdf,以便打印(pdf.js自带的打印有问题)
+var hiddenframe = document.getElementById("hiddenframe");
+var winHeight;
+var winWidth;
+
+getWindowWidth();
+loadPdfData();
+getDocument();
+
+// 上页
+$("#prev").click(function() {
+	if (pageIndex <= 1) {
+		return;
+	}
+	// 获取前一页的pdf
+	url = url.replace(pageIndex + ".pdf", (--pageIndex) + ".pdf");
+	getDocument();
+});
+
+// 下页
+$("#next").click(function() {
+	if (pageIndex >= pageSize) {
+		return;
+	}
+	url = url.replace(pageIndex + ".pdf", (++pageIndex) + ".pdf");
+	getDocument();
+});
+
+// 获取窗口宽度
+function getWindowWidth() {
+	if (window.innerWidth)
+		winWidth = window.innerWidth;
+	else if ((document.body) && (document.body.clientWidth))
+		winWidth = document.body.clientWidth;
+	// 获取窗口高度
+	if (window.innerHeight)
+		winHeight = window.innerHeight;
+	else if ((document.body) && (document.body.clientHeight))
+		winHeight = document.body.clientHeight;
+	// 通过深入 Document 内部对 body 进行检测,获取窗口大小
+	if (document.documentElement && document.documentElement.clientHeight
+			&& document.documentElement.clientWidth) {
+		winHeight = document.documentElement.clientHeight;
+		winWidth = document.documentElement.clientWidth;
+	}
+}
+
+// 发送请求,服务器端进行填充报表、生成pdf文件等操作
+function loadPdfData() {
+	var loadPdfDataUrl = "print/loadPdfData" + window.location.search;
+	pageIndex = getParameter("pageIndex");
+	if (!pageIndex) {
+		pageIndex = 1;
+		loadPdfDataUrl = loadPdfDataUrl + "&pageIndex=" + pageIndex;
+	}
+	$.ajax({
+		type : "get",
+		async : false,
+		url : loadPdfDataUrl,
+		success : function(data) {
+			var pdfPath = data.pdfPath;
+			hiddenframe.src = pdfPath;
+			url = pdfPath.replace(".pdf", "_" + pageIndex + ".pdf");
+			pageSize = data.pageSize;
+			document.getElementById('page_size').textContent = pageSize;
+		}
+	});
+};
+
+// 下载pdf文件
+function getDocument() {
+	PDFJS.getDocument(url).then(function(pdfDoc_) {
+		// 更新页码
+		document.getElementById('page_index').textContent = pageIndex;
+		pdfDoc = pdfDoc_;
+		// Initial/first page rendering
+		renderPage();
+	});
+}
+
+// Get page info from document, resize canvas accordingly, and render page.
+function renderPage() {
+	// 每个pdf只有一页
+	pdfDoc.getPage(1).then(function(page) {
+		var viewport = page.getViewport(scale);
+		var viewportWidth = viewport.width;
+		// 自动调整宽度为窗口宽度的0.8倍
+		scale = scale * 0.8 / (viewportWidth / winWidth);
+		viewport = page.getViewport(scale);
+		canvas.height = viewport.height;
+		canvas.width = viewport.width;
+
+		// Render PDF page into canvas context
+		var renderContext = {
+			canvasContext : ctx,
+			viewport : viewport
+		};
+		var renderTask = page.render(renderContext);
+	});
+}

+ 11 - 5
src/main/webapp/resources/js/prevnext/app.js

@@ -3,7 +3,7 @@
 // header on that server.
 //
 //var url = 'static/lib/pdf.js/web/compressed.tracemonkey-pldi-09.pdf';
-var url = "static/js/prevnext/Purchase1.pdf";
+var url = "resources/generate/pdf/Purchase_1475898385642_1.pdf";
 // var url = 'file://C:/Users/sunyj-pc/Downloads/Purchase.pdf';
 //
 // Disable workers to avoid yet another cross-origin issue (workers need
@@ -19,9 +19,15 @@ var url = "static/js/prevnext/Purchase1.pdf";
 //
 // PDFJS.workerSrc = '../../build/pdf.worker.js';
 
-var pdfDoc = null, pageNum = 1, pageRendering = false, pageNumPending = null, scale = 1, canvas = document
-		.getElementById('the-canvas'), ctx = canvas.getContext('2d');
-var winHeight,winWidth;
+var pdfDoc = null;
+var pageNum = 1;
+var pageRendering = false;
+var pageNumPending = null;
+var scale = 1;
+var canvas = document.getElementById('the-canvas');
+var ctx = canvas.getContext('2d');
+var winHeight;
+var winWidth;
 
 /**
  * Get page info from document, resize canvas accordingly, and render page.
@@ -36,7 +42,7 @@ function renderPage(num) {
 		var viewport = page.getViewport(scale);
 		getWindowWidth();
 		var viewportWidth = viewport.width;
-		scale = scale * 0.8/ (viewportWidth / winWidth);
+		scale = scale * 0.8 / (viewportWidth / winWidth);
 		viewport = page.getViewport(scale);
 		console.log(winWidth);
 		console.log(viewport.width);