diff --git a/src/core/jpg.js b/src/core/jpg.js index be6840479..4bb326635 100644 --- a/src/core/jpg.js +++ b/src/core/jpg.js @@ -387,6 +387,10 @@ var JpegImage = (function jpegImage() { var p0, p1, p2, p3, p4, p5, p6, p7; var t; + if (!qt) { + throw 'missing required Quantization Table.'; + } + // inverse DCT on rows for (var row = 0; row < 64; row += 8) { // gather block data @@ -738,7 +742,8 @@ var JpegImage = (function jpegImage() { l = frame.components.push({ h: h, v: v, - quantizationTable: quantizationTables[qId] + quantizationId: qId, + quantizationTable: null, // See comment below. }); frame.componentIds[componentId] = l - 1; offset += 3; @@ -822,6 +827,15 @@ var JpegImage = (function jpegImage() { this.components = []; for (i = 0; i < frame.components.length; i++) { component = frame.components[i]; + + // Prevent errors when DQT markers are placed after SOF{n} markers, + // by assigning the `quantizationTable` entry after the entire image + // has been parsed (fixes issue7406.pdf). + var quantizationTable = quantizationTables[component.quantizationId]; + if (quantizationTable) { + component.quantizationTable = quantizationTable; + } + this.components.push({ output: buildComponentData(frame, component), scaleX: component.h / frame.maxH, diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index ff1f009f9..72c0ca28c 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -30,6 +30,7 @@ !issue7200.pdf !issue7229.pdf !issue7403.pdf +!issue7406.pdf !issue7426.pdf !issue7439.pdf !issue7446.pdf diff --git a/test/pdfs/issue7406.pdf b/test/pdfs/issue7406.pdf new file mode 100644 index 000000000..1c1d07d82 Binary files /dev/null and b/test/pdfs/issue7406.pdf differ diff --git a/test/test_manifest.json b/test/test_manifest.json index b68bdb561..493e04666 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -999,6 +999,13 @@ "rounds": 1, "type": "eq" }, + { "id": "issue7406", + "file": "pdfs/issue7406.pdf", + "md5": "7a3d322d7c595a36b4470cfb6a54a2b7", + "link": false, + "rounds": 1, + "type": "eq" + }, { "id": "protectip", "file": "pdfs/protectip.pdf", "md5": "676e7a7b8f96d04825361832b1838a93",