From 11ab3b5c000eb13e7ea5632ac36b1109ff7280b7 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sun, 11 Feb 2018 13:13:11 +0100 Subject: [PATCH] Ensure that `JpegImage.getData` returns the correct data length when `forceRGBoutput == true` (issue 4888) With PDF.js version `2.0` we'll only support browsers with built-in `TypedArray` functionality, hence there doesn't seem to be any good reason not to implement this now. Fixes 4888. --- src/core/jpg.js | 6 ++++-- test/unit/api_spec.js | 21 ++++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/core/jpg.js b/src/core/jpg.js index 0842dd0ae..1e0c0c69c 100644 --- a/src/core/jpg.js +++ b/src/core/jpg.js @@ -1083,7 +1083,8 @@ var JpegImage = (function JpegImageClosure() { 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407); } - return data; + // Ensure that only the converted RGB data is returned. + return data.subarray(0, offset); }, _convertYcckToCmyk: function convertYcckToCmyk(data) { @@ -1140,7 +1141,8 @@ var JpegImage = (function JpegImageClosure() { 193.58209356861505) - k * (22.33816807309886 * k + 180.12613974708367); } - return data; + // Ensure that only the converted RGB data is returned. + return data.subarray(0, offset); }, getData: function getData(width, height, forceRGBoutput) { diff --git a/test/unit/api_spec.js b/test/unit/api_spec.js index 12252e079..ff5f9f2c8 100644 --- a/test/unit/api_spec.js +++ b/test/unit/api_spec.js @@ -18,7 +18,7 @@ import { } from './test_utils'; import { createPromiseCapability, FontType, InvalidPDFException, MissingPDFException, - PasswordException, PasswordResponses, StreamType, stringToBytes + OPS, PasswordException, PasswordResponses, StreamType, stringToBytes } from '../../src/shared/util'; import { DOMCanvasFactory, RenderingCancelledException @@ -1104,6 +1104,25 @@ describe('api', function() { done.fail(reason); }); }); + it('gets operatorList with JPEG image (issue 4888)', function(done) { + let loadingTask = getDocument(buildGetDocumentParams('cmykjpeg.pdf')); + + loadingTask.promise.then((pdfDoc) => { + pdfDoc.getPage(1).then((pdfPage) => { + pdfPage.getOperatorList().then((opList) => { + let imgIndex = opList.fnArray.indexOf(OPS.paintImageXObject); + let imgArgs = opList.argsArray[imgIndex]; + let { data: imgData, } = pdfPage.objs.get(imgArgs[0]); + + expect(imgData instanceof Uint8ClampedArray).toEqual(true); + expect(imgData.length).toEqual(90000); + done(); + }); + }); + }).catch(function (reason) { + done.fail(reason); + }); + }); it('gets stats after parsing page', function (done) { var promise = page.getOperatorList().then(function () { return pdfDocument.getStats();