Parcourir la source

预览时除第1页外不生成第2、3页,预览时若当前页不存在,才生成

sunyj il y a 9 ans
Parent
commit
658eb97d7e

+ 16 - 9
src/main/java/com/uas/report/controller/PrintController.java

@@ -78,7 +78,7 @@ public class PrintController {
 		if (printType.equals(ReportConstants.PREVIEW_PRINT_TYPE)
 				|| printType.equals(ReportConstants.PRINT_PRINT_TYPE)) {
 			try {
-				request.getRequestDispatcher("preview").forward(request, response);
+				request.getRequestDispatcher("preview2").forward(request, response);
 			} catch (IOException | ServletException e) {
 				throw new ReportException(e).setDetailedMessage(e);
 			}
@@ -208,19 +208,22 @@ public class PrintController {
 				+ fileService.generateFileName(userName, profile, reportName, whereCondition, otherParameters) + ".pdf";
 		File file = new File(PathUtils.getAppPath() + pdfPath);
 		// 文件无效(不存在或过期),重新创建pdf文件
-		if (!fileService.isFileValid(file.getPath(), fileService.getJrxmlFilePath(userName, reportName))) {
-			// 若参数pageIndex不为null,表示是预览
+		if (!fileService.isFileValid(
+				pageIndex == null ? file.getPath() : file.getPath().replace(".pdf", "_" + pageIndex + ".pdf"),
+				fileService.getJrxmlFilePath(userName, reportName))) {
+			// 若参数pageIndex不为null,表示是预览并且预览第一页
 			// 检查第一页的pdf文件是否存在,若不存在,先生成第一页pdf,返回给前台展示,
 			// 再开线程生成后面页的pdf和总的pdf(即未分页的pdf),以备后续可能的打印、下载操作使用
-			if (pageIndex != null) {
+			if (pageIndex != null && pageIndex == 1) {
 				Integer pageSize = printService.previewFirstPage(userName, profile, reportName, whereCondition,
 						otherParameters, file.getPath());
 				result = new HashMap<>();
 				result.put("pageSize", pageSize);
 			}
-			// 参数pageIndex为null,表示是直接打印,需要先生成总的pdf
+			// 参数pageIndex为null或不为1,表示是直接打印(需要先生成总的pdf)或预览非第一页
 			else {
-				result = printService.preview(userName, profile, reportName, whereCondition, otherParameters, null);
+				result = printService.preview(userName, profile, reportName, whereCondition, otherParameters,
+						pageIndex);
 				byte[] data = null;
 				if (result != null && result.containsKey("data")) {
 					data = (byte[]) result.remove("data");
@@ -228,9 +231,13 @@ public class PrintController {
 				if (ArrayUtils.isEmpty(data)) {
 					throw new ReportException("获取预览数据失败");
 				}
-				FileUtils.create(file.getPath(), data);
-				// 同时生成分页的pdf
-				fileService.createPagedPdfFiles(file.getPath());
+				if (pageIndex == null) {
+					FileUtils.create(file.getPath(), data);
+					// 同时生成分页的pdf
+					fileService.createPagedPdfFiles(file.getPath());
+				} else {
+					FileUtils.create(file.getPath().replace(".pdf", "_" + pageIndex + ".pdf"), data);
+				}
 			}
 		} else {
 			result = new HashMap<>();

+ 5 - 4
src/main/java/com/uas/report/service/impl/PrintServiceImpl.java

@@ -108,10 +108,11 @@ public class PrintServiceImpl implements PrintService {
 			@Override
 			public void run() {
 				// 生成之后2~3页的pdf,防止数据量较大的情况下,卡在生成总的pdf阶段,此时查看前3页也不会卡顿
-				for (int i = 2; i <= Math.min(pageSize, 3); i++) {
-					createPdfFile(userName, profile, reportName, whereCondition, otherParameters,
-							pdfFilePath.replace(".pdf", "_" + i + ".pdf"), i);
-				}
+				// for (int i = 2; i <= Math.min(pageSize, 3); i++) {
+				// createPdfFile(userName, profile, reportName, whereCondition,
+				// otherParameters,
+				// pdfFilePath.replace(".pdf", "_" + i + ".pdf"), i);
+				// }
 				// 生成总的pdf
 				createPdfFile(userName, profile, reportName, whereCondition, otherParameters, pdfFilePath, null);
 				fileService.createPagedPdfFiles(pdfFilePath);

+ 44 - 47
src/main/webapp/resources/js/preview2/app.js

@@ -31,7 +31,7 @@ var pagedPdfPath;
 var printType = getParameter("printType");
 
 getWindowWidth();
-loadData();
+loadData(1);
 
 // 是否立即打印
 if (printType == 'PRINT') {
@@ -69,29 +69,26 @@ $("#prev").click(prevPage);
 $("#next").click(nextPage);
 
 // 手动输入页码
-$("#pageIndex").keypress(
-		function(event) {
-			if (!pdfDoc) {
+$("#pageIndex").keypress(function(event) {
+	if (!pdfDoc) {
+		return;
+	}
+	// 按Enter键
+	if (event.keyCode == 13) {
+		var value = document.getElementById("pageIndex").value;
+		// 以非0开头的整数
+		var regExp = /^([1-9]+\d*)$/;
+		if (regExp.test(value) && value >= 1 && value <= pageSize) {
+			if (value == pageIndex) {
 				return;
 			}
-			// 按Enter键
-			if (event.keyCode == 13) {
-				var value = document.getElementById("pageIndex").value;
-				// 以非0开头的整数
-				var regExp = /^([1-9]+\d*)$/;
-				if (regExp.test(value) && value >= 1 && value <= pageSize) {
-					if (value == pageIndex) {
-						return;
-					}
-					pagedPdfPath = pagedPdfPath.replace(pageIndex + ".pdf",
-							value + ".pdf");
-					pageIndex = value;
-					loadPagedPdf(pagedPdfPath);
-				} else {
-					document.getElementById("pageIndex").value = pageIndex;
-				}
-			}
-		});
+			pageIndex = value;
+			loadData(pageIndex);
+		} else {
+			document.getElementById("pageIndex").value = pageIndex;
+		}
+	}
+});
 
 // 打印
 $("#print").click(function() {
@@ -284,13 +281,12 @@ function loadPagedPdf(pagedPdfPath, ifPreloadWholePdf) {
 /**
  * 发送请求,服务器端进行填充报表、生成pdf文件等操作
  */
-function loadData() {
-	var loadPdfDataUrl = "print/loadPdfData" + window.location.search;
-	// 未传参数printType或者为PREVIEW,则先获取第一页pdf
-	if (!printType || printType == "PREVIEW") {
-		loadPdfDataUrl = loadPdfDataUrl + "&pageIndex=" + 1;
-	}
+function loadData(page) {
+	ctx.clearRect(0, 0, canvas.width, canvas.height);
 	showLoading();
+	pageIndex = page || 1;
+	var loadPdfDataUrl = "print/loadPdfData" + window.location.search;
+	loadPdfDataUrl = loadPdfDataUrl + "&pageIndex=" + pageIndex;
 	$.ajax({
 		type : "get",
 		async : false,
@@ -298,19 +294,20 @@ function loadData() {
 		success : function(data) {
 			// 返回的pdf文件路径
 			wholePdfPath = data.pdfPath;
-			if (!pageIndex) {
-				pageIndex = 1;
-			}
-			// 第一页的pdf文件路径
+			// 第pageIndex页的pdf文件路径
 			pagedPdfPath = wholePdfPath.replace(".pdf", "_" + pageIndex
 					+ ".pdf");
-			pageSize = data.pageSize;
-			document.getElementById('pageSize').textContent = pageSize;
-			document.title = getParameter("reportName");
-			// 加载第一页文档
-			loadPagedPdf(pagedPdfPath, true);
-			// $.when(getDocument()).done(loadWholePdf);
-			// console.log(renderTask._internalRenderTask.running);
+			if (pageIndex == 1) {
+				pageSize = data.pageSize;
+				document.getElementById('pageSize').textContent = pageSize;
+				document.title = getParameter("reportName");
+				// 加载第一页文档,并且预加载整个文档
+				loadPagedPdf(pagedPdfPath, true);
+				// $.when(getDocument()).done(loadWholePdf);
+				// console.log(renderTask._internalRenderTask.running);
+			} else {
+				loadPagedPdf(pagedPdfPath);
+			}
 		},
 		error : function(XMLHttpRequest) {
 			$("#theCanvas").remove();
@@ -339,6 +336,10 @@ function loadWholePdf() {
 	console.log(new Date().format()
 			+ " ---- received and unsubscribe renderTaskFinishedSignal");
 	$.unsubscribe("renderTaskFinishedSignal", loadWholePdf);
+	// 之前已经加载,不再加载
+	if (hiddenFrameLoaded) {
+		return;
+	}
 	// 渲染完成后延迟一小段时间预加载整个文档
 	sleep(500);
 	if (pageSize > PRINT_MAX_PAGE_SIZE) {
@@ -458,11 +459,9 @@ function prevPage() {
 	if (!pdfDoc || pageIndex <= 1) {
 		return;
 	}
-	showLoading();
 	// 获取前一页的pdf
-	pagedPdfPath = pagedPdfPath.replace(pageIndex + ".pdf", (--pageIndex)
-			+ ".pdf");
-	loadPagedPdf(pagedPdfPath);
+	pageIndex--;
+	loadData(pageIndex);
 }
 
 /**
@@ -472,10 +471,8 @@ function nextPage() {
 	if (!pdfDoc || pageIndex >= pageSize) {
 		return;
 	}
-	showLoading();
-	pagedPdfPath = pagedPdfPath.replace(pageIndex + ".pdf", (++pageIndex)
-			+ ".pdf");
-	loadPagedPdf(pagedPdfPath);
+	pageIndex++;
+	loadData(pageIndex);
 }
 
 /**