DCTDecode; text and images vertical inversion fix
This commit is contained in:
parent
4452e5bd86
commit
e2933b5583
71
pdf.js
71
pdf.js
@ -509,9 +509,38 @@ var FlateStream = (function() {
|
||||
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() {
|
||||
function constructor(stream, params) {
|
||||
this.stream = stream;
|
||||
this.dict = stream.dict;
|
||||
this.predictor = params.get("Predictor") || 1;
|
||||
if (this.predictor <= 1) {
|
||||
return stream; // no prediction
|
||||
@ -1177,15 +1206,15 @@ var Parser = (function() {
|
||||
this.encAlgorithm,
|
||||
this.keyLength);
|
||||
}
|
||||
stream = this.filter(stream, dict);
|
||||
stream = this.filter(stream, dict, length);
|
||||
stream.parameters = dict;
|
||||
return stream;
|
||||
},
|
||||
filter: function(stream, dict) {
|
||||
filter: function(stream, dict, length) {
|
||||
var filter = dict.get2("Filter", "F");
|
||||
var params = dict.get2("DecodeParms", "DP");
|
||||
if (IsName(filter))
|
||||
return this.makeFilter(stream, filter.name, params);
|
||||
return this.makeFilter(stream, filter.name, length, params);
|
||||
if (IsArray(filter)) {
|
||||
var filterArray = filter;
|
||||
var paramsArray = params;
|
||||
@ -1196,18 +1225,21 @@ var Parser = (function() {
|
||||
params = null;
|
||||
if (IsArray(paramsArray) && (i in paramsArray))
|
||||
params = paramsArray[i];
|
||||
stream = this.makeFilter(stream, filter.name, params);
|
||||
stream = this.makeFilter(stream, filter.name, length, params);
|
||||
}
|
||||
}
|
||||
}
|
||||
return stream;
|
||||
},
|
||||
makeFilter: function(stream, name, params) {
|
||||
makeFilter: function(stream, name, length, params) {
|
||||
if (name == "FlateDecode" || name == "Fl") {
|
||||
if (params) {
|
||||
return new PredictorStream(new FlateStream(stream), params);
|
||||
}
|
||||
return new FlateStream(stream);
|
||||
} else if (name == "DCTDecode") {
|
||||
var bytes = stream.getBytes(length);
|
||||
return new JpegStream(bytes, stream.dict);
|
||||
} else {
|
||||
error("filter '" + name + "' not supported yet");
|
||||
}
|
||||
@ -2398,11 +2430,17 @@ var CanvasGraphics = (function() {
|
||||
|
||||
var fontName = "";
|
||||
var fontDescriptor = font.get("FontDescriptor");
|
||||
if (fontDescriptor.num) {
|
||||
if (fontDescriptor && fontDescriptor.num) {
|
||||
var fontDescriptor = this.xref.fetchIfRef(fontDescriptor);
|
||||
fontName = fontDescriptor.get("FontName").name.replace("+", "_");
|
||||
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.ctx.font = this.current.fontSize +'px "' + fontName + '"';
|
||||
@ -2431,9 +2469,9 @@ var CanvasGraphics = (function() {
|
||||
},
|
||||
showText: function(text) {
|
||||
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.scale(1, -1);
|
||||
this.ctx.translate(0, -2 * this.current.y);
|
||||
this.ctx.fillText(Fonts.chars2Unicode(text), this.current.x, this.current.y);
|
||||
this.current.x += this.ctx.measureText(text).width;
|
||||
|
||||
@ -2679,8 +2717,17 @@ var CanvasGraphics = (function() {
|
||||
error("Invalid image width or height");
|
||||
|
||||
var ctx = this.ctx;
|
||||
|
||||
// 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");
|
||||
if (!IsBool(interpolate))
|
||||
@ -2786,7 +2833,7 @@ var CanvasGraphics = (function() {
|
||||
switch (numComps) {
|
||||
case 1:
|
||||
for (var i = 0; i < length; i += 4) {
|
||||
var p = imgArray[imageIdx++];
|
||||
var p = imgArray[imgIdx++];
|
||||
pixels[i] = p;
|
||||
pixels[i+1] = p;
|
||||
pixels[i+2] = p;
|
||||
@ -2813,7 +2860,7 @@ var CanvasGraphics = (function() {
|
||||
switch (numComps) {
|
||||
case 1:
|
||||
for (var i = 0; i < length; i += 4) {
|
||||
var p = imgArray[imageIdx++];
|
||||
var p = imgArray[imgIdx++];
|
||||
pixels[i] = p;
|
||||
pixels[i+1] = p;
|
||||
pixels[i+2] = p;
|
||||
@ -2833,7 +2880,7 @@ var CanvasGraphics = (function() {
|
||||
}
|
||||
}
|
||||
tmpCtx.putImageData(imgData, 0, 0);
|
||||
ctx.drawImage(tmpCanvas, 0, 0);
|
||||
ctx.drawImage(tmpCanvas, 0, -h);
|
||||
this.restore();
|
||||
},
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user