Mercurial > hg > orthanc-stone
annotate Applications/StoneWebViewer/WebApplication/pdf-viewer.js @ 1652:fa9e6bf84958
integrating pdf.js into Stone Web viewer
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 16 Nov 2020 20:47:53 +0100 |
parents | |
children | 66e5fcdf5597 |
rev | line source |
---|---|
1652
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Stone of Orthanc |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * This program is free software: you can redistribute it and/or |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Affero General Public License |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * as published by the Free Software Foundation, either version 3 of |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * the License, or (at your option) any later version. |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, but |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * WITHOUT ANY WARRANTY; without even the implied warranty of |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * Affero General Public License for more details. |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Affero General Public License |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 **/ |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 // Loaded via <script> tag, create shortcut to access PDF.js exports. |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 var pdfjsLib = window['pdfjs-dist/build/pdf']; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
27 // The workerSrc property shall be specified. |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
28 pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.5.207/build/pdf.worker.min.js'; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
29 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
31 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 var ZOOM_FACTOR = 1.3; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 var FIT_MARGIN = 10; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
34 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
35 Vue.component('pdf-viewer', { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 props: [ 'prefix', 'pdf' ], // "pdf" must correspond to a "Uint8Array" |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 template: '#pdf-viewer', |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 data: function() { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 return { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 container: null, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 canvas: null, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
42 ctx: null, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 scale: 1, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 countPages: 0, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 currentPage: 0, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 pdfDoc: null, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 isRendering: false, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 pageNumPending: null |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 }, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 watch: { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
53 pdf: function(newVal, oldVal) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
54 this.LoadPdf(); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
55 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
56 }, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
57 mounted: function() { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
58 this.container = document.getElementById(this.prefix + '-container'); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
59 this.canvas = document.getElementById(this.prefix + '-canvas'); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
60 this.ctx = this.canvas.getContext('2d'); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
61 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
62 if (this.container === null || |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
63 this.canvas === null || |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
64 this.ctx === null) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
65 alert('Bad viewer configuration'); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
66 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
67 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
68 var that = this; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
69 this.container.addEventListener('wheel', function(event) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
70 that.MouseWheel(event); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
71 }); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
72 }, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
73 methods: { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
74 NextPage: function() { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
75 if (this.pdfDoc !== null && |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
76 this.currentPage < this.pdfDoc.numPages) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
77 this.QueueRenderPage(this.currentPage + 1); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
78 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 }, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
80 PreviousPage: function() { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
81 if (this.pdfDoc !== null && |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
82 this.currentPage > 1) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
83 this.QueueRenderPage(this.currentPage - 1); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
84 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 }, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
86 FitWidth: function() { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 if (this.pdfDoc !== null) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 var that = this; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 this.pdfDoc.getPage(this.currentPage).then(function(page) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 // https://github.com/mozilla/pdf.js/issues/5628 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 // https://stackoverflow.com/a/21064102/881731 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
92 // https://stackoverflow.com/a/60008044/881731 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
93 var scrollbarWidth = window.innerWidth - document.body.clientWidth + FIT_MARGIN; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
94 that.scale = (that.container.offsetWidth - scrollbarWidth) / page.getViewport({ scale: 1.0 }).width; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
95 that.QueueRenderPage(that.currentPage); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
96 }); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 }, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
99 FitHeight: function() { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 if (this.pdfDoc !== null) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 var that = this; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 this.pdfDoc.getPage(this.currentPage).then(function(page) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 // The computation below assumes that "line-height: 0px" CSS |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 // on the parent element of the canvas. |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
105 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
106 // https://github.com/mozilla/pdf.js/issues/5628 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 var scrollbarHeight = window.innerHeight - document.body.clientHeight + FIT_MARGIN; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 that.scale = (that.container.offsetHeight - scrollbarHeight) / page.getViewport({ scale: 1.0 }).height; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
109 //that.scale = that.container.clientHeight / page.getViewport({ scale: 1.0 }).height; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
110 that.QueueRenderPage(that.currentPage); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 }); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 }, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
114 ZoomIn: function() { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
115 this.scale *= ZOOM_FACTOR; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
116 this.QueueRenderPage(this.currentPage); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
117 }, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
118 ZoomOut: function() { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
119 this.scale /= ZOOM_FACTOR; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
120 this.QueueRenderPage(this.currentPage); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
121 }, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
122 LoadPdf: function(pdf) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
123 var that = this; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
124 pdfjsLib.getDocument(new Uint8Array(this.pdf)).promise.then(function(pdfDoc_) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
125 that.pdfDoc = pdfDoc_; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
126 that.currentPage = 0; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
127 that.countPages = pdfDoc_.numPages; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
128 that.scale = 1; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
129 that.isRendering = false; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
130 that.pageNumPending = null; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
131 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
132 // Initial/first page rendering |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
133 that.RenderPage(1); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
134 }); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
135 }, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
136 RenderPage: function(pageNum) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
137 var that = this; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
138 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
139 if (this.pdfDoc !== null && |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
140 pageNum >= 1 && |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
141 pageNum <= this.countPages) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
142 this.isRendering = true; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
143 this.pdfDoc.getPage(pageNum).then(function(page) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
144 var viewport = page.getViewport({scale: that.scale}); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
145 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
146 that.canvas.height = viewport.height; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
147 that.canvas.width = viewport.width; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
148 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
149 // Horizontal centering of the canvas. This requires CSS |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
150 // "position: relative" on the canvas element. |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
151 if (that.canvas.width < that.container.clientWidth) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
152 that.canvas.style.left = Math.floor((that.container.clientWidth - viewport.width) / 2) + 'px'; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
153 } else { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
154 that.canvas.style.left = '0px'; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
155 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
156 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
157 // Render PDF page into canvas context |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
158 var renderContext = { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
159 canvasContext: that.ctx, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
160 viewport: viewport |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
161 }; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
162 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
163 var renderTask = page.render(renderContext); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
164 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
165 // Wait for rendering to finish |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
166 renderTask.promise.then(function() { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
167 that.isRendering = false; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
168 that.currentPage = pageNum; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
169 if (that.pageNumPending !== null) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
170 // New page rendering is pending |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
171 that.currentPage = that.pageNumPending; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
172 that.pageNumPending = null; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
173 that.RenderPage(); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
174 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
175 }); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
176 }); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
177 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
178 }, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
179 QueueRenderPage: function(pageNum) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
180 if (this.isRendering) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
181 this.pageNumPending = pageNum; |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
182 } else { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
183 this.RenderPage(pageNum); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
184 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
185 }, |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
186 MouseWheel: function(event) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
187 if (event.ctrlKey) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
188 if (event.deltaY < 0) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
189 this.ZoomIn(); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
190 } else if (event.deltaY > 0) { |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
191 this.ZoomOut(); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
192 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
193 |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
194 event.preventDefault(); |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
195 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
196 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
197 } |
fa9e6bf84958
integrating pdf.js into Stone Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
198 }); |