PageSourceSearch

https://www.3peaks.co.jp/catalog/2024/v2_lib/jquery.wisebookPrint.canvas.min.js

js 3peaks.co.jp collected 2026-10-08 18:49:36 UTC 17,145 bytes, 605 lines download raw bytes

1/*************************************************************************************
2 wisebookPrint 印刷
3 **************************************************************************************/
4(function () {
5	/**
6	 * wisebookPrint CSS設定
7	 * @param options
8	 */
9	wisebookPrint = function (options) {
10		var path = 'v2_css/print/print.css';
11		if (viewUtils.browser === 'msie' || viewUtils.browser === 'edge') {
12			path = 'v2_css/print/printer_ie9more.css';
13		} else if (viewUtils.browser === 'safari') {
14			path = 'v2_css/print/printer_safari.css?' + new Date().getTime();
15		}
16		this.printCss = viewPath + path;
17		$.extend(this.op, options);
18	};
19
20	wisebookPrint.prototype = {
21		printCss: null,
22		op: {
23			printMode: null,
24			popHt: $(window).innerHeight(),
25			popWd: $(window).innerWidth() - 400,
26			popX: 150,
27			popY: 50,
28			popTitle: '',
29			popClose: true
30		},
31		originalParts: {zoom: "", width: 0, height: 0, list: []},
32		originalTotalSize: {
33			width: 0,
34			height: 0
35		},
36		printInfo: {
37			dir: "", //both, single
38			page: ""
39		},
40
41		writeDoc: null,
42		printWindow: null,
43
44		/**
45		 * 印刷機能はじめ
46		 * @param {object} info - ブック情報
47		 */
48		startPrinter: function (info) {
49			$("#printIframe").remove();
50
51			this.originalImgZoom = (PARAM.zoominfo["200"].enable) ? "200" : "100";
52			this.printInfo.dir = (info.pageList.length === 2) ? "both" : "single";
53
54			if (this.printInfo.page !== info.pageList) {
55				this.printInfo.page = info.pageList;
56				this.originalimgCreate();
57			} else {
58				this.originalImgToPrinter();
59			}
60			ADDONS.loadingImgView('none');
61		},
62
63		/**
64		 * 印刷するブックの紙面画像を準備
65		 */
66		originalimgCreate: function () {
67			var that = this, canvasElem,
68				originalsize = {width: 0, height: PARAM.zoominfo[this.originalImgZoom].height},
69				elementArr = [], bothImgs = [];//見開きのイメージ配列
70
71			var pageObj,
72				img;
73
74			if (this.printInfo.dir === "both") {
75				//見開き
76				for (var i in PARAM.side.view) {
77					var page = PARAM.side.view[i];
78					if (page <= 0) {
79						continue;
80					}
81
82					pageObj = htmlview._pages[page - 1];
83					img = (this.originalImgZoom === "100") ? pageObj.image[0].srcList : pageObj.image[1].srcList;
84
85					if (img.length !== this.originalParts.list.length) {
86						this.originalPartData(this.originalImgZoom);
87					}
88					elementArr.push(this.makeOriginaldata(pageObj, img, originalsize.width));
89					bothImgs.push(viewInfo.bothImg);
90					originalsize.width += PARAM.zoominfo[this.originalImgZoom].width;
91				}
92			} else {
93				//単ページ
94				pageObj = htmlview._pages[this.printInfo.page - 1];
95				img = (this.originalImgZoom === "100") ? pageObj.image[0].srcList : pageObj.image[1].srcList;
96
97				if (img.length !== this.originalParts.list.length) {
98					this.originalPartData(this.originalImgZoom);
99				}
100				elementArr.push(this.makeOriginaldata(pageObj, img, 0));
101				originalsize.width = PARAM.zoominfo[this.originalImgZoom].width;
102			}
103			this.originalTotalSize = originalsize;
104
105			var tempIframe = this.createIframe("printer-tmp-element");
106			tempIframe.write(this.docType() + "<html><head></head>" + this.setBody() + "</html>");
107			canvasElem = $(tempIframe.getElementById('printer-canvas-image-body'));
108			
109			
110
111
112			elementArr.forEach(function (elem) {
113				canvasElem.append(elem);
114			});
115
116			if (viewUtils.browser === 'safari') {
117				this.openIframeOrWindow();
118			}
119			
120			
121
122			html2canvas(canvasElem[0], {
123				letterRendering: true,
124				allowTaint: true,
125				useCORS: true,
126				width: originalsize.width ,
127				height: originalsize.height 
128			}).then(function (canvas) {
129
130				if (viewInfo.toConvert !== "" && viewUtils.browser === 'safari') {
131					that.originalImg = viewInfo.toConvert;
132				} else {
133					that.originalImg = canvas.toDataURL("image/jpeg");
134				}
135
136				if (that.printInfo.dir === "both") {
137					that.twoPageCanvasRedrawing(canvas, canvasElem, originalsize, bothImgs, that);
138				} else {
139					that.originalImgToPrinter();
140					$('#printer-tmp-element').remove();
141				}
142			});
143
144
145
146		},
147
148		/**
149		 * 紙面が両面の場合Canvasをrefresh
150		 * @param canvas
151		 * @param canvasElem
152		 * @param originalsize
153		 * @param bothImgs
154		 */
155		twoPageCanvasRedrawing: function (canvas, canvasElem, originalsize, bothImgs) {
156			var that = this;
157			var img = new Image();
158			img.crossOrigin = 'anonymous';//2022-09-13 WBCLOUD-94
159			img.onload = function () {
160
161				//2022-08-31 WBCLOUD-94 ブラウザのズームやos側の解像度設定が100%以外の場合にè¦
161‹åˆ‡ã‚Œã‚‹å•é¡Œã®å¯¾ç­–
162				let zoom_rate = window.devicePixelRatio || window.screen.availWidth / document.documentElement.clientWidth * 100;
163				originalsize.width *= zoom_rate;
164				originalsize.height *= zoom_rate;
165
166				canvasElem.html(canvas);
167				//回転作業
168				var imgCanvas = canvasElem.find("canvas"),
169					ctx = imgCanvas[0].getContext('2d');
170				ctx.clearRect(0, 0, originalsize.width, originalsize.height);
171
172
173
174				//大きさ再指定
175				imgCanvas.attr({
176					width: originalsize.height ,
177					height: originalsize.width 
178				});
179				ctx.translate(originalsize.height / 2, originalsize.width / 2);
180				//現在のcanvasを回転
181				ctx.rotate(90 * Math.PI / 180);
182				//元イメージを0点座標に移動
183				ctx.translate(-1 * originalsize.width / 2, -1 * originalsize.height / 2);
184				ctx.drawImage(img, 0, 0);
185				//イメージ際保存
186				/**
187				 * safariの場合はサーバーで処理
188				 */
189				if (bothImgs[0] !== "" && viewUtils.browser === 'safari') {
190					$.ajax({
191						type: 'POST',
192						dataType: 'text',
193						async: false,
194						url: '/api/toGdImg',
195						data: {'imgs': bothImgs, 'type': 'print'},
196						success: function (data) {
197							that.originalImg = data;
198						}
199					});
200				} else {
201					that.originalImg = imgCanvas[0].toDataURL("image/jpeg");
202				}
203				$('#printer-tmp-element').remove();
204				var tem_w = that.originalTotalSize.width;
205				that.originalTotalSize.width = originalsize.height;
206				that.originalTotalSize.height = tem_w;
207
208				that.originalImgToPrinter();
209			};
210			img.src = that.originalImg;
211		},
212
213		/**
214		 * iframeを開く
215		 */
216		openIframeOrWindow: function () {
217			switch (this.op.printMode) {
218				case "iframe" :
219					this.writeDoc = this.createIframe("printIframe");
220					break;
221				case "popup" :
222					this.printWindow = this.createWindowPopup();
223					this.writeDoc = this.printWindow.doc;
224					break;
225			}
226		},
227
228		/**
229		 * 印刷するイメージデーターをiframeに送る、印刷イベントバインディング
230		 */
231		originalImgToPrinter: function () {
232			var that = this;
233
234			if (viewUtils.browser !== 'safari') {
235				this.openIframeOrWindow();
236			}
237
238			var html = this.docType() + "<html>" + this.setHead() + this.setPrintBody() + "</html>";
239			this.writeDoc.open();
240
241			this.writeDoc.write(html);
242
243			$(this.writeDoc).ready(function () {
244				var $imgTag = $(that.writeDoc).contents().find('#printImg');
245				if (viewUtils.browser === 'msie' || viewUtils.browser === 'edge') {
246					that.completePrint($imgTag);
247				} else {
248					$imgTag.bind("load", function () {
249						that.completePrint($(this));
250						$(this).unbind("load");
251					});
252				}
253			});
254		},
255
256		/**
257		 * 印刷完了
258		 * @param imgTag
259		 */
260		completePrint: function (imgTag) {
261			var that = this;
262			var width = that.originalTotalSize.width;
263			var height = that.originalTotalSize.height;
264
265			imgTag.css({
266				position: "absolute",
267				width: "100%",
268				top: "0",
269				left: "0",
270				right: "0",
271				bottom: "0",
272				margin: "0 auto",
273				objectFit: "scale-down"
274			});
275
276			setTimeout(function () {
277				that.writeDoc.close();
278				that.printWindow.print();
279				if (viewUtils.device === 'pc' && that.op.printMode === "iframe") {
280					$("#printIframe").remove();
281				} else if (that.op.printMode === "popup" && that.op.popClose) {
282					that.printWindow.close();
283				}
284				that.destroy();
285			}, 50);
286		},
287
288		/**
289		 * iframeを作る
290		 * @param iframeid
291		 * @returns {null|*}
292		 */
293		createIframe: function (iframeid) {
294			try {
295				var iframeStyle = 'border:0;position:absolute;left:0px;top:0px;opacity:0;z-index:-1;';
296				var iframe = document.createElement('iframe');
297				document.body.appendChild(iframe);
298				$(iframe).attr({style: iframeStyle, id: iframeid});
299				
300				
301				iframe.doc = null;
302				iframe.doc = iframe.contentDocument ? iframe.contentDocument : (iframe.contentWindow ? iframe.contentWindow.document : iframe.document);
303			} catch (e) {
304				throw e + ". iframes may not be supported in this browser.";
305			}
306
307			this.printWindow = iframe.contentWindow || iframe;
308			return iframe.doc;
309		},
310
311		/**
312		 * ウィンドウポップアップを作る
313		 * @returns {Window}
314		 */
315		createWindowPopup: function () {
316			var windowAttr = "location=no,statusbar=no,directories=no,menubar=no,titlebar=no,toolbar=no,dependent=no";
317			windowAttr += ",width=" + this.op.popWd + ",height=" + this.op.popHt;
318			windowAttr += ",resizable=yes,screenX=" + this.op.popX + ",screenY=" + this.op.popY + ",personalbar=no,scrollbars=yes";
319
320			var newWin = window.open("about:blank", "_blank", windowAttr);
321			newWin.doc = newWin.document;
322
323			return newWin;
324		},
325
326		/**
327		 * iframeのdocTypeセット
328		 * @returns {string}
329		 */
330		docType: function () {
331			return '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
332		},
333
334		/**
335		 * iframeのHeaderセット
336		 * @returns {string}
337		 */
338		setHead: function () {
339			var head = '<head><title>' + this.op.popTitle + '</title>';
340			head += '<link href="' + this.printCss + '" rel="stylesheet" type="text/css" />';
341			head += '</head>';
342
343			return head;
344		},
345
346		/**
347		 * iframeのBodyをセット
348		 * @returns {string}
349		 */
350		setBody: function () {
351			return '<body style="margin:0; padding:0;">' +
352				'<div id="printer-canvas-image-body" style="width:' +
353				this.originalTotalSize.width + 'px; height:' +
354				this.originalTotalSize.height + 'px; top:0; left:0; position: absolute;"/>' +
355				'</body>';
356		},
357
358		/**
359		 * 印刷用のBodyをセット
360		 * @returns {string}
361		 */
362		setPrintBody: function () {
363			var body_tag = '<body><center id="printContents"><img id="printImg" src="' + this.originalImg + '"/></center></body>';
364
365			if (viewUtils.browser === 'safari') {
366				//body_tag = '<body><img id="printImg" src="' + this.originalImg + '" width="724" height="850"/></body>';
367				//2023-02-07 WBCLOUD-260
368				body_tag = '<body><img id="printImg" src="' + this.originalImg + '"  width="auto" height="610" /></body>';
369
370			}
371			return body_tag;
372		},
373
374		/**
375		 * 分割画像の場合
376		 *
377		 * @param zoomvalue
378		 * @param index
379		 */
380		originalPartData: function (zoomvalue, index) {
381			var page = (index) ? htmlview._pages[index] : htmlview._pages[0];
382			var img,
383				dataPageImgWidth = 0,
384				dataPageImgHeight = 0,
385				imageWidth = 0;
386
387			if (zoomvalue === "200") {
388				dataPageImgWidth = page.image[1].width;
389				dataPageImgHeight = page.image[1].height;
390				imageWidth = PARAM.zoominfo['200'].width;
391				img = page.image[1].srcList;
392			} else {
393				dataPageImgWidth = page.image[0].width;
394				dataPageImgHeight = page.image[0].height;
395				imageWidth = PARAM.zoominfo['100'].width;
396				img = page.image[0].srcList;
397			}
398
399			this.originalParts.list = [];
400
401			$.extend(this.originalParts, {zoom: zoomvalue, width: dataPageImgWidth, height: dataPageImgHeight});
402
403			var w = 0, h = 0, x = 0, y = 0, total = 0;
404
405			for (var i = 0; i < img.length; i++) {
406				w = img[i].width;
407				h = img[i].height;
408				total += w;
409				var pos = {
410					x: x,
411					y: y,
412					width: w,
413					height: h
414				};
415
416				this.originalParts.list.push(pos);
417
418				if (img.length !== 1) {
419					if (total >= imageWidth) {
420						x = 0;
421						y += h;
422						total = 0;
423					} else {
424						x += w;
425					}
426				}
427			} //for end
428		},
429
430		/**
431		 * originalDataを生成
432		 *
433		 * @param pageObj
434		 * @param img
435		 * @param leftx
436		 * @returns {jQuery}
437		 */
438		makeOriginaldata: function (pageObj, img, leftx) {
439			//分割非対応バージョン
440			var x = 0, y = 0,
441				width = this.originalParts.width,
442				height = this.originalParts.height,
443				parts = this.originalParts.list;
444
445			var bgimage = [];
446			var bgsize = [];
447			var bgposition = [];
448			var bgrepeat = [];
449			viewInfo.toConvert = '';
450			viewInfo.bothImg = '';
451
452			for (var i = 0; i < parts.length; i++) {
453				if (i === 0) {
454					x = parts[i].x;
455					y = parts[i].y;
456				}
457				var img_url = viewInfo.bookurl + pageObj.number + "/" + img[i].src;
458				// REGEX! if html5Viewhost is NOT one of
459				// bookshelf.wisebook4.jp or local.wisebook.jp or dev.wisebook4.jp or ebook.wisebook4.jp or localViewer
460//				var regexPattern = /^(http|https):\/\/((local|dev|bookshelf|ebook)\.wisebook4?\.jp|\/h5\/)/;
461//				if (!regexPattern.test(viewInfo.html5Viewhost)) {
462//					viewInfo.bothImg = img_url;
463//					$.ajax({
464//						type: 'POST',
465//						dataType: 'text',
466//						async: false,
467//						url: '/api/toBase64',
468//						data: {'img': img_url},
469//						success: function (data) {
470//							img_url = data;
471//							viewInfo.toConvert = img_url;
472//						}
473//					});
474//				}
475				bgimage.push("url(" + img_url + ")");
476
477				bgposition.push(parts[i].x + "px" + " " + parts[i].y + "px");
478				bgsize.push(parts[i].width + "px" + " " + parts[i].height + "px");
479				bgrepeat.push("no-repeat");
480			}
481			
482			var tmpDom = document.createElement('div');
483			var cssObject = {
484				position: "absolute",
485				width: width,
486				height: height,
487				left: leftx,
488				top: 0,
489				display: "block",
490				backgroundImage: bgimage.join(","),
491				backgroundRepeat: bgrepeat.join(","),
492				backgroundPosition: bgposition.join(","),
493				backgroundSize: bgsize.join(",")
494			};
495			//return $(tmpDom).css(cssObject);
496			
497			//2022-09-13 WBCLOUD-94 divだとcrossOriginが使えないのでimgを試みる
498			var tag = "";
499			tag += '<div style="position:absolute;display:block;left:'+ leftx+  'px;top:0px;width:'+width+'px;height:'+height+'px;">'
500			//tag += '<img src="' + img_url + '" style="width:'+width+'px;height:'+height+'px;" crossOrigin="anonymous">';
501			//2022-10-12 WBCLOUD-94 キャッシュ対策
502			tag += '<img src="' + img_url + '?ts='+ Date.now()   +'" style="width:'+width+'px;height:'+height+'px;" crossOrigin="anonymous">';
503			tag += '</div>';
504			return $(tag);
505
506		},
507
508		makeOriginaldata_alt: function (pageObj, img, leftx) {
509			//分割対応バージョン
510			var x = 0, y = 0,
511				width = this.originalParts.width,
512				height = this.originalParts.height,
513				parts = this.originalParts.list;
514
515			var bgimage = [];
516			var bgsize = [];
517			var bgposition = [];
518			var bgrepeat = [];
519			viewInfo.toConvert = '';
520			viewInfo.bothImg = '';
521
522			var div_parts = [];
523
524			for (var i = 0; i < parts.length; i++) {
525				if (i === 0) {
526					x = parts[i].x;
527					y = parts[i].y;
528				}
529				var img_url = viewInfo.bookurl + pageObj.number + "/" + img[i].src;
530				// REGEX! if html5Viewhost is NOT one of
531				// bookshelf.wisebook4.jp or local.wisebook.jp or dev.wisebook4.jp or ebook.wisebook4.jp or localViewer
532//				var regexPattern = /^(http|https):\/\/((local|dev|bookshelf|ebook)\.wisebook4?\.jp|\/h5\/)/;
533//				if (!regexPattern.test(viewInfo.html5Viewhost)) {
534//					viewInfo.bothImg = img_url;
535//					$.ajax({
536//						type: 'POST',
537//						dataType: 'text',
538//						async: false,
539//						url: '/api/toBase64',
540//						data: {'img': img_url},
541//						success: function (data) {
542//							img_url = data;
543//							viewInfo.toConvert = img_url;
544//						}
545//					});
546//				}
547				bgimage.push("url(" + img_url + ")");
548				bgposition.push(parts[i].x + "px" + " " + parts[i].y + "px");
549				bgsize.push(parts[i].width + "px" + " " + parts[i].height + "px");
550				bgrepeat.push("no-repeat");
551				
552				
553				//2022-11-08 WBCLOUD-181 分割対策
554				let  tag = "";
555				tag += '<div style="position:absolute;display:block;left:'+ parts[i].x +  'px;top:'  +  parts[i].y  + 'px;width:'+parts[i].width+'px;height:'+ parts[i].height+'px;">'
556				//tag += '<img src="' + img_url + '" style="width:'+width+'px;height:'+height+'px;" crossOrigin="anonymous">';
557				tag += '<img src="' + img_url + '?ts='+ Date.now()   +'" style="width:'+parts[i].width+'px;height:'+ parts[i].height+'px;" crossOrigin="anonymous">';
558				tag += '</div>';
559				div_parts.push(tag);
560				
561				
562			}
563			
564			var tmpDom = document.createElement('div');
565			var cssObject = {
566				position: "absolute",
567				width: width,
568				height: height,
569				left: leftx,
570				top: 0,
571				display: "block",
572				backgroundImage: bgimage.join(","),
573				backgroundRepeat: bgrepeat.join(","),
574				backgroundPosition: bgposition.join(","),
575				backgroundSize: bgsize.join(",")
576			};
577			//return $(tmpDom).css(cssObject);
578			
579
580			//2022-09-13 WBCLOUD-94 divだとcrossOriginが使えないのでimgを試みる
581			var tag = "";
582			tag += '<div style="position:absolute;display:block;left:'+ leftx+  'px;top:0px;width:'+width+'px;height:'+height+'px;">'
583			//2022-11-08 WBCLOUD-181 分割対策
584			tag += div_parts.join('');
585			tag += '</div>';
586			return $(tag);
587
588
589			
590			
591		},
592
593
594
595		/**
596		 * 印刷機能初期化
597		 */
598		destroy: function () {
599			this.writeDoc = null;
600			this.printWindow = null;
601		}
602	};
603
604	window.wisebookPrint = wisebookPrint;
605})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.