Browse Source

预览页面增加对文件状态、加载成功与否、文件过大等情况的处理

sunyj 9 years ago
parent
commit
689f1f4af4
1 changed files with 123 additions and 42 deletions
  1. 123 42
      src/main/webapp/resources/js/preview2/app.js

+ 123 - 42
src/main/webapp/resources/js/preview2/app.js

@@ -9,31 +9,28 @@ var hiddenFrame = document.getElementById("hiddenFrame");
 // pdf文件的路径
 var url;
 var pdfDoc;
-//页码
+// 页码
 var pageIndex;
-//总页数
+// 总页数
 var pageSize;
-//预览的pdf的缩放级别(为pdf原大小的倍数)
+// 预览的pdf的缩放级别(为pdf原大小的倍数)
 var scale;
-//浏览器窗口高度
+// 浏览器窗口高度
 var winHeight;
-//浏览器窗口宽度
+// 浏览器窗口宽度
 var winWidth;
-//参数打印类型,可能为PRINT、PREVIEW
-var printType = getParameter("printType");
-//hiddenFrame是否加载成功
+// hiddenFrame是否加载成功
 var hiddenFrameLoaded = false;
+// 将要打印的总的pdf相对路径
+var pdfPath;
+// 参数打印类型,可能为PRINT、PREVIEW
+var printType = getParameter("printType");
 
 getWindowWidth();
-loadPdfData();
+loadData();
 
 // 是否立即打印
-if (printType && printType == 'PRINT') {
-	// hiddenFrame.onload = function() {
-	// }
-//	hiddenFrame.contentWindow.print();
-//	if (hiddenFrameLoaded) {
-//	}
+if (printType == 'PRINT') {
 	printPdf();
 }
 
@@ -96,12 +93,12 @@ $("#print").click(function() {
 		return;
 	}
 	printPdf();
-//	console.log("1--loaded.." + hiddenFrameLoaded);
-//	if (hiddenFrameLoaded) {
-//		hiddenFrame.contentWindow.print();
-//	} else {
-//		console.log("2--loaded.." + hiddenFrameLoaded);
-//	}
+	// console.log("1--loaded.." + hiddenFrameLoaded);
+	// if (hiddenFrameLoaded) {
+	// hiddenFrame.contentWindow.print();
+	// } else {
+	// console.log("2--loaded.." + hiddenFrameLoaded);
+	// }
 });
 
 // 下载pdf
@@ -109,6 +106,12 @@ $("#downloadPdf").click(function() {
 	if (!pdfDoc) {
 		return;
 	}
+	// 检查文件状态,直到其可用
+	var valid;
+	while (!valid) {
+		valid = getGeneratedPdfOrXlsInformation("pdf")
+		sleep(1000);
+	}
 	window.location = downloadUrl("pdf");
 });
 
@@ -117,6 +120,11 @@ $("#downloadExcelWithOnlyData").click(function() {
 	if (!pdfDoc) {
 		return;
 	}
+	var valid;
+	while (!valid) {
+		valid = getGeneratedPdfOrXlsInformation("xls")
+		sleep(1000);
+	}
 	window.location = downloadUrl("xls_with_only_data");
 });
 
