Prefer the Width/Height of the image data, rather than the image dictionary, for JPEG 2000 images (issue 9650)
According to the PDF specification, see https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf#page=45 > When using the JPXDecode filter with image XObjects, the following changes to and constraints on some entries in the image dictionary shall apply (see 8.9.5, "Image Dictionaries" for details on these entries): > > - Width and Height shall match the corresponding width and height values in the JPEG2000 data. > > - . . . Hence it seems reasonable to use the Width/Height of the image data *itself*, rather than the image dictionary when there's a mismatch. Given that JPEG 2000 images are already being parsed, in order to obtain basic parameters, the actual Width/Height is readily available in the `PDFImage` constructor.
This commit is contained in:
parent
17f65908ae
commit
3ce420131f
@ -91,6 +91,9 @@ var PDFImage = (function PDFImageClosure() {
|
||||
var jpxImage = new JpxImage();
|
||||
jpxImage.parseImageProperties(image.stream);
|
||||
image.stream.reset();
|
||||
|
||||
image.width = jpxImage.width;
|
||||
image.height = jpxImage.height;
|
||||
image.bitsPerComponent = jpxImage.bitsPerComponent;
|
||||
image.numComps = jpxImage.componentsCount;
|
||||
break;
|
||||
@ -105,13 +108,23 @@ var PDFImage = (function PDFImageClosure() {
|
||||
}
|
||||
// TODO cache rendered images?
|
||||
|
||||
this.width = dict.get('Width', 'W');
|
||||
this.height = dict.get('Height', 'H');
|
||||
let width = dict.get('Width', 'W');
|
||||
let height = dict.get('Height', 'H');
|
||||
|
||||
if (this.width < 1 || this.height < 1) {
|
||||
throw new FormatError(`Invalid image width: ${this.width} or ` +
|
||||
`height: ${this.height}`);
|
||||
if ((Number.isInteger(image.width) && image.width > 0) &&
|
||||
(Number.isInteger(image.height) && image.height > 0) &&
|
||||
(image.width !== width || image.height !== height)) {
|
||||
warn('PDFImage - using the Width/Height of the image data, ' +
|
||||
'rather than the image dictionary.');
|
||||
width = image.width;
|
||||
height = image.height;
|
||||
}
|
||||
if (width < 1 || height < 1) {
|
||||
throw new FormatError(`Invalid image width: ${width} or ` +
|
||||
`height: ${height}`);
|
||||
}
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
|
||||
this.interpolate = dict.get('Interpolate', 'I') || false;
|
||||
this.imageMask = dict.get('ImageMask', 'IM') || false;
|
||||
|
1
test/pdfs/issue9650.pdf.link
Normal file
1
test/pdfs/issue9650.pdf.link
Normal file
@ -0,0 +1 @@
|
||||
https://github.com/mozilla/pdf.js/files/1898753/Kred.Eingangsrechnungen.pdf
|
@ -3259,6 +3259,14 @@
|
||||
"lastPage": 1,
|
||||
"type": "eq"
|
||||
},
|
||||
{ "id": "issue9650",
|
||||
"file": "pdfs/issue9650.pdf",
|
||||
"md5": "20d50bda6b1080b6d9088811299c791e",
|
||||
"rounds": 1,
|
||||
"link": true,
|
||||
"lastPage": 1,
|
||||
"type": "eq"
|
||||
},
|
||||
{ "id": "issue9679",
|
||||
"file": "pdfs/issue9679.pdf",
|
||||
"md5": "3077d06add3875705aa1021c7b116023",
|
||||
|
Loading…
Reference in New Issue
Block a user