[api-minor] Remove the manual passing of an AnnotationStorage-instance when calling various API-method
				
					
				
			Note how we purposely don't expose the `AnnotationStorage`-class directly in the official API (see `src/pdf.js`), since trying to use *multiple* ones simultaneously doesn't really make sense (e.g. in the viewer). Instead we lazily initialize, and cache, just *one* instance via `PDFDocumentProxy.annotationStorage` which should thus be available internally in the API itself without having to be manually passed to various methods. To support these changes, the `AnnotationStorage`-instance initialization is moved into the `WorkerTransport`-class to allow both `PDFDocumentProxy` and `PDFPageProxy` to access it. This patch implements the following simplifications: - Remove the `annotationStorage`-parameter from `PDFDocumentProxy.saveDocument`, since it's already available internally. Furthermore, while it's currently possible to call that method without an `AnnotationStorage`-instance, that really does *not* make any sense at all. In this case you're effectively reducing `PDFDocumentProxy.saveDocument` to a "regular" `PDFDocumentProxy.getData` call, but with *a lot* more overhead, which was obviously not the intention of the `PDFDocumentProxy.saveDocument`-method. - Try to discourage third-party users from calling `PDFDocumentProxy.saveDocument` unconditionally, as a replacement for `PDFDocumentProxy.getData` (note the previous point). - Replace the `annotationStorage`-parameter, in `PDFPageProxy.render`, with a boolean `includeAnnotationStorage`-parameter which simply indicates if the (internally available) `AnnotationStorage`-instance should be used during rendering (e.g. for printing). - By removing the need to *manually* provide `annotationStorage`-parameters to various API-methods, using the API should become simpler (e.g. for third-parties) since you no longer need to worry about manually fetching and passing around this data.
