From 0ecc22cb04b54e57bbe0e498791f9a604c8c2e57 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Fri, 1 Jun 2018 12:52:29 +0200 Subject: [PATCH] Attempt to provide better default values for the `disableFontFace`/`nativeImageDecoderSupport` API options in Node.js This should provide a better out-of-the-box experience when using PDF.js in a Node.js environment, since it's missing native support for both `@font-face` and `Image`. Please note that this change *only* affects the default values, hence it's still possible for an API consumer to override those values when calling `getDocument`. Also, prevents "ReferenceError: document is not defined" errors, when running the unit-tests in Node.js/Travis. --- examples/node/pdf2png/pdf2png.js | 10 ++-------- src/display/api.js | 8 ++++++-- src/display/api_compatibility.js | 18 +++++++++++++----- web/viewer_compatibility.js | 5 +---- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/examples/node/pdf2png/pdf2png.js b/examples/node/pdf2png/pdf2png.js index d42ba4b40..ae739a35b 100644 --- a/examples/node/pdf2png/pdf2png.js +++ b/examples/node/pdf2png/pdf2png.js @@ -56,14 +56,8 @@ var pdfURL = '../../../web/compressed.tracemonkey-pldi-09.pdf'; // Read the PDF file into a typed array so PDF.js can load it. var rawData = new Uint8Array(fs.readFileSync(pdfURL)); -// Load the PDF file. The `disableFontFace` and `nativeImageDecoderSupport` -// options must be passed because Node.js has no native `@font-face` and -// `Image` support. -pdfjsLib.getDocument({ - data: rawData, - disableFontFace: true, - nativeImageDecoderSupport: 'none', -}).then(function (pdfDocument) { +// Load the PDF file. +pdfjsLib.getDocument(rawData).then(function (pdfDocument) { console.log('# PDF document loaded.'); // Get the first page. diff --git a/src/display/api.js b/src/display/api.js index 4f7259c50..ca673438b 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -274,7 +274,9 @@ function getDocument(src) { const NativeImageDecoderValues = Object.values(NativeImageDecoding); if (params.nativeImageDecoderSupport === undefined || !NativeImageDecoderValues.includes(params.nativeImageDecoderSupport)) { - params.nativeImageDecoderSupport = NativeImageDecoding.DECODE; + params.nativeImageDecoderSupport = + (apiCompatibilityParams.nativeImageDecoderSupport || + NativeImageDecoding.DECODE); } if (!Number.isInteger(params.maxImageSize)) { params.maxImageSize = -1; @@ -283,7 +285,7 @@ function getDocument(src) { params.isEvalSupported = true; } if (typeof params.disableFontFace !== 'boolean') { - params.disableFontFace = false; + params.disableFontFace = apiCompatibilityParams.disableFontFace || false; } if (typeof params.disableRange !== 'boolean') { @@ -2168,6 +2170,8 @@ var WorkerTransport = (function WorkerTransportClosure() { disableStream: params.disableStream, disableAutoFetch: params.disableAutoFetch, disableCreateObjectURL: params.disableCreateObjectURL, + disableFontFace: params.disableFontFace, + nativeImageDecoderSupport: params.nativeImageDecoderSupport, }); }, }; diff --git a/src/display/api_compatibility.js b/src/display/api_compatibility.js index 09e283e75..beb49fe65 100644 --- a/src/display/api_compatibility.js +++ b/src/display/api_compatibility.js @@ -15,6 +15,8 @@ let compatibilityParams = Object.create(null); if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) { + const isNodeJS = require('../shared/is_node'); + const userAgent = (typeof navigator !== 'undefined' && navigator.userAgent) || ''; const isIE = /Trident/.test(userAgent); @@ -42,9 +44,15 @@ if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) { compatibilityParams.disableStream = true; } })(); -} -const apiCompatibilityParams = Object.freeze(compatibilityParams); -export { - apiCompatibilityParams, -}; + // Support: Node.js + (function checkFontFaceAndImage() { + // Node.js is missing native support for `@font-face` and `Image`. + if (isNodeJS()) { + compatibilityParams.disableFontFace = true; + compatibilityParams.nativeImageDecoderSupport = 'none'; + } + })(); +} + +exports.apiCompatibilityParams = Object.freeze(compatibilityParams); diff --git a/web/viewer_compatibility.js b/web/viewer_compatibility.js index e6aadea80..2debdc412 100644 --- a/web/viewer_compatibility.js +++ b/web/viewer_compatibility.js @@ -37,8 +37,5 @@ if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) { } })(); } -const viewerCompatibilityParams = Object.freeze(compatibilityParams); -export { - viewerCompatibilityParams, -}; +exports.viewerCompatibilityParams = Object.freeze(compatibilityParams);