@@ -158,30 +166,47 @@ function getWindowWidth() {
 /**
  * 打印
  */
-//TODO delete 为hiddenFrame绑定事件,一旦pdf加载成功,修改hiddenFrameLoaded值
+// TODO delete 为hiddenFrame绑定事件,一旦pdf加载成功,修改hiddenFrameLoaded值
 function printPdf() {
-	console.log(hiddenFrameLoaded);
-	if(hiddenFrameLoaded){
-		return hiddenFrame.contentWindow.print();
+	if (pageSize > 1000) {
+		alert("文件过大,建议先下载到本地,再进行打印");
+		return;
 	}
-	//IE的onload事件
-	if (hiddenFrame.attachEvent) {
-		hiddenFrame.attachEvent("onload", function() {
-			hiddenFrameLoaded = true;
-			hiddenFrame.contentWindow.print();
-		})
-	} else {
-		hiddenFrame.onload = function() {
-			hiddenFrameLoaded = true;
-			hiddenFrame.contentWindow.print();
-		};
+	var valid;
+	while (!valid) {
+		valid = getGeneratedPdfOrXlsInformation("pdf")
+		sleep(1000);
 	}
+	while (!hiddenFrameLoaded) {
+		console.log(Date.now() + " not loaded yet");
+		sleep(1000);
+	}
+	console.log(Date.now() + " loaded");
+	hiddenFrame.contentWindow.print();
+	// console.log("1----" + hiddenFrameLoaded);
+	// if (!hiddenFrameLoaded) {
+	// hiddenFrame.src = pdfPath;
+	// // IE的onload事件
+	// if (hiddenFrame.attachEvent) {
+	// hiddenFrame.attachEvent("onload", function() {
+	// hiddenFrameLoaded = true;
+	// hiddenFrame.contentWindow.print();
+	// })
+	// } else {
+	// hiddenFrame.onload = function() {
+	// hiddenFrameLoaded = true;
+	// hiddenFrame.contentWindow.print();
+	// };
+	// }
+	// } else {
+	// hiddenFrame.contentWindow.print();
+	// }
 }
 
 /**
  * 发送请求,服务器端进行填充报表、生成pdf文件等操作
  */
-function loadPdfData() {
+function loadData() {
 	var loadPdfDataUrl = "print/loadPdfData" + window.location.search;
 	if (printType == "PREVIEW") {
 		loadPdfDataUrl = loadPdfDataUrl + "&pageIndex=" + 1;
@@ -192,17 +217,19 @@ function loadPdfData() {
 		url : loadPdfDataUrl,
 		success : function(data) {
 			// 返回的pdf文件路径
-			var pdfPath = data.pdfPath;
-			hiddenFrame.src = pdfPath;
+			pdfPath = data.pdfPath;
 			if (!pageIndex) {
 				pageIndex = 1;
 			}
-			// 获取所对应的分页的pdf文件路径
+			// 第一页的pdf文件路径
 			url = pdfPath.replace(".pdf", "_" + pageIndex + ".pdf");
 			pageSize = data.pageSize;
 			document.getElementById('pageSize').textContent = pageSize;
 			document.title = getParameter("reportName");
+			// 加载第一页文档
 			getDocument();
+			// 预加载整个文档
+			preloadWholePdf();
 		},
 		error : function(XMLHttpRequest) {
 			var viewerContainer = document.getElementById("viewerContainer");
@@ -219,7 +246,7 @@ function loadPdfData() {
 };
 
 /**
- * 下载pdf文件
+ * 获取预览的pdf文档数据
  */
 function getDocument() {
 	PDFJS.getDocument(url).then(function(pdfDoc_) {
@@ -231,6 +258,27 @@ function getDocument() {
 	});
 }
 
+/**
+ * 预加载整个pdf(大于1000页,不加载)文件,以提高后续打印速度
+ */
+function preloadWholePdf() {
+	if (pageSize > 1000) {
+		console.log("文件过大,建议先下载到本地,再进行打印");
+		return;
+	}
+	hiddenFrame.src = pdfPath;
+	hiddenFrame.onload = function() {
+		// 加载失败(pdf文件不存在,404错误),title不为null
+		if (hiddenFrame.contentDocument.title) {
+			console.log(Date.now() + " " + hiddenFrame.contentDocument.title);
+			hiddenFrame.src = pdfPath;
+			sleep(2000);
+		} else {
+			hiddenFrameLoaded = true;
+		}
+	};
+}
+
 /**
  * Get page info from document, resize canvas accordingly, and render page
  */
@@ -261,12 +309,13 @@ function renderPage() {
 }
 
 /**
- * 调整pdf显示的宽度为窗口宽度的multipleOfWindowWidth倍
+ * 获取缩放级别(将pdf显示的宽度调整为窗口宽度的multipleOfWindowWidth倍,获取该情况下pdf宽度为原宽度的倍数)
  * 
  * @param page
  *            pdf数据
  * @param multipleOfWindowWidth
  *            窗口宽度的倍数
+ * @returns {Number} 缩放级别(pdf原宽度的倍数)
  */
 function getScale(page, multipleOfWindowWidth) {
 	// 首先获取pdf原始宽度
@@ -307,4 +356,36 @@ function changeTextOfSelectScale() {
 	hiddenOption.text = (scale * 100).toFixed() + "%";
 	hiddenOption.selected = true;
 	hiddenOption.hidden = true;
+}
+
+/**
+ * 获取生成的pdf或者xls的信息
+ * 
+ * @param pdfOrXls
+ *            pdf或者xls
+ */
+function getGeneratedPdfOrXlsInformation(pdfOrXls) {
+	var valid;
+	$.ajax({
+		type : "get",
+		async : false,
+		url : "print/getGeneratedPdfOrXlsInformation" + window.location.search
+				+ "&pdfOrXls=" + pdfOrXls,
+		success : function(data) {
+			console.log(data);
+			valid = data.valid;
+		}
+	});
+	return valid;
+}
+
+/**
+ * 休眠一段时间
+ * 
+ * @param millsecond
+ *            休眠时长(毫秒)
+ */
+function sleep(millsecond) {
+	for (var d = Date.now(); Date.now() - d <= millsecond;)
+		;
 }