[api-minor] Add a getDocument parameter that allows disabling of the NativeImageDecoder (e.g. for use with Node.js)

Note that I initially tried to add this as a parameter to the `PDFPageProxy.render` method, such that it could be passed to `PartialEvaluator.getOperatorList`.
However, given all the different code-paths that call `getOperatorList` (there's a bunch only in `annotation.js`), this seemed to very quickly become unwieldy and thus difficult to maintain compared to simply using the existing `evaluatorOptions`.
This commit is contained in:
Jonas Jenwald 2017-02-06 22:09:19 +01:00
parent 3e5c6e4287
commit 9c34d0aa8c
3 changed files with 16 additions and 5 deletions

View File

@ -112,7 +112,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
forceDataSchema: false, forceDataSchema: false,
maxImageSize: -1, maxImageSize: -1,
disableFontFace: false, disableFontFace: false,
cMapOptions: { url: null, packed: false } cMapOptions: { url: null, packed: false },
disableNativeImageDecoder: false,
}; };
function NativeImageDecoder(xref, resources, handler, forceDataSchema) { function NativeImageDecoder(xref, resources, handler, forceDataSchema) {
@ -388,13 +389,15 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
return; return;
} }
var useNativeImageDecoder = !this.options.disableNativeImageDecoder;
// If there is no imageMask, create the PDFImage and a lot // If there is no imageMask, create the PDFImage and a lot
// of image processing can be done here. // of image processing can be done here.
var objId = 'img_' + this.idFactory.createObjId(); var objId = 'img_' + this.idFactory.createObjId();
operatorList.addDependency(objId); operatorList.addDependency(objId);
args = [objId, w, h]; args = [objId, w, h];
if (!softMask && !mask && image instanceof JpegStream && if (useNativeImageDecoder &&
!softMask && !mask && image instanceof JpegStream &&
NativeImageDecoder.isSupported(image, this.xref, resources)) { NativeImageDecoder.isSupported(image, this.xref, resources)) {
// These JPEGs don't need any more processing so we can just send it. // These JPEGs don't need any more processing so we can just send it.
operatorList.addOp(OPS.paintJpegXObject, args); 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. // Creates native image decoder only if a JPEG image or mask is present.
var nativeImageDecoder = null; var nativeImageDecoder = null;
if (image instanceof JpegStream || mask instanceof JpegStream || if (useNativeImageDecoder &&
softMask instanceof JpegStream) { (image instanceof JpegStream || mask instanceof JpegStream ||
softMask instanceof JpegStream)) {
nativeImageDecoder = new NativeImageDecoder(self.xref, resources, nativeImageDecoder = new NativeImageDecoder(self.xref, resources,
self.handler, self.options.forceDataSchema); self.handler, self.options.forceDataSchema);
} }

View File

@ -737,7 +737,8 @@ var WorkerMessageHandler = {
forceDataSchema: data.disableCreateObjectURL, forceDataSchema: data.disableCreateObjectURL,
maxImageSize: data.maxImageSize === undefined ? -1 : data.maxImageSize, maxImageSize: data.maxImageSize === undefined ? -1 : data.maxImageSize,
disableFontFace: data.disableFontFace, disableFontFace: data.disableFontFace,
cMapOptions: cMapOptions cMapOptions: cMapOptions,
disableNativeImageDecoder: data.disableNativeImageDecoder,
}; };
getPdfManager(data, evaluatorOptions).then(function (newPdfManager) { getPdfManager(data, evaluatorOptions).then(function (newPdfManager) {

View File

@ -131,6 +131,10 @@ if (typeof PDFJSDev !== 'undefined' &&
* @property {string} docBaseUrl - (optional) The base URL of the document, * @property {string} docBaseUrl - (optional) The base URL of the document,
* used when attempting to recover valid absolute URLs for annotations, and * used when attempting to recover valid absolute URLs for annotations, and
* outline items, that (incorrectly) only specify relative URLs. * 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.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;
params.disableNativeImageDecoder = params.disableNativeImageDecoder === true;
if (!worker) { if (!worker) {
// Worker was not provided -- creating and owning our own. // Worker was not provided -- creating and owning our own.
@ -304,6 +309,7 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
postMessageTransfers: getDefaultSetting('postMessageTransfers') && postMessageTransfers: getDefaultSetting('postMessageTransfers') &&
!isPostMessageTransfersDisabled, !isPostMessageTransfersDisabled,
docBaseUrl: source.docBaseUrl, docBaseUrl: source.docBaseUrl,
disableNativeImageDecoder: source.disableNativeImageDecoder,
}).then(function (workerId) { }).then(function (workerId) {
if (worker.destroyed) { if (worker.destroyed) {
throw new Error('Worker was destroyed'); throw new Error('Worker was destroyed');