1
1
import { PDFLinkService } from 'pdfjs-dist/lib/web/pdf_link_service' ;
2
2
3
+ var pendingOperation = Promise . resolve ( ) ;
4
+
3
5
export default function ( PDFJS ) {
4
6
5
7
function isPDFDocumentLoadingTask ( obj ) {
@@ -19,6 +21,10 @@ export default function(PDFJS) {
19
21
else
20
22
throw new TypeError ( 'invalid src type' ) ;
21
23
24
+ // source.verbosity = PDFJS.VerbosityLevel.INFOS;
25
+ // source.pdfBug = true;
26
+ // source.stopAtErrors = true;
27
+
22
28
var loadingTask = PDFJS . getDocument ( source ) ;
23
29
loadingTask . __PDFDocumentLoadingTask = true ; // since PDFDocumentLoadingTask is not public
24
30
@@ -56,7 +62,9 @@ export default function(PDFJS) {
56
62
57
63
if ( pdfDoc === null )
58
64
return ;
59
- pdfDoc . destroy ( ) ;
65
+
66
+ // Aborts all network requests and destroys worker.
67
+ pendingOperation = pdfDoc . destroy ( ) ;
60
68
pdfDoc = null ;
61
69
}
62
70
@@ -105,7 +113,7 @@ export default function(PDFJS) {
105
113
return pdfDoc . getPage ( 1 )
106
114
. then ( function ( page ) {
107
115
108
- var viewport = page . getViewport ( 1 ) ;
116
+ var viewport = page . getViewport ( { scale : 1 } ) ;
109
117
win . document . head . appendChild ( win . document . createElement ( 'style' ) ) . textContent =
110
118
'@supports ((size:A4) and (size:1pt 1pt)) {' +
111
119
'@page { margin: 1pt; size: ' + ( ( viewport . width * PRINT_UNITS ) / CSS_UNITS ) + 'pt ' + ( ( viewport . height * PRINT_UNITS ) / CSS_UNITS ) + 'pt; }' +
@@ -137,7 +145,7 @@ export default function(PDFJS) {
137
145
pdfDoc . getPage ( pageNumber )
138
146
. then ( function ( page ) {
139
147
140
- var viewport = page . getViewport ( 1 ) ;
148
+ var viewport = page . getViewport ( { scale : 1 } ) ;
141
149
142
150
var printCanvasElt = win . document . body . appendChild ( win . document . createElement ( 'canvas' ) ) ;
143
151
printCanvasElt . width = ( viewport . width * PRINT_UNITS ) ;
@@ -190,8 +198,8 @@ export default function(PDFJS) {
190
198
191
199
rotate = ( pdfPage . rotate === undefined ? 0 : pdfPage . rotate ) + ( rotate === undefined ? 0 : rotate ) ;
192
200
193
- var scale = canvasElt . offsetWidth / pdfPage . getViewport ( 1 ) . width * ( window . devicePixelRatio || 1 ) ;
194
- var viewport = pdfPage . getViewport ( scale , rotate ) ;
201
+ var scale = canvasElt . offsetWidth / pdfPage . getViewport ( { scale : 1 } ) . width * ( window . devicePixelRatio || 1 ) ;
202
+ var viewport = pdfPage . getViewport ( { scale, rotation : rotate } ) ;
195
203
196
204
emitEvent ( 'page-size' , viewport . width , viewport . height ) ;
197
205
@@ -216,36 +224,44 @@ export default function(PDFJS) {
216
224
linkService . setDocument ( pdfDoc ) ;
217
225
linkService . setViewer ( viewer ) ;
218
226
219
- pdfPage . getAnnotations ( { intent : 'display' } )
220
- . then ( function ( annotations ) {
227
+ pendingOperation = pendingOperation . then ( function ( ) {
221
228
222
- PDFJS . AnnotationLayer . render ( {
223
- viewport : viewport . clone ( { dontFlip : true } ) ,
224
- div : annotationLayerElt ,
225
- annotations : annotations ,
226
- page : pdfPage ,
227
- linkService : linkService ,
228
- renderInteractiveForms : false
229
- } ) ;
230
- } ) ;
229
+ var getAnnotationsOperation =
230
+ pdfPage . getAnnotations ( { intent : 'display' } )
231
+ . then ( function ( annotations ) {
231
232
232
- pdfRender
233
- . then ( function ( ) {
234
- annotationLayerElt . style . visibility = '' ;
235
- canceling = false ;
236
- pdfRender = null ;
237
- } )
238
- . catch ( function ( err ) {
233
+ PDFJS . AnnotationLayer . render ( {
234
+ viewport : viewport . clone ( { dontFlip : true } ) ,
235
+ div : annotationLayerElt ,
236
+ annotations : annotations ,
237
+ page : pdfPage ,
238
+ linkService : linkService ,
239
+ renderInteractiveForms : false
240
+ } ) ;
241
+ } ) ;
239
242
240
- pdfRender = null ;
241
- if ( err instanceof PDFJS . RenderingCancelledException ) {
243
+ var pdfRenderOperation =
244
+ pdfRender . promise
245
+ . then ( function ( ) {
242
246
247
+ annotationLayerElt . style . visibility = '' ;
243
248
canceling = false ;
244
- this . renderPage ( rotate ) ;
245
- return ;
246
- }
247
- emitEvent ( 'error' , err ) ;
248
- } . bind ( this ) )
249
+ pdfRender = null ;
250
+ } )
251
+ . catch ( function ( err ) {
252
+
253
+ pdfRender = null ;
254
+ if ( err instanceof PDFJS . RenderingCancelledException ) {
255
+
256
+ canceling = false ;
257
+ this . renderPage ( rotate ) ;
258
+ return ;
259
+ }
260
+ emitEvent ( 'error' , err ) ;
261
+ } . bind ( this ) )
262
+
263
+ return Promise . all ( [ getAnnotationsOperation , pdfRenderOperation ] ) ;
264
+ } . bind ( this ) ) ;
249
265
}
250
266
251
267
@@ -273,7 +289,10 @@ export default function(PDFJS) {
273
289
if ( pdfDoc === null )
274
290
return ;
275
291
276
- pdfDoc . getPage ( pageNumber )
292
+ pendingOperation = pendingOperation . then ( function ( ) {
293
+
294
+ return pdfDoc . getPage ( pageNumber ) ;
295
+ } )
277
296
. then ( function ( page ) {
278
297
279
298
pdfPage = page ;
@@ -303,40 +322,45 @@ export default function(PDFJS) {
303
322
return ;
304
323
}
305
324
306
- if ( isPDFDocumentLoadingTask ( src ) ) {
325
+ // wait for pending operation ends
326
+ pendingOperation = pendingOperation . then ( function ( ) {
307
327
308
- if ( src . destroyed ) {
309
-
310
- emitEvent ( 'error' , new Error ( 'loadingTask has been destroyed' ) ) ;
311
- return
312
- }
328
+ var loadingTask ;
329
+ if ( isPDFDocumentLoadingTask ( src ) ) {
313
330
314
- var loadingTask = src ;
315
- } else {
331
+ if ( src . destroyed ) {
316
332
317
- var loadingTask = createLoadingTask ( src , {
318
- onPassword : function ( updatePassword , reason ) {
333
+ emitEvent ( 'error' , new Error ( 'loadingTask has been destroyed' ) ) ;
334
+ return
335
+ }
319
336
320
- var reasonStr ;
321
- switch ( reason ) {
322
- case PDFJS . PasswordResponses . NEED_PASSWORD :
323
- reasonStr = 'NEED_PASSWORD' ;
324
- break ;
325
- case PDFJS . PasswordResponses . INCORRECT_PASSWORD :
326
- reasonStr = 'INCORRECT_PASSWORD' ;
327
- break ;
337
+ loadingTask = src ;
338
+ } else {
339
+
340
+ loadingTask = createLoadingTask ( src , {
341
+ onPassword : function ( updatePassword , reason ) {
342
+
343
+ var reasonStr ;
344
+ switch ( reason ) {
345
+ case PDFJS . PasswordResponses . NEED_PASSWORD :
346
+ reasonStr = 'NEED_PASSWORD' ;
347
+ break ;
348
+ case PDFJS . PasswordResponses . INCORRECT_PASSWORD :
349
+ reasonStr = 'INCORRECT_PASSWORD' ;
350
+ break ;
351
+ }
352
+ emitEvent ( 'password' , updatePassword , reasonStr ) ;
353
+ } ,
354
+ onProgress : function ( status ) {
355
+
356
+ var ratio = status . loaded / status . total ;
357
+ emitEvent ( 'progress' , Math . min ( ratio , 1 ) ) ;
328
358
}
329
- emitEvent ( 'password' , updatePassword , reasonStr ) ;
330
- } ,
331
- onProgress : function ( status ) {
332
-
333
- var ratio = status . loaded / status . total ;
334
- emitEvent ( 'progress' , Math . min ( ratio , 1 ) ) ;
335
- }
336
- } ) ;
337
- }
359
+ } ) ;
360
+ }
338
361
339
- loadingTask
362
+ return loadingTask . promise ;
363
+ } )
340
364
. then ( function ( pdf ) {
341
365
342
366
pdfDoc = pdf ;
0 commit comments