This commit is contained in:
		
							parent
							
								
									6429ccc002
								
							
						
					
					
						commit
						72ef183085
					
				| @ -675,7 +675,7 @@ class PDFDocumentProxy { | ||||
|    * @type {AnnotationStorage} Storage for annotation data in forms. | ||||
|    */ | ||||
|   get annotationStorage() { | ||||
|     return shadow(this, "annotationStorage", new AnnotationStorage()); | ||||
|     return this._transport.annotationStorage; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
| @ -954,13 +954,20 @@ class PDFDocumentProxy { | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * @param {AnnotationStorage} annotationStorage - Storage for annotation | ||||
|    *   data in forms. | ||||
|    * @returns {Promise<Uint8Array>} A promise that is resolved with a | ||||
|    *   {Uint8Array} containing the full data of the saved document. | ||||
|    */ | ||||
|   saveDocument(annotationStorage) { | ||||
|     return this._transport.saveDocument(annotationStorage); | ||||
|   saveDocument() { | ||||
|     if ( | ||||
|       (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) && | ||||
|       this._transport.annotationStorage.size <= 0 | ||||
|     ) { | ||||
|       deprecated( | ||||
|         "saveDocument called while `annotationStorage` is empty, " + | ||||
|           "please use the getData-method instead." | ||||
|       ); | ||||
|     } | ||||
|     return this._transport.saveDocument(); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
| @ -1068,7 +1075,7 @@ class PDFDocumentProxy { | ||||
|  *   some operations. The default value is `false`. | ||||
|  * @property {boolean} [renderInteractiveForms] - Whether or not interactive | ||||
|  *   form elements are rendered in the display layer. If so, we do not render | ||||
|  *   them on the canvas as well. | ||||
|  *   them on the canvas as well. The default value is `false`. | ||||
|  * @property {Array<any>} [transform] - Additional transform, applied just | ||||
|  *   before viewport transform. | ||||
|  * @property {Object} [imageLayer] - An object that has `beginLayout`, | ||||
| @ -1080,8 +1087,9 @@ class PDFDocumentProxy { | ||||
|  *   <color> value, a `CanvasGradient` object (a linear or radial gradient) or | ||||
|  *   a `CanvasPattern` object (a repetitive image). The default value is | ||||
|  *   'rgb(255,255,255)'. | ||||
|  * @property {AnnotationStorage} [annotationStorage] - Storage for annotation | ||||
|  *   data in forms. | ||||
|  * @property {boolean} [includeAnnotationStorage] - Render stored interactive | ||||
|  *   form element data, from the {@link AnnotationStorage}-instance, onto the | ||||
|  *   canvas itself; useful e.g. for printing. The default value is `false`. | ||||
|  * @property {Promise<OptionalContentConfig>} [optionalContentConfigPromise] - | ||||
|  *   A promise that should resolve with an {@link OptionalContentConfig} | ||||
|  *   created from `PDFDocumentProxy.getOptionalContentConfig`. If `null`, | ||||
| @ -1230,7 +1238,7 @@ class PDFPageProxy { | ||||
|     imageLayer = null, | ||||
|     canvasFactory = null, | ||||
|     background = null, | ||||
|     annotationStorage = null, | ||||
|     includeAnnotationStorage = false, | ||||
|     optionalContentConfigPromise = null, | ||||
|   }) { | ||||
|     if (this._stats) { | ||||
| @ -1264,6 +1272,9 @@ class PDFPageProxy { | ||||
|     const webGLContext = new WebGLContext({ | ||||
|       enable: enableWebGL, | ||||
|     }); | ||||
|     const annotationStorage = includeAnnotationStorage | ||||
|       ? this._transport.annotationStorage.serializable | ||||
|       : null; | ||||
| 
 | ||||
|     // If there's no displayReadyCapability yet, then the operatorList
 | ||||
|     // was never requested before. Make the request and create the promise.
 | ||||
| @ -1282,7 +1293,7 @@ class PDFPageProxy { | ||||
|         pageIndex: this._pageIndex, | ||||
|         intent: renderingIntent, | ||||
|         renderInteractiveForms: renderInteractiveForms === true, | ||||
|         annotationStorage: annotationStorage?.serializable || null, | ||||
|         annotationStorage, | ||||
|       }); | ||||
|     } | ||||
| 
 | ||||
| @ -2192,8 +2203,8 @@ class WorkerTransport { | ||||
|     this.setupMessageHandler(); | ||||
|   } | ||||
| 
 | ||||
|   get loadingTaskSettled() { | ||||
|     return this.loadingTask._capability.settled; | ||||
|   get annotationStorage() { | ||||
|     return shadow(this, "annotationStorage", new AnnotationStorage()); | ||||
|   } | ||||
| 
 | ||||
|   destroy() { | ||||
| @ -2220,21 +2231,14 @@ class WorkerTransport { | ||||
|     }); | ||||
|     this.pageCache.length = 0; | ||||
|     this.pagePromises.length = 0; | ||||
|     // Allow `AnnotationStorage`-related clean-up when destroying the document.
 | ||||
|     if (this.hasOwnProperty("annotationStorage")) { | ||||
|       this.annotationStorage.resetModified(); | ||||
|     } | ||||
|     // We also need to wait for the worker to finish its long running tasks.
 | ||||
|     const terminated = this.messageHandler.sendWithPromise("Terminate", null); | ||||
|     waitOn.push(terminated); | ||||
|     // Allow `AnnotationStorage`-related clean-up when destroying the document.
 | ||||
|     if (this.loadingTaskSettled) { | ||||
|       const annotationStorageResetModified = this.loadingTask.promise | ||||
|         .then(pdfDocument => { | ||||
|           // Avoid initializing the `annotationStorage` if it doesn't exist.
 | ||||
|           if (pdfDocument.hasOwnProperty("annotationStorage")) { | ||||
|             pdfDocument.annotationStorage.resetModified(); | ||||
|           } | ||||
|         }) | ||||
|         .catch(() => {}); | ||||
|       waitOn.push(annotationStorageResetModified); | ||||
|     } | ||||
| 
 | ||||
|     Promise.all(waitOn).then(() => { | ||||
|       this.commonObjs.clear(); | ||||
|       this.fontLoader.clear(); | ||||
| @ -2669,17 +2673,15 @@ class WorkerTransport { | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   saveDocument(annotationStorage) { | ||||
|   saveDocument() { | ||||
|     return this.messageHandler | ||||
|       .sendWithPromise("SaveDocument", { | ||||
|         numPages: this._numPages, | ||||
|         annotationStorage: annotationStorage?.serializable || null, | ||||
|         annotationStorage: this.annotationStorage.serializable, | ||||
|         filename: this._fullReader?.filename ?? null, | ||||
|       }) | ||||
|       .finally(() => { | ||||
|         if (annotationStorage) { | ||||
|           annotationStorage.resetModified(); | ||||
|         } | ||||
|         this.annotationStorage.resetModified(); | ||||
|       }); | ||||
|   } | ||||
| 
 | ||||
|  | ||||
| @ -635,14 +635,13 @@ var Driver = (function DriverClosure() { | ||||
|                 optionalContentConfigPromise: task.optionalContentConfigPromise, | ||||
|               }; | ||||
|               if (renderPrint) { | ||||
|                 const annotationStorage = task.annotationStorage; | ||||
|                 if (annotationStorage) { | ||||
|                   const docAnnotationStorage = task.pdfDoc.annotationStorage; | ||||
|                   const entries = Object.entries(annotationStorage); | ||||
|                 if (task.annotationStorage) { | ||||
|                   const entries = Object.entries(task.annotationStorage), | ||||
|                     docAnnotationStorage = task.pdfDoc.annotationStorage; | ||||
|                   for (const [key, value] of entries) { | ||||
|                     docAnnotationStorage.setValue(key, value); | ||||
|                   } | ||||
|                   renderContext.annotationStorage = docAnnotationStorage; | ||||
|                   renderContext.includeAnnotationStorage = true; | ||||
|                 } | ||||
|                 renderContext.intent = "print"; | ||||
|               } | ||||
|  | ||||
| @ -998,9 +998,7 @@ const PDFViewerApplication = { | ||||
|     try { | ||||
|       this._ensureDownloadComplete(); | ||||
| 
 | ||||
|       const data = await this.pdfDocument.saveDocument( | ||||
|         this.pdfDocument.annotationStorage | ||||
|       ); | ||||
|       const data = await this.pdfDocument.saveDocument(); | ||||
|       const blob = new Blob([data], { type: "application/pdf" }); | ||||
| 
 | ||||
|       await this.downloadManager.download(blob, url, filename, sourceEventType); | ||||
|  | ||||
| @ -66,7 +66,7 @@ function composePage( | ||||
|           transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0], | ||||
|           viewport: pdfPage.getViewport({ scale: 1, rotation: size.rotation }), | ||||
|           intent: "print", | ||||
|           annotationStorage: pdfDocument.annotationStorage, | ||||
|           includeAnnotationStorage: true, | ||||
|           optionalContentConfigPromise, | ||||
|         }; | ||||
|         currentRenderTask = thisRenderTask = pdfPage.render(renderContext); | ||||
|  | ||||
| @ -48,7 +48,7 @@ function renderPage( | ||||
|       transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0], | ||||
|       viewport: pdfPage.getViewport({ scale: 1, rotation: size.rotation }), | ||||
|       intent: "print", | ||||
|       annotationStorage: pdfDocument.annotationStorage, | ||||
|       includeAnnotationStorage: true, | ||||
|       optionalContentConfigPromise, | ||||
|     }; | ||||
|     return pdfPage.render(renderContext).promise; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user