Browse Source

因受浏览器版本影响,返回字节数组,pdf.js会预览失败,所以直接将数据写入输出流

sunyj 9 years ago
parent
commit
c36ab566d9

+ 19 - 1
src/main/java/com/uas/report/controller/PrintController.java

@@ -118,7 +118,7 @@ public class PrintController {
 	@RequestMapping(value = "/loadPdfData")
 	@ResponseBody
 	public Map<String, Object> loadPdfData(String userName, String reportName, String whereCondition,
-			String otherParameters, Integer pageIndex) {
+			String otherParameters, Integer pageIndex, HttpServletResponse response) {
 		String message = "";
 		if (StringUtils.isEmpty(userName)) {
 			message = "未传入当前账套用户名!";
@@ -146,6 +146,24 @@ public class PrintController {
 		// 对pdf流进行base64编码
 		result.put("data", Base64.encodeBase64String(data));
 		logger.info("预览报表成功:" + reportName);
+		OutputStream outputStream = null;
+		try {
+			outputStream = response.getOutputStream();
+			outputStream.write(data);
+			outputStream.flush();
+		} catch (IOException e) {
+			e.printStackTrace();
+			throw new SystemError(e.getMessage());
+		} finally {
+			if (outputStream != null) {
+				try {
+					outputStream.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+					throw new SystemError(e.getMessage());
+				}
+			}
+		}
 		return result;
 	}
 }

+ 11 - 4
src/main/resources/dev/js-rest-api.properties

@@ -1,11 +1,18 @@
 schema=http
-host=localhost
-port=8081
+host=192.168.253.60
+port=8080
 contextRoot=jasperserver
 rest=rest_v2
 resources=resources
-authorization=amFzcGVyYWRtaW46emh1aTEqOA==
+authorization=amFzcGVyYWRtaW46amFzcGVyYWRtaW4=
 images=Picture
-localBaseDir=C:/sunyj/reports
+localBaseDir=C:/sunyj/reports/60
+#host=localhost
+#port=8081
+#contextRoot=jasperserver
+#rest=rest_v2
+#resources=resources
+#authorization=amFzcGVyYWRtaW46emh1aTEqOA==
+#localBaseDir=C:/sunyj/reports/local
 localImagesDir=/Picture
 localJrxmlDir=/jrxml

+ 2 - 2
src/main/webapp/WEB-INF/views/preview.html

@@ -33,8 +33,6 @@ See https://github.com/adobe-type-tools/cmap-resources
 <link rel="stylesheet"
 	href="static/lib/fontawesome/css/font-awesome.min.css">
 
-<script src="static/lib/pdf.js/web/compatibility.js"></script>
-
 <!-- This snippet is used in production (included from viewer.html) -->
 <link rel="resource" type="application/l10n"
 	href="static/lib/pdf.js/web/locale/locale.properties">
@@ -528,6 +526,8 @@ See https://github.com/adobe-type-tools/cmap-resources
 	</div>
 
 </body>
+
+<script src="static/lib/pdf.js/web/compatibility.js"></script>
 <script src="static/lib/pdf.js/web/l10n.js"></script>
 <script src="static/lib/pdf.js/build/pdf.js"></script>
 <script src="static/lib/jquery/jquery.min.js"></script>

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

@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<title>Previous/Next example</title>
+</head>
+<body>
+
+	<div>
+		<button id="prev">Previous</button>
+		<button id="next">Next</button>
+		&nbsp; &nbsp; <span>Page: <span id="page_num"></span> / <span
+			id="page_count"></span></span>
+	</div>
+
+	<div style="text-align: center">
+		<canvas id="the-canvas"></canvas>
+	</div>
+
+	<!-- for legacy browsers add compatibility.js -->
+	<!--<script src="../compatibility.js"></script>-->
+
+	<script src="static/lib/pdf.js/build/pdf.js"></script>
+
+	<script src="static/js/prevnext/app.js"></script>
+
+
+</body>
+</html>

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

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

+ 19 - 20
src/main/webapp/resources/js/preview/app.js

@@ -16,7 +16,6 @@ var downloadReport = function(exportFileType) {
 	exportFileType = exportFileType || "pdf";
 	// 导出文件的格式
 	downloadUrl += "&exportFileType=" + exportFileType;
-	console.log(downloadUrl);
 	window.location = downloadUrl;
 }
 
@@ -62,27 +61,25 @@ var getParameters = function() {
 
 // 获取数据
 function loadData() {
-	$.ajax({
-		type : "post",
-		async : false,
-		url : "print/loadPdfData",
-		data : getParameters(),
-		success : function(data) {
-			pageSize = data.pageSize;
-			PDFData = base64_decode(data.data);
-			var rawLength = PDFData.length;
-			// 转换成pdf.js能直接解析的Uint8Array类型,见pdf.js-4068
-			var array = new Uint8Array(new ArrayBuffer(rawLength));
-			for (var i = 0; i < rawLength; i++) {
-				array[i] = PDFData.charCodeAt(i) & 0xff;
-			}
-			DEFAULT_URL = array;
-		}
-	});
+	var loadDataUrl = "print/loadPdfData" + window.location.search;
+	pageIndex = getParameter("pageIndex");
+	if (!pageIndex) {
+		pageIndex = 1;
+		loadDataUrl = loadDataUrl + "&pageIndex=" + pageIndex;
+	}
+	DEFAULT_URL = loadDataUrl;
+
+	/*
+	 * $.ajax({ type : "post", async : false, url : "print/loadPdfData", data :
+	 * getParameters(), success : function(data) { // pageSize = data.pageSize;
+	 * PDFData = base64_decode(data); // PDFData = data; var rawLength =
+	 * PDFData.length; // // 转换成pdf.js能直接解析的Uint8Array类型,见pdf.js-4068 var array =
+	 * new Uint8Array(new ArrayBuffer(rawLength)); for (var i = 0; i <
+	 * rawLength; i++) { array[i] = PDFData.charCodeAt(i) & 0xff; } DEFAULT_URL =
+	 * array; } });
+	 */
 };
 
-loadData();
-
 // base64 解码
 function base64_decode(str) {
 	var c1, c2, c3, c4;
@@ -140,3 +137,5 @@ function base64_decode(str) {
 	}
 	return string;
 }
+
+loadData();

+ 133 - 0
src/main/webapp/resources/js/prevnext/app.js

@@ -0,0 +1,133 @@
+//
+// If absolute URL from the remote server is provided, configure the CORS
+// 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 = 'file://C:/Users/sunyj-pc/Downloads/Purchase.pdf';
+//
+// Disable workers to avoid yet another cross-origin issue (workers need
+// the URL of the script to be loaded, and dynamically loading a cross-origin
+// script does not work).
+//
+// PDFJS.disableWorker = true;
+
+//
+// In cases when the pdf.worker.js is located at the different folder than the
+// pdf.js's one, or the pdf.js is executed via eval(), the workerSrc property
+// shall be specified.
+//
+// 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;
+
+/**
+ * Get page info from document, resize canvas accordingly, and render page.
+ * 
+ * @param num
+ *            Page number.
+ */
+function renderPage(num) {
+	pageRendering = true;
+	// Using promise to fetch the page
+	pdfDoc.getPage(num).then(function(page) {
+		var viewport = page.getViewport(scale);
+		getWindowWidth();
+		var viewportWidth = viewport.width;
+		scale = scale * 0.8/ (viewportWidth / winWidth);
+		viewport = page.getViewport(scale);
+		console.log(winWidth);
+		console.log(viewport.width);
+		console.log(viewportWidth / winWidth);
+		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);
+
+		// Wait for rendering to finish
+		renderTask.promise.then(function() {
+			pageRendering = false;
+			if (pageNumPending !== null) {
+				// New page rendering is pending
+				renderPage(pageNumPending);
+				pageNumPending = null;
+			}
+		});
+	});
+
+	// Update page counters
+	document.getElementById('page_num').textContent = pageNum;
+}
+
+/**
+ * If another page rendering in progress, waits until the rendering is finised.
+ * Otherwise, executes rendering immediately.
+ */
+function queueRenderPage(num) {
+	if (pageRendering) {
+		pageNumPending = num;
+	} else {
+		renderPage(num);
+	}
+}
+
+/**
+ * Displays previous page.
+ */
+function onPrevPage() {
+	if (pageNum <= 1) {
+		return;
+	}
+	pageNum--;
+	queueRenderPage(pageNum);
+}
+document.getElementById('prev').addEventListener('click', onPrevPage);
+
+/**
+ * Displays next page.
+ */
+function onNextPage() {
+	if (pageNum >= pdfDoc.numPages) {
+		return;
+	}
+	pageNum++;
+	queueRenderPage(pageNum);
+}
+document.getElementById('next').addEventListener('click', onNextPage);
+
+/**
+ * Asynchronously downloads PDF.
+ */
+PDFJS.getDocument(url).then(function(pdfDoc_) {
+	pdfDoc = pdfDoc_;
+	document.getElementById('page_count').textContent = pdfDoc.numPages;
+
+	// Initial/first page rendering
+	renderPage(pageNum);
+});
+
+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;
+	}
+}

+ 2 - 2
src/main/webapp/resources/lib/pdf.js/web/viewer.js

@@ -16,7 +16,7 @@
 
 'use strict';
 
-//var DEFAULT_URL = 'pdf.js/web/compressed.tracemonkey-pldi-09.pdf';
+//var DEFAULT_URL = 'static/lib/pdf.js/web/compressed.tracemonkey-pldi-09.pdf';
 
   var pdfjsWebLibs = {
     pdfjsWebPDFJS: window.pdfjsDistBuildPdf
@@ -6952,7 +6952,7 @@ var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;
 
 function configure(PDFJS) {
   PDFJS.imageResourcesPath = './images/';
-  PDFJS.workerSrc = 'pdf.js/build/pdf.worker.js';
+  PDFJS.workerSrc = 'static/lib/pdf.js/build/pdf.worker.js';
   PDFJS.cMapUrl = 'pdf.js/web/cmaps/';
   PDFJS.cMapPacked = true;
 }