@progress/kendo-pdfviewer-common 0.2.11 → 0.3.0-dev.202409251137
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/scroller.js +22 -0
- package/dist/es/utils.js +54 -6
- package/dist/es2015/scroller.js +22 -0
- package/dist/es2015/utils.js +54 -6
- package/dist/npm/scroller.d.ts +1 -0
- package/dist/npm/scroller.js +22 -0
- package/dist/npm/utils.d.ts +5 -0
- package/dist/npm/utils.js +56 -7
- package/package.json +1 -1
package/dist/es/scroller.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Draggable from '@progress/kendo-draggable';
|
|
2
|
+
import { renderPage, currentPage } from './utils';
|
|
2
3
|
const throttle = function (func, wait, options = {}) {
|
|
3
4
|
let timeout, context, args, result;
|
|
4
5
|
let previous = 0;
|
|
@@ -81,6 +82,21 @@ export class Scroller {
|
|
|
81
82
|
this.state.trackNextElementScroll = true;
|
|
82
83
|
}
|
|
83
84
|
};
|
|
85
|
+
this.onDemandScroll = () => {
|
|
86
|
+
const pages = this.options.pages, currentPageIndex = currentPage(this.element.parentElement), page = pages[currentPageIndex], nextPage = pages[currentPageIndex + 1], previousPage = pages[currentPageIndex - 1], pageInfo = page === null || page === void 0 ? void 0 : page._pageInfo, nextPageInfo = nextPage === null || nextPage === void 0 ? void 0 : nextPage._pageInfo, previousPageInfo = previousPage === null || previousPage === void 0 ? void 0 : previousPage._pageInfo, error = (e) => {
|
|
87
|
+
throw new Error(e);
|
|
88
|
+
};
|
|
89
|
+
// Render the current and surrounding pages if they have not been rendered already.
|
|
90
|
+
if (page && !pageInfo.rendered && !pageInfo.renderInProgress) {
|
|
91
|
+
renderPage(page, pageInfo.emptyPage, error);
|
|
92
|
+
}
|
|
93
|
+
if (nextPage && !nextPageInfo.rendered && !nextPageInfo.renderInProgress) {
|
|
94
|
+
renderPage(nextPage, nextPageInfo.emptyPage, error);
|
|
95
|
+
}
|
|
96
|
+
if (previousPage && !previousPageInfo.rendered && !previousPageInfo.renderInProgress) {
|
|
97
|
+
renderPage(previousPage, previousPageInfo.emptyPage, error);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
84
100
|
this.onDragStart = (e) => {
|
|
85
101
|
this.state.dragStarted = false;
|
|
86
102
|
if (!this.shouldTrackPanEvents()) {
|
|
@@ -175,6 +191,9 @@ export class Scroller {
|
|
|
175
191
|
this.throttledOnElementScroll = this.onElementScroll;
|
|
176
192
|
}
|
|
177
193
|
this.element.addEventListener(SCROLL, this.throttledOnElementScroll);
|
|
194
|
+
if (this.options.loadOnDemand) {
|
|
195
|
+
this.element.addEventListener(SCROLL, this.onDemandScroll);
|
|
196
|
+
}
|
|
178
197
|
}
|
|
179
198
|
unbindEvents() {
|
|
180
199
|
this.unbindElementScroll();
|
|
@@ -189,6 +208,9 @@ export class Scroller {
|
|
|
189
208
|
this.throttledOnElementScroll.cancel();
|
|
190
209
|
this.throttledOnElementScroll = null;
|
|
191
210
|
}
|
|
211
|
+
if (this.options.loadOnDemand) {
|
|
212
|
+
this.element.removeEventListener(SCROLL, this.onDemandScroll);
|
|
213
|
+
}
|
|
192
214
|
this.element.removeEventListener(SCROLL, this.throttledOnElementScroll);
|
|
193
215
|
}
|
|
194
216
|
setState(newState) {
|
package/dist/es/utils.js
CHANGED
|
@@ -84,6 +84,7 @@ export const download = (options, fileName = 'Document', saveOptions = {}, onDow
|
|
|
84
84
|
export const loadPDF = (options) => {
|
|
85
85
|
const params = getDocumentParameters(options);
|
|
86
86
|
const { dom, zoom, done, error } = options;
|
|
87
|
+
const loadOnDemandPageSize = options.loadOnDemandPageSize || 2;
|
|
87
88
|
getDocument(params)
|
|
88
89
|
.promise.then((pdfDoc) => {
|
|
89
90
|
const pages = [];
|
|
@@ -94,7 +95,18 @@ export const loadPDF = (options) => {
|
|
|
94
95
|
}).then(({ pages, pdfDoc }) => {
|
|
95
96
|
Promise.all(pages)
|
|
96
97
|
.then((all) => all.map((page, i) => {
|
|
97
|
-
|
|
98
|
+
const emptyPage = createEmptyPage(page, zoom);
|
|
99
|
+
appendPage(dom, emptyPage.pageElement, i);
|
|
100
|
+
if (options.loadOnDemand) {
|
|
101
|
+
// If LOD is enabled, render the first two(default) or X pages initially.
|
|
102
|
+
if (i < loadOnDemandPageSize) {
|
|
103
|
+
renderPage(page, emptyPage, error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
renderPage(page, emptyPage, error);
|
|
108
|
+
}
|
|
109
|
+
page._pageInfo.emptyPage = emptyPage;
|
|
98
110
|
return page;
|
|
99
111
|
})).then((pdfPages) => {
|
|
100
112
|
// required by new PDFJS version
|
|
@@ -122,17 +134,39 @@ export const loadPDF = (options) => {
|
|
|
122
134
|
* @hidden
|
|
123
135
|
*/
|
|
124
136
|
export const reloadDocument = (params) => {
|
|
125
|
-
const { pdfDoc, zoom, dom, done, error } = params;
|
|
137
|
+
const { pdfDoc, zoom, dom, done, error, loadOnDemand, rootElement } = params;
|
|
126
138
|
const pages = [];
|
|
139
|
+
let currentPageIndex = 0;
|
|
140
|
+
// Save the index of the current page in view before we reload the document.
|
|
141
|
+
if (loadOnDemand && rootElement) {
|
|
142
|
+
currentPageIndex = currentPage(rootElement);
|
|
143
|
+
}
|
|
127
144
|
for (let i = 1; i <= pdfDoc.numPages; i++) {
|
|
128
145
|
pages.push(pdfDoc.getPage(i));
|
|
129
146
|
}
|
|
130
147
|
Promise.all(pages)
|
|
131
148
|
.then((all) => all.map((page, i) => {
|
|
132
|
-
|
|
149
|
+
// Set 'rendered' back to false so that the pages can be re-rendered when scrolling.
|
|
150
|
+
page._pageInfo.rendered = false;
|
|
151
|
+
const emptyPage = createEmptyPage(page, zoom);
|
|
152
|
+
appendPage(dom, emptyPage.pageElement, i);
|
|
153
|
+
// If on demand is not enabled, proceed as usual.
|
|
154
|
+
if (!loadOnDemand) {
|
|
155
|
+
renderPage(page, emptyPage, error);
|
|
156
|
+
}
|
|
157
|
+
page._pageInfo.emptyPage = emptyPage;
|
|
133
158
|
return page;
|
|
134
159
|
}))
|
|
135
|
-
.then(
|
|
160
|
+
.then((pdfPages) => {
|
|
161
|
+
/* If on demand is enabled, render the page that was previously in view.
|
|
162
|
+
Then scroll to that page. */
|
|
163
|
+
if (loadOnDemand) {
|
|
164
|
+
const page = pdfPages[currentPageIndex];
|
|
165
|
+
renderPage(page, page._pageInfo.emptyPage, error);
|
|
166
|
+
scrollToPage(rootElement, currentPageIndex);
|
|
167
|
+
}
|
|
168
|
+
done(pdfPages);
|
|
169
|
+
})
|
|
136
170
|
.catch(error);
|
|
137
171
|
};
|
|
138
172
|
/**
|
|
@@ -177,6 +211,15 @@ const openPrintDialog = (dom, width, height, done, onError) => {
|
|
|
177
211
|
printDialog.addEventListener('afterprint', onAfterPrint);
|
|
178
212
|
}
|
|
179
213
|
};
|
|
214
|
+
const createEmptyPage = (page, zoom) => {
|
|
215
|
+
const { canvasContext, viewport, pageElement, styles } = createCanvas(page, zoom, 'k-page');
|
|
216
|
+
return {
|
|
217
|
+
canvasContext,
|
|
218
|
+
viewport,
|
|
219
|
+
pageElement,
|
|
220
|
+
styles
|
|
221
|
+
};
|
|
222
|
+
};
|
|
180
223
|
const renderCanvas = (page, done, error) => {
|
|
181
224
|
const { canvasContext, viewport, scaleNum, canvas, pageElement } = createCanvas(page);
|
|
182
225
|
page.render({ canvasContext, viewport })
|
|
@@ -206,8 +249,9 @@ const transforms = {
|
|
|
206
249
|
'180': 'rotate(180deg) translate(-100%, -100%)',
|
|
207
250
|
'270': 'rotate(270deg) translateX(-100%)'
|
|
208
251
|
};
|
|
209
|
-
const renderPage = (page,
|
|
210
|
-
const { canvasContext, viewport, pageElement, styles } =
|
|
252
|
+
export const renderPage = (page, emptyPage, error) => {
|
|
253
|
+
const { canvasContext, viewport, pageElement, styles } = emptyPage;
|
|
254
|
+
page._pageInfo.renderInProgress = true;
|
|
211
255
|
page.render({ canvasContext, viewport })
|
|
212
256
|
.promise.then(() => {
|
|
213
257
|
page.getTextContent().then((textContent) => {
|
|
@@ -232,6 +276,10 @@ const renderPage = (page, zoom, error) => {
|
|
|
232
276
|
pageElement.appendChild(textLayer);
|
|
233
277
|
}).catch(error);
|
|
234
278
|
});
|
|
279
|
+
})
|
|
280
|
+
.then(() => {
|
|
281
|
+
page._pageInfo.rendered = true;
|
|
282
|
+
page._pageInfo.renderInProgress = false;
|
|
235
283
|
})
|
|
236
284
|
.catch(error);
|
|
237
285
|
return pageElement;
|
package/dist/es2015/scroller.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Draggable from '@progress/kendo-draggable';
|
|
2
|
+
import { renderPage, currentPage } from './utils';
|
|
2
3
|
const throttle = function (func, wait, options = {}) {
|
|
3
4
|
let timeout, context, args, result;
|
|
4
5
|
let previous = 0;
|
|
@@ -81,6 +82,21 @@ export class Scroller {
|
|
|
81
82
|
this.state.trackNextElementScroll = true;
|
|
82
83
|
}
|
|
83
84
|
};
|
|
85
|
+
this.onDemandScroll = () => {
|
|
86
|
+
const pages = this.options.pages, currentPageIndex = currentPage(this.element.parentElement), page = pages[currentPageIndex], nextPage = pages[currentPageIndex + 1], previousPage = pages[currentPageIndex - 1], pageInfo = page === null || page === void 0 ? void 0 : page._pageInfo, nextPageInfo = nextPage === null || nextPage === void 0 ? void 0 : nextPage._pageInfo, previousPageInfo = previousPage === null || previousPage === void 0 ? void 0 : previousPage._pageInfo, error = (e) => {
|
|
87
|
+
throw new Error(e);
|
|
88
|
+
};
|
|
89
|
+
// Render the current and surrounding pages if they have not been rendered already.
|
|
90
|
+
if (page && !pageInfo.rendered && !pageInfo.renderInProgress) {
|
|
91
|
+
renderPage(page, pageInfo.emptyPage, error);
|
|
92
|
+
}
|
|
93
|
+
if (nextPage && !nextPageInfo.rendered && !nextPageInfo.renderInProgress) {
|
|
94
|
+
renderPage(nextPage, nextPageInfo.emptyPage, error);
|
|
95
|
+
}
|
|
96
|
+
if (previousPage && !previousPageInfo.rendered && !previousPageInfo.renderInProgress) {
|
|
97
|
+
renderPage(previousPage, previousPageInfo.emptyPage, error);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
84
100
|
this.onDragStart = (e) => {
|
|
85
101
|
this.state.dragStarted = false;
|
|
86
102
|
if (!this.shouldTrackPanEvents()) {
|
|
@@ -175,6 +191,9 @@ export class Scroller {
|
|
|
175
191
|
this.throttledOnElementScroll = this.onElementScroll;
|
|
176
192
|
}
|
|
177
193
|
this.element.addEventListener(SCROLL, this.throttledOnElementScroll);
|
|
194
|
+
if (this.options.loadOnDemand) {
|
|
195
|
+
this.element.addEventListener(SCROLL, this.onDemandScroll);
|
|
196
|
+
}
|
|
178
197
|
}
|
|
179
198
|
unbindEvents() {
|
|
180
199
|
this.unbindElementScroll();
|
|
@@ -189,6 +208,9 @@ export class Scroller {
|
|
|
189
208
|
this.throttledOnElementScroll.cancel();
|
|
190
209
|
this.throttledOnElementScroll = null;
|
|
191
210
|
}
|
|
211
|
+
if (this.options.loadOnDemand) {
|
|
212
|
+
this.element.removeEventListener(SCROLL, this.onDemandScroll);
|
|
213
|
+
}
|
|
192
214
|
this.element.removeEventListener(SCROLL, this.throttledOnElementScroll);
|
|
193
215
|
}
|
|
194
216
|
setState(newState) {
|
package/dist/es2015/utils.js
CHANGED
|
@@ -84,6 +84,7 @@ export const download = (options, fileName = 'Document', saveOptions = {}, onDow
|
|
|
84
84
|
export const loadPDF = (options) => {
|
|
85
85
|
const params = getDocumentParameters(options);
|
|
86
86
|
const { dom, zoom, done, error } = options;
|
|
87
|
+
const loadOnDemandPageSize = options.loadOnDemandPageSize || 2;
|
|
87
88
|
getDocument(params)
|
|
88
89
|
.promise.then((pdfDoc) => {
|
|
89
90
|
const pages = [];
|
|
@@ -94,7 +95,18 @@ export const loadPDF = (options) => {
|
|
|
94
95
|
}).then(({ pages, pdfDoc }) => {
|
|
95
96
|
Promise.all(pages)
|
|
96
97
|
.then((all) => all.map((page, i) => {
|
|
97
|
-
|
|
98
|
+
const emptyPage = createEmptyPage(page, zoom);
|
|
99
|
+
appendPage(dom, emptyPage.pageElement, i);
|
|
100
|
+
if (options.loadOnDemand) {
|
|
101
|
+
// If LOD is enabled, render the first two(default) or X pages initially.
|
|
102
|
+
if (i < loadOnDemandPageSize) {
|
|
103
|
+
renderPage(page, emptyPage, error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
renderPage(page, emptyPage, error);
|
|
108
|
+
}
|
|
109
|
+
page._pageInfo.emptyPage = emptyPage;
|
|
98
110
|
return page;
|
|
99
111
|
})).then((pdfPages) => {
|
|
100
112
|
// required by new PDFJS version
|
|
@@ -122,17 +134,39 @@ export const loadPDF = (options) => {
|
|
|
122
134
|
* @hidden
|
|
123
135
|
*/
|
|
124
136
|
export const reloadDocument = (params) => {
|
|
125
|
-
const { pdfDoc, zoom, dom, done, error } = params;
|
|
137
|
+
const { pdfDoc, zoom, dom, done, error, loadOnDemand, rootElement } = params;
|
|
126
138
|
const pages = [];
|
|
139
|
+
let currentPageIndex = 0;
|
|
140
|
+
// Save the index of the current page in view before we reload the document.
|
|
141
|
+
if (loadOnDemand && rootElement) {
|
|
142
|
+
currentPageIndex = currentPage(rootElement);
|
|
143
|
+
}
|
|
127
144
|
for (let i = 1; i <= pdfDoc.numPages; i++) {
|
|
128
145
|
pages.push(pdfDoc.getPage(i));
|
|
129
146
|
}
|
|
130
147
|
Promise.all(pages)
|
|
131
148
|
.then((all) => all.map((page, i) => {
|
|
132
|
-
|
|
149
|
+
// Set 'rendered' back to false so that the pages can be re-rendered when scrolling.
|
|
150
|
+
page._pageInfo.rendered = false;
|
|
151
|
+
const emptyPage = createEmptyPage(page, zoom);
|
|
152
|
+
appendPage(dom, emptyPage.pageElement, i);
|
|
153
|
+
// If on demand is not enabled, proceed as usual.
|
|
154
|
+
if (!loadOnDemand) {
|
|
155
|
+
renderPage(page, emptyPage, error);
|
|
156
|
+
}
|
|
157
|
+
page._pageInfo.emptyPage = emptyPage;
|
|
133
158
|
return page;
|
|
134
159
|
}))
|
|
135
|
-
.then(
|
|
160
|
+
.then((pdfPages) => {
|
|
161
|
+
/* If on demand is enabled, render the page that was previously in view.
|
|
162
|
+
Then scroll to that page. */
|
|
163
|
+
if (loadOnDemand) {
|
|
164
|
+
const page = pdfPages[currentPageIndex];
|
|
165
|
+
renderPage(page, page._pageInfo.emptyPage, error);
|
|
166
|
+
scrollToPage(rootElement, currentPageIndex);
|
|
167
|
+
}
|
|
168
|
+
done(pdfPages);
|
|
169
|
+
})
|
|
136
170
|
.catch(error);
|
|
137
171
|
};
|
|
138
172
|
/**
|
|
@@ -177,6 +211,15 @@ const openPrintDialog = (dom, width, height, done, onError) => {
|
|
|
177
211
|
printDialog.addEventListener('afterprint', onAfterPrint);
|
|
178
212
|
}
|
|
179
213
|
};
|
|
214
|
+
const createEmptyPage = (page, zoom) => {
|
|
215
|
+
const { canvasContext, viewport, pageElement, styles } = createCanvas(page, zoom, 'k-page');
|
|
216
|
+
return {
|
|
217
|
+
canvasContext,
|
|
218
|
+
viewport,
|
|
219
|
+
pageElement,
|
|
220
|
+
styles
|
|
221
|
+
};
|
|
222
|
+
};
|
|
180
223
|
const renderCanvas = (page, done, error) => {
|
|
181
224
|
const { canvasContext, viewport, scaleNum, canvas, pageElement } = createCanvas(page);
|
|
182
225
|
page.render({ canvasContext, viewport })
|
|
@@ -206,8 +249,9 @@ const transforms = {
|
|
|
206
249
|
'180': 'rotate(180deg) translate(-100%, -100%)',
|
|
207
250
|
'270': 'rotate(270deg) translateX(-100%)'
|
|
208
251
|
};
|
|
209
|
-
const renderPage = (page,
|
|
210
|
-
const { canvasContext, viewport, pageElement, styles } =
|
|
252
|
+
export const renderPage = (page, emptyPage, error) => {
|
|
253
|
+
const { canvasContext, viewport, pageElement, styles } = emptyPage;
|
|
254
|
+
page._pageInfo.renderInProgress = true;
|
|
211
255
|
page.render({ canvasContext, viewport })
|
|
212
256
|
.promise.then(() => {
|
|
213
257
|
page.getTextContent().then((textContent) => {
|
|
@@ -232,6 +276,10 @@ const renderPage = (page, zoom, error) => {
|
|
|
232
276
|
pageElement.appendChild(textLayer);
|
|
233
277
|
}).catch(error);
|
|
234
278
|
});
|
|
279
|
+
})
|
|
280
|
+
.then(() => {
|
|
281
|
+
page._pageInfo.rendered = true;
|
|
282
|
+
page._pageInfo.renderInProgress = false;
|
|
235
283
|
})
|
|
236
284
|
.catch(error);
|
|
237
285
|
return pageElement;
|
package/dist/npm/scroller.d.ts
CHANGED
package/dist/npm/scroller.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Scroller = void 0;
|
|
4
4
|
const kendo_draggable_1 = require("@progress/kendo-draggable");
|
|
5
|
+
const utils_1 = require("./utils");
|
|
5
6
|
const throttle = function (func, wait, options = {}) {
|
|
6
7
|
let timeout, context, args, result;
|
|
7
8
|
let previous = 0;
|
|
@@ -84,6 +85,21 @@ class Scroller {
|
|
|
84
85
|
this.state.trackNextElementScroll = true;
|
|
85
86
|
}
|
|
86
87
|
};
|
|
88
|
+
this.onDemandScroll = () => {
|
|
89
|
+
const pages = this.options.pages, currentPageIndex = (0, utils_1.currentPage)(this.element.parentElement), page = pages[currentPageIndex], nextPage = pages[currentPageIndex + 1], previousPage = pages[currentPageIndex - 1], pageInfo = page === null || page === void 0 ? void 0 : page._pageInfo, nextPageInfo = nextPage === null || nextPage === void 0 ? void 0 : nextPage._pageInfo, previousPageInfo = previousPage === null || previousPage === void 0 ? void 0 : previousPage._pageInfo, error = (e) => {
|
|
90
|
+
throw new Error(e);
|
|
91
|
+
};
|
|
92
|
+
// Render the current and surrounding pages if they have not been rendered already.
|
|
93
|
+
if (page && !pageInfo.rendered && !pageInfo.renderInProgress) {
|
|
94
|
+
(0, utils_1.renderPage)(page, pageInfo.emptyPage, error);
|
|
95
|
+
}
|
|
96
|
+
if (nextPage && !nextPageInfo.rendered && !nextPageInfo.renderInProgress) {
|
|
97
|
+
(0, utils_1.renderPage)(nextPage, nextPageInfo.emptyPage, error);
|
|
98
|
+
}
|
|
99
|
+
if (previousPage && !previousPageInfo.rendered && !previousPageInfo.renderInProgress) {
|
|
100
|
+
(0, utils_1.renderPage)(previousPage, previousPageInfo.emptyPage, error);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
87
103
|
this.onDragStart = (e) => {
|
|
88
104
|
this.state.dragStarted = false;
|
|
89
105
|
if (!this.shouldTrackPanEvents()) {
|
|
@@ -178,6 +194,9 @@ class Scroller {
|
|
|
178
194
|
this.throttledOnElementScroll = this.onElementScroll;
|
|
179
195
|
}
|
|
180
196
|
this.element.addEventListener(SCROLL, this.throttledOnElementScroll);
|
|
197
|
+
if (this.options.loadOnDemand) {
|
|
198
|
+
this.element.addEventListener(SCROLL, this.onDemandScroll);
|
|
199
|
+
}
|
|
181
200
|
}
|
|
182
201
|
unbindEvents() {
|
|
183
202
|
this.unbindElementScroll();
|
|
@@ -192,6 +211,9 @@ class Scroller {
|
|
|
192
211
|
this.throttledOnElementScroll.cancel();
|
|
193
212
|
this.throttledOnElementScroll = null;
|
|
194
213
|
}
|
|
214
|
+
if (this.options.loadOnDemand) {
|
|
215
|
+
this.element.removeEventListener(SCROLL, this.onDemandScroll);
|
|
216
|
+
}
|
|
195
217
|
this.element.removeEventListener(SCROLL, this.throttledOnElementScroll);
|
|
196
218
|
}
|
|
197
219
|
setState(newState) {
|
package/dist/npm/utils.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ export interface PDFReadParameters {
|
|
|
21
21
|
data?: string;
|
|
22
22
|
arrayBuffer?: ArrayBuffer;
|
|
23
23
|
typedArray?: TypedArray;
|
|
24
|
+
loadOnDemand?: boolean;
|
|
25
|
+
loadOnDemandPageSize?: number;
|
|
24
26
|
error: ErrorFn;
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
@@ -38,6 +40,8 @@ export interface PDFReloadParameters {
|
|
|
38
40
|
pdfDoc: PDFDocumentProxy;
|
|
39
41
|
zoom: number;
|
|
40
42
|
dom: HTMLElement;
|
|
43
|
+
rootElement?: HTMLElement;
|
|
44
|
+
loadOnDemand?: boolean;
|
|
41
45
|
done: (pdfPages: PDFPageProxy[]) => void;
|
|
42
46
|
error: ErrorFn;
|
|
43
47
|
}
|
|
@@ -68,6 +72,7 @@ export declare const reloadDocument: (params: PDFReloadParameters) => void;
|
|
|
68
72
|
* @hidden
|
|
69
73
|
*/
|
|
70
74
|
export declare const print: (pages: PDFPageProxy[], done: () => void, error: ErrorFn) => void;
|
|
75
|
+
export declare const renderPage: (page: PDFPageProxy, emptyPage: any, error: ErrorFn) => any;
|
|
71
76
|
/**
|
|
72
77
|
* @hidden
|
|
73
78
|
*/
|
package/dist/npm/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.currentPage = exports.scrollToPage = exports.calculateZoomLevel = exports.goToPreviousSearchMatch = exports.goToNextSearchMatch = exports.print = exports.reloadDocument = exports.loadPDF = exports.download = exports.removeChildren = exports.DEFAULT_ZOOM_LEVEL = void 0;
|
|
3
|
+
exports.currentPage = exports.scrollToPage = exports.calculateZoomLevel = exports.goToPreviousSearchMatch = exports.goToNextSearchMatch = exports.renderPage = exports.print = exports.reloadDocument = exports.loadPDF = exports.download = exports.removeChildren = exports.DEFAULT_ZOOM_LEVEL = void 0;
|
|
4
4
|
const kendo_file_saver_1 = require("@progress/kendo-file-saver");
|
|
5
5
|
const kendo_common_1 = require("@progress/kendo-common");
|
|
6
6
|
const pdf_mjs_1 = require("pdfjs-dist/legacy/build/pdf.mjs");
|
|
@@ -89,6 +89,7 @@ exports.download = download;
|
|
|
89
89
|
const loadPDF = (options) => {
|
|
90
90
|
const params = getDocumentParameters(options);
|
|
91
91
|
const { dom, zoom, done, error } = options;
|
|
92
|
+
const loadOnDemandPageSize = options.loadOnDemandPageSize || 2;
|
|
92
93
|
(0, pdf_mjs_1.getDocument)(params)
|
|
93
94
|
.promise.then((pdfDoc) => {
|
|
94
95
|
const pages = [];
|
|
@@ -99,7 +100,18 @@ const loadPDF = (options) => {
|
|
|
99
100
|
}).then(({ pages, pdfDoc }) => {
|
|
100
101
|
Promise.all(pages)
|
|
101
102
|
.then((all) => all.map((page, i) => {
|
|
102
|
-
|
|
103
|
+
const emptyPage = createEmptyPage(page, zoom);
|
|
104
|
+
appendPage(dom, emptyPage.pageElement, i);
|
|
105
|
+
if (options.loadOnDemand) {
|
|
106
|
+
// If LOD is enabled, render the first two(default) or X pages initially.
|
|
107
|
+
if (i < loadOnDemandPageSize) {
|
|
108
|
+
(0, exports.renderPage)(page, emptyPage, error);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
(0, exports.renderPage)(page, emptyPage, error);
|
|
113
|
+
}
|
|
114
|
+
page._pageInfo.emptyPage = emptyPage;
|
|
103
115
|
return page;
|
|
104
116
|
})).then((pdfPages) => {
|
|
105
117
|
// required by new PDFJS version
|
|
@@ -128,17 +140,39 @@ exports.loadPDF = loadPDF;
|
|
|
128
140
|
* @hidden
|
|
129
141
|
*/
|
|
130
142
|
const reloadDocument = (params) => {
|
|
131
|
-
const { pdfDoc, zoom, dom, done, error } = params;
|
|
143
|
+
const { pdfDoc, zoom, dom, done, error, loadOnDemand, rootElement } = params;
|
|
132
144
|
const pages = [];
|
|
145
|
+
let currentPageIndex = 0;
|
|
146
|
+
// Save the index of the current page in view before we reload the document.
|
|
147
|
+
if (loadOnDemand && rootElement) {
|
|
148
|
+
currentPageIndex = (0, exports.currentPage)(rootElement);
|
|
149
|
+
}
|
|
133
150
|
for (let i = 1; i <= pdfDoc.numPages; i++) {
|
|
134
151
|
pages.push(pdfDoc.getPage(i));
|
|
135
152
|
}
|
|
136
153
|
Promise.all(pages)
|
|
137
154
|
.then((all) => all.map((page, i) => {
|
|
138
|
-
|
|
155
|
+
// Set 'rendered' back to false so that the pages can be re-rendered when scrolling.
|
|
156
|
+
page._pageInfo.rendered = false;
|
|
157
|
+
const emptyPage = createEmptyPage(page, zoom);
|
|
158
|
+
appendPage(dom, emptyPage.pageElement, i);
|
|
159
|
+
// If on demand is not enabled, proceed as usual.
|
|
160
|
+
if (!loadOnDemand) {
|
|
161
|
+
(0, exports.renderPage)(page, emptyPage, error);
|
|
162
|
+
}
|
|
163
|
+
page._pageInfo.emptyPage = emptyPage;
|
|
139
164
|
return page;
|
|
140
165
|
}))
|
|
141
|
-
.then(
|
|
166
|
+
.then((pdfPages) => {
|
|
167
|
+
/* If on demand is enabled, render the page that was previously in view.
|
|
168
|
+
Then scroll to that page. */
|
|
169
|
+
if (loadOnDemand) {
|
|
170
|
+
const page = pdfPages[currentPageIndex];
|
|
171
|
+
(0, exports.renderPage)(page, page._pageInfo.emptyPage, error);
|
|
172
|
+
(0, exports.scrollToPage)(rootElement, currentPageIndex);
|
|
173
|
+
}
|
|
174
|
+
done(pdfPages);
|
|
175
|
+
})
|
|
142
176
|
.catch(error);
|
|
143
177
|
};
|
|
144
178
|
exports.reloadDocument = reloadDocument;
|
|
@@ -185,6 +219,15 @@ const openPrintDialog = (dom, width, height, done, onError) => {
|
|
|
185
219
|
printDialog.addEventListener('afterprint', onAfterPrint);
|
|
186
220
|
}
|
|
187
221
|
};
|
|
222
|
+
const createEmptyPage = (page, zoom) => {
|
|
223
|
+
const { canvasContext, viewport, pageElement, styles } = createCanvas(page, zoom, 'k-page');
|
|
224
|
+
return {
|
|
225
|
+
canvasContext,
|
|
226
|
+
viewport,
|
|
227
|
+
pageElement,
|
|
228
|
+
styles
|
|
229
|
+
};
|
|
230
|
+
};
|
|
188
231
|
const renderCanvas = (page, done, error) => {
|
|
189
232
|
const { canvasContext, viewport, scaleNum, canvas, pageElement } = createCanvas(page);
|
|
190
233
|
page.render({ canvasContext, viewport })
|
|
@@ -214,8 +257,9 @@ const transforms = {
|
|
|
214
257
|
'180': 'rotate(180deg) translate(-100%, -100%)',
|
|
215
258
|
'270': 'rotate(270deg) translateX(-100%)'
|
|
216
259
|
};
|
|
217
|
-
const renderPage = (page,
|
|
218
|
-
const { canvasContext, viewport, pageElement, styles } =
|
|
260
|
+
const renderPage = (page, emptyPage, error) => {
|
|
261
|
+
const { canvasContext, viewport, pageElement, styles } = emptyPage;
|
|
262
|
+
page._pageInfo.renderInProgress = true;
|
|
219
263
|
page.render({ canvasContext, viewport })
|
|
220
264
|
.promise.then(() => {
|
|
221
265
|
page.getTextContent().then((textContent) => {
|
|
@@ -240,10 +284,15 @@ const renderPage = (page, zoom, error) => {
|
|
|
240
284
|
pageElement.appendChild(textLayer);
|
|
241
285
|
}).catch(error);
|
|
242
286
|
});
|
|
287
|
+
})
|
|
288
|
+
.then(() => {
|
|
289
|
+
page._pageInfo.rendered = true;
|
|
290
|
+
page._pageInfo.renderInProgress = false;
|
|
243
291
|
})
|
|
244
292
|
.catch(error);
|
|
245
293
|
return pageElement;
|
|
246
294
|
};
|
|
295
|
+
exports.renderPage = renderPage;
|
|
247
296
|
const searchMatchScrollLeftOffset = 0;
|
|
248
297
|
const searchMatchScrollTopOffset = -64;
|
|
249
298
|
const scrollToSearchMatch = (matchElement, ref) => {
|