DCTDecode; text and images vertical inversion fix
This commit is contained in:
		
							parent
							
								
									c2ce7fa7b2
								
							
						
					
					
						commit
						a66e085734
					
				
							
								
								
									
										71
									
								
								pdf.js
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								pdf.js
									
									
									
									
									
								
							| @ -509,9 +509,38 @@ var FlateStream = (function() { | |||||||
|     return constructor; |     return constructor; | ||||||
| })(); | })(); | ||||||
| 
 | 
 | ||||||
|  | var JpegStream = (function() { | ||||||
|  |     function constructor(bytes, dict) { | ||||||
|  |         // TODO per poppler, some images may have "junk" before that need to be removed
 | ||||||
|  |         this.bytes = bytes; | ||||||
|  |         this.dict = dict; | ||||||
|  | 
 | ||||||
|  |         // create DOM image
 | ||||||
|  |         var buffer = "", i, n = bytes.length; | ||||||
|  |         for (i = 0; i < n; ++i) { | ||||||
|  |             buffer += String.fromCharCode(bytes[i]); | ||||||
|  |         } | ||||||
|  |         var img = new Image(); | ||||||
|  |         img.src = "data:image/jpeg;base64," + window.btoa(buffer); | ||||||
|  |         this.domImage = img; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     constructor.prototype = { | ||||||
|  |         getChar: function() { | ||||||
|  |             TODO("read direct pixels data"); | ||||||
|  |         }, | ||||||
|  |         getImage: function() { | ||||||
|  |             return this.domImage; | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     return constructor; | ||||||
|  | })(); | ||||||
|  | 
 | ||||||
| var PredictorStream = (function() { | var PredictorStream = (function() { | ||||||
|     function constructor(stream, params) { |     function constructor(stream, params) { | ||||||
|         this.stream = stream; |         this.stream = stream; | ||||||
|  |         this.dict = stream.dict; | ||||||
|         this.predictor = params.get("Predictor") || 1; |         this.predictor = params.get("Predictor") || 1; | ||||||
|         if (this.predictor <= 1) { |         if (this.predictor <= 1) { | ||||||
|             return stream; // no prediction
 |             return stream; // no prediction
 | ||||||
| @ -1177,15 +1206,15 @@ var Parser = (function() { | |||||||
|                                            this.encAlgorithm, |                                            this.encAlgorithm, | ||||||
|                                            this.keyLength); |                                            this.keyLength); | ||||||
|             } |             } | ||||||
|             stream = this.filter(stream, dict); |             stream = this.filter(stream, dict, length); | ||||||
|             stream.parameters = dict;  |             stream.parameters = dict;  | ||||||
|             return stream; |             return stream; | ||||||
|         }, |         }, | ||||||
|         filter: function(stream, dict) { |         filter: function(stream, dict, length) { | ||||||
|             var filter = dict.get2("Filter", "F"); |             var filter = dict.get2("Filter", "F"); | ||||||
|             var params = dict.get2("DecodeParms", "DP"); |             var params = dict.get2("DecodeParms", "DP"); | ||||||
|             if (IsName(filter)) |             if (IsName(filter)) | ||||||
|                 return this.makeFilter(stream, filter.name, params); |                 return this.makeFilter(stream, filter.name, length, params); | ||||||
|             if (IsArray(filter)) { |             if (IsArray(filter)) { | ||||||
|                 var filterArray = filter; |                 var filterArray = filter; | ||||||
|                 var paramsArray = params; |                 var paramsArray = params; | ||||||
| @ -1196,18 +1225,21 @@ var Parser = (function() { | |||||||
|                         params = null; |                         params = null; | ||||||
|                         if (IsArray(paramsArray) && (i in paramsArray)) |                         if (IsArray(paramsArray) && (i in paramsArray)) | ||||||
|                             params = paramsArray[i]; |                             params = paramsArray[i]; | ||||||
|                         stream = this.makeFilter(stream, filter.name, params); |                         stream = this.makeFilter(stream, filter.name, length, params); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             return stream; |             return stream; | ||||||
|         }, |         }, | ||||||
|         makeFilter: function(stream, name, params) { |         makeFilter: function(stream, name, length, params) { | ||||||
|             if (name == "FlateDecode" || name == "Fl") { |             if (name == "FlateDecode" || name == "Fl") { | ||||||
|                 if (params) { |                 if (params) { | ||||||
|                     return new PredictorStream(new FlateStream(stream), params); |                     return new PredictorStream(new FlateStream(stream), params); | ||||||
|                 } |                 } | ||||||
|                 return new FlateStream(stream); |                 return new FlateStream(stream); | ||||||
|  |             } else if (name == "DCTDecode") { | ||||||
|  |                 var bytes = stream.getBytes(length); | ||||||
|  |                 return new JpegStream(bytes, stream.dict); | ||||||
|             } else { |             } else { | ||||||
|                 error("filter '" + name + "' not supported yet"); |                 error("filter '" + name + "' not supported yet"); | ||||||
|             } |             } | ||||||
| @ -2398,11 +2430,17 @@ var CanvasGraphics = (function() { | |||||||
| 
 | 
 | ||||||
|             var fontName = ""; |             var fontName = ""; | ||||||
|             var fontDescriptor = font.get("FontDescriptor"); |             var fontDescriptor = font.get("FontDescriptor"); | ||||||
|             if (fontDescriptor.num) { |             if (fontDescriptor && fontDescriptor.num) { | ||||||
|                 var fontDescriptor = this.xref.fetchIfRef(fontDescriptor); |                 var fontDescriptor = this.xref.fetchIfRef(fontDescriptor); | ||||||
|                 fontName = fontDescriptor.get("FontName").name.replace("+", "_"); |                 fontName = fontDescriptor.get("FontName").name.replace("+", "_"); | ||||||
|                 Fonts.active = fontName; |                 Fonts.active = fontName; | ||||||
|             } |             } | ||||||
|  |             if (!fontName) { | ||||||
|  |                 // fontDescriptor is not available, fallback to default font (TODO ?)
 | ||||||
|  |                 this.current.fontSize = size; | ||||||
|  |                 this.ctx.font = this.current.fontSize + 'px sans-serif'; | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             this.current.fontSize = size; |             this.current.fontSize = size; | ||||||
|             this.ctx.font = this.current.fontSize +'px "' + fontName + '"'; |             this.ctx.font = this.current.fontSize +'px "' + fontName + '"'; | ||||||
| @ -2431,9 +2469,9 @@ var CanvasGraphics = (function() { | |||||||
|         }, |         }, | ||||||
|         showText: function(text) { |         showText: function(text) { | ||||||
|             this.ctx.save(); |             this.ctx.save(); | ||||||
|             this.ctx.translate(0, 2 * this.current.y); |  | ||||||
|             this.ctx.scale(1, -1); |  | ||||||
|             this.ctx.transform.apply(this.ctx, this.current.textMatrix); |             this.ctx.transform.apply(this.ctx, this.current.textMatrix); | ||||||
|  |             this.ctx.scale(1, -1); | ||||||
|  |             this.ctx.translate(0, -2 * this.current.y); | ||||||
|             this.ctx.fillText(Fonts.chars2Unicode(text), this.current.x, this.current.y); |             this.ctx.fillText(Fonts.chars2Unicode(text), this.current.x, this.current.y); | ||||||
|             this.current.x += this.ctx.measureText(text).width; |             this.current.x += this.ctx.measureText(text).width; | ||||||
| 
 | 
 | ||||||
| @ -2679,8 +2717,17 @@ var CanvasGraphics = (function() { | |||||||
|                 error("Invalid image width or height"); |                 error("Invalid image width or height"); | ||||||
|              |              | ||||||
|             var ctx = this.ctx; |             var ctx = this.ctx; | ||||||
|  | 
 | ||||||
|             // scale the image to the unit square
 |             // scale the image to the unit square
 | ||||||
|             ctx.scale(1/w, 1/h); |             ctx.scale(1/w, -1/h); | ||||||
|  | 
 | ||||||
|  |             if (image instanceof JpegStream) { | ||||||
|  |                 var domImage = image.getImage(); | ||||||
|  |                 ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height, | ||||||
|  |                     0, -h, w, h); | ||||||
|  |                 this.restore(); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             var interpolate = dict.get2("Interpolate", "I"); |             var interpolate = dict.get2("Interpolate", "I"); | ||||||
|             if (!IsBool(interpolate)) |             if (!IsBool(interpolate)) | ||||||
| @ -2786,7 +2833,7 @@ var CanvasGraphics = (function() { | |||||||
|                 switch (numComps) { |                 switch (numComps) { | ||||||
|                 case 1: |                 case 1: | ||||||
|                     for (var i = 0; i < length; i += 4) { |                     for (var i = 0; i < length; i += 4) { | ||||||
|                         var p = imgArray[imageIdx++]; |                         var p = imgArray[imgIdx++]; | ||||||
|                         pixels[i] = p; |                         pixels[i] = p; | ||||||
|                         pixels[i+1] = p; |                         pixels[i+1] = p; | ||||||
|                         pixels[i+2] = p; |                         pixels[i+2] = p; | ||||||
| @ -2813,7 +2860,7 @@ var CanvasGraphics = (function() { | |||||||
|                 switch (numComps) { |                 switch (numComps) { | ||||||
|                 case 1: |                 case 1: | ||||||
|                     for (var i = 0; i < length; i += 4) { |                     for (var i = 0; i < length; i += 4) { | ||||||
|                         var p = imgArray[imageIdx++]; |                         var p = imgArray[imgIdx++]; | ||||||
|                         pixels[i] = p; |                         pixels[i] = p; | ||||||
|                         pixels[i+1] = p; |                         pixels[i+1] = p; | ||||||
|                         pixels[i+2] = p; |                         pixels[i+2] = p; | ||||||
| @ -2833,7 +2880,7 @@ var CanvasGraphics = (function() { | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             tmpCtx.putImageData(imgData, 0, 0); |             tmpCtx.putImageData(imgData, 0, 0); | ||||||
|             ctx.drawImage(tmpCanvas, 0, 0); |             ctx.drawImage(tmpCanvas, 0, -h); | ||||||
|             this.restore(); |             this.restore(); | ||||||
|         }, |         }, | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user