diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index 089a574ec..5a527bbf2 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -112,7 +112,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
     forceDataSchema: false,
     maxImageSize: -1,
     disableFontFace: false,
-    cMapOptions: { url: null, packed: false }
+    cMapOptions: { url: null, packed: false },
+    disableNativeImageDecoder: false,
   };
 
   function NativeImageDecoder(xref, resources, handler, forceDataSchema) {
@@ -388,13 +389,15 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
         return;
       }
 
+      var useNativeImageDecoder = !this.options.disableNativeImageDecoder;
       // If there is no imageMask, create the PDFImage and a lot
       // of image processing can be done here.
       var objId = 'img_' + this.idFactory.createObjId();
       operatorList.addDependency(objId);
       args = [objId, w, h];
 
-      if (!softMask && !mask && image instanceof JpegStream &&
+      if (useNativeImageDecoder &&
+          !softMask && !mask && image instanceof JpegStream &&
           NativeImageDecoder.isSupported(image, this.xref, resources)) {
         // These JPEGs don't need any more processing so we can just send it.
         operatorList.addOp(OPS.paintJpegXObject, args);
@@ -406,8 +409,9 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
 
       // Creates native image decoder only if a JPEG image or mask is present.
       var nativeImageDecoder = null;
-      if (image instanceof JpegStream || mask instanceof JpegStream ||
-          softMask instanceof JpegStream) {
+      if (useNativeImageDecoder &&
+          (image instanceof JpegStream || mask instanceof JpegStream ||
+           softMask instanceof JpegStream)) {
         nativeImageDecoder = new NativeImageDecoder(self.xref, resources,
           self.handler, self.options.forceDataSchema);
       }
diff --git a/src/core/worker.js b/src/core/worker.js
index 293462c2a..adbb6137e 100644
--- a/src/core/worker.js
+++ b/src/core/worker.js
@@ -737,7 +737,8 @@ var WorkerMessageHandler = {
         forceDataSchema: data.disableCreateObjectURL,
         maxImageSize: data.maxImageSize === undefined ? -1 : data.maxImageSize,
         disableFontFace: data.disableFontFace,
-        cMapOptions: cMapOptions
+        cMapOptions: cMapOptions,
+        disableNativeImageDecoder: data.disableNativeImageDecoder,
       };
 
       getPdfManager(data, evaluatorOptions).then(function (newPdfManager) {
diff --git a/src/display/api.js b/src/display/api.js
index 3c89d28d8..a84f522c2 100644
--- a/src/display/api.js
+++ b/src/display/api.js
@@ -131,6 +131,10 @@ if (typeof PDFJSDev !== 'undefined' &&
  * @property {string} docBaseUrl - (optional) The base URL of the document,
  *   used when attempting to recover valid absolute URLs for annotations, and
  *   outline items, that (incorrectly) only specify relative URLs.
+ * @property {boolean} disableNativeImageDecoder - (optional) Disable decoding
+ *   of certain (simple) JPEG images in the browser. This is useful for
+ *   environments without DOM image support, such as e.g. Node.js.
+ *   The default value is `false`.
  */
 
 /**
@@ -244,6 +248,7 @@ function getDocument(src, pdfDataRangeTransport,
   }
 
   params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;
+  params.disableNativeImageDecoder = params.disableNativeImageDecoder === true;
 
   if (!worker) {
     // Worker was not provided -- creating and owning our own.
@@ -304,6 +309,7 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
     postMessageTransfers: getDefaultSetting('postMessageTransfers') &&
                           !isPostMessageTransfersDisabled,
     docBaseUrl: source.docBaseUrl,
+    disableNativeImageDecoder: source.disableNativeImageDecoder,
   }).then(function (workerId) {
     if (worker.destroyed) {
       throw new Error('Worker was destroyed');