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;
|
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…
Reference in New Issue
Block a user