XFA - An image can be a stream in the pdf (bug 1718521) - hrefs can be found in catalog > Names > XFAImages
This commit is contained in:
		
							parent
							
								
									fcd4c8151c
								
							
						
					
					
						commit
						5cdee80c8e
					
				| @ -915,6 +915,22 @@ class Catalog { | |||||||
|     return shadow(this, "attachments", attachments); |     return shadow(this, "attachments", attachments); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   get xfaImages() { | ||||||
|  |     const obj = this._catDict.get("Names"); | ||||||
|  |     let xfaImages = null; | ||||||
|  | 
 | ||||||
|  |     if (obj instanceof Dict && obj.has("XFAImages")) { | ||||||
|  |       const nameTree = new NameTree(obj.getRaw("XFAImages"), this.xref); | ||||||
|  |       for (const [key, value] of nameTree.getAll()) { | ||||||
|  |         if (!xfaImages) { | ||||||
|  |           xfaImages = new Dict(this.xref); | ||||||
|  |         } | ||||||
|  |         xfaImages.set(key, value); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     return shadow(this, "xfaImages", xfaImages); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   _collectJavaScript() { |   _collectJavaScript() { | ||||||
|     const obj = this._catDict.get("Names"); |     const obj = this._catDict.get("Names"); | ||||||
|     let javaScript = null; |     let javaScript = null; | ||||||
|  | |||||||
| @ -869,6 +869,28 @@ class PDFDocument { | |||||||
|     return null; |     return null; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   async loadXfaImages() { | ||||||
|  |     const xfaImagesDict = await this.pdfManager.ensureCatalog("xfaImages"); | ||||||
|  |     if (!xfaImagesDict) { | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     const keys = xfaImagesDict.getKeys(); | ||||||
|  |     const objectLoader = new ObjectLoader(xfaImagesDict, keys, this.xref); | ||||||
|  |     await objectLoader.load(); | ||||||
|  | 
 | ||||||
|  |     const xfaImages = new Map(); | ||||||
|  |     for (const key of keys) { | ||||||
|  |       const stream = xfaImagesDict.get(key); | ||||||
|  |       if (!isStream(stream)) { | ||||||
|  |         continue; | ||||||
|  |       } | ||||||
|  |       xfaImages.set(key, stream.getBytes()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     this.xfaFactory.setImages(xfaImages); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   async loadXfaFonts(handler, task) { |   async loadXfaFonts(handler, task) { | ||||||
|     const acroForm = await this.pdfManager.ensureCatalog("acroForm"); |     const acroForm = await this.pdfManager.ensureCatalog("acroForm"); | ||||||
|     if (!acroForm) { |     if (!acroForm) { | ||||||
|  | |||||||
| @ -77,6 +77,10 @@ class BasePdfManager { | |||||||
|     return this.pdfDocument.loadXfaFonts(handler, task); |     return this.pdfDocument.loadXfaFonts(handler, task); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   loadXfaImages() { | ||||||
|  |     return this.pdfDocument.loadXfaImages(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   serializeXfaData(annotationStorage) { |   serializeXfaData(annotationStorage) { | ||||||
|     return this.pdfDocument.serializeXfaData(annotationStorage); |     return this.pdfDocument.serializeXfaData(annotationStorage); | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -191,12 +191,15 @@ class WorkerMessageHandler { | |||||||
|       if (isPureXfa) { |       if (isPureXfa) { | ||||||
|         const task = new WorkerTask("loadXfaFonts"); |         const task = new WorkerTask("loadXfaFonts"); | ||||||
|         startWorkerTask(task); |         startWorkerTask(task); | ||||||
|         await pdfManager |         await Promise.all([ | ||||||
|           .loadXfaFonts(handler, task) |           pdfManager | ||||||
|           .catch(reason => { |             .loadXfaFonts(handler, task) | ||||||
|             // Ignore errors, to allow the document to load.
 |             .catch(reason => { | ||||||
|           }) |               // Ignore errors, to allow the document to load.
 | ||||||
|           .then(() => finishWorkerTask(task)); |             }) | ||||||
|  |             .then(() => finishWorkerTask(task)), | ||||||
|  |           pdfManager.loadXfaImages(), | ||||||
|  |         ]); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       const [numPages, fingerprints] = await Promise.all([ |       const [numPages, fingerprints] = await Promise.all([ | ||||||
|  | |||||||
| @ -61,6 +61,10 @@ class XFAFactory { | |||||||
|     return this.dims.length; |     return this.dims.length; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   setImages(images) { | ||||||
|  |     this.form[$globalData].images = images; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   setFonts(fonts) { |   setFonts(fonts) { | ||||||
|     this.form[$globalData].fontFinder = new FontFinder(fonts); |     this.form[$globalData].fontFinder = new FontFinder(fonts); | ||||||
|     const missingFonts = []; |     const missingFonts = []; | ||||||
|  | |||||||
| @ -2932,56 +2932,59 @@ class Image extends StringObject { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   [$toHTML]() { |   [$toHTML]() { | ||||||
|     if (this.href || !this[$content]) { |     let buffer = | ||||||
|       // TODO: href can be a Name referring to an internal stream
 |       this[$globalData].images && this[$globalData].images.get(this.href); | ||||||
|       // containing a picture.
 |     if (!buffer && (this.href || !this[$content])) { | ||||||
|       // In general, we don't get remote data and use what we have
 |       // In general, we don't get remote data and use what we have
 | ||||||
|       // in the pdf itself, so no picture for non null href.
 |       // in the pdf itself, so no picture for non null href.
 | ||||||
|       return HTMLResult.EMPTY; |       return HTMLResult.EMPTY; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // TODO: Firefox doesn't support natively tiff (and tif) format.
 |     if (!buffer && this.transferEncoding === "base64") { | ||||||
|     if (this.transferEncoding === "base64") { |       buffer = stringToBytes(atob(this[$content])); | ||||||
|       const buffer = stringToBytes(atob(this[$content])); |  | ||||||
|       const blob = new Blob([buffer], { type: this.contentType }); |  | ||||||
|       let style; |  | ||||||
|       switch (this.aspect) { |  | ||||||
|         case "fit": |  | ||||||
|         case "actual": |  | ||||||
|           // TODO: check what to do with actual.
 |  | ||||||
|           // Normally we should return {auto, auto} for it but
 |  | ||||||
|           // it implies some wrong rendering (see xfa_bug1716816.pdf).
 |  | ||||||
|           break; |  | ||||||
|         case "height": |  | ||||||
|           style = { |  | ||||||
|             width: "auto", |  | ||||||
|             height: "100%", |  | ||||||
|           }; |  | ||||||
|           break; |  | ||||||
|         case "none": |  | ||||||
|           style = { |  | ||||||
|             width: "100%", |  | ||||||
|             height: "100%", |  | ||||||
|           }; |  | ||||||
|           break; |  | ||||||
|         case "width": |  | ||||||
|           style = { |  | ||||||
|             width: "100%", |  | ||||||
|             height: "auto", |  | ||||||
|           }; |  | ||||||
|           break; |  | ||||||
|       } |  | ||||||
|       return HTMLResult.success({ |  | ||||||
|         name: "img", |  | ||||||
|         attributes: { |  | ||||||
|           class: ["xfaImage"], |  | ||||||
|           style, |  | ||||||
|           src: URL.createObjectURL(blob), |  | ||||||
|         }, |  | ||||||
|       }); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return HTMLResult.EMPTY; |     if (!buffer) { | ||||||
|  |       return HTMLResult.EMPTY; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // TODO: Firefox doesn't support natively tiff (and tif) format.
 | ||||||
|  |     const blob = new Blob([buffer], { type: this.contentType }); | ||||||
|  |     let style; | ||||||
|  |     switch (this.aspect) { | ||||||
|  |       case "fit": | ||||||
|  |       case "actual": | ||||||
|  |         // TODO: check what to do with actual.
 | ||||||
|  |         // Normally we should return {auto, auto} for it but
 | ||||||
|  |         // it implies some wrong rendering (see xfa_bug1716816.pdf).
 | ||||||
|  |         break; | ||||||
|  |       case "height": | ||||||
|  |         style = { | ||||||
|  |           width: "auto", | ||||||
|  |           height: "100%", | ||||||
|  |         }; | ||||||
|  |         break; | ||||||
|  |       case "none": | ||||||
|  |         style = { | ||||||
|  |           width: "100%", | ||||||
|  |           height: "100%", | ||||||
|  |         }; | ||||||
|  |         break; | ||||||
|  |       case "width": | ||||||
|  |         style = { | ||||||
|  |           width: "100%", | ||||||
|  |           height: "auto", | ||||||
|  |         }; | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     return HTMLResult.success({ | ||||||
|  |       name: "img", | ||||||
|  |       attributes: { | ||||||
|  |         class: ["xfaImage"], | ||||||
|  |         style, | ||||||
|  |         src: URL.createObjectURL(blob), | ||||||
|  |       }, | ||||||
|  |     }); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								test/pdfs/xfa_bug1718521_1.pdf.link
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/pdfs/xfa_bug1718521_1.pdf.link
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | https://bugzilla.mozilla.org/attachment.cgi?id=9229396 | ||||||
							
								
								
									
										1
									
								
								test/pdfs/xfa_bug1718521_2.pdf.link
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/pdfs/xfa_bug1718521_2.pdf.link
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | https://bugzilla.mozilla.org/attachment.cgi?id=9229409 | ||||||
							
								
								
									
										1
									
								
								test/pdfs/xfa_bug1718521_3.pdf.link
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/pdfs/xfa_bug1718521_3.pdf.link
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | https://bugzilla.mozilla.org/attachment.cgi?id=9229430 | ||||||
| @ -938,6 +938,30 @@ | |||||||
|        "lastPage": 2, |        "lastPage": 2, | ||||||
|        "type": "eq" |        "type": "eq" | ||||||
|     }, |     }, | ||||||
|  |     {  "id": "xfa_bug1718521_1", | ||||||
|  |        "file": "pdfs/xfa_bug1718521_1.pdf", | ||||||
|  |        "md5": "9b89dd9e6a4c6c3258ca24debd806863", | ||||||
|  |        "link": true, | ||||||
|  |        "rounds": 1, | ||||||
|  |        "enableXfa": true, | ||||||
|  |        "type": "eq" | ||||||
|  |     }, | ||||||
|  |     {  "id": "xfa_bug1718521_2", | ||||||
|  |        "file": "pdfs/xfa_bug1718521_2.pdf", | ||||||
|  |        "md5": "c23beb39e1c91a780da9d4b60cbd157f", | ||||||
|  |        "link": true, | ||||||
|  |        "rounds": 1, | ||||||
|  |        "enableXfa": true, | ||||||
|  |        "type": "eq" | ||||||
|  |     }, | ||||||
|  |     {  "id": "xfa_bug1718521_3", | ||||||
|  |        "file": "pdfs/xfa_bug1718521_3.pdf", | ||||||
|  |        "md5": "5cc6fb1a65515518e3e64baa81e7a21e", | ||||||
|  |        "link": true, | ||||||
|  |        "rounds": 1, | ||||||
|  |        "enableXfa": true, | ||||||
|  |        "type": "eq" | ||||||
|  |     }, | ||||||
|     {  "id": "xfa_bug1718735", |     {  "id": "xfa_bug1718735", | ||||||
|        "file": "pdfs/xfa_bug1718735.pdf", |        "file": "pdfs/xfa_bug1718735.pdf", | ||||||
|        "md5": "1001f5c02c026943cbd37f646725d82f", |        "md5": "1001f5c02c026943cbd37f646725d82f", | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user