2012-09-01 07:48:21 +09:00
|
|
|
/* Copyright 2012 Mozilla Foundation
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
2017-07-09 22:19:16 +09:00
|
|
|
/* globals requirejs, __non_webpack_require__ */
|
2012-04-10 14:20:57 +09:00
|
|
|
|
2017-04-02 21:25:33 +09:00
|
|
|
import {
|
2017-12-06 21:51:04 +09:00
|
|
|
assert, createPromiseCapability, getVerbosityLevel, info, InvalidPDFException,
|
2018-06-06 03:30:11 +09:00
|
|
|
isArrayBuffer, isSameOrigin, MissingPDFException, NativeImageDecoding,
|
2018-06-04 19:37:54 +09:00
|
|
|
PasswordException, setVerbosityLevel, shadow, stringToBytes,
|
|
|
|
UnexpectedResponseException, UnknownErrorException, unreachable, Util, warn
|
2017-04-02 21:25:33 +09:00
|
|
|
} from '../shared/util';
|
|
|
|
import {
|
2018-06-07 20:52:40 +09:00
|
|
|
DOMCanvasFactory, DOMCMapReaderFactory, DummyStatTimer, loadScript,
|
|
|
|
PageViewport, RenderingCancelledException, StatTimer
|
2017-04-02 21:25:33 +09:00
|
|
|
} from './dom_utils';
|
|
|
|
import { FontFaceObject, FontLoader } from './font_loader';
|
2018-02-18 06:22:10 +09:00
|
|
|
import { apiCompatibilityParams } from './api_compatibility';
|
2017-04-02 21:25:33 +09:00
|
|
|
import { CanvasGraphics } from './canvas';
|
2017-08-23 07:06:11 +09:00
|
|
|
import globalScope from '../shared/global_scope';
|
2018-02-14 22:25:47 +09:00
|
|
|
import { GlobalWorkerOptions } from './worker_options';
|
2018-06-04 19:37:54 +09:00
|
|
|
import { MessageHandler } from '../shared/message_handler';
|
2017-04-02 21:25:33 +09:00
|
|
|
import { Metadata } from './metadata';
|
2017-07-01 02:59:52 +09:00
|
|
|
import { PDFDataTransportStream } from './transport_stream';
|
2017-11-02 00:32:22 +09:00
|
|
|
import { WebGLContext } from './webgl';
|
2015-11-22 01:32:47 +09:00
|
|
|
|
2015-10-22 08:56:27 +09:00
|
|
|
var DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536
|
|
|
|
|
2018-02-14 22:49:24 +09:00
|
|
|
let isWorkerDisabled = false;
|
|
|
|
let workerSrc;
|
2016-03-29 04:49:22 +09:00
|
|
|
|
2018-02-14 22:49:24 +09:00
|
|
|
const pdfjsFilePath =
|
2017-02-09 07:32:15 +09:00
|
|
|
typeof PDFJSDev !== 'undefined' &&
|
|
|
|
PDFJSDev.test('PRODUCTION && !(MOZCENTRAL || FIREFOX)') &&
|
|
|
|
typeof document !== 'undefined' && document.currentScript ?
|
|
|
|
document.currentScript.src : null;
|
|
|
|
|
2016-10-15 00:57:53 +09:00
|
|
|
var fakeWorkerFilesLoader = null;
|
|
|
|
var useRequireEnsure = false;
|
2018-01-18 02:20:00 +09:00
|
|
|
if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC')) {
|
2018-02-14 22:49:24 +09:00
|
|
|
// For GENERIC build we need to add support for different fake file loaders
|
|
|
|
// for different frameworks.
|
2016-10-15 00:57:53 +09:00
|
|
|
if (typeof window === 'undefined') {
|
|
|
|
// node.js - disable worker and set require.ensure.
|
|
|
|
isWorkerDisabled = true;
|
2017-07-09 22:19:16 +09:00
|
|
|
if (typeof __non_webpack_require__.ensure === 'undefined') {
|
|
|
|
__non_webpack_require__.ensure = __non_webpack_require__('node-ensure');
|
2016-10-15 00:57:53 +09:00
|
|
|
}
|
|
|
|
useRequireEnsure = true;
|
2017-07-09 22:19:16 +09:00
|
|
|
} else if (typeof __non_webpack_require__ !== 'undefined' &&
|
|
|
|
typeof __non_webpack_require__.ensure === 'function') {
|
2016-10-15 00:57:53 +09:00
|
|
|
useRequireEnsure = true;
|
|
|
|
}
|
|
|
|
if (typeof requirejs !== 'undefined' && requirejs.toUrl) {
|
|
|
|
workerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js');
|
|
|
|
}
|
|
|
|
var dynamicLoaderSupported =
|
|
|
|
typeof requirejs !== 'undefined' && requirejs.load;
|
|
|
|
fakeWorkerFilesLoader = useRequireEnsure ? (function (callback) {
|
2017-07-09 22:19:16 +09:00
|
|
|
__non_webpack_require__.ensure([], function () {
|
2017-04-09 00:09:54 +09:00
|
|
|
var worker;
|
|
|
|
if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('LIB')) {
|
2017-07-09 22:19:16 +09:00
|
|
|
worker = __non_webpack_require__('../pdf.worker.js');
|
2017-04-09 00:09:54 +09:00
|
|
|
} else {
|
2017-07-09 22:19:16 +09:00
|
|
|
worker = __non_webpack_require__('./pdf.worker.js');
|
2017-04-09 00:09:54 +09:00
|
|
|
}
|
2016-10-15 00:57:53 +09:00
|
|
|
callback(worker.WorkerMessageHandler);
|
|
|
|
});
|
|
|
|
}) : dynamicLoaderSupported ? (function (callback) {
|
|
|
|
requirejs(['pdfjs-dist/build/pdf.worker'], function (worker) {
|
|
|
|
callback(worker.WorkerMessageHandler);
|
|
|
|
});
|
|
|
|
}) : null;
|
|
|
|
}
|
2015-12-22 04:46:50 +09:00
|
|
|
|
2018-01-14 08:34:46 +09:00
|
|
|
/**
|
|
|
|
* @typedef {function} IPDFStreamFactory
|
|
|
|
* @param {DocumentInitParameters} params The document initialization
|
|
|
|
* parameters. The "url" key is always present.
|
|
|
|
* @return {IPDFStream}
|
|
|
|
*/
|
|
|
|
|
|
|
|
/** @type IPDFStreamFactory */
|
|
|
|
var createPDFNetworkStream;
|
2017-07-01 02:59:52 +09:00
|
|
|
|
|
|
|
/**
|
2018-01-14 08:34:46 +09:00
|
|
|
* Sets the function that instantiates a IPDFStream as an alternative PDF data
|
|
|
|
* transport.
|
|
|
|
* @param {IPDFStreamFactory} pdfNetworkStreamFactory - the factory function
|
|
|
|
* that takes document initialization parameters (including a "url") and returns
|
|
|
|
* an instance of IPDFStream.
|
2017-07-01 02:59:52 +09:00
|
|
|
*/
|
2018-01-14 08:34:46 +09:00
|
|
|
function setPDFNetworkStreamFactory(pdfNetworkStreamFactory) {
|
|
|
|
createPDFNetworkStream = pdfNetworkStreamFactory;
|
2017-07-01 02:59:52 +09:00
|
|
|
}
|
|
|
|
|
2014-01-22 04:28:18 +09:00
|
|
|
/**
|
|
|
|
* Document initialization / loading parameters object.
|
|
|
|
*
|
|
|
|
* @typedef {Object} DocumentInitParameters
|
|
|
|
* @property {string} url - The URL of the PDF.
|
2015-01-13 05:52:52 +09:00
|
|
|
* @property {TypedArray|Array|string} data - Binary PDF data. Use typed arrays
|
|
|
|
* (Uint8Array) to improve the memory usage. If PDF data is BASE64-encoded,
|
|
|
|
* use atob() to convert it to a binary string first.
|
2014-01-22 04:28:18 +09:00
|
|
|
* @property {Object} httpHeaders - Basic authentication headers.
|
|
|
|
* @property {boolean} withCredentials - Indicates whether or not cross-site
|
|
|
|
* Access-Control requests should be made using credentials such as cookies
|
|
|
|
* or authorization headers. The default is false.
|
|
|
|
* @property {string} password - For decrypting password-protected PDFs.
|
|
|
|
* @property {TypedArray} initialData - A typed array with the first portion or
|
|
|
|
* all of the pdf data. Used by the extension since some data is already
|
|
|
|
* loaded before the switch to range requests.
|
2015-01-06 12:45:01 +09:00
|
|
|
* @property {number} length - The PDF file length. It's used for progress
|
|
|
|
* reports and range requests operations.
|
|
|
|
* @property {PDFDataRangeTransport} range
|
2015-10-22 08:56:27 +09:00
|
|
|
* @property {number} rangeChunkSize - Optional parameter to specify
|
|
|
|
* maximum number of bytes fetched per range request. The default value is
|
|
|
|
* 2^16 = 65536.
|
2018-02-15 00:03:54 +09:00
|
|
|
* @property {PDFWorker} worker - (optional) The worker that will be used for
|
|
|
|
* the loading and parsing of the PDF data.
|
2018-02-15 00:53:50 +09:00
|
|
|
* @property {boolean} postMessageTransfers - (optional) Enables transfer usage
|
|
|
|
* in postMessage for ArrayBuffers. The default value is `true`.
|
2018-02-15 01:35:08 +09:00
|
|
|
* @property {number} verbosity - (optional) Controls the logging level; the
|
|
|
|
* constants from {VerbosityLevel} should be used.
|
2016-10-01 19:05:07 +09:00
|
|
|
* @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.
|
2017-05-08 12:32:44 +09:00
|
|
|
* @property {string} nativeImageDecoderSupport - (optional) Strategy for
|
|
|
|
* decoding certain (simple) JPEG images in the browser. This is useful for
|
|
|
|
* environments without DOM image and canvas support, such as e.g. Node.js.
|
|
|
|
* Valid values are 'decode', 'display' or 'none'; where 'decode' is intended
|
|
|
|
* for browsers with full image/canvas support, 'display' for environments
|
|
|
|
* with limited image support through stubs (useful for SVG conversion),
|
|
|
|
* and 'none' where JPEG images will be decoded entirely by PDF.js.
|
|
|
|
* The default value is 'decode'.
|
2018-02-18 00:57:24 +09:00
|
|
|
* @property {string} cMapUrl - (optional) The URL where the predefined
|
|
|
|
* Adobe CMaps are located. Include trailing slash.
|
|
|
|
* @property {boolean} cMapPacked - (optional) Specifies if the Adobe CMaps are
|
|
|
|
* binary packed.
|
2017-02-12 23:54:41 +09:00
|
|
|
* @property {Object} CMapReaderFactory - (optional) The factory that will be
|
|
|
|
* used when reading built-in CMap files. Providing a custom factory is useful
|
|
|
|
* for environments without `XMLHttpRequest` support, such as e.g. Node.js.
|
|
|
|
* The default value is {DOMCMapReaderFactory}.
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
* @property {boolean} stopAtErrors - (optional) Reject certain promises, e.g.
|
|
|
|
* `getOperatorList`, `getTextContent`, and `RenderTask`, when the associated
|
|
|
|
* PDF data cannot be successfully parsed, instead of attempting to recover
|
|
|
|
* whatever possible of the data. The default value is `false`.
|
2018-02-18 00:13:33 +09:00
|
|
|
* @property {number} maxImageSize - (optional) The maximum allowed image size
|
|
|
|
* in total pixels, i.e. width * height. Images above this value will not be
|
|
|
|
* rendered. Use -1 for no limit, which is also the default value.
|
2018-02-18 05:49:14 +09:00
|
|
|
* @property {boolean} isEvalSupported - (optional) Determines if we can eval
|
|
|
|
* strings as JS. Primarily used to improve performance of font rendering,
|
|
|
|
* and when parsing PDF functions. The default value is `true`.
|
2018-02-18 05:57:20 +09:00
|
|
|
* @property {boolean} disableFontFace - (optional) By default fonts are
|
|
|
|
* converted to OpenType fonts and loaded via font face rules. If disabled,
|
|
|
|
* fonts will be rendered using a built-in font renderer that constructs the
|
|
|
|
* glyphs with primitive path commands. The default value is `false`.
|
2018-02-18 06:22:10 +09:00
|
|
|
* @property {boolean} disableRange - (optional) Disable range request loading
|
|
|
|
* of PDF files. When enabled, and if the server supports partial content
|
|
|
|
* requests, then the PDF will be fetched in chunks.
|
|
|
|
* The default value is `false`.
|
2018-02-18 06:28:08 +09:00
|
|
|
* @property {boolean} disableStream - (optional) Disable streaming of PDF file
|
|
|
|
* data. By default PDF.js attempts to load PDFs in chunks.
|
|
|
|
* The default value is `false`.
|
2018-02-18 06:08:45 +09:00
|
|
|
* @property {boolean} disableAutoFetch - (optional) Disable pre-fetching of PDF
|
|
|
|
* file data. When range requests are enabled PDF.js will automatically keep
|
|
|
|
* fetching more data even if it isn't needed to display the current page.
|
|
|
|
* The default value is `false`.
|
|
|
|
* NOTE: It is also necessary to disable streaming, see above,
|
|
|
|
* in order for disabling of pre-fetching to work correctly.
|
2018-02-18 06:51:03 +09:00
|
|
|
* @property {boolean} disableCreateObjectURL - (optional) Disable the use of
|
|
|
|
* `URL.createObjectURL`, for compatibility with older browsers.
|
|
|
|
* The default value is `false`.
|
2018-02-18 07:13:49 +09:00
|
|
|
* @property {boolean} pdfBug - (optional) Enables special hooks for debugging
|
|
|
|
* PDF.js (see `web/debugger.js`). The default value is `false`.
|
2014-01-22 04:28:18 +09:00
|
|
|
*/
|
|
|
|
|
2014-06-16 23:52:04 +09:00
|
|
|
/**
|
|
|
|
* @typedef {Object} PDFDocumentStats
|
|
|
|
* @property {Array} streamTypes - Used stream types in the document (an item
|
|
|
|
* is set to true if specific stream ID was used in the document).
|
|
|
|
* @property {Array} fontTypes - Used font type in the document (an item is set
|
|
|
|
* to true if specific font ID was used in the document).
|
|
|
|
*/
|
|
|
|
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
|
|
|
* This is the main entry point for loading a PDF and interacting with it.
|
|
|
|
* NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)
|
|
|
|
* is used, which means it must follow the same origin rules that any XHR does
|
|
|
|
* e.g. No cross domain requests without CORS.
|
|
|
|
*
|
2015-01-06 12:45:01 +09:00
|
|
|
* @param {string|TypedArray|DocumentInitParameters|PDFDataRangeTransport} src
|
|
|
|
* Can be a url to where a PDF is located, a typed array (Uint8Array)
|
|
|
|
* already populated with data or parameter object.
|
2012-05-15 03:45:07 +09:00
|
|
|
*
|
2015-01-06 12:45:01 +09:00
|
|
|
* @return {PDFDocumentLoadingTask}
|
2012-04-14 01:25:08 +09:00
|
|
|
*/
|
2017-10-03 06:05:32 +09:00
|
|
|
function getDocument(src) {
|
2015-01-06 12:45:01 +09:00
|
|
|
var task = new PDFDocumentLoadingTask();
|
|
|
|
|
|
|
|
var source;
|
|
|
|
if (typeof src === 'string') {
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
source = { url: src, };
|
2015-01-06 12:45:01 +09:00
|
|
|
} else if (isArrayBuffer(src)) {
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
source = { data: src, };
|
2015-01-06 12:45:01 +09:00
|
|
|
} else if (src instanceof PDFDataRangeTransport) {
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
source = { range: src, };
|
2015-01-06 12:45:01 +09:00
|
|
|
} else {
|
|
|
|
if (typeof src !== 'object') {
|
2017-06-29 05:51:31 +09:00
|
|
|
throw new Error('Invalid parameter in getDocument, ' +
|
|
|
|
'need either Uint8Array, string or a parameter object');
|
2015-01-06 12:45:01 +09:00
|
|
|
}
|
|
|
|
if (!src.url && !src.data && !src.range) {
|
2017-06-29 05:51:31 +09:00
|
|
|
throw new Error(
|
|
|
|
'Invalid parameter object: need either .data, .range or .url');
|
2015-01-06 12:45:01 +09:00
|
|
|
}
|
2012-06-28 19:33:32 +09:00
|
|
|
|
2015-01-06 12:45:01 +09:00
|
|
|
source = src;
|
2014-03-14 21:24:04 +09:00
|
|
|
}
|
2012-06-24 04:48:33 +09:00
|
|
|
|
2018-02-18 00:13:33 +09:00
|
|
|
let params = Object.create(null);
|
2015-10-28 02:55:15 +09:00
|
|
|
var rangeTransport = null;
|
2018-02-15 00:03:54 +09:00
|
|
|
let worker = null;
|
2017-06-23 20:07:44 +09:00
|
|
|
|
2012-07-27 02:11:28 +09:00
|
|
|
for (var key in source) {
|
|
|
|
if (key === 'url' && typeof window !== 'undefined') {
|
2015-01-13 05:52:52 +09:00
|
|
|
// The full path is required in the 'url' field.
|
2016-04-16 01:03:10 +09:00
|
|
|
params[key] = new URL(source[key], window.location).href;
|
2012-07-27 02:11:28 +09:00
|
|
|
continue;
|
2015-01-06 12:45:01 +09:00
|
|
|
} else if (key === 'range') {
|
2015-10-28 02:55:15 +09:00
|
|
|
rangeTransport = source[key];
|
|
|
|
continue;
|
|
|
|
} else if (key === 'worker') {
|
|
|
|
worker = source[key];
|
2015-01-06 12:45:01 +09:00
|
|
|
continue;
|
2015-01-13 05:52:52 +09:00
|
|
|
} else if (key === 'data' && !(source[key] instanceof Uint8Array)) {
|
|
|
|
// Converting string or array-like data to Uint8Array.
|
|
|
|
var pdfBytes = source[key];
|
|
|
|
if (typeof pdfBytes === 'string') {
|
|
|
|
params[key] = stringToBytes(pdfBytes);
|
|
|
|
} else if (typeof pdfBytes === 'object' && pdfBytes !== null &&
|
|
|
|
!isNaN(pdfBytes.length)) {
|
|
|
|
params[key] = new Uint8Array(pdfBytes);
|
2015-08-20 00:54:41 +09:00
|
|
|
} else if (isArrayBuffer(pdfBytes)) {
|
|
|
|
params[key] = new Uint8Array(pdfBytes);
|
2015-01-13 05:52:52 +09:00
|
|
|
} else {
|
2017-06-29 05:51:31 +09:00
|
|
|
throw new Error('Invalid PDF binary data: either typed array, ' +
|
|
|
|
'string or array-like object is expected in the ' +
|
|
|
|
'data property.');
|
2015-01-13 05:52:52 +09:00
|
|
|
}
|
|
|
|
continue;
|
2012-07-27 02:11:28 +09:00
|
|
|
}
|
|
|
|
params[key] = source[key];
|
|
|
|
}
|
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;
|
2018-06-06 03:30:14 +09:00
|
|
|
params.CMapReaderFactory = params.CMapReaderFactory || DOMCMapReaderFactory;
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
params.ignoreErrors = params.stopAtErrors !== true;
|
2018-02-18 07:13:49 +09:00
|
|
|
params.pdfBug = params.pdfBug === true;
|
2015-10-22 08:56:27 +09:00
|
|
|
|
2018-02-18 00:13:33 +09:00
|
|
|
const NativeImageDecoderValues = Object.values(NativeImageDecoding);
|
2017-10-16 01:15:37 +09:00
|
|
|
if (params.nativeImageDecoderSupport === undefined ||
|
2018-02-18 00:13:33 +09:00
|
|
|
!NativeImageDecoderValues.includes(params.nativeImageDecoderSupport)) {
|
2018-06-01 19:52:29 +09:00
|
|
|
params.nativeImageDecoderSupport =
|
|
|
|
(apiCompatibilityParams.nativeImageDecoderSupport ||
|
|
|
|
NativeImageDecoding.DECODE);
|
2017-05-08 12:32:44 +09:00
|
|
|
}
|
2018-02-18 00:13:33 +09:00
|
|
|
if (!Number.isInteger(params.maxImageSize)) {
|
|
|
|
params.maxImageSize = -1;
|
|
|
|
}
|
2018-02-18 05:49:14 +09:00
|
|
|
if (typeof params.isEvalSupported !== 'boolean') {
|
|
|
|
params.isEvalSupported = true;
|
|
|
|
}
|
2018-02-18 05:57:20 +09:00
|
|
|
if (typeof params.disableFontFace !== 'boolean') {
|
2018-06-01 19:52:29 +09:00
|
|
|
params.disableFontFace = apiCompatibilityParams.disableFontFace || false;
|
2018-02-18 05:57:20 +09:00
|
|
|
}
|
2017-05-08 12:32:44 +09:00
|
|
|
|
2018-02-18 06:22:10 +09:00
|
|
|
if (typeof params.disableRange !== 'boolean') {
|
|
|
|
params.disableRange = apiCompatibilityParams.disableRange || false;
|
|
|
|
}
|
2018-02-18 06:28:08 +09:00
|
|
|
if (typeof params.disableStream !== 'boolean') {
|
|
|
|
params.disableStream = apiCompatibilityParams.disableStream || false;
|
|
|
|
}
|
2018-02-18 06:08:45 +09:00
|
|
|
if (typeof params.disableAutoFetch !== 'boolean') {
|
|
|
|
params.disableAutoFetch = false;
|
|
|
|
}
|
2018-02-18 06:51:03 +09:00
|
|
|
if (typeof params.disableCreateObjectURL !== 'boolean') {
|
|
|
|
params.disableCreateObjectURL =
|
|
|
|
apiCompatibilityParams.disableCreateObjectURL || false;
|
|
|
|
}
|
2018-02-18 06:08:45 +09:00
|
|
|
|
2018-02-15 01:35:08 +09:00
|
|
|
// Set the main-thread verbosity level.
|
|
|
|
setVerbosityLevel(params.verbosity);
|
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
if (!worker) {
|
2018-02-15 00:03:54 +09:00
|
|
|
const workerParams = {
|
2018-02-15 00:53:50 +09:00
|
|
|
postMessageTransfers: params.postMessageTransfers,
|
2018-02-15 01:35:08 +09:00
|
|
|
verbosity: params.verbosity,
|
2018-02-15 00:03:54 +09:00
|
|
|
};
|
2017-02-25 04:33:18 +09:00
|
|
|
// Worker was not provided -- creating and owning our own. If message port
|
2018-02-14 22:25:47 +09:00
|
|
|
// is specified in global worker options, using it.
|
|
|
|
let workerPort = GlobalWorkerOptions.workerPort;
|
2018-02-15 00:03:54 +09:00
|
|
|
if (workerPort) {
|
|
|
|
workerParams.port = workerPort;
|
|
|
|
worker = PDFWorker.fromPort(workerParams);
|
|
|
|
} else {
|
|
|
|
worker = new PDFWorker(workerParams);
|
|
|
|
}
|
2015-10-28 02:55:15 +09:00
|
|
|
task._worker = worker;
|
|
|
|
}
|
|
|
|
var docId = task.docId;
|
|
|
|
worker.promise.then(function () {
|
|
|
|
if (task.destroyed) {
|
|
|
|
throw new Error('Loading aborted');
|
|
|
|
}
|
|
|
|
return _fetchDocument(worker, params, rangeTransport, docId).then(
|
|
|
|
function (workerId) {
|
|
|
|
if (task.destroyed) {
|
|
|
|
throw new Error('Loading aborted');
|
|
|
|
}
|
2017-07-01 02:59:52 +09:00
|
|
|
|
|
|
|
let networkStream;
|
|
|
|
if (rangeTransport) {
|
2018-02-18 07:19:43 +09:00
|
|
|
networkStream = new PDFDataTransportStream({
|
|
|
|
length: params.length,
|
|
|
|
initialData: params.initialData,
|
|
|
|
disableRange: params.disableRange,
|
|
|
|
disableStream: params.disableStream,
|
|
|
|
}, rangeTransport);
|
2017-07-01 02:59:52 +09:00
|
|
|
} else if (!params.data) {
|
2018-02-18 07:19:43 +09:00
|
|
|
networkStream = createPDFNetworkStream({
|
|
|
|
url: params.url,
|
|
|
|
length: params.length,
|
|
|
|
httpHeaders: params.httpHeaders,
|
|
|
|
withCredentials: params.withCredentials,
|
|
|
|
rangeChunkSize: params.rangeChunkSize,
|
|
|
|
disableRange: params.disableRange,
|
|
|
|
disableStream: params.disableStream,
|
|
|
|
});
|
2017-07-01 02:59:52 +09:00
|
|
|
}
|
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
var messageHandler = new MessageHandler(docId, workerId, worker.port);
|
2017-07-01 02:59:52 +09:00
|
|
|
messageHandler.postMessageTransfers = worker.postMessageTransfers;
|
|
|
|
var transport = new WorkerTransport(messageHandler, task, networkStream,
|
2018-06-06 03:30:14 +09:00
|
|
|
params);
|
2015-10-28 02:55:15 +09:00
|
|
|
task._transport = transport;
|
2016-01-30 02:43:19 +09:00
|
|
|
messageHandler.send('Ready', null);
|
2015-10-28 02:55:15 +09:00
|
|
|
});
|
2015-12-17 09:37:43 +09:00
|
|
|
}).catch(task._capability.reject);
|
2015-01-06 12:45:01 +09:00
|
|
|
|
|
|
|
return task;
|
2016-03-29 04:49:22 +09:00
|
|
|
}
|
2012-04-13 04:11:22 +09:00
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
/**
|
|
|
|
* Starts fetching of specified PDF document/data.
|
|
|
|
* @param {PDFWorker} worker
|
|
|
|
* @param {Object} source
|
|
|
|
* @param {PDFDataRangeTransport} pdfDataRangeTransport
|
|
|
|
* @param {string} docId Unique document id, used as MessageHandler id.
|
|
|
|
* @returns {Promise} The promise, which is resolved when worker id of
|
|
|
|
* MessageHandler is known.
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
|
|
|
|
if (worker.destroyed) {
|
|
|
|
return Promise.reject(new Error('Worker was destroyed'));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pdfDataRangeTransport) {
|
|
|
|
source.length = pdfDataRangeTransport.length;
|
|
|
|
source.initialData = pdfDataRangeTransport.initialData;
|
|
|
|
}
|
|
|
|
return worker.messageHandler.sendWithPromise('GetDocRequest', {
|
2017-04-25 23:17:18 +09:00
|
|
|
docId,
|
2018-02-18 07:19:43 +09:00
|
|
|
apiVersion: (typeof PDFJSDev !== 'undefined' ?
|
|
|
|
PDFJSDev.eval('BUNDLE_VERSION') : null),
|
2018-06-06 03:30:14 +09:00
|
|
|
source: { // Only send the required properties, and *not* the entire object.
|
2017-07-30 01:20:00 +09:00
|
|
|
data: source.data,
|
|
|
|
url: source.url,
|
|
|
|
password: source.password,
|
|
|
|
disableAutoFetch: source.disableAutoFetch,
|
|
|
|
rangeChunkSize: source.rangeChunkSize,
|
|
|
|
length: source.length,
|
|
|
|
},
|
2018-02-18 00:13:33 +09:00
|
|
|
maxImageSize: source.maxImageSize,
|
2018-02-18 05:57:20 +09:00
|
|
|
disableFontFace: source.disableFontFace,
|
2018-02-18 06:51:03 +09:00
|
|
|
disableCreateObjectURL: source.disableCreateObjectURL,
|
2018-02-15 00:53:50 +09:00
|
|
|
postMessageTransfers: worker.postMessageTransfers,
|
2016-10-01 19:05:07 +09:00
|
|
|
docBaseUrl: source.docBaseUrl,
|
2017-05-08 12:32:44 +09:00
|
|
|
nativeImageDecoderSupport: source.nativeImageDecoderSupport,
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
ignoreErrors: source.ignoreErrors,
|
2018-02-18 05:49:14 +09:00
|
|
|
isEvalSupported: source.isEvalSupported,
|
2015-10-28 02:55:15 +09:00
|
|
|
}).then(function (workerId) {
|
|
|
|
if (worker.destroyed) {
|
|
|
|
throw new Error('Worker was destroyed');
|
|
|
|
}
|
|
|
|
return workerId;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2015-01-06 12:45:01 +09:00
|
|
|
/**
|
|
|
|
* PDF document loading operation.
|
|
|
|
* @class
|
2015-11-13 04:39:58 +09:00
|
|
|
* @alias PDFDocumentLoadingTask
|
2015-01-06 12:45:01 +09:00
|
|
|
*/
|
|
|
|
var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() {
|
2015-10-28 02:55:15 +09:00
|
|
|
var nextDocumentId = 0;
|
|
|
|
|
|
|
|
/** @constructs PDFDocumentLoadingTask */
|
2015-01-06 12:45:01 +09:00
|
|
|
function PDFDocumentLoadingTask() {
|
|
|
|
this._capability = createPromiseCapability();
|
2015-10-21 07:45:55 +09:00
|
|
|
this._transport = null;
|
2015-10-28 02:55:15 +09:00
|
|
|
this._worker = null;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Unique document loading task id -- used in MessageHandlers.
|
|
|
|
* @type {string}
|
|
|
|
*/
|
|
|
|
this.docId = 'd' + (nextDocumentId++);
|
2015-01-06 12:45:01 +09:00
|
|
|
|
2015-10-28 00:07:20 +09:00
|
|
|
/**
|
|
|
|
* Shows if loading task is destroyed.
|
|
|
|
* @type {boolean}
|
|
|
|
*/
|
|
|
|
this.destroyed = false;
|
2015-01-06 12:45:01 +09:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Callback to request a password if wrong or no password was provided.
|
|
|
|
* The callback receives two parameters: function that needs to be called
|
|
|
|
* with new password and reason (see {PasswordResponses}).
|
|
|
|
*/
|
|
|
|
this.onPassword = null;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Callback to be able to monitor the loading progress of the PDF file
|
|
|
|
* (necessary to implement e.g. a loading bar). The callback receives
|
|
|
|
* an {Object} with the properties: {number} loaded and {number} total.
|
|
|
|
*/
|
|
|
|
this.onProgress = null;
|
2015-12-01 05:42:47 +09:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Callback to when unsupported feature is used. The callback receives
|
2016-03-29 04:49:22 +09:00
|
|
|
* an {UNSUPPORTED_FEATURES} argument.
|
2015-12-01 05:42:47 +09:00
|
|
|
*/
|
|
|
|
this.onUnsupportedFeature = null;
|
2015-01-06 12:45:01 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
PDFDocumentLoadingTask.prototype =
|
|
|
|
/** @lends PDFDocumentLoadingTask.prototype */ {
|
|
|
|
/**
|
|
|
|
* @return {Promise}
|
|
|
|
*/
|
|
|
|
get promise() {
|
|
|
|
return this._capability.promise;
|
|
|
|
},
|
|
|
|
|
2015-10-21 07:45:55 +09:00
|
|
|
/**
|
|
|
|
* Aborts all network requests and destroys worker.
|
|
|
|
* @return {Promise} A promise that is resolved after destruction activity
|
|
|
|
* is completed.
|
|
|
|
*/
|
2017-04-25 23:17:18 +09:00
|
|
|
destroy() {
|
2015-10-28 00:07:20 +09:00
|
|
|
this.destroyed = true;
|
2015-10-28 02:55:15 +09:00
|
|
|
|
|
|
|
var transportDestroyed = !this._transport ? Promise.resolve() :
|
|
|
|
this._transport.destroy();
|
2017-05-03 23:39:54 +09:00
|
|
|
return transportDestroyed.then(() => {
|
2015-10-28 02:55:15 +09:00
|
|
|
this._transport = null;
|
|
|
|
if (this._worker) {
|
|
|
|
this._worker.destroy();
|
|
|
|
this._worker = null;
|
|
|
|
}
|
2017-05-03 23:39:54 +09:00
|
|
|
});
|
2015-10-21 07:45:55 +09:00
|
|
|
},
|
2015-01-06 12:45:01 +09:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Registers callbacks to indicate the document loading completion.
|
|
|
|
*
|
|
|
|
* @param {function} onFulfilled The callback for the loading completion.
|
|
|
|
* @param {function} onRejected The callback for the loading failure.
|
|
|
|
* @return {Promise} A promise that is resolved after the onFulfilled or
|
|
|
|
* onRejected callback.
|
|
|
|
*/
|
|
|
|
then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) {
|
|
|
|
return this.promise.then.apply(this.promise, arguments);
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
},
|
2015-01-06 12:45:01 +09:00
|
|
|
};
|
|
|
|
|
|
|
|
return PDFDocumentLoadingTask;
|
|
|
|
})();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Abstract class to support range requests file loading.
|
|
|
|
* @class
|
2016-03-29 04:49:22 +09:00
|
|
|
* @alias PDFDataRangeTransport
|
2015-11-13 04:39:58 +09:00
|
|
|
* @param {number} length
|
|
|
|
* @param {Uint8Array} initialData
|
2015-01-06 12:45:01 +09:00
|
|
|
*/
|
|
|
|
var PDFDataRangeTransport = (function pdfDataRangeTransportClosure() {
|
|
|
|
function PDFDataRangeTransport(length, initialData) {
|
|
|
|
this.length = length;
|
|
|
|
this.initialData = initialData;
|
|
|
|
|
|
|
|
this._rangeListeners = [];
|
|
|
|
this._progressListeners = [];
|
|
|
|
this._progressiveReadListeners = [];
|
|
|
|
this._readyCapability = createPromiseCapability();
|
|
|
|
}
|
|
|
|
PDFDataRangeTransport.prototype =
|
|
|
|
/** @lends PDFDataRangeTransport.prototype */ {
|
|
|
|
addRangeListener:
|
|
|
|
function PDFDataRangeTransport_addRangeListener(listener) {
|
|
|
|
this._rangeListeners.push(listener);
|
|
|
|
},
|
|
|
|
|
|
|
|
addProgressListener:
|
|
|
|
function PDFDataRangeTransport_addProgressListener(listener) {
|
|
|
|
this._progressListeners.push(listener);
|
|
|
|
},
|
|
|
|
|
|
|
|
addProgressiveReadListener:
|
|
|
|
function PDFDataRangeTransport_addProgressiveReadListener(listener) {
|
|
|
|
this._progressiveReadListeners.push(listener);
|
|
|
|
},
|
|
|
|
|
|
|
|
onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) {
|
|
|
|
var listeners = this._rangeListeners;
|
|
|
|
for (var i = 0, n = listeners.length; i < n; ++i) {
|
|
|
|
listeners[i](begin, chunk);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) {
|
2017-05-03 23:39:54 +09:00
|
|
|
this._readyCapability.promise.then(() => {
|
2015-01-06 12:45:01 +09:00
|
|
|
var listeners = this._progressListeners;
|
|
|
|
for (var i = 0, n = listeners.length; i < n; ++i) {
|
|
|
|
listeners[i](loaded);
|
|
|
|
}
|
2017-05-03 23:39:54 +09:00
|
|
|
});
|
2015-01-06 12:45:01 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
onDataProgressiveRead:
|
|
|
|
function PDFDataRangeTransport_onDataProgress(chunk) {
|
2017-05-03 23:39:54 +09:00
|
|
|
this._readyCapability.promise.then(() => {
|
2015-01-06 12:45:01 +09:00
|
|
|
var listeners = this._progressiveReadListeners;
|
|
|
|
for (var i = 0, n = listeners.length; i < n; ++i) {
|
|
|
|
listeners[i](chunk);
|
|
|
|
}
|
2017-05-03 23:39:54 +09:00
|
|
|
});
|
2015-01-06 12:45:01 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
transportReady: function PDFDataRangeTransport_transportReady() {
|
|
|
|
this._readyCapability.resolve();
|
|
|
|
},
|
|
|
|
|
|
|
|
requestDataRange:
|
|
|
|
function PDFDataRangeTransport_requestDataRange(begin, end) {
|
2017-12-13 22:51:45 +09:00
|
|
|
unreachable('Abstract method PDFDataRangeTransport.requestDataRange');
|
2015-10-21 07:45:55 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
abort: function PDFDataRangeTransport_abort() {
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
},
|
2015-01-06 12:45:01 +09:00
|
|
|
};
|
|
|
|
return PDFDataRangeTransport;
|
|
|
|
})();
|
|
|
|
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
|
|
|
* Proxy to a PDFDocument in the worker thread. Also, contains commonly used
|
|
|
|
* properties that can be read synchronously.
|
2014-01-22 04:28:18 +09:00
|
|
|
* @class
|
2015-11-13 04:39:58 +09:00
|
|
|
* @alias PDFDocumentProxy
|
2012-04-14 01:25:08 +09:00
|
|
|
*/
|
2012-05-02 02:54:16 +09:00
|
|
|
var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
|
2015-10-21 07:45:55 +09:00
|
|
|
function PDFDocumentProxy(pdfInfo, transport, loadingTask) {
|
2018-06-06 03:30:00 +09:00
|
|
|
this._pdfInfo = pdfInfo;
|
2012-04-13 04:11:22 +09:00
|
|
|
this.transport = transport;
|
2015-10-21 07:45:55 +09:00
|
|
|
this.loadingTask = loadingTask;
|
2012-04-13 04:11:22 +09:00
|
|
|
}
|
2014-01-22 04:28:18 +09:00
|
|
|
PDFDocumentProxy.prototype = /** @lends PDFDocumentProxy.prototype */ {
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
|
|
|
* @return {number} Total number of pages the PDF contains.
|
|
|
|
*/
|
2012-04-13 04:11:22 +09:00
|
|
|
get numPages() {
|
2018-06-06 03:30:00 +09:00
|
|
|
return this._pdfInfo.numPages;
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
|
|
|
* @return {string} A unique ID to identify a PDF. Not guaranteed to be
|
|
|
|
* unique.
|
|
|
|
*/
|
2012-04-13 04:11:22 +09:00
|
|
|
get fingerprint() {
|
2018-06-06 03:30:00 +09:00
|
|
|
return this._pdfInfo.fingerprint;
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
2014-01-22 04:28:18 +09:00
|
|
|
* @param {number} pageNumber The page number to get. The first page is 1.
|
|
|
|
* @return {Promise} A promise that is resolved with a {@link PDFPageProxy}
|
2012-04-14 01:25:08 +09:00
|
|
|
* object.
|
|
|
|
*/
|
2017-11-25 19:49:33 +09:00
|
|
|
getPage(pageNumber) {
|
2014-01-22 04:28:18 +09:00
|
|
|
return this.transport.getPage(pageNumber);
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2013-11-14 08:27:46 +09:00
|
|
|
/**
|
2014-01-22 04:28:18 +09:00
|
|
|
* @param {{num: number, gen: number}} ref The page reference. Must have
|
|
|
|
* the 'num' and 'gen' properties.
|
2013-11-14 08:27:46 +09:00
|
|
|
* @return {Promise} A promise that is resolved with the page index that is
|
|
|
|
* associated with the reference.
|
|
|
|
*/
|
|
|
|
getPageIndex: function PDFDocumentProxy_getPageIndex(ref) {
|
|
|
|
return this.transport.getPageIndex(ref);
|
|
|
|
},
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
|
|
|
* @return {Promise} A promise that is resolved with a lookup table for
|
|
|
|
* mapping named destinations to reference numbers.
|
2014-10-05 22:56:40 +09:00
|
|
|
*
|
|
|
|
* This can be slow for large documents: use getDestination instead
|
2012-04-14 01:25:08 +09:00
|
|
|
*/
|
2012-05-02 02:48:07 +09:00
|
|
|
getDestinations: function PDFDocumentProxy_getDestinations() {
|
2013-02-07 08:19:29 +09:00
|
|
|
return this.transport.getDestinations();
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2014-10-05 22:56:40 +09:00
|
|
|
/**
|
|
|
|
* @param {string} id The named destination to get.
|
|
|
|
* @return {Promise} A promise that is resolved with all information
|
|
|
|
* of the given named destination.
|
|
|
|
*/
|
|
|
|
getDestination: function PDFDocumentProxy_getDestination(id) {
|
|
|
|
return this.transport.getDestination(id);
|
|
|
|
},
|
2015-12-26 05:57:08 +09:00
|
|
|
/**
|
2016-01-27 07:01:38 +09:00
|
|
|
* @return {Promise} A promise that is resolved with:
|
|
|
|
* an Array containing the pageLabels that correspond to the pageIndexes,
|
|
|
|
* or `null` when no pageLabels are present in the PDF file.
|
2015-12-26 05:57:08 +09:00
|
|
|
*/
|
|
|
|
getPageLabels: function PDFDocumentProxy_getPageLabels() {
|
|
|
|
return this.transport.getPageLabels();
|
|
|
|
},
|
2017-07-18 20:08:02 +09:00
|
|
|
/**
|
|
|
|
* @return {Promise} A promise that is resolved with a {string} containing
|
|
|
|
* the PageMode name.
|
|
|
|
*/
|
|
|
|
getPageMode() {
|
|
|
|
return this.transport.getPageMode();
|
|
|
|
},
|
2014-03-19 05:32:47 +09:00
|
|
|
/**
|
|
|
|
* @return {Promise} A promise that is resolved with a lookup table for
|
|
|
|
* mapping named attachments to their content.
|
|
|
|
*/
|
|
|
|
getAttachments: function PDFDocumentProxy_getAttachments() {
|
|
|
|
return this.transport.getAttachments();
|
|
|
|
},
|
2013-03-01 08:29:07 +09:00
|
|
|
/**
|
2017-10-16 05:13:58 +09:00
|
|
|
* @return {Promise} A promise that is resolved with an {Array} of all the
|
|
|
|
* JavaScript strings in the name tree, or `null` if no JavaScript exists.
|
2013-03-01 08:29:07 +09:00
|
|
|
*/
|
2017-10-16 05:13:58 +09:00
|
|
|
getJavaScript() {
|
2014-05-08 04:15:34 +09:00
|
|
|
return this.transport.getJavaScript();
|
2013-03-01 08:29:07 +09:00
|
|
|
},
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
2014-01-22 04:28:18 +09:00
|
|
|
* @return {Promise} A promise that is resolved with an {Array} that is a
|
2012-04-14 01:25:08 +09:00
|
|
|
* tree outline (if it has one) of the PDF. The tree is in the format of:
|
|
|
|
* [
|
|
|
|
* {
|
|
|
|
* title: string,
|
|
|
|
* bold: boolean,
|
|
|
|
* italic: boolean,
|
2016-01-31 23:35:57 +09:00
|
|
|
* color: rgb Uint8Array,
|
2012-04-14 01:25:08 +09:00
|
|
|
* dest: dest obj,
|
2015-12-22 20:59:23 +09:00
|
|
|
* url: string,
|
2012-04-14 01:25:08 +09:00
|
|
|
* items: array of more items like this
|
|
|
|
* },
|
|
|
|
* ...
|
|
|
|
* ].
|
|
|
|
*/
|
2012-05-02 02:48:07 +09:00
|
|
|
getOutline: function PDFDocumentProxy_getOutline() {
|
2014-05-08 04:06:44 +09:00
|
|
|
return this.transport.getOutline();
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
2014-01-22 04:28:18 +09:00
|
|
|
* @return {Promise} A promise that is resolved with an {Object} that has
|
|
|
|
* info and metadata properties. Info is an {Object} filled with anything
|
2012-04-14 01:25:08 +09:00
|
|
|
* available in the information dictionary and similarly metadata is a
|
|
|
|
* {Metadata} object with information from the metadata section of the PDF.
|
|
|
|
*/
|
2012-05-02 02:48:07 +09:00
|
|
|
getMetadata: function PDFDocumentProxy_getMetadata() {
|
2014-05-08 04:38:40 +09:00
|
|
|
return this.transport.getMetadata();
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2012-06-02 06:17:09 +09:00
|
|
|
/**
|
|
|
|
* @return {Promise} A promise that is resolved with a TypedArray that has
|
|
|
|
* the raw data from the PDF.
|
|
|
|
*/
|
|
|
|
getData: function PDFDocumentProxy_getData() {
|
2014-05-14 08:20:21 +09:00
|
|
|
return this.transport.getData();
|
2012-06-02 06:17:09 +09:00
|
|
|
},
|
2013-02-07 08:19:29 +09:00
|
|
|
/**
|
|
|
|
* @return {Promise} A promise that is resolved when the document's data
|
2014-01-29 06:13:47 +09:00
|
|
|
* is loaded. It is resolved with an {Object} that contains the length
|
|
|
|
* property that indicates size of the PDF data in bytes.
|
2013-02-07 08:19:29 +09:00
|
|
|
*/
|
2014-01-29 06:13:47 +09:00
|
|
|
getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() {
|
2014-04-30 00:07:05 +09:00
|
|
|
return this.transport.downloadInfoCapability.promise;
|
2013-02-07 08:19:29 +09:00
|
|
|
},
|
2014-06-16 23:52:04 +09:00
|
|
|
/**
|
2015-01-06 12:45:01 +09:00
|
|
|
* @return {Promise} A promise this is resolved with current stats about
|
2014-06-16 23:52:04 +09:00
|
|
|
* document structures (see {@link PDFDocumentStats}).
|
|
|
|
*/
|
|
|
|
getStats: function PDFDocumentProxy_getStats() {
|
|
|
|
return this.transport.getStats();
|
|
|
|
},
|
2014-01-22 04:28:18 +09:00
|
|
|
/**
|
|
|
|
* Cleans up resources allocated by the document, e.g. created @font-face.
|
|
|
|
*/
|
2013-11-15 06:43:38 +09:00
|
|
|
cleanup: function PDFDocumentProxy_cleanup() {
|
|
|
|
this.transport.startCleanup();
|
|
|
|
},
|
2014-01-22 04:28:18 +09:00
|
|
|
/**
|
|
|
|
* Destroys current document instance and terminates worker.
|
|
|
|
*/
|
2012-05-02 02:48:07 +09:00
|
|
|
destroy: function PDFDocumentProxy_destroy() {
|
2015-10-28 02:55:15 +09:00
|
|
|
return this.loadingTask.destroy();
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
},
|
2018-02-18 06:08:45 +09:00
|
|
|
|
|
|
|
get loadingParams() {
|
|
|
|
return this.transport.loadingParams;
|
|
|
|
},
|
2012-04-13 04:11:22 +09:00
|
|
|
};
|
|
|
|
return PDFDocumentProxy;
|
|
|
|
})();
|
|
|
|
|
2015-11-24 00:57:43 +09:00
|
|
|
/**
|
|
|
|
* Page getTextContent parameters.
|
|
|
|
*
|
|
|
|
* @typedef {Object} getTextContentParameters
|
2016-10-17 20:04:55 +09:00
|
|
|
* @property {boolean} normalizeWhitespace - replaces all occurrences of
|
2015-11-24 00:57:43 +09:00
|
|
|
* whitespace with standard spaces (0x20). The default value is `false`.
|
2016-10-17 20:04:55 +09:00
|
|
|
* @property {boolean} disableCombineTextItems - do not attempt to combine
|
2016-07-04 01:29:47 +09:00
|
|
|
* same line {@link TextItem}'s. The default value is `false`.
|
2015-11-24 00:57:43 +09:00
|
|
|
*/
|
|
|
|
|
2014-04-10 08:44:07 +09:00
|
|
|
/**
|
|
|
|
* Page text content.
|
|
|
|
*
|
|
|
|
* @typedef {Object} TextContent
|
|
|
|
* @property {array} items - array of {@link TextItem}
|
2016-10-17 20:04:55 +09:00
|
|
|
* @property {Object} styles - {@link TextStyles} objects, indexed by font name.
|
2014-04-10 08:44:07 +09:00
|
|
|
*/
|
|
|
|
|
2014-01-22 04:28:18 +09:00
|
|
|
/**
|
|
|
|
* Page text content part.
|
|
|
|
*
|
2014-04-10 08:44:07 +09:00
|
|
|
* @typedef {Object} TextItem
|
2014-01-22 04:28:18 +09:00
|
|
|
* @property {string} str - text content.
|
|
|
|
* @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'.
|
2014-04-10 08:44:07 +09:00
|
|
|
* @property {array} transform - transformation matrix.
|
|
|
|
* @property {number} width - width in device space.
|
|
|
|
* @property {number} height - height in device space.
|
|
|
|
* @property {string} fontName - font name used by pdf.js for converted font.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
2014-04-12 00:57:48 +09:00
|
|
|
* Text style.
|
|
|
|
*
|
2014-04-10 08:44:07 +09:00
|
|
|
* @typedef {Object} TextStyle
|
|
|
|
* @property {number} ascent - font ascent.
|
|
|
|
* @property {number} descent - font descent.
|
|
|
|
* @property {boolean} vertical - text is in vertical mode.
|
|
|
|
* @property {string} fontFamily - possible font family
|
2014-01-22 04:28:18 +09:00
|
|
|
*/
|
|
|
|
|
2015-11-22 21:56:52 +09:00
|
|
|
/**
|
|
|
|
* Page annotation parameters.
|
|
|
|
*
|
|
|
|
* @typedef {Object} GetAnnotationsParameters
|
2016-10-17 20:04:55 +09:00
|
|
|
* @property {string} intent - Determines the annotations that will be fetched,
|
|
|
|
* can be either 'display' (viewable annotations) or 'print'
|
|
|
|
* (printable annotations).
|
|
|
|
* If the parameter is omitted, all annotations are fetched.
|
2015-11-22 21:56:52 +09:00
|
|
|
*/
|
|
|
|
|
2014-04-12 00:57:48 +09:00
|
|
|
/**
|
|
|
|
* Page render parameters.
|
|
|
|
*
|
|
|
|
* @typedef {Object} RenderParameters
|
|
|
|
* @property {Object} canvasContext - A 2D context of a DOM Canvas object.
|
2016-03-29 04:49:22 +09:00
|
|
|
* @property {PageViewport} viewport - Rendering viewport obtained by
|
2014-05-06 04:09:47 +09:00
|
|
|
* calling of PDFPage.getViewport method.
|
2014-04-12 00:57:48 +09:00
|
|
|
* @property {string} intent - Rendering intent, can be 'display' or 'print'
|
|
|
|
* (default value is 'display').
|
2018-02-13 22:16:10 +09:00
|
|
|
* @property {boolean} enableWebGL - (optional) Enables WebGL accelerated
|
|
|
|
* rendering for some operations. The default value is `false`.
|
2016-09-15 05:49:37 +09:00
|
|
|
* @property {boolean} renderInteractiveForms - (optional) Whether or not
|
|
|
|
* interactive form elements are rendered in the display
|
|
|
|
* layer. If so, we do not render them on canvas as well.
|
2015-11-17 01:50:02 +09:00
|
|
|
* @property {Array} transform - (optional) Additional transform, applied
|
|
|
|
* just before viewport transform.
|
2014-04-12 00:57:48 +09:00
|
|
|
* @property {Object} imageLayer - (optional) An object that has beginLayout,
|
|
|
|
* endLayout and appendImage functions.
|
2017-01-28 02:58:39 +09:00
|
|
|
* @property {Object} canvasFactory - (optional) The factory that will be used
|
|
|
|
* when creating canvases. The default value is
|
|
|
|
* {DOMCanvasFactory}.
|
2017-05-16 20:01:03 +09:00
|
|
|
* @property {Object} background - (optional) Background to use for the canvas.
|
|
|
|
* Can use any valid canvas.fillStyle: A DOMString parsed as
|
|
|
|
* CSS <color> value, a CanvasGradient object (a linear or
|
|
|
|
* radial gradient) or a CanvasPattern object (a repetitive
|
|
|
|
* image). The default value is 'rgb(255,255,255)'.
|
2014-04-12 00:57:48 +09:00
|
|
|
*/
|
2015-02-03 00:12:52 +09:00
|
|
|
|
2014-06-17 03:35:38 +09:00
|
|
|
/**
|
|
|
|
* PDF page operator list.
|
|
|
|
*
|
|
|
|
* @typedef {Object} PDFOperatorList
|
|
|
|
* @property {Array} fnArray - Array containing the operator functions.
|
|
|
|
* @property {Array} argsArray - Array containing the arguments of the
|
|
|
|
* functions.
|
|
|
|
*/
|
2014-04-12 00:57:48 +09:00
|
|
|
|
2014-01-22 04:28:18 +09:00
|
|
|
/**
|
|
|
|
* Proxy to a PDFPage in the worker thread.
|
|
|
|
* @class
|
2015-11-13 04:39:58 +09:00
|
|
|
* @alias PDFPageProxy
|
2014-01-22 04:28:18 +09:00
|
|
|
*/
|
2012-04-13 04:11:22 +09:00
|
|
|
var PDFPageProxy = (function PDFPageProxyClosure() {
|
2018-02-18 07:13:49 +09:00
|
|
|
function PDFPageProxy(pageIndex, pageInfo, transport, pdfBug = false) {
|
2014-05-09 05:02:53 +09:00
|
|
|
this.pageIndex = pageIndex;
|
2018-06-06 03:30:06 +09:00
|
|
|
this._pageInfo = pageInfo;
|
2012-04-13 04:11:22 +09:00
|
|
|
this.transport = transport;
|
2018-02-18 07:13:49 +09:00
|
|
|
this._stats = (pdfBug ? new StatTimer() : DummyStatTimer);
|
|
|
|
this._pdfBug = pdfBug;
|
2012-10-29 05:10:34 +09:00
|
|
|
this.commonObjs = transport.commonObjs;
|
|
|
|
this.objs = new PDFObjects();
|
|
|
|
this.cleanupAfterRender = false;
|
2015-10-21 07:45:55 +09:00
|
|
|
this.pendingCleanup = false;
|
2016-01-28 02:04:13 +09:00
|
|
|
this.intentStates = Object.create(null);
|
2015-10-21 07:45:55 +09:00
|
|
|
this.destroyed = false;
|
2012-04-13 04:11:22 +09:00
|
|
|
}
|
2014-01-22 04:28:18 +09:00
|
|
|
PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ {
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
|
|
|
* @return {number} Page number of the page. First page is 1.
|
|
|
|
*/
|
2012-04-13 04:11:22 +09:00
|
|
|
get pageNumber() {
|
2014-05-09 05:02:53 +09:00
|
|
|
return this.pageIndex + 1;
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
|
|
|
* @return {number} The number of degrees the page is rotated clockwise.
|
|
|
|
*/
|
2012-04-13 04:11:22 +09:00
|
|
|
get rotate() {
|
2018-06-06 03:30:06 +09:00
|
|
|
return this._pageInfo.rotate;
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
2014-01-22 04:28:18 +09:00
|
|
|
* @return {Object} The reference that points to this page. It has 'num' and
|
2012-04-14 01:25:08 +09:00
|
|
|
* 'gen' properties.
|
|
|
|
*/
|
2012-04-13 04:11:22 +09:00
|
|
|
get ref() {
|
2018-06-06 03:30:06 +09:00
|
|
|
return this._pageInfo.ref;
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2016-11-22 06:39:04 +09:00
|
|
|
/**
|
|
|
|
* @return {number} The default size of units in 1/72nds of an inch.
|
|
|
|
*/
|
|
|
|
get userUnit() {
|
2018-06-06 03:30:06 +09:00
|
|
|
return this._pageInfo.userUnit;
|
2016-11-22 06:39:04 +09:00
|
|
|
},
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
2014-01-22 04:28:18 +09:00
|
|
|
* @return {Array} An array of the visible portion of the PDF page in the
|
2012-04-14 01:25:08 +09:00
|
|
|
* user space units - [x1, y1, x2, y2].
|
|
|
|
*/
|
2012-04-13 04:11:22 +09:00
|
|
|
get view() {
|
2018-06-06 03:30:06 +09:00
|
|
|
return this._pageInfo.view;
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2018-03-18 01:10:37 +09:00
|
|
|
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
|
|
|
* @param {number} scale The desired scale of the viewport.
|
|
|
|
* @param {number} rotate Degrees to rotate the viewport. If omitted this
|
|
|
|
* defaults to the page rotation.
|
2017-11-04 01:05:53 +09:00
|
|
|
* @param {boolean} dontFlip (optional) If true, axis Y will not be flipped.
|
2016-03-29 04:49:22 +09:00
|
|
|
* @return {PageViewport} Contains 'width' and 'height' properties
|
2014-05-06 04:09:47 +09:00
|
|
|
* along with transforms required for rendering.
|
2012-04-14 01:25:08 +09:00
|
|
|
*/
|
2017-11-04 01:05:53 +09:00
|
|
|
getViewport(scale, rotate = this.rotate, dontFlip = false) {
|
2018-06-04 19:37:00 +09:00
|
|
|
return new PageViewport({
|
|
|
|
viewBox: this.view,
|
|
|
|
scale,
|
|
|
|
rotation: rotate,
|
|
|
|
dontFlip,
|
|
|
|
});
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
2015-11-22 21:56:52 +09:00
|
|
|
* @param {GetAnnotationsParameters} params - Annotation parameters.
|
2014-01-22 04:28:18 +09:00
|
|
|
* @return {Promise} A promise that is resolved with an {Array} of the
|
2012-04-14 01:25:08 +09:00
|
|
|
* annotation objects.
|
|
|
|
*/
|
2015-11-22 21:56:52 +09:00
|
|
|
getAnnotations: function PDFPageProxy_getAnnotations(params) {
|
|
|
|
var intent = (params && params.intent) || null;
|
|
|
|
|
|
|
|
if (!this.annotationsPromise || this.annotationsIntent !== intent) {
|
|
|
|
this.annotationsPromise = this.transport.getAnnotations(this.pageIndex,
|
|
|
|
intent);
|
|
|
|
this.annotationsIntent = intent;
|
2014-03-14 21:24:04 +09:00
|
|
|
}
|
2015-07-19 00:52:03 +09:00
|
|
|
return this.annotationsPromise;
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
|
|
|
* Begins the process of rendering a page to the desired context.
|
2014-04-12 00:57:48 +09:00
|
|
|
* @param {RenderParameters} params Page render parameters.
|
|
|
|
* @return {RenderTask} An object that contains the promise, which
|
|
|
|
* is resolved when the page finishes rendering.
|
2012-04-14 01:25:08 +09:00
|
|
|
*/
|
2012-05-02 02:48:07 +09:00
|
|
|
render: function PDFPageProxy_render(params) {
|
[api-major] Only create a `StatTimer` for pages when `enableStats == true` (issue 5215)
Unless the debugging tools (i.e. `PDFBug`) are enabled, or the `browsertest` is running, the `PDFPageProxy.stats` aren't actually used for anything.
Rather than initializing unnecessary `StatTimer` instances, we can simply re-use *one* dummy class (with static methods) for every page. Note that by using a dummy `StatTimer` in this way, rather than letting `PDFPageProxy.stats` be undefined, we don't need to guard *every* single stats collection callsite.
Since it wouldn't make much sense to attempt to use `PDFPageProxy.stats` when stat collection is disabled, it was instead changed to a "private" property (i.e. `PDFPageProxy._stats`) and a getter was added for accessing `PDFPageProxy.stats`. This getter will now return `null` when stat collection is disabled, making that case easy to handle.
For benchmarking purposes, the test-suite used to re-create the `StatTimer` after loading/rendering each page. However, modifying properties on various API code from the outside in this way seems very error-prone, and is an anti-pattern that we really should avoid at all cost. Hence the `PDFPageProxy.cleanup` method was modified to accept an optional parameter, which will take care of resetting `this.stats` when necessary, and `test/driver.js` was updated accordingly.
Finally, a tiny bit more validation was added on the viewer side, to ensure that all the code we're attempting to access is defined when handling `PDFPageProxy` stats.
2017-12-07 00:30:04 +09:00
|
|
|
let stats = this._stats;
|
2012-04-13 04:11:22 +09:00
|
|
|
stats.time('Overall');
|
2013-08-01 03:17:36 +09:00
|
|
|
|
2013-08-07 09:35:54 +09:00
|
|
|
// If there was a pending destroy cancel it so no cleanup happens during
|
|
|
|
// this call to render.
|
2015-10-21 07:45:55 +09:00
|
|
|
this.pendingCleanup = false;
|
2013-08-07 09:35:54 +09:00
|
|
|
|
2014-08-01 19:39:31 +09:00
|
|
|
var renderingIntent = (params.intent === 'print' ? 'print' : 'display');
|
2017-01-28 02:58:39 +09:00
|
|
|
var canvasFactory = params.canvasFactory || new DOMCanvasFactory();
|
2017-11-02 00:32:22 +09:00
|
|
|
let webGLContext = new WebGLContext({
|
2018-02-13 22:16:10 +09:00
|
|
|
enable: params.enableWebGL,
|
2017-11-02 00:32:22 +09:00
|
|
|
});
|
2014-03-07 23:48:42 +09:00
|
|
|
|
|
|
|
if (!this.intentStates[renderingIntent]) {
|
2016-01-28 02:04:13 +09:00
|
|
|
this.intentStates[renderingIntent] = Object.create(null);
|
2014-03-07 23:48:42 +09:00
|
|
|
}
|
|
|
|
var intentState = this.intentStates[renderingIntent];
|
|
|
|
|
2014-04-30 00:07:05 +09:00
|
|
|
// If there's no displayReadyCapability yet, then the operatorList
|
|
|
|
// was never requested before. Make the request and create the promise.
|
|
|
|
if (!intentState.displayReadyCapability) {
|
2014-03-07 23:48:42 +09:00
|
|
|
intentState.receivingOperatorList = true;
|
2014-04-30 00:07:05 +09:00
|
|
|
intentState.displayReadyCapability = createPromiseCapability();
|
2014-03-07 23:48:42 +09:00
|
|
|
intentState.operatorList = {
|
2013-08-01 03:17:36 +09:00
|
|
|
fnArray: [],
|
|
|
|
argsArray: [],
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
lastChunk: false,
|
2013-08-01 03:17:36 +09:00
|
|
|
};
|
2012-04-13 04:11:22 +09:00
|
|
|
|
[api-major] Only create a `StatTimer` for pages when `enableStats == true` (issue 5215)
Unless the debugging tools (i.e. `PDFBug`) are enabled, or the `browsertest` is running, the `PDFPageProxy.stats` aren't actually used for anything.
Rather than initializing unnecessary `StatTimer` instances, we can simply re-use *one* dummy class (with static methods) for every page. Note that by using a dummy `StatTimer` in this way, rather than letting `PDFPageProxy.stats` be undefined, we don't need to guard *every* single stats collection callsite.
Since it wouldn't make much sense to attempt to use `PDFPageProxy.stats` when stat collection is disabled, it was instead changed to a "private" property (i.e. `PDFPageProxy._stats`) and a getter was added for accessing `PDFPageProxy.stats`. This getter will now return `null` when stat collection is disabled, making that case easy to handle.
For benchmarking purposes, the test-suite used to re-create the `StatTimer` after loading/rendering each page. However, modifying properties on various API code from the outside in this way seems very error-prone, and is an anti-pattern that we really should avoid at all cost. Hence the `PDFPageProxy.cleanup` method was modified to accept an optional parameter, which will take care of resetting `this.stats` when necessary, and `test/driver.js` was updated accordingly.
Finally, a tiny bit more validation was added on the viewer side, to ensure that all the code we're attempting to access is defined when handling `PDFPageProxy` stats.
2017-12-07 00:30:04 +09:00
|
|
|
stats.time('Page Request');
|
2012-04-13 04:11:22 +09:00
|
|
|
this.transport.messageHandler.send('RenderPageRequest', {
|
2014-03-07 23:48:42 +09:00
|
|
|
pageIndex: this.pageNumber - 1,
|
2016-09-15 05:49:37 +09:00
|
|
|
intent: renderingIntent,
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
renderInteractiveForms: (params.renderInteractiveForms === true),
|
2012-04-13 04:11:22 +09:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2017-05-03 23:39:54 +09:00
|
|
|
var complete = (error) => {
|
|
|
|
var i = intentState.renderTasks.indexOf(internalRenderTask);
|
|
|
|
if (i >= 0) {
|
|
|
|
intentState.renderTasks.splice(i, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.cleanupAfterRender) {
|
|
|
|
this.pendingCleanup = true;
|
|
|
|
}
|
|
|
|
this._tryCleanup();
|
|
|
|
|
|
|
|
if (error) {
|
|
|
|
internalRenderTask.capability.reject(error);
|
|
|
|
} else {
|
|
|
|
internalRenderTask.capability.resolve();
|
|
|
|
}
|
|
|
|
stats.timeEnd('Rendering');
|
|
|
|
stats.timeEnd('Overall');
|
|
|
|
};
|
|
|
|
|
2013-08-01 03:17:36 +09:00
|
|
|
var internalRenderTask = new InternalRenderTask(complete, params,
|
2014-03-14 21:24:04 +09:00
|
|
|
this.objs,
|
|
|
|
this.commonObjs,
|
|
|
|
intentState.operatorList,
|
2017-01-28 02:58:39 +09:00
|
|
|
this.pageNumber,
|
2017-11-02 00:32:22 +09:00
|
|
|
canvasFactory,
|
2018-02-18 07:13:49 +09:00
|
|
|
webGLContext,
|
|
|
|
this._pdfBug);
|
2015-05-12 22:44:42 +09:00
|
|
|
internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print';
|
2014-03-07 23:48:42 +09:00
|
|
|
if (!intentState.renderTasks) {
|
|
|
|
intentState.renderTasks = [];
|
|
|
|
}
|
|
|
|
intentState.renderTasks.push(internalRenderTask);
|
2015-01-06 12:45:01 +09:00
|
|
|
var renderTask = internalRenderTask.task;
|
|
|
|
|
2017-05-03 23:39:54 +09:00
|
|
|
intentState.displayReadyCapability.promise.then((transparency) => {
|
|
|
|
if (this.pendingCleanup) {
|
|
|
|
complete();
|
|
|
|
return;
|
2012-12-01 08:31:22 +09:00
|
|
|
}
|
2017-05-03 23:39:54 +09:00
|
|
|
stats.time('Rendering');
|
|
|
|
internalRenderTask.initializeGraphics(transparency);
|
|
|
|
internalRenderTask.operatorListChanged();
|
2017-06-13 06:04:35 +09:00
|
|
|
}).catch(complete);
|
2012-04-13 04:11:22 +09:00
|
|
|
|
2013-08-01 03:17:36 +09:00
|
|
|
return renderTask;
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2014-06-17 03:35:38 +09:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @return {Promise} A promise resolved with an {@link PDFOperatorList}
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
* object that represents page's operator list.
|
2014-06-17 03:35:38 +09:00
|
|
|
*/
|
|
|
|
getOperatorList: function PDFPageProxy_getOperatorList() {
|
|
|
|
function operatorListChanged() {
|
|
|
|
if (intentState.operatorList.lastChunk) {
|
|
|
|
intentState.opListReadCapability.resolve(intentState.operatorList);
|
2016-01-22 21:28:30 +09:00
|
|
|
|
|
|
|
var i = intentState.renderTasks.indexOf(opListTask);
|
|
|
|
if (i >= 0) {
|
|
|
|
intentState.renderTasks.splice(i, 1);
|
|
|
|
}
|
2014-06-17 03:35:38 +09:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var renderingIntent = 'oplist';
|
|
|
|
if (!this.intentStates[renderingIntent]) {
|
2016-01-28 02:04:13 +09:00
|
|
|
this.intentStates[renderingIntent] = Object.create(null);
|
2014-06-17 03:35:38 +09:00
|
|
|
}
|
|
|
|
var intentState = this.intentStates[renderingIntent];
|
2016-01-22 21:28:30 +09:00
|
|
|
var opListTask;
|
2014-06-17 03:35:38 +09:00
|
|
|
|
|
|
|
if (!intentState.opListReadCapability) {
|
2016-01-22 21:28:30 +09:00
|
|
|
opListTask = {};
|
2014-06-17 03:35:38 +09:00
|
|
|
opListTask.operatorListChanged = operatorListChanged;
|
|
|
|
intentState.receivingOperatorList = true;
|
|
|
|
intentState.opListReadCapability = createPromiseCapability();
|
|
|
|
intentState.renderTasks = [];
|
|
|
|
intentState.renderTasks.push(opListTask);
|
|
|
|
intentState.operatorList = {
|
|
|
|
fnArray: [],
|
|
|
|
argsArray: [],
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
lastChunk: false,
|
2014-06-17 03:35:38 +09:00
|
|
|
};
|
|
|
|
|
|
|
|
this.transport.messageHandler.send('RenderPageRequest', {
|
|
|
|
pageIndex: this.pageIndex,
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
intent: renderingIntent,
|
2014-06-17 03:35:38 +09:00
|
|
|
});
|
|
|
|
}
|
|
|
|
return intentState.opListReadCapability.promise;
|
|
|
|
},
|
|
|
|
|
2017-04-17 21:46:53 +09:00
|
|
|
/**
|
|
|
|
* @param {getTextContentParameters} params - getTextContent parameters.
|
|
|
|
* @return {ReadableStream} ReadableStream to read textContent chunks.
|
|
|
|
*/
|
|
|
|
streamTextContent(params = {}) {
|
|
|
|
const TEXT_CONTENT_CHUNK_SIZE = 100;
|
|
|
|
return this.transport.messageHandler.sendWithStream('GetTextContent', {
|
|
|
|
pageIndex: this.pageNumber - 1,
|
|
|
|
normalizeWhitespace: (params.normalizeWhitespace === true),
|
|
|
|
combineTextItems: (params.disableCombineTextItems !== true),
|
|
|
|
}, {
|
|
|
|
highWaterMark: TEXT_CONTENT_CHUNK_SIZE,
|
|
|
|
size(textContent) {
|
|
|
|
return textContent.items.length;
|
|
|
|
},
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
2015-11-24 00:57:43 +09:00
|
|
|
* @param {getTextContentParameters} params - getTextContent parameters.
|
2014-04-10 08:44:07 +09:00
|
|
|
* @return {Promise} That is resolved a {@link TextContent}
|
|
|
|
* object that represent the page text content.
|
2012-04-14 01:25:08 +09:00
|
|
|
*/
|
2015-11-24 00:57:43 +09:00
|
|
|
getTextContent: function PDFPageProxy_getTextContent(params) {
|
[api-minor] Always allow e.g. rendering to continue even if there are errors, and add a `stopAtErrors` parameter to `getDocument` to opt-out of this behaviour (issue 6342, issue 3795, bug 1130815)
Other PDF readers, e.g. Adobe Reader and PDFium (in Chrome), will attempt to render as much of a page as possible even if there are errors present.
Currently we just bail as soon the first error is hit, which means that we'll usually not render anything in these cases and just display a blank page instead.
NOTE: This patch changes the default behaviour of the PDF.js API to always attempt to recover as much data as possible, even when encountering errors during e.g. `getOperatorList`/`getTextContent`, which thus improve our handling of corrupt PDF files and allow the default viewer to handle errors slightly more gracefully.
In the event that an API consumer wishes to use the old behaviour, where we stop parsing as soon as an error is encountered, the `stopAtErrors` parameter can be set at `getDocument`.
Fixes, inasmuch it's possible since the PDF files are corrupt, e.g. issue 6342, issue 3795, and [bug 1130815](https://bugzilla.mozilla.org/show_bug.cgi?id=1130815) (and probably others too).
2017-02-19 22:03:08 +09:00
|
|
|
params = params || {};
|
2017-04-17 21:46:53 +09:00
|
|
|
let readableStream = this.streamTextContent(params);
|
|
|
|
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
|
function pump() {
|
|
|
|
reader.read().then(function({ value, done, }) {
|
|
|
|
if (done) {
|
|
|
|
resolve(textContent);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Util.extendObj(textContent.styles, value.styles);
|
2018-06-10 03:51:15 +09:00
|
|
|
textContent.items.push(...value.items);
|
2017-04-17 21:46:53 +09:00
|
|
|
pump();
|
|
|
|
}, reject);
|
|
|
|
}
|
|
|
|
|
|
|
|
let reader = readableStream.getReader();
|
|
|
|
let textContent = {
|
|
|
|
items: [],
|
|
|
|
styles: Object.create(null),
|
|
|
|
};
|
|
|
|
|
|
|
|
pump();
|
2014-05-08 08:15:25 +09:00
|
|
|
});
|
2012-04-13 04:11:22 +09:00
|
|
|
},
|
2015-10-21 07:45:55 +09:00
|
|
|
|
2012-04-17 04:13:41 +09:00
|
|
|
/**
|
2015-10-21 07:45:55 +09:00
|
|
|
* Destroys page object.
|
2012-04-17 04:13:41 +09:00
|
|
|
*/
|
2015-10-21 07:45:55 +09:00
|
|
|
_destroy: function PDFPageProxy_destroy() {
|
|
|
|
this.destroyed = true;
|
|
|
|
this.transport.pageCache[this.pageIndex] = null;
|
|
|
|
|
2015-10-21 10:50:32 +09:00
|
|
|
var waitOn = [];
|
2015-10-21 07:45:55 +09:00
|
|
|
Object.keys(this.intentStates).forEach(function(intent) {
|
2016-01-22 21:28:30 +09:00
|
|
|
if (intent === 'oplist') {
|
|
|
|
// Avoid errors below, since the renderTasks are just stubs.
|
|
|
|
return;
|
|
|
|
}
|
2015-10-21 07:45:55 +09:00
|
|
|
var intentState = this.intentStates[intent];
|
|
|
|
intentState.renderTasks.forEach(function(renderTask) {
|
2015-10-21 10:50:32 +09:00
|
|
|
var renderCompleted = renderTask.capability.promise.
|
|
|
|
catch(function () {}); // ignoring failures
|
|
|
|
waitOn.push(renderCompleted);
|
2015-10-21 07:45:55 +09:00
|
|
|
renderTask.cancel();
|
|
|
|
});
|
|
|
|
}, this);
|
|
|
|
this.objs.clear();
|
|
|
|
this.annotationsPromise = null;
|
|
|
|
this.pendingCleanup = false;
|
2015-10-21 10:50:32 +09:00
|
|
|
return Promise.all(waitOn);
|
2015-10-21 07:45:55 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Cleans up resources allocated by the page.
|
[api-major] Only create a `StatTimer` for pages when `enableStats == true` (issue 5215)
Unless the debugging tools (i.e. `PDFBug`) are enabled, or the `browsertest` is running, the `PDFPageProxy.stats` aren't actually used for anything.
Rather than initializing unnecessary `StatTimer` instances, we can simply re-use *one* dummy class (with static methods) for every page. Note that by using a dummy `StatTimer` in this way, rather than letting `PDFPageProxy.stats` be undefined, we don't need to guard *every* single stats collection callsite.
Since it wouldn't make much sense to attempt to use `PDFPageProxy.stats` when stat collection is disabled, it was instead changed to a "private" property (i.e. `PDFPageProxy._stats`) and a getter was added for accessing `PDFPageProxy.stats`. This getter will now return `null` when stat collection is disabled, making that case easy to handle.
For benchmarking purposes, the test-suite used to re-create the `StatTimer` after loading/rendering each page. However, modifying properties on various API code from the outside in this way seems very error-prone, and is an anti-pattern that we really should avoid at all cost. Hence the `PDFPageProxy.cleanup` method was modified to accept an optional parameter, which will take care of resetting `this.stats` when necessary, and `test/driver.js` was updated accordingly.
Finally, a tiny bit more validation was added on the viewer side, to ensure that all the code we're attempting to access is defined when handling `PDFPageProxy` stats.
2017-12-07 00:30:04 +09:00
|
|
|
* @param {boolean} resetStats - (optional) Reset page stats, if enabled.
|
|
|
|
* The default value is `false`.
|
2015-10-21 07:45:55 +09:00
|
|
|
*/
|
[api-major] Only create a `StatTimer` for pages when `enableStats == true` (issue 5215)
Unless the debugging tools (i.e. `PDFBug`) are enabled, or the `browsertest` is running, the `PDFPageProxy.stats` aren't actually used for anything.
Rather than initializing unnecessary `StatTimer` instances, we can simply re-use *one* dummy class (with static methods) for every page. Note that by using a dummy `StatTimer` in this way, rather than letting `PDFPageProxy.stats` be undefined, we don't need to guard *every* single stats collection callsite.
Since it wouldn't make much sense to attempt to use `PDFPageProxy.stats` when stat collection is disabled, it was instead changed to a "private" property (i.e. `PDFPageProxy._stats`) and a getter was added for accessing `PDFPageProxy.stats`. This getter will now return `null` when stat collection is disabled, making that case easy to handle.
For benchmarking purposes, the test-suite used to re-create the `StatTimer` after loading/rendering each page. However, modifying properties on various API code from the outside in this way seems very error-prone, and is an anti-pattern that we really should avoid at all cost. Hence the `PDFPageProxy.cleanup` method was modified to accept an optional parameter, which will take care of resetting `this.stats` when necessary, and `test/driver.js` was updated accordingly.
Finally, a tiny bit more validation was added on the viewer side, to ensure that all the code we're attempting to access is defined when handling `PDFPageProxy` stats.
2017-12-07 00:30:04 +09:00
|
|
|
cleanup(resetStats = false) {
|
2015-10-21 07:45:55 +09:00
|
|
|
this.pendingCleanup = true;
|
[api-major] Only create a `StatTimer` for pages when `enableStats == true` (issue 5215)
Unless the debugging tools (i.e. `PDFBug`) are enabled, or the `browsertest` is running, the `PDFPageProxy.stats` aren't actually used for anything.
Rather than initializing unnecessary `StatTimer` instances, we can simply re-use *one* dummy class (with static methods) for every page. Note that by using a dummy `StatTimer` in this way, rather than letting `PDFPageProxy.stats` be undefined, we don't need to guard *every* single stats collection callsite.
Since it wouldn't make much sense to attempt to use `PDFPageProxy.stats` when stat collection is disabled, it was instead changed to a "private" property (i.e. `PDFPageProxy._stats`) and a getter was added for accessing `PDFPageProxy.stats`. This getter will now return `null` when stat collection is disabled, making that case easy to handle.
For benchmarking purposes, the test-suite used to re-create the `StatTimer` after loading/rendering each page. However, modifying properties on various API code from the outside in this way seems very error-prone, and is an anti-pattern that we really should avoid at all cost. Hence the `PDFPageProxy.cleanup` method was modified to accept an optional parameter, which will take care of resetting `this.stats` when necessary, and `test/driver.js` was updated accordingly.
Finally, a tiny bit more validation was added on the viewer side, to ensure that all the code we're attempting to access is defined when handling `PDFPageProxy` stats.
2017-12-07 00:30:04 +09:00
|
|
|
this._tryCleanup(resetStats);
|
2013-08-01 03:17:36 +09:00
|
|
|
},
|
|
|
|
/**
|
2013-08-07 09:35:54 +09:00
|
|
|
* For internal use only. Attempts to clean up if rendering is in a state
|
|
|
|
* where that's possible.
|
2014-01-22 04:28:18 +09:00
|
|
|
* @ignore
|
2013-08-01 03:17:36 +09:00
|
|
|
*/
|
[api-major] Only create a `StatTimer` for pages when `enableStats == true` (issue 5215)
Unless the debugging tools (i.e. `PDFBug`) are enabled, or the `browsertest` is running, the `PDFPageProxy.stats` aren't actually used for anything.
Rather than initializing unnecessary `StatTimer` instances, we can simply re-use *one* dummy class (with static methods) for every page. Note that by using a dummy `StatTimer` in this way, rather than letting `PDFPageProxy.stats` be undefined, we don't need to guard *every* single stats collection callsite.
Since it wouldn't make much sense to attempt to use `PDFPageProxy.stats` when stat collection is disabled, it was instead changed to a "private" property (i.e. `PDFPageProxy._stats`) and a getter was added for accessing `PDFPageProxy.stats`. This getter will now return `null` when stat collection is disabled, making that case easy to handle.
For benchmarking purposes, the test-suite used to re-create the `StatTimer` after loading/rendering each page. However, modifying properties on various API code from the outside in this way seems very error-prone, and is an anti-pattern that we really should avoid at all cost. Hence the `PDFPageProxy.cleanup` method was modified to accept an optional parameter, which will take care of resetting `this.stats` when necessary, and `test/driver.js` was updated accordingly.
Finally, a tiny bit more validation was added on the viewer side, to ensure that all the code we're attempting to access is defined when handling `PDFPageProxy` stats.
2017-12-07 00:30:04 +09:00
|
|
|
_tryCleanup(resetStats = false) {
|
2015-10-21 07:45:55 +09:00
|
|
|
if (!this.pendingCleanup ||
|
2014-03-07 23:48:42 +09:00
|
|
|
Object.keys(this.intentStates).some(function(intent) {
|
|
|
|
var intentState = this.intentStates[intent];
|
2014-03-14 21:24:04 +09:00
|
|
|
return (intentState.renderTasks.length !== 0 ||
|
|
|
|
intentState.receivingOperatorList);
|
2014-03-07 23:48:42 +09:00
|
|
|
}, this)) {
|
2013-08-07 09:35:54 +09:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-03-07 23:48:42 +09:00
|
|
|
Object.keys(this.intentStates).forEach(function(intent) {
|
|
|
|
delete this.intentStates[intent];
|
|
|
|
}, this);
|
2013-08-01 03:17:36 +09:00
|
|
|
this.objs.clear();
|
2014-05-09 05:02:53 +09:00
|
|
|
this.annotationsPromise = null;
|
2018-01-26 03:27:34 +09:00
|
|
|
if (resetStats && this._stats instanceof StatTimer) {
|
|
|
|
this._stats = new StatTimer();
|
[api-major] Only create a `StatTimer` for pages when `enableStats == true` (issue 5215)
Unless the debugging tools (i.e. `PDFBug`) are enabled, or the `browsertest` is running, the `PDFPageProxy.stats` aren't actually used for anything.
Rather than initializing unnecessary `StatTimer` instances, we can simply re-use *one* dummy class (with static methods) for every page. Note that by using a dummy `StatTimer` in this way, rather than letting `PDFPageProxy.stats` be undefined, we don't need to guard *every* single stats collection callsite.
Since it wouldn't make much sense to attempt to use `PDFPageProxy.stats` when stat collection is disabled, it was instead changed to a "private" property (i.e. `PDFPageProxy._stats`) and a getter was added for accessing `PDFPageProxy.stats`. This getter will now return `null` when stat collection is disabled, making that case easy to handle.
For benchmarking purposes, the test-suite used to re-create the `StatTimer` after loading/rendering each page. However, modifying properties on various API code from the outside in this way seems very error-prone, and is an anti-pattern that we really should avoid at all cost. Hence the `PDFPageProxy.cleanup` method was modified to accept an optional parameter, which will take care of resetting `this.stats` when necessary, and `test/driver.js` was updated accordingly.
Finally, a tiny bit more validation was added on the viewer side, to ensure that all the code we're attempting to access is defined when handling `PDFPageProxy` stats.
2017-12-07 00:30:04 +09:00
|
|
|
}
|
2015-10-21 07:45:55 +09:00
|
|
|
this.pendingCleanup = false;
|
2013-08-01 03:17:36 +09:00
|
|
|
},
|
|
|
|
/**
|
|
|
|
* For internal use only.
|
2014-01-22 04:28:18 +09:00
|
|
|
* @ignore
|
2013-08-01 03:17:36 +09:00
|
|
|
*/
|
2014-03-07 23:48:42 +09:00
|
|
|
_startRenderPage: function PDFPageProxy_startRenderPage(transparency,
|
|
|
|
intent) {
|
|
|
|
var intentState = this.intentStates[intent];
|
2014-06-17 03:35:38 +09:00
|
|
|
// TODO Refactor RenderPageRequest to separate rendering
|
|
|
|
// and operator list logic
|
|
|
|
if (intentState.displayReadyCapability) {
|
|
|
|
intentState.displayReadyCapability.resolve(transparency);
|
|
|
|
}
|
2013-08-01 03:17:36 +09:00
|
|
|
},
|
|
|
|
/**
|
|
|
|
* For internal use only.
|
2014-01-22 04:28:18 +09:00
|
|
|
* @ignore
|
2013-08-01 03:17:36 +09:00
|
|
|
*/
|
2014-03-07 23:48:42 +09:00
|
|
|
_renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk,
|
|
|
|
intent) {
|
|
|
|
var intentState = this.intentStates[intent];
|
2014-04-09 04:48:16 +09:00
|
|
|
var i, ii;
|
2013-08-01 03:17:36 +09:00
|
|
|
// Add the new chunk to the current operator list.
|
2014-04-09 04:48:16 +09:00
|
|
|
for (i = 0, ii = operatorListChunk.length; i < ii; i++) {
|
2014-03-07 23:48:42 +09:00
|
|
|
intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);
|
|
|
|
intentState.operatorList.argsArray.push(
|
|
|
|
operatorListChunk.argsArray[i]);
|
2013-11-14 04:43:38 +09:00
|
|
|
}
|
2014-03-07 23:48:42 +09:00
|
|
|
intentState.operatorList.lastChunk = operatorListChunk.lastChunk;
|
2013-08-01 03:17:36 +09:00
|
|
|
|
|
|
|
// Notify all the rendering tasks there are more operators to be consumed.
|
2014-04-09 04:48:16 +09:00
|
|
|
for (i = 0; i < intentState.renderTasks.length; i++) {
|
2014-03-07 23:48:42 +09:00
|
|
|
intentState.renderTasks[i].operatorListChanged();
|
2012-04-17 04:49:55 +09:00
|
|
|
}
|
2013-08-07 09:35:54 +09:00
|
|
|
|
|
|
|
if (operatorListChunk.lastChunk) {
|
2014-03-07 23:48:42 +09:00
|
|
|
intentState.receivingOperatorList = false;
|
2015-10-21 07:45:55 +09:00
|
|
|
this._tryCleanup();
|
2013-08-07 09:35:54 +09:00
|
|
|
}
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
},
|
[api-major] Only create a `StatTimer` for pages when `enableStats == true` (issue 5215)
Unless the debugging tools (i.e. `PDFBug`) are enabled, or the `browsertest` is running, the `PDFPageProxy.stats` aren't actually used for anything.
Rather than initializing unnecessary `StatTimer` instances, we can simply re-use *one* dummy class (with static methods) for every page. Note that by using a dummy `StatTimer` in this way, rather than letting `PDFPageProxy.stats` be undefined, we don't need to guard *every* single stats collection callsite.
Since it wouldn't make much sense to attempt to use `PDFPageProxy.stats` when stat collection is disabled, it was instead changed to a "private" property (i.e. `PDFPageProxy._stats`) and a getter was added for accessing `PDFPageProxy.stats`. This getter will now return `null` when stat collection is disabled, making that case easy to handle.
For benchmarking purposes, the test-suite used to re-create the `StatTimer` after loading/rendering each page. However, modifying properties on various API code from the outside in this way seems very error-prone, and is an anti-pattern that we really should avoid at all cost. Hence the `PDFPageProxy.cleanup` method was modified to accept an optional parameter, which will take care of resetting `this.stats` when necessary, and `test/driver.js` was updated accordingly.
Finally, a tiny bit more validation was added on the viewer side, to ensure that all the code we're attempting to access is defined when handling `PDFPageProxy` stats.
2017-12-07 00:30:04 +09:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @return {Object} Returns page stats, if enabled.
|
|
|
|
*/
|
|
|
|
get stats() {
|
|
|
|
return (this._stats instanceof StatTimer ? this._stats : null);
|
|
|
|
},
|
2012-04-13 04:11:22 +09:00
|
|
|
};
|
|
|
|
return PDFPageProxy;
|
|
|
|
})();
|
2014-01-22 04:28:18 +09:00
|
|
|
|
2017-05-03 02:20:13 +09:00
|
|
|
class LoopbackPort {
|
2018-06-04 19:38:05 +09:00
|
|
|
constructor(defer = true) {
|
2017-05-03 02:20:13 +09:00
|
|
|
this._listeners = [];
|
|
|
|
this._defer = defer;
|
|
|
|
this._deferred = Promise.resolve(undefined);
|
|
|
|
}
|
|
|
|
|
|
|
|
postMessage(obj, transfers) {
|
|
|
|
function cloneValue(value) {
|
|
|
|
// Trying to perform a structured clone close to the spec, including
|
|
|
|
// transfers.
|
|
|
|
if (typeof value !== 'object' || value === null) {
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
if (cloned.has(value)) { // already cloned the object
|
|
|
|
return cloned.get(value);
|
|
|
|
}
|
|
|
|
var result;
|
|
|
|
var buffer;
|
|
|
|
if ((buffer = value.buffer) && isArrayBuffer(buffer)) {
|
|
|
|
// We found object with ArrayBuffer (typed array).
|
2018-02-04 22:50:58 +09:00
|
|
|
var transferable = transfers && transfers.includes(buffer);
|
2017-05-03 02:20:13 +09:00
|
|
|
if (value === buffer) {
|
|
|
|
// Special case when we are faking typed arrays in compatibility.js.
|
|
|
|
result = value;
|
|
|
|
} else if (transferable) {
|
|
|
|
result = new value.constructor(buffer, value.byteOffset,
|
|
|
|
value.byteLength);
|
|
|
|
} else {
|
|
|
|
result = new value.constructor(value);
|
|
|
|
}
|
|
|
|
cloned.set(value, result);
|
|
|
|
return result;
|
|
|
|
}
|
2017-08-23 07:50:27 +09:00
|
|
|
result = Array.isArray(value) ? [] : {};
|
2017-05-03 02:20:13 +09:00
|
|
|
cloned.set(value, result); // adding to cache now for cyclic references
|
|
|
|
// Cloning all value and object properties, however ignoring properties
|
|
|
|
// defined via getter.
|
|
|
|
for (var i in value) {
|
|
|
|
var desc, p = value;
|
|
|
|
while (!(desc = Object.getOwnPropertyDescriptor(p, i))) {
|
|
|
|
p = Object.getPrototypeOf(p);
|
|
|
|
}
|
|
|
|
if (typeof desc.value === 'undefined' ||
|
|
|
|
typeof desc.value === 'function') {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
result[i] = cloneValue(desc.value);
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!this._defer) {
|
|
|
|
this._listeners.forEach(function (listener) {
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
listener.call(this, { data: obj, });
|
2017-05-03 02:20:13 +09:00
|
|
|
}, this);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var cloned = new WeakMap();
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
var e = { data: cloneValue(obj), };
|
2017-05-03 23:39:54 +09:00
|
|
|
this._deferred.then(() => {
|
2017-05-03 02:20:13 +09:00
|
|
|
this._listeners.forEach(function (listener) {
|
|
|
|
listener.call(this, e);
|
|
|
|
}, this);
|
2017-05-03 23:39:54 +09:00
|
|
|
});
|
2017-05-03 02:20:13 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
addEventListener(name, listener) {
|
|
|
|
this._listeners.push(listener);
|
|
|
|
}
|
|
|
|
|
|
|
|
removeEventListener(name, listener) {
|
|
|
|
var i = this._listeners.indexOf(listener);
|
|
|
|
this._listeners.splice(i, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
terminate() {
|
|
|
|
this._listeners = [];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-15 00:03:54 +09:00
|
|
|
/**
|
|
|
|
* @typedef {Object} PDFWorkerParameters
|
|
|
|
* @property {string} name - (optional) The name of the worker.
|
|
|
|
* @property {Object} port - (optional) The `workerPort`.
|
2018-02-15 00:53:50 +09:00
|
|
|
* @property {boolean} postMessageTransfers - (optional) Enables transfer usage
|
|
|
|
* in postMessage for ArrayBuffers. The default value is `true`.
|
2018-02-15 01:35:08 +09:00
|
|
|
* @property {number} verbosity - (optional) Controls the logging level; the
|
|
|
|
* constants from {VerbosityLevel} should be used.
|
2018-02-15 00:03:54 +09:00
|
|
|
*/
|
|
|
|
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
2015-10-28 02:55:15 +09:00
|
|
|
* PDF.js web worker abstraction, it controls instantiation of PDF documents and
|
2018-02-15 00:03:54 +09:00
|
|
|
* WorkerTransport for them. If creation of a web worker is not possible,
|
2015-10-28 02:55:15 +09:00
|
|
|
* a "fake" worker will be used instead.
|
|
|
|
* @class
|
2012-04-14 01:25:08 +09:00
|
|
|
*/
|
2015-10-28 02:55:15 +09:00
|
|
|
var PDFWorker = (function PDFWorkerClosure() {
|
2017-06-10 10:07:51 +09:00
|
|
|
let nextFakeWorkerId = 0;
|
2015-10-28 02:55:15 +09:00
|
|
|
|
2015-12-24 08:46:08 +09:00
|
|
|
function getWorkerSrc() {
|
2018-02-14 22:49:24 +09:00
|
|
|
if (GlobalWorkerOptions.workerSrc) {
|
|
|
|
return GlobalWorkerOptions.workerSrc;
|
2015-12-24 08:46:08 +09:00
|
|
|
}
|
2018-02-08 04:31:18 +09:00
|
|
|
if (typeof workerSrc !== 'undefined') {
|
|
|
|
return workerSrc;
|
|
|
|
}
|
2016-10-15 00:57:53 +09:00
|
|
|
if (typeof PDFJSDev !== 'undefined' &&
|
|
|
|
PDFJSDev.test('PRODUCTION && !(MOZCENTRAL || FIREFOX)') &&
|
|
|
|
pdfjsFilePath) {
|
2017-04-18 21:07:09 +09:00
|
|
|
return pdfjsFilePath.replace(/(\.(?:min\.)?js)(\?.*)?$/i, '.worker$1$2');
|
2016-10-15 00:57:53 +09:00
|
|
|
}
|
2018-02-14 22:49:24 +09:00
|
|
|
throw new Error('No "GlobalWorkerOptions.workerSrc" specified.');
|
2015-12-24 08:46:08 +09:00
|
|
|
}
|
|
|
|
|
2018-01-20 02:16:17 +09:00
|
|
|
function getMainThreadWorkerMessageHandler() {
|
|
|
|
if (typeof window === 'undefined') {
|
|
|
|
return null;
|
|
|
|
}
|
2018-03-29 17:50:52 +09:00
|
|
|
return (window.pdfjsWorker && window.pdfjsWorker.WorkerMessageHandler);
|
2018-01-20 02:16:17 +09:00
|
|
|
}
|
|
|
|
|
2017-06-10 10:07:51 +09:00
|
|
|
let fakeWorkerFilesLoadedCapability;
|
2016-03-03 10:16:38 +09:00
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
// Loads worker code into main thread.
|
|
|
|
function setupFakeWorkerGlobal() {
|
2016-10-15 00:57:53 +09:00
|
|
|
if (fakeWorkerFilesLoadedCapability) {
|
|
|
|
return fakeWorkerFilesLoadedCapability.promise;
|
|
|
|
}
|
|
|
|
fakeWorkerFilesLoadedCapability = createPromiseCapability();
|
2018-01-20 02:16:17 +09:00
|
|
|
|
|
|
|
let mainWorkerMessageHandler = getMainThreadWorkerMessageHandler();
|
|
|
|
if (mainWorkerMessageHandler) {
|
|
|
|
// The worker was already loaded using a `<script>` tag.
|
|
|
|
fakeWorkerFilesLoadedCapability.resolve(mainWorkerMessageHandler);
|
|
|
|
return fakeWorkerFilesLoadedCapability.promise;
|
|
|
|
}
|
2018-01-21 01:15:16 +09:00
|
|
|
// In the developer build load worker_loader.js which in turn loads all the
|
2016-10-15 00:57:53 +09:00
|
|
|
// other files and resolves the promise. In production only the
|
|
|
|
// pdf.worker.js file is needed.
|
|
|
|
if (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) {
|
2017-04-02 21:25:33 +09:00
|
|
|
if (typeof SystemJS === 'object') {
|
2017-07-01 02:59:52 +09:00
|
|
|
SystemJS.import('pdfjs/core/worker').then((worker) => {
|
2018-01-21 01:15:16 +09:00
|
|
|
fakeWorkerFilesLoadedCapability.resolve(worker.WorkerMessageHandler);
|
2015-11-24 02:46:40 +09:00
|
|
|
});
|
|
|
|
} else if (typeof require === 'function') {
|
2018-01-21 01:15:16 +09:00
|
|
|
let worker = require('../core/worker.js');
|
|
|
|
fakeWorkerFilesLoadedCapability.resolve(worker.WorkerMessageHandler);
|
2015-11-24 02:46:40 +09:00
|
|
|
} else {
|
2017-04-02 21:25:33 +09:00
|
|
|
throw new Error(
|
|
|
|
'SystemJS or CommonJS must be used to load fake worker.');
|
2015-11-24 02:46:40 +09:00
|
|
|
}
|
2016-10-15 00:57:53 +09:00
|
|
|
} else {
|
2018-01-21 01:15:16 +09:00
|
|
|
let loader = fakeWorkerFilesLoader || function(callback) {
|
2018-06-07 20:52:40 +09:00
|
|
|
loadScript(getWorkerSrc()).then(function() {
|
2018-03-16 05:49:28 +09:00
|
|
|
callback(window.pdfjsWorker.WorkerMessageHandler);
|
2016-10-15 00:57:53 +09:00
|
|
|
});
|
|
|
|
};
|
|
|
|
loader(fakeWorkerFilesLoadedCapability.resolve);
|
2015-10-28 02:55:15 +09:00
|
|
|
}
|
2016-03-03 10:16:38 +09:00
|
|
|
return fakeWorkerFilesLoadedCapability.promise;
|
2015-10-28 02:55:15 +09:00
|
|
|
}
|
2012-04-12 07:52:15 +09:00
|
|
|
|
2016-01-16 06:05:46 +09:00
|
|
|
function createCDNWrapper(url) {
|
|
|
|
// We will rely on blob URL's property to specify origin.
|
|
|
|
// We want this function to fail in case if createObjectURL or Blob do not
|
|
|
|
// exist or fail for some reason -- our Worker creation will fail anyway.
|
|
|
|
var wrapper = 'importScripts(\'' + url + '\');';
|
|
|
|
return URL.createObjectURL(new Blob([wrapper]));
|
|
|
|
}
|
|
|
|
|
2017-06-10 10:07:51 +09:00
|
|
|
let pdfWorkerPorts = new WeakMap();
|
|
|
|
|
2018-02-15 00:03:54 +09:00
|
|
|
/**
|
|
|
|
* @param {PDFWorkerParameters} params - The worker initialization parameters.
|
|
|
|
*/
|
2018-02-15 00:53:50 +09:00
|
|
|
function PDFWorker({ name = null, port = null,
|
2018-06-06 03:30:11 +09:00
|
|
|
postMessageTransfers = true,
|
|
|
|
verbosity = getVerbosityLevel(), } = {}) {
|
2017-06-13 23:16:12 +09:00
|
|
|
if (port && pdfWorkerPorts.has(port)) {
|
2017-06-10 10:07:51 +09:00
|
|
|
throw new Error('Cannot use more than one PDFWorker per port');
|
|
|
|
}
|
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
this.name = name;
|
2015-10-21 07:45:55 +09:00
|
|
|
this.destroyed = false;
|
2018-02-15 00:53:50 +09:00
|
|
|
this.postMessageTransfers = postMessageTransfers !== false;
|
2018-06-06 03:30:11 +09:00
|
|
|
this.verbosity = verbosity;
|
2015-01-06 12:45:01 +09:00
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
this._readyCapability = createPromiseCapability();
|
|
|
|
this._port = null;
|
|
|
|
this._webWorker = null;
|
|
|
|
this._messageHandler = null;
|
2017-02-25 04:33:18 +09:00
|
|
|
|
|
|
|
if (port) {
|
2017-06-10 10:07:51 +09:00
|
|
|
pdfWorkerPorts.set(port, this);
|
2017-02-25 04:33:18 +09:00
|
|
|
this._initializeFromPort(port);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
this._initialize();
|
|
|
|
}
|
|
|
|
|
2017-07-12 20:14:25 +09:00
|
|
|
PDFWorker.prototype = /** @lends PDFWorker.prototype */ {
|
2015-10-28 02:55:15 +09:00
|
|
|
get promise() {
|
|
|
|
return this._readyCapability.promise;
|
|
|
|
},
|
|
|
|
|
|
|
|
get port() {
|
|
|
|
return this._port;
|
|
|
|
},
|
2013-05-10 07:35:23 +09:00
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
get messageHandler() {
|
|
|
|
return this._messageHandler;
|
|
|
|
},
|
|
|
|
|
2017-02-25 04:33:18 +09:00
|
|
|
_initializeFromPort: function PDFWorker_initializeFromPort(port) {
|
|
|
|
this._port = port;
|
|
|
|
this._messageHandler = new MessageHandler('main', 'worker', port);
|
|
|
|
this._messageHandler.on('ready', function () {
|
|
|
|
// Ignoring 'ready' event -- MessageHandler shall be already initialized
|
|
|
|
// and ready to accept the messages.
|
|
|
|
});
|
|
|
|
this._readyCapability.resolve();
|
|
|
|
},
|
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
_initialize: function PDFWorker_initialize() {
|
|
|
|
// If worker support isn't disabled explicit and the browser has worker
|
2016-02-11 10:48:56 +09:00
|
|
|
// support, create a new web worker and test if it/the browser fulfills
|
2015-10-28 02:55:15 +09:00
|
|
|
// all requirements to run parts of pdf.js in a web worker.
|
|
|
|
// Right now, the requirement is, that an Uint8Array is still an
|
|
|
|
// Uint8Array as it arrives on the worker. (Chrome added this with v.15.)
|
2018-01-18 02:20:00 +09:00
|
|
|
if (typeof Worker !== 'undefined' && !isWorkerDisabled &&
|
2018-01-20 02:16:17 +09:00
|
|
|
!getMainThreadWorkerMessageHandler()) {
|
2015-12-24 08:46:08 +09:00
|
|
|
var workerSrc = getWorkerSrc();
|
2012-04-12 07:52:15 +09:00
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
try {
|
2016-10-15 00:57:53 +09:00
|
|
|
// Wraps workerSrc path into blob URL, if the former does not belong
|
|
|
|
// to the same origin.
|
|
|
|
if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC') &&
|
|
|
|
!isSameOrigin(window.location.href, workerSrc)) {
|
|
|
|
workerSrc = createCDNWrapper(
|
|
|
|
new URL(workerSrc, window.location).href);
|
|
|
|
}
|
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
// Some versions of FF can't create a worker on localhost, see:
|
|
|
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=683280
|
|
|
|
var worker = new Worker(workerSrc);
|
|
|
|
var messageHandler = new MessageHandler('main', 'worker', worker);
|
2017-05-03 23:39:54 +09:00
|
|
|
var terminateEarly = () => {
|
2015-12-25 21:24:19 +09:00
|
|
|
worker.removeEventListener('error', onWorkerError);
|
2017-10-07 01:55:28 +09:00
|
|
|
messageHandler.destroy();
|
2015-12-25 21:24:19 +09:00
|
|
|
worker.terminate();
|
2015-10-28 02:55:15 +09:00
|
|
|
if (this.destroyed) {
|
|
|
|
this._readyCapability.reject(new Error('Worker was destroyed'));
|
2015-12-25 21:24:19 +09:00
|
|
|
} else {
|
|
|
|
// Fall back to fake worker if the termination is caused by an
|
|
|
|
// error (e.g. NetworkError / SecurityError).
|
|
|
|
this._setupFakeWorker();
|
|
|
|
}
|
2017-05-03 23:39:54 +09:00
|
|
|
};
|
2015-12-25 21:24:19 +09:00
|
|
|
|
2017-05-03 23:39:54 +09:00
|
|
|
var onWorkerError = () => {
|
2015-12-25 21:24:19 +09:00
|
|
|
if (!this._webWorker) {
|
|
|
|
// Worker failed to initialize due to an error. Clean up and fall
|
|
|
|
// back to the fake worker.
|
|
|
|
terminateEarly();
|
|
|
|
}
|
2017-05-03 23:39:54 +09:00
|
|
|
};
|
2015-12-25 21:24:19 +09:00
|
|
|
worker.addEventListener('error', onWorkerError);
|
|
|
|
|
2017-05-03 23:39:54 +09:00
|
|
|
messageHandler.on('test', (data) => {
|
2015-12-25 21:24:19 +09:00
|
|
|
worker.removeEventListener('error', onWorkerError);
|
|
|
|
if (this.destroyed) {
|
|
|
|
terminateEarly();
|
2015-10-28 02:55:15 +09:00
|
|
|
return; // worker was destroyed
|
2013-11-12 12:30:26 +09:00
|
|
|
}
|
Ensure that the correct data is sent, with the `test` message, from the worker if typed arrays aren't properly supported
With native typed array support now being mandatory in PDF.js, since version 2.0, this probably isn't a huge problem even though the current code seems wrong (it was changed in PR 6571).
Note how in the `!(data instanceof Uint8Array)` case we're currently attempting to send `handler.send('test', 'main', false);` to the main-thread, which doesn't really make any sense since the signature of the method reads `send(actionName, data, transfers) {`.
Hence the data that's *actually* being sent here is `'main'`, with `false` as the transferList, which just seems weird. On the main-thread, this means that we're in this case checking `data && data.supportTypedArray`, where `data` contains the string `'main'` rather than being falsy. Since a string doesn't have a `supportTypedArray` property, that check still fails as expected but it doesn't seem great nonetheless.
2018-06-06 03:29:52 +09:00
|
|
|
if (data && data.supportTypedArray) {
|
2015-10-28 02:55:15 +09:00
|
|
|
this._messageHandler = messageHandler;
|
|
|
|
this._port = worker;
|
|
|
|
this._webWorker = worker;
|
|
|
|
if (!data.supportTransfers) {
|
2017-07-01 02:59:52 +09:00
|
|
|
this.postMessageTransfers = false;
|
2015-10-28 02:55:15 +09:00
|
|
|
}
|
|
|
|
this._readyCapability.resolve();
|
2016-03-29 04:49:22 +09:00
|
|
|
// Send global setting, e.g. verbosity level.
|
2016-03-04 01:13:37 +09:00
|
|
|
messageHandler.send('configure', {
|
2018-02-15 01:35:08 +09:00
|
|
|
verbosity: this.verbosity,
|
2016-03-04 01:13:37 +09:00
|
|
|
});
|
2015-10-28 02:55:15 +09:00
|
|
|
} else {
|
|
|
|
this._setupFakeWorker();
|
2017-10-07 01:55:28 +09:00
|
|
|
messageHandler.destroy();
|
2015-10-28 02:55:15 +09:00
|
|
|
worker.terminate();
|
|
|
|
}
|
2017-05-03 23:39:54 +09:00
|
|
|
});
|
2015-10-28 02:55:15 +09:00
|
|
|
|
2017-05-03 23:39:54 +09:00
|
|
|
messageHandler.on('ready', (data) => {
|
2015-12-25 21:24:19 +09:00
|
|
|
worker.removeEventListener('error', onWorkerError);
|
2015-12-17 09:37:43 +09:00
|
|
|
if (this.destroyed) {
|
2015-12-25 21:24:19 +09:00
|
|
|
terminateEarly();
|
2015-12-17 09:37:43 +09:00
|
|
|
return; // worker was destroyed
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
sendTest();
|
2016-12-10 22:28:27 +09:00
|
|
|
} catch (e) {
|
2015-12-17 09:37:43 +09:00
|
|
|
// We need fallback to a faked worker.
|
|
|
|
this._setupFakeWorker();
|
|
|
|
}
|
2017-05-03 23:39:54 +09:00
|
|
|
});
|
2015-12-17 09:37:43 +09:00
|
|
|
|
2018-02-15 00:53:50 +09:00
|
|
|
const sendTest = () => {
|
|
|
|
let testObj = new Uint8Array([this.postMessageTransfers ? 255 : 0]);
|
2015-12-17 09:37:43 +09:00
|
|
|
// Some versions of Opera throw a DATA_CLONE_ERR on serializing the
|
|
|
|
// typed array. Also, checking if we can use transfers.
|
|
|
|
try {
|
|
|
|
messageHandler.send('test', testObj, [testObj.buffer]);
|
|
|
|
} catch (ex) {
|
|
|
|
info('Cannot use postMessage transfers');
|
|
|
|
testObj[0] = 0;
|
|
|
|
messageHandler.send('test', testObj);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// It might take time for worker to initialize (especially when AMD
|
|
|
|
// loader is used). We will try to send test immediately, and then
|
|
|
|
// when 'ready' message will arrive. The worker shall process only
|
|
|
|
// first received 'test'.
|
|
|
|
sendTest();
|
2015-10-28 02:55:15 +09:00
|
|
|
return;
|
|
|
|
} catch (e) {
|
|
|
|
info('The worker has been disabled.');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Either workers are disabled, not supported or have thrown an exception.
|
|
|
|
// Thus, we fallback to a faked worker.
|
|
|
|
this._setupFakeWorker();
|
|
|
|
},
|
2012-04-12 07:52:15 +09:00
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
_setupFakeWorker: function PDFWorker_setupFakeWorker() {
|
2018-01-20 02:16:17 +09:00
|
|
|
if (!isWorkerDisabled) {
|
2015-12-22 04:46:50 +09:00
|
|
|
warn('Setting up fake worker.');
|
2016-03-29 04:49:22 +09:00
|
|
|
isWorkerDisabled = true;
|
2015-12-22 04:46:50 +09:00
|
|
|
}
|
2015-10-28 00:07:20 +09:00
|
|
|
|
2017-05-03 23:39:54 +09:00
|
|
|
setupFakeWorkerGlobal().then((WorkerMessageHandler) => {
|
2015-10-28 02:55:15 +09:00
|
|
|
if (this.destroyed) {
|
|
|
|
this._readyCapability.reject(new Error('Worker was destroyed'));
|
|
|
|
return;
|
2013-11-12 12:30:26 +09:00
|
|
|
}
|
2018-06-06 03:29:37 +09:00
|
|
|
let port = new LoopbackPort();
|
2015-10-28 02:55:15 +09:00
|
|
|
this._port = port;
|
|
|
|
|
|
|
|
// All fake workers use the same port, making id unique.
|
|
|
|
var id = 'fake' + (nextFakeWorkerId++);
|
|
|
|
|
|
|
|
// If the main thread is our worker, setup the handling for the
|
|
|
|
// messages -- the main thread sends to it self.
|
|
|
|
var workerHandler = new MessageHandler(id + '_worker', id, port);
|
2016-03-03 10:16:38 +09:00
|
|
|
WorkerMessageHandler.setup(workerHandler, port);
|
2015-10-28 02:55:15 +09:00
|
|
|
|
|
|
|
var messageHandler = new MessageHandler(id, id + '_worker', port);
|
|
|
|
this._messageHandler = messageHandler;
|
|
|
|
this._readyCapability.resolve();
|
2017-05-03 23:39:54 +09:00
|
|
|
});
|
2015-10-28 02:55:15 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Destroys the worker instance.
|
|
|
|
*/
|
|
|
|
destroy: function PDFWorker_destroy() {
|
|
|
|
this.destroyed = true;
|
|
|
|
if (this._webWorker) {
|
|
|
|
// We need to terminate only web worker created resource.
|
|
|
|
this._webWorker.terminate();
|
|
|
|
this._webWorker = null;
|
|
|
|
}
|
2017-08-03 05:48:42 +09:00
|
|
|
pdfWorkerPorts.delete(this._port);
|
2015-10-28 02:55:15 +09:00
|
|
|
this._port = null;
|
|
|
|
if (this._messageHandler) {
|
2017-10-07 01:55:28 +09:00
|
|
|
this._messageHandler.destroy();
|
2015-10-28 02:55:15 +09:00
|
|
|
this._messageHandler = null;
|
2012-04-12 07:52:15 +09:00
|
|
|
}
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
},
|
2015-10-28 02:55:15 +09:00
|
|
|
};
|
|
|
|
|
2018-02-15 00:03:54 +09:00
|
|
|
/**
|
|
|
|
* @param {PDFWorkerParameters} params - The worker initialization parameters.
|
|
|
|
*/
|
|
|
|
PDFWorker.fromPort = function(params) {
|
2018-06-06 03:29:42 +09:00
|
|
|
if (!params || !params.port) {
|
|
|
|
throw new Error('PDFWorker.fromPort - invalid method signature.');
|
|
|
|
}
|
2018-02-15 00:03:54 +09:00
|
|
|
if (pdfWorkerPorts.has(params.port)) {
|
|
|
|
return pdfWorkerPorts.get(params.port);
|
2017-06-10 10:07:51 +09:00
|
|
|
}
|
2018-02-15 00:03:54 +09:00
|
|
|
return new PDFWorker(params);
|
2017-06-10 10:07:51 +09:00
|
|
|
};
|
|
|
|
|
2018-01-29 23:58:40 +09:00
|
|
|
PDFWorker.getWorkerSrc = function() {
|
|
|
|
return getWorkerSrc();
|
|
|
|
};
|
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
return PDFWorker;
|
|
|
|
})();
|
|
|
|
|
2012-04-14 01:25:08 +09:00
|
|
|
/**
|
|
|
|
* For internal use only.
|
2014-01-22 04:28:18 +09:00
|
|
|
* @ignore
|
2012-04-14 01:25:08 +09:00
|
|
|
*/
|
2012-04-13 04:11:22 +09:00
|
|
|
var WorkerTransport = (function WorkerTransportClosure() {
|
2018-06-06 03:30:14 +09:00
|
|
|
function WorkerTransport(messageHandler, loadingTask, networkStream, params) {
|
2015-10-28 02:55:15 +09:00
|
|
|
this.messageHandler = messageHandler;
|
|
|
|
this.loadingTask = loadingTask;
|
2012-10-29 05:10:34 +09:00
|
|
|
this.commonObjs = new PDFObjects();
|
2015-10-28 07:48:10 +09:00
|
|
|
this.fontLoader = new FontLoader(loadingTask.docId);
|
2018-02-18 00:57:24 +09:00
|
|
|
this._params = params;
|
2018-06-06 03:30:14 +09:00
|
|
|
this.CMapReaderFactory = new params.CMapReaderFactory({
|
2018-02-18 00:57:24 +09:00
|
|
|
baseUrl: params.cMapUrl,
|
|
|
|
isCompressed: params.cMapPacked,
|
2017-02-12 23:54:41 +09:00
|
|
|
});
|
2012-04-12 07:52:15 +09:00
|
|
|
|
2015-10-21 07:45:55 +09:00
|
|
|
this.destroyed = false;
|
|
|
|
this.destroyCapability = null;
|
2016-12-31 21:59:07 +09:00
|
|
|
this._passwordCapability = null;
|
2015-01-06 12:45:01 +09:00
|
|
|
|
2017-07-01 02:59:52 +09:00
|
|
|
this._networkStream = networkStream;
|
|
|
|
this._fullReader = null;
|
|
|
|
this._lastProgress = null;
|
|
|
|
|
2012-04-12 07:52:15 +09:00
|
|
|
this.pageCache = [];
|
2014-05-09 05:02:53 +09:00
|
|
|
this.pagePromises = [];
|
2014-04-30 00:07:05 +09:00
|
|
|
this.downloadInfoCapability = createPromiseCapability();
|
2013-05-10 07:35:23 +09:00
|
|
|
|
2015-10-28 02:55:15 +09:00
|
|
|
this.setupMessageHandler();
|
2012-04-12 07:52:15 +09:00
|
|
|
}
|
|
|
|
WorkerTransport.prototype = {
|
2012-04-12 09:09:55 +09:00
|
|
|
destroy: function WorkerTransport_destroy() {
|
2015-10-21 07:45:55 +09:00
|
|
|
if (this.destroyCapability) {
|
|
|
|
return this.destroyCapability.promise;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.destroyed = true;
|
|
|
|
this.destroyCapability = createPromiseCapability();
|
|
|
|
|
2016-12-31 21:59:07 +09:00
|
|
|
if (this._passwordCapability) {
|
|
|
|
this._passwordCapability.reject(
|
|
|
|
new Error('Worker was destroyed during onPassword callback'));
|
|
|
|
}
|
|
|
|
|
2015-10-21 10:50:32 +09:00
|
|
|
var waitOn = [];
|
|
|
|
// We need to wait for all renderings to be completed, e.g.
|
|
|
|
// timeout/rAF can take a long time.
|
2015-10-21 07:45:55 +09:00
|
|
|
this.pageCache.forEach(function (page) {
|
|
|
|
if (page) {
|
2015-10-21 10:50:32 +09:00
|
|
|
waitOn.push(page._destroy());
|
2015-10-21 07:45:55 +09:00
|
|
|
}
|
|
|
|
});
|
2012-04-13 02:01:07 +09:00
|
|
|
this.pageCache = [];
|
2014-05-09 05:02:53 +09:00
|
|
|
this.pagePromises = [];
|
2015-10-21 10:50:32 +09:00
|
|
|
// We also need to wait for the worker to finish its long running tasks.
|
|
|
|
var terminated = this.messageHandler.sendWithPromise('Terminate', null);
|
|
|
|
waitOn.push(terminated);
|
2017-05-03 23:39:54 +09:00
|
|
|
Promise.all(waitOn).then(() => {
|
|
|
|
this.fontLoader.clear();
|
2017-07-01 02:59:52 +09:00
|
|
|
if (this._networkStream) {
|
|
|
|
this._networkStream.cancelAllRequests();
|
2015-10-21 07:45:55 +09:00
|
|
|
}
|
2017-07-01 02:59:52 +09:00
|
|
|
|
2017-05-03 23:39:54 +09:00
|
|
|
if (this.messageHandler) {
|
2017-10-07 01:55:28 +09:00
|
|
|
this.messageHandler.destroy();
|
2017-05-03 23:39:54 +09:00
|
|
|
this.messageHandler = null;
|
2015-10-28 02:55:15 +09:00
|
|
|
}
|
2017-05-03 23:39:54 +09:00
|
|
|
this.destroyCapability.resolve();
|
2015-10-21 07:45:55 +09:00
|
|
|
}, this.destroyCapability.reject);
|
|
|
|
return this.destroyCapability.promise;
|
2012-04-12 09:09:55 +09:00
|
|
|
},
|
2013-08-13 02:48:06 +09:00
|
|
|
|
2016-12-31 21:59:07 +09:00
|
|
|
setupMessageHandler: function WorkerTransport_setupMessageHandler() {
|
2015-10-28 02:55:15 +09:00
|
|
|
var messageHandler = this.messageHandler;
|
2016-12-31 21:59:07 +09:00
|
|
|
var loadingTask = this.loadingTask;
|
2013-05-10 07:35:23 +09:00
|
|
|
|
2017-07-01 02:59:52 +09:00
|
|
|
messageHandler.on('GetReader', function(data, sink) {
|
|
|
|
assert(this._networkStream);
|
|
|
|
this._fullReader = this._networkStream.getFullReader();
|
|
|
|
this._fullReader.onProgress = (evt) => {
|
|
|
|
this._lastProgress = {
|
|
|
|
loaded: evt.loaded,
|
|
|
|
total: evt.total,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
sink.onPull = () => {
|
|
|
|
this._fullReader.read().then(function({ value, done, }) {
|
|
|
|
if (done) {
|
|
|
|
sink.close();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
assert(isArrayBuffer(value));
|
|
|
|
// Enqueue data chunk into sink, and transfer it
|
|
|
|
// to other side as `Transferable` object.
|
|
|
|
sink.enqueue(new Uint8Array(value), 1, [value]);
|
|
|
|
}).catch((reason) => {
|
|
|
|
sink.error(reason);
|
2013-02-07 08:19:29 +09:00
|
|
|
});
|
2017-07-01 02:59:52 +09:00
|
|
|
};
|
|
|
|
|
|
|
|
sink.onCancel = (reason) => {
|
|
|
|
this._fullReader.cancel(reason);
|
|
|
|
};
|
|
|
|
}, this);
|
|
|
|
|
|
|
|
messageHandler.on('ReaderHeadersReady', function(data) {
|
|
|
|
let headersCapability = createPromiseCapability();
|
|
|
|
let fullReader = this._fullReader;
|
|
|
|
fullReader.headersReady.then(() => {
|
|
|
|
// If stream or range are disabled, it's our only way to report
|
|
|
|
// loading progress.
|
|
|
|
if (!fullReader.isStreamingSupported ||
|
|
|
|
!fullReader.isRangeSupported) {
|
|
|
|
if (this._lastProgress) {
|
|
|
|
let loadingTask = this.loadingTask;
|
|
|
|
if (loadingTask.onProgress) {
|
|
|
|
loadingTask.onProgress(this._lastProgress);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fullReader.onProgress = (evt) => {
|
|
|
|
let loadingTask = this.loadingTask;
|
|
|
|
if (loadingTask.onProgress) {
|
|
|
|
loadingTask.onProgress({
|
|
|
|
loaded: evt.loaded,
|
|
|
|
total: evt.total,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
2013-02-07 08:19:29 +09:00
|
|
|
|
2017-07-01 02:59:52 +09:00
|
|
|
headersCapability.resolve({
|
|
|
|
isStreamingSupported: fullReader.isStreamingSupported,
|
|
|
|
isRangeSupported: fullReader.isRangeSupported,
|
|
|
|
contentLength: fullReader.contentLength,
|
2013-04-20 05:53:22 +09:00
|
|
|
});
|
2017-07-01 02:59:52 +09:00
|
|
|
}, headersCapability.reject);
|
|
|
|
|
|
|
|
return headersCapability.promise;
|
|
|
|
}, this);
|
2013-04-20 05:53:22 +09:00
|
|
|
|
2017-07-01 02:59:52 +09:00
|
|
|
messageHandler.on('GetRangeReader', function(data, sink) {
|
|
|
|
assert(this._networkStream);
|
|
|
|
let _rangeReader =
|
|
|
|
this._networkStream.getRangeReader(data.begin, data.end);
|
|
|
|
|
|
|
|
sink.onPull = () => {
|
|
|
|
_rangeReader.read().then(function({ value, done, }) {
|
|
|
|
if (done) {
|
|
|
|
sink.close();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
assert(isArrayBuffer(value));
|
|
|
|
sink.enqueue(new Uint8Array(value), 1, [value]);
|
|
|
|
}).catch((reason) => {
|
|
|
|
sink.error(reason);
|
2014-09-06 10:02:54 +09:00
|
|
|
});
|
2017-07-01 02:59:52 +09:00
|
|
|
};
|
2014-09-06 10:02:54 +09:00
|
|
|
|
2017-07-01 02:59:52 +09:00
|
|
|
sink.onCancel = (reason) => {
|
|
|
|
_rangeReader.cancel(reason);
|
|
|
|
};
|
|
|
|
}, this);
|
2013-02-07 08:19:29 +09:00
|
|
|
|
2017-12-21 20:03:59 +09:00
|
|
|
messageHandler.on('GetDoc', function transportDoc({ pdfInfo, }) {
|
|
|
|
this.numPages = pdfInfo.numPages;
|
2015-10-21 07:45:55 +09:00
|
|
|
var loadingTask = this.loadingTask;
|
|
|
|
var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask);
|
2012-04-12 07:52:15 +09:00
|
|
|
this.pdfDocument = pdfDocument;
|
2015-10-21 07:45:55 +09:00
|
|
|
loadingTask._capability.resolve(pdfDocument);
|
2012-04-12 07:52:15 +09:00
|
|
|
}, this);
|
|
|
|
|
2016-12-31 21:59:07 +09:00
|
|
|
messageHandler.on('PasswordRequest',
|
|
|
|
function transportPasswordRequest(exception) {
|
|
|
|
this._passwordCapability = createPromiseCapability();
|
|
|
|
|
2015-01-06 12:45:01 +09:00
|
|
|
if (loadingTask.onPassword) {
|
2017-04-25 23:17:18 +09:00
|
|
|
var updatePassword = (password) => {
|
2016-12-31 21:59:07 +09:00
|
|
|
this._passwordCapability.resolve({
|
2017-04-25 23:17:18 +09:00
|
|
|
password,
|
2016-12-31 21:59:07 +09:00
|
|
|
});
|
2017-04-25 23:17:18 +09:00
|
|
|
};
|
2018-06-01 19:52:47 +09:00
|
|
|
try {
|
|
|
|
loadingTask.onPassword(updatePassword, exception.code);
|
|
|
|
} catch (ex) {
|
|
|
|
this._passwordCapability.reject(ex);
|
|
|
|
}
|
2016-12-31 21:59:07 +09:00
|
|
|
} else {
|
|
|
|
this._passwordCapability.reject(
|
|
|
|
new PasswordException(exception.message, exception.code));
|
2013-05-10 07:35:23 +09:00
|
|
|
}
|
2016-12-31 21:59:07 +09:00
|
|
|
return this._passwordCapability.promise;
|
2012-05-15 03:45:07 +09:00
|
|
|
}, this);
|
|
|
|
|
2016-12-31 21:59:07 +09:00
|
|
|
messageHandler.on('PasswordException',
|
|
|
|
function transportPasswordException(exception) {
|
2015-01-06 12:45:01 +09:00
|
|
|
loadingTask._capability.reject(
|
2014-08-23 23:03:49 +09:00
|
|
|
new PasswordException(exception.message, exception.code));
|
2012-05-15 03:45:07 +09:00
|
|
|
}, this);
|
|
|
|
|
2014-08-23 23:03:49 +09:00
|
|
|
messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) {
|
2015-01-06 12:45:01 +09:00
|
|
|
this.loadingTask._capability.reject(
|
2014-08-23 23:03:49 +09:00
|
|
|
new InvalidPDFException(exception.message));
|
2012-10-16 19:10:37 +09:00
|
|
|
}, this);
|
|
|
|
|
2014-08-23 23:03:49 +09:00
|
|
|
messageHandler.on('MissingPDF', function transportMissingPDF(exception) {
|
2015-01-06 12:45:01 +09:00
|
|
|
this.loadingTask._capability.reject(
|
2014-08-23 23:03:49 +09:00
|
|
|
new MissingPDFException(exception.message));
|
2013-01-30 03:13:28 +09:00
|
|
|
}, this);
|
|
|
|
|
2014-09-13 23:47:16 +09:00
|
|
|
messageHandler.on('UnexpectedResponse',
|
|
|
|
function transportUnexpectedResponse(exception) {
|
2015-01-06 12:45:01 +09:00
|
|
|
this.loadingTask._capability.reject(
|
2014-09-13 23:47:16 +09:00
|
|
|
new UnexpectedResponseException(exception.message, exception.status));
|
|
|
|
}, this);
|
|
|
|
|
2014-08-23 23:03:49 +09:00
|
|
|
messageHandler.on('UnknownError',
|
|
|
|
function transportUnknownError(exception) {
|
2015-01-06 12:45:01 +09:00
|
|
|
this.loadingTask._capability.reject(
|
2014-08-23 23:03:49 +09:00
|
|
|
new UnknownErrorException(exception.message, exception.details));
|
2012-10-16 19:10:37 +09:00
|
|
|
}, this);
|
|
|
|
|
2014-01-29 06:13:47 +09:00
|
|
|
messageHandler.on('DataLoaded', function transportPage(data) {
|
2014-04-30 00:07:05 +09:00
|
|
|
this.downloadInfoCapability.resolve(data);
|
2014-01-29 06:13:47 +09:00
|
|
|
}, this);
|
|
|
|
|
2013-08-01 03:17:36 +09:00
|
|
|
messageHandler.on('StartRenderPage', function transportRender(data) {
|
2015-10-24 03:44:18 +09:00
|
|
|
if (this.destroyed) {
|
|
|
|
return; // Ignore any pending requests if the worker was terminated.
|
|
|
|
}
|
2012-04-13 02:01:07 +09:00
|
|
|
var page = this.pageCache[data.pageIndex];
|
2012-04-12 07:52:15 +09:00
|
|
|
|
[api-major] Only create a `StatTimer` for pages when `enableStats == true` (issue 5215)
Unless the debugging tools (i.e. `PDFBug`) are enabled, or the `browsertest` is running, the `PDFPageProxy.stats` aren't actually used for anything.
Rather than initializing unnecessary `StatTimer` instances, we can simply re-use *one* dummy class (with static methods) for every page. Note that by using a dummy `StatTimer` in this way, rather than letting `PDFPageProxy.stats` be undefined, we don't need to guard *every* single stats collection callsite.
Since it wouldn't make much sense to attempt to use `PDFPageProxy.stats` when stat collection is disabled, it was instead changed to a "private" property (i.e. `PDFPageProxy._stats`) and a getter was added for accessing `PDFPageProxy.stats`. This getter will now return `null` when stat collection is disabled, making that case easy to handle.
For benchmarking purposes, the test-suite used to re-create the `StatTimer` after loading/rendering each page. However, modifying properties on various API code from the outside in this way seems very error-prone, and is an anti-pattern that we really should avoid at all cost. Hence the `PDFPageProxy.cleanup` method was modified to accept an optional parameter, which will take care of resetting `this.stats` when necessary, and `test/driver.js` was updated accordingly.
Finally, a tiny bit more validation was added on the viewer side, to ensure that all the code we're attempting to access is defined when handling `PDFPageProxy` stats.
2017-12-07 00:30:04 +09:00
|
|
|
page._stats.timeEnd('Page Request');
|
2014-03-07 23:48:42 +09:00
|
|
|
page._startRenderPage(data.transparency, data.intent);
|
2013-08-01 03:17:36 +09:00
|
|
|
}, this);
|
|
|
|
|
|
|
|
messageHandler.on('RenderPageChunk', function transportRender(data) {
|
2015-10-24 03:44:18 +09:00
|
|
|
if (this.destroyed) {
|
|
|
|
return; // Ignore any pending requests if the worker was terminated.
|
|
|
|
}
|
2013-08-01 03:17:36 +09:00
|
|
|
var page = this.pageCache[data.pageIndex];
|
|
|
|
|
2014-03-07 23:48:42 +09:00
|
|
|
page._renderPageChunk(data.operatorList, data.intent);
|
2012-04-12 07:52:15 +09:00
|
|
|
}, this);
|
|
|
|
|
2012-10-29 05:10:34 +09:00
|
|
|
messageHandler.on('commonobj', function transportObj(data) {
|
2015-10-30 03:06:22 +09:00
|
|
|
if (this.destroyed) {
|
|
|
|
return; // Ignore any pending requests if the worker was terminated.
|
|
|
|
}
|
|
|
|
|
2012-04-12 07:52:15 +09:00
|
|
|
var id = data[0];
|
|
|
|
var type = data[1];
|
2014-03-14 21:24:04 +09:00
|
|
|
if (this.commonObjs.hasData(id)) {
|
2012-04-17 08:44:51 +09:00
|
|
|
return;
|
2014-03-14 21:24:04 +09:00
|
|
|
}
|
2012-04-12 07:52:15 +09:00
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case 'Font':
|
2012-09-13 09:31:04 +09:00
|
|
|
var exportedData = data[2];
|
2018-02-18 05:49:14 +09:00
|
|
|
let params = this._params;
|
2012-04-12 07:52:15 +09:00
|
|
|
|
2013-08-01 03:17:36 +09:00
|
|
|
if ('error' in exportedData) {
|
2016-04-22 17:02:17 +09:00
|
|
|
var exportedError = exportedData.error;
|
|
|
|
warn('Error during font loading: ' + exportedError);
|
|
|
|
this.commonObjs.resolve(id, exportedError);
|
2013-08-01 03:17:36 +09:00
|
|
|
break;
|
|
|
|
}
|
2016-04-22 17:02:17 +09:00
|
|
|
var fontRegistry = null;
|
2018-02-18 07:13:49 +09:00
|
|
|
if (params.pdfBug && globalScope.FontInspector &&
|
|
|
|
globalScope.FontInspector.enabled) {
|
2016-04-22 17:02:17 +09:00
|
|
|
fontRegistry = {
|
2017-04-25 23:17:18 +09:00
|
|
|
registerFont(font, url) {
|
2016-04-22 17:02:17 +09:00
|
|
|
globalScope['FontInspector'].fontAdded(font, url);
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
},
|
2016-04-22 17:02:17 +09:00
|
|
|
};
|
|
|
|
}
|
|
|
|
var font = new FontFaceObject(exportedData, {
|
2018-02-18 05:49:14 +09:00
|
|
|
isEvalSupported: params.isEvalSupported,
|
2018-02-18 05:57:20 +09:00
|
|
|
disableFontFace: params.disableFontFace,
|
2017-04-25 23:17:18 +09:00
|
|
|
fontRegistry,
|
2016-04-22 17:02:17 +09:00
|
|
|
});
|
2017-05-03 23:39:54 +09:00
|
|
|
var fontReady = (fontObjs) => {
|
|
|
|
this.commonObjs.resolve(id, font);
|
|
|
|
};
|
2013-08-01 03:17:36 +09:00
|
|
|
|
2017-05-03 23:39:54 +09:00
|
|
|
this.fontLoader.bind([font], fontReady);
|
2012-10-29 05:10:34 +09:00
|
|
|
break;
|
2013-08-20 08:33:20 +09:00
|
|
|
case 'FontPath':
|
|
|
|
this.commonObjs.resolve(id, data[2]);
|
|
|
|
break;
|
2012-10-29 05:10:34 +09:00
|
|
|
default:
|
2017-06-29 05:51:31 +09:00
|
|
|
throw new Error(`Got unknown common object type ${type}`);
|
2012-10-29 05:10:34 +09:00
|
|
|
}
|
|
|
|
}, this);
|
|
|
|
|
|
|
|
messageHandler.on('obj', function transportObj(data) {
|
2015-10-30 03:06:22 +09:00
|
|
|
if (this.destroyed) {
|
|
|
|
return; // Ignore any pending requests if the worker was terminated.
|
|
|
|
}
|
|
|
|
|
2012-10-29 05:10:34 +09:00
|
|
|
var id = data[0];
|
|
|
|
var pageIndex = data[1];
|
|
|
|
var type = data[2];
|
|
|
|
var pageProxy = this.pageCache[pageIndex];
|
2014-04-09 04:48:16 +09:00
|
|
|
var imageData;
|
2014-03-07 23:48:42 +09:00
|
|
|
if (pageProxy.objs.hasData(id)) {
|
2012-10-29 05:10:34 +09:00
|
|
|
return;
|
2014-03-07 23:48:42 +09:00
|
|
|
}
|
2012-10-29 05:10:34 +09:00
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case 'JpegStream':
|
2014-04-09 04:48:16 +09:00
|
|
|
imageData = data[3];
|
2018-02-02 00:43:10 +09:00
|
|
|
return new Promise((resolve, reject) => {
|
2018-02-01 23:38:17 +09:00
|
|
|
const img = new Image();
|
|
|
|
img.onload = function() {
|
|
|
|
resolve(img);
|
|
|
|
};
|
|
|
|
img.onerror = function() {
|
|
|
|
reject(new Error('Error during JPEG image loading'));
|
2018-02-02 00:43:10 +09:00
|
|
|
// Note that when the browser image loading/decoding fails,
|
|
|
|
// we'll fallback to the built-in PDF.js JPEG decoder; see
|
|
|
|
// `PartialEvaluator.buildPaintImageXObject` in the
|
|
|
|
// `src/core/evaluator.js` file.
|
2018-02-01 23:38:17 +09:00
|
|
|
};
|
|
|
|
img.src = imageData;
|
|
|
|
}).then((img) => {
|
|
|
|
pageProxy.objs.resolve(id, img);
|
|
|
|
});
|
2012-10-29 05:10:34 +09:00
|
|
|
case 'Image':
|
2014-04-09 04:48:16 +09:00
|
|
|
imageData = data[3];
|
2012-10-29 05:10:34 +09:00
|
|
|
pageProxy.objs.resolve(id, imageData);
|
|
|
|
|
|
|
|
// heuristics that will allow not to store large data
|
|
|
|
var MAX_IMAGE_SIZE_TO_STORE = 8000000;
|
2014-04-15 05:22:35 +09:00
|
|
|
if (imageData && 'data' in imageData &&
|
2012-10-29 05:10:34 +09:00
|
|
|
imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {
|
|
|
|
pageProxy.cleanupAfterRender = true;
|
|
|
|
}
|
2012-04-12 07:52:15 +09:00
|
|
|
break;
|
|
|
|
default:
|
2017-06-29 05:51:31 +09:00
|
|
|
throw new Error(`Got unknown object type ${type}`);
|
2012-04-12 07:52:15 +09:00
|
|
|
}
|
|
|
|
}, this);
|
|
|
|
|
2012-06-24 04:48:33 +09:00
|
|
|
messageHandler.on('DocProgress', function transportDocProgress(data) {
|
2015-10-30 03:06:22 +09:00
|
|
|
if (this.destroyed) {
|
|
|
|
return; // Ignore any pending requests if the worker was terminated.
|
|
|
|
}
|
|
|
|
|
2015-01-06 12:45:01 +09:00
|
|
|
var loadingTask = this.loadingTask;
|
|
|
|
if (loadingTask.onProgress) {
|
|
|
|
loadingTask.onProgress({
|
2013-06-15 23:04:54 +09:00
|
|
|
loaded: data.loaded,
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
total: data.total,
|
2013-06-15 23:04:54 +09:00
|
|
|
});
|
|
|
|
}
|
2012-06-24 04:48:33 +09:00
|
|
|
}, this);
|
|
|
|
|
2014-05-08 08:15:25 +09:00
|
|
|
messageHandler.on('PageError', function transportError(data) {
|
2015-10-30 03:06:22 +09:00
|
|
|
if (this.destroyed) {
|
|
|
|
return; // Ignore any pending requests if the worker was terminated.
|
|
|
|
}
|
|
|
|
|
2012-04-13 07:14:18 +09:00
|
|
|
var page = this.pageCache[data.pageNum - 1];
|
2014-05-08 08:15:25 +09:00
|
|
|
var intentState = page.intentStates[data.intent];
|
2016-03-11 22:59:09 +09:00
|
|
|
|
2014-08-14 03:59:28 +09:00
|
|
|
if (intentState.displayReadyCapability) {
|
2014-04-30 00:07:05 +09:00
|
|
|
intentState.displayReadyCapability.reject(data.error);
|
2014-03-14 21:24:04 +09:00
|
|
|
} else {
|
2017-06-29 05:51:31 +09:00
|
|
|
throw new Error(data.error);
|
2014-03-14 21:24:04 +09:00
|
|
|
}
|
2016-03-11 22:59:09 +09:00
|
|
|
|
|
|
|
if (intentState.operatorList) {
|
|
|
|
// Mark operator list as complete.
|
|
|
|
intentState.operatorList.lastChunk = true;
|
|
|
|
for (var i = 0; i < intentState.renderTasks.length; i++) {
|
|
|
|
intentState.renderTasks[i].operatorListChanged();
|
|
|
|
}
|
|
|
|
}
|
2012-04-12 07:52:15 +09:00
|
|
|
}, this);
|
|
|
|
|
2017-10-01 22:13:19 +09:00
|
|
|
messageHandler.on('UnsupportedFeature', function(data) {
|
2015-12-01 05:42:47 +09:00
|
|
|
if (this.destroyed) {
|
|
|
|
return; // Ignore any pending requests if the worker was terminated.
|
|
|
|
}
|
2017-10-01 22:13:19 +09:00
|
|
|
let loadingTask = this.loadingTask;
|
2015-12-01 05:42:47 +09:00
|
|
|
if (loadingTask.onUnsupportedFeature) {
|
2017-10-01 22:13:19 +09:00
|
|
|
loadingTask.onUnsupportedFeature(data.featureId);
|
2015-12-01 05:42:47 +09:00
|
|
|
}
|
|
|
|
}, this);
|
|
|
|
|
2014-05-08 08:15:25 +09:00
|
|
|
messageHandler.on('JpegDecode', function(data) {
|
2015-10-30 03:06:22 +09:00
|
|
|
if (this.destroyed) {
|
2016-09-05 21:43:16 +09:00
|
|
|
return Promise.reject(new Error('Worker was destroyed'));
|
2015-10-30 03:06:22 +09:00
|
|
|
}
|
|
|
|
|
2017-01-28 02:58:39 +09:00
|
|
|
if (typeof document === 'undefined') {
|
|
|
|
// Make sure that this code is not executing in node.js, as
|
|
|
|
// it's using DOM image, and there is no library to support that.
|
|
|
|
return Promise.reject(new Error('"document" is not defined.'));
|
|
|
|
}
|
|
|
|
|
2013-11-12 13:25:03 +09:00
|
|
|
var imageUrl = data[0];
|
2012-04-12 07:52:15 +09:00
|
|
|
var components = data[1];
|
2014-08-01 19:39:31 +09:00
|
|
|
if (components !== 3 && components !== 1) {
|
2014-05-08 08:15:25 +09:00
|
|
|
return Promise.reject(
|
2014-05-09 05:02:53 +09:00
|
|
|
new Error('Only 3 components or 1 component can be returned'));
|
2014-03-14 21:24:04 +09:00
|
|
|
}
|
2012-04-12 07:52:15 +09:00
|
|
|
|
2014-05-08 08:15:25 +09:00
|
|
|
return new Promise(function (resolve, reject) {
|
|
|
|
var img = new Image();
|
|
|
|
img.onload = function () {
|
|
|
|
var width = img.width;
|
|
|
|
var height = img.height;
|
|
|
|
var size = width * height;
|
|
|
|
var rgbaLength = size * 4;
|
2018-06-06 03:29:47 +09:00
|
|
|
var buf = new Uint8ClampedArray(size * components);
|
2017-01-28 02:58:39 +09:00
|
|
|
var tmpCanvas = document.createElement('canvas');
|
|
|
|
tmpCanvas.width = width;
|
|
|
|
tmpCanvas.height = height;
|
2014-05-08 08:15:25 +09:00
|
|
|
var tmpCtx = tmpCanvas.getContext('2d');
|
|
|
|
tmpCtx.drawImage(img, 0, 0);
|
|
|
|
var data = tmpCtx.getImageData(0, 0, width, height).data;
|
|
|
|
var i, j;
|
|
|
|
|
2014-08-01 19:39:31 +09:00
|
|
|
if (components === 3) {
|
2014-05-08 08:15:25 +09:00
|
|
|
for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
|
|
|
|
buf[j] = data[i];
|
|
|
|
buf[j + 1] = data[i + 1];
|
|
|
|
buf[j + 2] = data[i + 2];
|
|
|
|
}
|
2014-08-01 19:39:31 +09:00
|
|
|
} else if (components === 1) {
|
2014-05-08 08:15:25 +09:00
|
|
|
for (i = 0, j = 0; i < rgbaLength; i += 4, j++) {
|
|
|
|
buf[j] = data[i];
|
|
|
|
}
|
2012-04-12 07:52:15 +09:00
|
|
|
}
|
2017-04-25 23:17:18 +09:00
|
|
|
resolve({ data: buf, width, height, });
|
2014-05-08 08:15:25 +09:00
|
|
|
};
|
|
|
|
img.onerror = function () {
|
|
|
|
reject(new Error('JpegDecode failed to load image'));
|
|
|
|
};
|
|
|
|
img.src = imageUrl;
|
|
|
|
});
|
2015-10-30 03:06:22 +09:00
|
|
|
}, this);
|
2017-02-12 23:54:41 +09:00
|
|
|
|
|
|
|
messageHandler.on('FetchBuiltInCMap', function (data) {
|
|
|
|
if (this.destroyed) {
|
|
|
|
return Promise.reject(new Error('Worker was destroyed'));
|
|
|
|
}
|
|
|
|
return this.CMapReaderFactory.fetch({
|
|
|
|
name: data.name,
|
|
|
|
});
|
|
|
|
}, this);
|
2012-04-12 07:52:15 +09:00
|
|
|
},
|
|
|
|
|
2014-05-14 08:20:21 +09:00
|
|
|
getData: function WorkerTransport_getData() {
|
|
|
|
return this.messageHandler.sendWithPromise('GetData', null);
|
2012-06-02 06:17:09 +09:00
|
|
|
},
|
|
|
|
|
2017-11-25 19:49:33 +09:00
|
|
|
getPage(pageNumber) {
|
2017-09-01 23:52:50 +09:00
|
|
|
if (!Number.isInteger(pageNumber) ||
|
|
|
|
pageNumber <= 0 || pageNumber > this.numPages) {
|
2014-05-08 06:25:24 +09:00
|
|
|
return Promise.reject(new Error('Invalid page request'));
|
2014-02-24 03:16:14 +09:00
|
|
|
}
|
|
|
|
|
2012-04-13 02:01:07 +09:00
|
|
|
var pageIndex = pageNumber - 1;
|
2014-05-09 05:02:53 +09:00
|
|
|
if (pageIndex in this.pagePromises) {
|
|
|
|
return this.pagePromises[pageIndex];
|
2014-03-14 21:24:04 +09:00
|
|
|
}
|
2014-05-09 05:02:53 +09:00
|
|
|
var promise = this.messageHandler.sendWithPromise('GetPage', {
|
2017-04-25 23:17:18 +09:00
|
|
|
pageIndex,
|
2017-05-03 23:39:54 +09:00
|
|
|
}).then((pageInfo) => {
|
2015-10-21 07:45:55 +09:00
|
|
|
if (this.destroyed) {
|
|
|
|
throw new Error('Transport destroyed');
|
|
|
|
}
|
2018-02-18 07:13:49 +09:00
|
|
|
let page = new PDFPageProxy(pageIndex, pageInfo, this,
|
|
|
|
this._params.pdfBug);
|
2014-05-09 05:02:53 +09:00
|
|
|
this.pageCache[pageIndex] = page;
|
|
|
|
return page;
|
2017-05-03 23:39:54 +09:00
|
|
|
});
|
2014-05-09 05:02:53 +09:00
|
|
|
this.pagePromises[pageIndex] = promise;
|
|
|
|
return promise;
|
2012-04-15 05:54:31 +09:00
|
|
|
},
|
|
|
|
|
2013-11-14 08:27:46 +09:00
|
|
|
getPageIndex: function WorkerTransport_getPageIndexByRef(ref) {
|
2016-09-05 21:43:16 +09:00
|
|
|
return this.messageHandler.sendWithPromise('GetPageIndex', {
|
2017-04-25 23:17:18 +09:00
|
|
|
ref,
|
2016-09-05 21:43:16 +09:00
|
|
|
}).catch(function (reason) {
|
|
|
|
return Promise.reject(new Error(reason));
|
|
|
|
});
|
2013-11-14 08:27:46 +09:00
|
|
|
},
|
|
|
|
|
2015-11-22 21:56:52 +09:00
|
|
|
getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) {
|
|
|
|
return this.messageHandler.sendWithPromise('GetAnnotations', {
|
2017-04-25 23:17:18 +09:00
|
|
|
pageIndex,
|
|
|
|
intent,
|
2015-11-22 21:56:52 +09:00
|
|
|
});
|
2013-02-07 08:19:29 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
getDestinations: function WorkerTransport_getDestinations() {
|
2014-05-08 08:15:25 +09:00
|
|
|
return this.messageHandler.sendWithPromise('GetDestinations', null);
|
2013-11-15 06:43:38 +09:00
|
|
|
},
|
|
|
|
|
2014-10-05 22:56:40 +09:00
|
|
|
getDestination: function WorkerTransport_getDestination(id) {
|
2017-04-25 23:17:18 +09:00
|
|
|
return this.messageHandler.sendWithPromise('GetDestination', {
|
|
|
|
id,
|
|
|
|
});
|
2014-10-05 22:56:40 +09:00
|
|
|
},
|
|
|
|
|
2015-12-26 05:57:08 +09:00
|
|
|
getPageLabels: function WorkerTransport_getPageLabels() {
|
|
|
|
return this.messageHandler.sendWithPromise('GetPageLabels', null);
|
|
|
|
},
|
|
|
|
|
2017-07-18 20:08:02 +09:00
|
|
|
getPageMode() {
|
|
|
|
return this.messageHandler.sendWithPromise('GetPageMode', null);
|
|
|
|
},
|
|
|
|
|
2014-03-19 05:32:47 +09:00
|
|
|
getAttachments: function WorkerTransport_getAttachments() {
|
2014-05-08 08:15:25 +09:00
|
|
|
return this.messageHandler.sendWithPromise('GetAttachments', null);
|
2014-03-19 05:32:47 +09:00
|
|
|
},
|
|
|
|
|
2014-05-08 04:15:34 +09:00
|
|
|
getJavaScript: function WorkerTransport_getJavaScript() {
|
2014-05-08 08:15:25 +09:00
|
|
|
return this.messageHandler.sendWithPromise('GetJavaScript', null);
|
2014-05-08 04:15:34 +09:00
|
|
|
},
|
|
|
|
|
2014-05-08 04:06:44 +09:00
|
|
|
getOutline: function WorkerTransport_getOutline() {
|
2014-05-08 08:15:25 +09:00
|
|
|
return this.messageHandler.sendWithPromise('GetOutline', null);
|
2014-05-08 04:06:44 +09:00
|
|
|
},
|
|
|
|
|
2014-05-08 04:38:40 +09:00
|
|
|
getMetadata: function WorkerTransport_getMetadata() {
|
2014-05-08 08:15:25 +09:00
|
|
|
return this.messageHandler.sendWithPromise('GetMetadata', null).
|
2018-01-17 00:24:36 +09:00
|
|
|
then((results) => {
|
2014-05-08 08:15:25 +09:00
|
|
|
return {
|
|
|
|
info: results[0],
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
metadata: (results[1] ? new Metadata(results[1]) : null),
|
2018-01-17 00:24:36 +09:00
|
|
|
contentDispositionFilename: (this._fullReader ?
|
|
|
|
this._fullReader.filename : null),
|
2014-05-08 08:15:25 +09:00
|
|
|
};
|
2018-01-17 00:24:36 +09:00
|
|
|
});
|
2014-05-08 04:38:40 +09:00
|
|
|
},
|
|
|
|
|
2014-06-16 23:52:04 +09:00
|
|
|
getStats: function WorkerTransport_getStats() {
|
|
|
|
return this.messageHandler.sendWithPromise('GetStats', null);
|
|
|
|
},
|
|
|
|
|
2013-11-15 06:43:38 +09:00
|
|
|
startCleanup: function WorkerTransport_startCleanup() {
|
2017-05-03 23:39:54 +09:00
|
|
|
this.messageHandler.sendWithPromise('Cleanup', null).then(() => {
|
2014-05-08 08:15:25 +09:00
|
|
|
for (var i = 0, ii = this.pageCache.length; i < ii; i++) {
|
|
|
|
var page = this.pageCache[i];
|
|
|
|
if (page) {
|
2015-10-21 07:45:55 +09:00
|
|
|
page.cleanup();
|
2013-11-15 06:43:38 +09:00
|
|
|
}
|
2014-05-08 08:15:25 +09:00
|
|
|
}
|
|
|
|
this.commonObjs.clear();
|
2015-10-28 07:48:10 +09:00
|
|
|
this.fontLoader.clear();
|
2017-05-03 23:39:54 +09:00
|
|
|
});
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
},
|
2018-02-18 06:08:45 +09:00
|
|
|
|
|
|
|
get loadingParams() {
|
|
|
|
let params = this._params;
|
|
|
|
return shadow(this, 'loadingParams', {
|
2018-02-18 06:22:10 +09:00
|
|
|
disableRange: params.disableRange,
|
2018-02-18 06:28:08 +09:00
|
|
|
disableStream: params.disableStream,
|
2018-02-18 06:08:45 +09:00
|
|
|
disableAutoFetch: params.disableAutoFetch,
|
2018-02-18 06:51:03 +09:00
|
|
|
disableCreateObjectURL: params.disableCreateObjectURL,
|
2018-06-01 19:52:29 +09:00
|
|
|
disableFontFace: params.disableFontFace,
|
|
|
|
nativeImageDecoderSupport: params.nativeImageDecoderSupport,
|
2018-02-18 06:08:45 +09:00
|
|
|
});
|
|
|
|
},
|
2012-04-12 07:52:15 +09:00
|
|
|
};
|
2012-04-13 04:11:22 +09:00
|
|
|
return WorkerTransport;
|
2012-04-12 07:52:15 +09:00
|
|
|
|
2012-04-10 14:20:57 +09:00
|
|
|
})();
|
2013-08-01 03:17:36 +09:00
|
|
|
|
|
|
|
/**
|
2013-08-13 02:48:06 +09:00
|
|
|
* A PDF document and page is built of many objects. E.g. there are objects
|
|
|
|
* for fonts, images, rendering code and such. These objects might get processed
|
|
|
|
* inside of a worker. The `PDFObjects` implements some basic functions to
|
|
|
|
* manage these objects.
|
2014-01-22 04:28:18 +09:00
|
|
|
* @ignore
|
2013-08-13 02:48:06 +09:00
|
|
|
*/
|
|
|
|
var PDFObjects = (function PDFObjectsClosure() {
|
|
|
|
function PDFObjects() {
|
2016-01-28 02:04:13 +09:00
|
|
|
this.objs = Object.create(null);
|
2013-08-13 02:48:06 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
PDFObjects.prototype = {
|
|
|
|
/**
|
|
|
|
* Internal function.
|
|
|
|
* Ensures there is an object defined for `objId`.
|
|
|
|
*/
|
|
|
|
ensureObj: function PDFObjects_ensureObj(objId) {
|
2014-03-14 21:24:04 +09:00
|
|
|
if (this.objs[objId]) {
|
2013-08-13 02:48:06 +09:00
|
|
|
return this.objs[objId];
|
2014-03-14 21:24:04 +09:00
|
|
|
}
|
2013-08-13 02:48:06 +09:00
|
|
|
|
|
|
|
var obj = {
|
2014-04-30 00:07:05 +09:00
|
|
|
capability: createPromiseCapability(),
|
2013-08-13 02:48:06 +09:00
|
|
|
data: null,
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
resolved: false,
|
2013-08-13 02:48:06 +09:00
|
|
|
};
|
|
|
|
this.objs[objId] = obj;
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* If called *without* callback, this returns the data of `objId` but the
|
|
|
|
* object needs to be resolved. If it isn't, this function throws.
|
|
|
|
*
|
|
|
|
* If called *with* a callback, the callback is called with the data of the
|
|
|
|
* object once the object is resolved. That means, if you call this
|
|
|
|
* function and the object is already resolved, the callback gets called
|
|
|
|
* right away.
|
|
|
|
*/
|
|
|
|
get: function PDFObjects_get(objId, callback) {
|
|
|
|
// If there is a callback, then the get can be async and the object is
|
|
|
|
// not required to be resolved right now
|
|
|
|
if (callback) {
|
2014-04-30 00:07:05 +09:00
|
|
|
this.ensureObj(objId).capability.promise.then(callback);
|
2013-08-13 02:48:06 +09:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If there isn't a callback, the user expects to get the resolved data
|
|
|
|
// directly.
|
|
|
|
var obj = this.objs[objId];
|
|
|
|
|
|
|
|
// If there isn't an object yet or the object isn't resolved, then the
|
|
|
|
// data isn't ready yet!
|
2014-03-14 21:24:04 +09:00
|
|
|
if (!obj || !obj.resolved) {
|
2017-06-29 05:51:31 +09:00
|
|
|
throw new Error(`Requesting object that isn't resolved yet ${objId}`);
|
2014-03-14 21:24:04 +09:00
|
|
|
}
|
2013-08-13 02:48:06 +09:00
|
|
|
|
|
|
|
return obj.data;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Resolves the object `objId` with optional `data`.
|
|
|
|
*/
|
|
|
|
resolve: function PDFObjects_resolve(objId, data) {
|
|
|
|
var obj = this.ensureObj(objId);
|
|
|
|
|
|
|
|
obj.resolved = true;
|
|
|
|
obj.data = data;
|
2014-04-30 00:07:05 +09:00
|
|
|
obj.capability.resolve(data);
|
2013-08-13 02:48:06 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
isResolved: function PDFObjects_isResolved(objId) {
|
|
|
|
var objs = this.objs;
|
|
|
|
|
|
|
|
if (!objs[objId]) {
|
|
|
|
return false;
|
|
|
|
}
|
2016-12-16 21:05:33 +09:00
|
|
|
return objs[objId].resolved;
|
2013-08-13 02:48:06 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
hasData: function PDFObjects_hasData(objId) {
|
|
|
|
return this.isResolved(objId);
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the data of `objId` if object exists, null otherwise.
|
|
|
|
*/
|
|
|
|
getData: function PDFObjects_getData(objId) {
|
|
|
|
var objs = this.objs;
|
|
|
|
if (!objs[objId] || !objs[objId].resolved) {
|
|
|
|
return null;
|
|
|
|
}
|
2016-12-16 21:05:33 +09:00
|
|
|
return objs[objId].data;
|
2013-08-13 02:48:06 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
clear: function PDFObjects_clear() {
|
2016-01-28 02:04:13 +09:00
|
|
|
this.objs = Object.create(null);
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
},
|
2013-08-13 02:48:06 +09:00
|
|
|
};
|
|
|
|
return PDFObjects;
|
|
|
|
})();
|
2014-01-04 09:17:05 +09:00
|
|
|
|
2014-01-22 04:28:18 +09:00
|
|
|
/**
|
|
|
|
* Allows controlling of the rendering tasks.
|
|
|
|
* @class
|
2015-11-13 04:39:58 +09:00
|
|
|
* @alias RenderTask
|
2014-01-22 04:28:18 +09:00
|
|
|
*/
|
2013-08-01 03:17:36 +09:00
|
|
|
var RenderTask = (function RenderTaskClosure() {
|
|
|
|
function RenderTask(internalRenderTask) {
|
2015-01-06 12:45:01 +09:00
|
|
|
this._internalRenderTask = internalRenderTask;
|
|
|
|
|
2014-01-22 04:28:18 +09:00
|
|
|
/**
|
2015-01-06 12:45:01 +09:00
|
|
|
* Callback for incremental rendering -- a function that will be called
|
|
|
|
* each time the rendering is paused. To continue rendering call the
|
|
|
|
* function that is the first argument to the callback.
|
|
|
|
* @type {function}
|
2014-01-22 04:28:18 +09:00
|
|
|
*/
|
2015-01-06 12:45:01 +09:00
|
|
|
this.onContinue = null;
|
2013-08-01 03:17:36 +09:00
|
|
|
}
|
|
|
|
|
2014-01-22 04:28:18 +09:00
|
|
|
RenderTask.prototype = /** @lends RenderTask.prototype */ {
|
2015-01-06 12:45:01 +09:00
|
|
|
/**
|
|
|
|
* Promise for rendering task completion.
|
|
|
|
* @return {Promise}
|
|
|
|
*/
|
|
|
|
get promise() {
|
|
|
|
return this._internalRenderTask.capability.promise;
|
|
|
|
},
|
|
|
|
|
2014-01-22 04:28:18 +09:00
|
|
|
/**
|
|
|
|
* Cancels the rendering task. If the task is currently rendering it will
|
|
|
|
* not be cancelled until graphics pauses with a timeout. The promise that
|
2017-03-14 01:35:33 +09:00
|
|
|
* this object extends will be rejected when cancelled.
|
2014-01-22 04:28:18 +09:00
|
|
|
*/
|
|
|
|
cancel: function RenderTask_cancel() {
|
2015-01-06 12:45:01 +09:00
|
|
|
this._internalRenderTask.cancel();
|
2014-04-12 02:10:42 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2015-01-06 12:45:01 +09:00
|
|
|
* Registers callbacks to indicate the rendering task completion.
|
2014-04-12 02:10:42 +09:00
|
|
|
*
|
|
|
|
* @param {function} onFulfilled The callback for the rendering completion.
|
|
|
|
* @param {function} onRejected The callback for the rendering failure.
|
|
|
|
* @return {Promise} A promise that is resolved after the onFulfilled or
|
|
|
|
* onRejected callback.
|
|
|
|
*/
|
|
|
|
then: function RenderTask_then(onFulfilled, onRejected) {
|
2015-01-06 12:45:01 +09:00
|
|
|
return this.promise.then.apply(this.promise, arguments);
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
},
|
2013-08-01 03:17:36 +09:00
|
|
|
};
|
|
|
|
|
|
|
|
return RenderTask;
|
|
|
|
})();
|
|
|
|
|
2014-01-22 04:28:18 +09:00
|
|
|
/**
|
|
|
|
* For internal use only.
|
|
|
|
* @ignore
|
|
|
|
*/
|
2013-08-01 03:17:36 +09:00
|
|
|
var InternalRenderTask = (function InternalRenderTaskClosure() {
|
2017-06-13 06:04:35 +09:00
|
|
|
let canvasInRendering = new WeakMap();
|
2013-08-01 03:17:36 +09:00
|
|
|
|
|
|
|
function InternalRenderTask(callback, params, objs, commonObjs, operatorList,
|
2018-02-18 07:13:49 +09:00
|
|
|
pageNumber, canvasFactory, webGLContext,
|
|
|
|
pdfBug = false) {
|
2013-08-01 03:17:36 +09:00
|
|
|
this.callback = callback;
|
|
|
|
this.params = params;
|
|
|
|
this.objs = objs;
|
|
|
|
this.commonObjs = commonObjs;
|
|
|
|
this.operatorListIdx = null;
|
|
|
|
this.operatorList = operatorList;
|
|
|
|
this.pageNumber = pageNumber;
|
2017-01-28 02:58:39 +09:00
|
|
|
this.canvasFactory = canvasFactory;
|
2017-11-02 00:32:22 +09:00
|
|
|
this.webGLContext = webGLContext;
|
2018-02-18 07:13:49 +09:00
|
|
|
this._pdfBug = pdfBug;
|
2017-11-02 00:32:22 +09:00
|
|
|
|
2013-08-01 03:17:36 +09:00
|
|
|
this.running = false;
|
|
|
|
this.graphicsReadyCallback = null;
|
|
|
|
this.graphicsReady = false;
|
2015-05-12 22:44:42 +09:00
|
|
|
this.useRequestAnimationFrame = false;
|
2013-08-01 03:17:36 +09:00
|
|
|
this.cancelled = false;
|
2014-04-30 00:07:05 +09:00
|
|
|
this.capability = createPromiseCapability();
|
2015-01-06 12:45:01 +09:00
|
|
|
this.task = new RenderTask(this);
|
2014-05-09 21:00:47 +09:00
|
|
|
// caching this-bound methods
|
|
|
|
this._continueBound = this._continue.bind(this);
|
|
|
|
this._scheduleNextBound = this._scheduleNext.bind(this);
|
|
|
|
this._nextBound = this._next.bind(this);
|
2017-06-13 06:04:35 +09:00
|
|
|
this._canvas = params.canvasContext.canvas;
|
2013-08-01 03:17:36 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
InternalRenderTask.prototype = {
|
|
|
|
|
2016-05-03 07:34:58 +09:00
|
|
|
initializeGraphics:
|
|
|
|
function InternalRenderTask_initializeGraphics(transparency) {
|
2013-08-01 03:17:36 +09:00
|
|
|
|
2017-06-13 06:04:35 +09:00
|
|
|
if (this._canvas) {
|
|
|
|
if (canvasInRendering.has(this._canvas)) {
|
|
|
|
throw new Error(
|
|
|
|
'Cannot use the same canvas during multiple render() operations. ' +
|
|
|
|
'Use different canvas or ensure previous operations were ' +
|
|
|
|
'cancelled or completed.');
|
|
|
|
}
|
|
|
|
canvasInRendering.set(this._canvas, this);
|
|
|
|
}
|
|
|
|
|
2013-08-01 03:17:36 +09:00
|
|
|
if (this.cancelled) {
|
|
|
|
return;
|
|
|
|
}
|
2018-02-18 07:13:49 +09:00
|
|
|
if (this._pdfBug && globalScope.StepperManager &&
|
2013-08-01 03:17:36 +09:00
|
|
|
globalScope.StepperManager.enabled) {
|
|
|
|
this.stepper = globalScope.StepperManager.create(this.pageNumber - 1);
|
|
|
|
this.stepper.init(this.operatorList);
|
|
|
|
this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();
|
|
|
|
}
|
|
|
|
|
|
|
|
var params = this.params;
|
|
|
|
this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,
|
2017-01-28 02:58:39 +09:00
|
|
|
this.objs, this.canvasFactory,
|
2017-11-02 00:32:22 +09:00
|
|
|
this.webGLContext, params.imageLayer);
|
2013-08-01 03:17:36 +09:00
|
|
|
|
2017-05-16 20:01:03 +09:00
|
|
|
this.gfx.beginDrawing({
|
|
|
|
transform: params.transform,
|
|
|
|
viewport: params.viewport,
|
|
|
|
transparency,
|
|
|
|
background: params.background,
|
|
|
|
});
|
2013-08-01 03:17:36 +09:00
|
|
|
this.operatorListIdx = 0;
|
|
|
|
this.graphicsReady = true;
|
|
|
|
if (this.graphicsReadyCallback) {
|
|
|
|
this.graphicsReadyCallback();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
cancel: function InternalRenderTask_cancel() {
|
|
|
|
this.running = false;
|
|
|
|
this.cancelled = true;
|
2017-06-13 06:04:35 +09:00
|
|
|
if (this._canvas) {
|
|
|
|
canvasInRendering.delete(this._canvas);
|
|
|
|
}
|
2017-10-05 01:09:28 +09:00
|
|
|
this.callback(new RenderingCancelledException(
|
|
|
|
'Rendering cancelled, page ' + this.pageNumber, 'canvas'));
|
2013-08-01 03:17:36 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
operatorListChanged: function InternalRenderTask_operatorListChanged() {
|
|
|
|
if (!this.graphicsReady) {
|
|
|
|
if (!this.graphicsReadyCallback) {
|
2014-05-09 21:00:47 +09:00
|
|
|
this.graphicsReadyCallback = this._continueBound;
|
2013-08-01 03:17:36 +09:00
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.stepper) {
|
|
|
|
this.stepper.updateOperatorList(this.operatorList);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.running) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this._continue();
|
|
|
|
},
|
|
|
|
|
|
|
|
_continue: function InternalRenderTask__continue() {
|
|
|
|
this.running = true;
|
|
|
|
if (this.cancelled) {
|
|
|
|
return;
|
|
|
|
}
|
2015-01-06 12:45:01 +09:00
|
|
|
if (this.task.onContinue) {
|
2017-01-22 01:08:25 +09:00
|
|
|
this.task.onContinue(this._scheduleNextBound);
|
2013-08-01 03:17:36 +09:00
|
|
|
} else {
|
2014-05-09 21:00:47 +09:00
|
|
|
this._scheduleNext();
|
2013-08-01 03:17:36 +09:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2014-05-09 21:00:47 +09:00
|
|
|
_scheduleNext: function InternalRenderTask__scheduleNext() {
|
2016-04-07 00:38:48 +09:00
|
|
|
if (this.useRequestAnimationFrame && typeof window !== 'undefined') {
|
2015-05-12 22:44:42 +09:00
|
|
|
window.requestAnimationFrame(this._nextBound);
|
|
|
|
} else {
|
|
|
|
Promise.resolve(undefined).then(this._nextBound);
|
|
|
|
}
|
2014-05-09 21:00:47 +09:00
|
|
|
},
|
|
|
|
|
2013-08-01 03:17:36 +09:00
|
|
|
_next: function InternalRenderTask__next() {
|
|
|
|
if (this.cancelled) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList,
|
|
|
|
this.operatorListIdx,
|
2014-05-09 21:00:47 +09:00
|
|
|
this._continueBound,
|
2013-08-01 03:17:36 +09:00
|
|
|
this.stepper);
|
2013-11-14 04:43:38 +09:00
|
|
|
if (this.operatorListIdx === this.operatorList.argsArray.length) {
|
2013-08-01 03:17:36 +09:00
|
|
|
this.running = false;
|
|
|
|
if (this.operatorList.lastChunk) {
|
|
|
|
this.gfx.endDrawing();
|
2017-06-13 06:04:35 +09:00
|
|
|
if (this._canvas) {
|
|
|
|
canvasInRendering.delete(this._canvas);
|
|
|
|
}
|
2013-08-01 03:17:36 +09:00
|
|
|
this.callback();
|
|
|
|
}
|
|
|
|
}
|
Fix inconsistent spacing and trailing commas in objects in remaining `src/` files, so we can enable the `comma-dangle` and `object-curly-spacing` ESLint rules later on
http://eslint.org/docs/rules/comma-dangle
http://eslint.org/docs/rules/object-curly-spacing
Given that we currently have quite inconsistent object formatting, fixing this in *one* big patch probably wouldn't be feasible (since I cannot imagine anyone wanting to review that); hence I've opted to try and do this piecewise instead.
Please note: This patch was created automatically, using the ESLint `--fix` command line option. In a couple of places this caused lines to become too long, and I've fixed those manually; please refer to the interdiff below for the only hand-edits in this patch.
```diff
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 5739f6f2..4216b2d2 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -2071,7 +2071,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var map = [];
for (var i = 0, ii = positions.length; i < ii; i += 2) {
map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],
- positions[i + 1]], x: 0, y: 0, w: width, h: height, });
+ positions[i + 1]], x: 0, y: 0, w: width, h: height, });
}
this.paintInlineImageXObjectGroup(imgData, map);
},
diff --git a/src/display/svg.js b/src/display/svg.js
index 9eb05dfa..2aa21482 100644
--- a/src/display/svg.js
+++ b/src/display/svg.js
@@ -458,7 +458,11 @@ SVGGraphics = (function SVGGraphicsClosure() {
for (var x = 0; x < fnArrayLen; x++) {
var fnId = fnArray[x];
- opList.push({ 'fnId': fnId, 'fn': REVOPS[fnId], 'args': argsArray[x], });
+ opList.push({
+ 'fnId': fnId,
+ 'fn': REVOPS[fnId],
+ 'args': argsArray[x],
+ });
}
return opListToTree(opList);
},
```
2017-06-02 18:26:37 +09:00
|
|
|
},
|
2013-08-01 03:17:36 +09:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
return InternalRenderTask;
|
|
|
|
})();
|
2015-12-01 05:42:47 +09:00
|
|
|
|
2017-04-02 21:25:33 +09:00
|
|
|
var version, build;
|
2017-02-09 07:32:15 +09:00
|
|
|
if (typeof PDFJSDev !== 'undefined') {
|
2017-04-02 21:25:33 +09:00
|
|
|
version = PDFJSDev.eval('BUNDLE_VERSION');
|
|
|
|
build = PDFJSDev.eval('BUNDLE_BUILD');
|
2016-03-29 06:44:27 +09:00
|
|
|
}
|
|
|
|
|
2017-04-02 21:25:33 +09:00
|
|
|
export {
|
|
|
|
getDocument,
|
2017-05-03 02:20:13 +09:00
|
|
|
LoopbackPort,
|
2017-04-02 21:25:33 +09:00
|
|
|
PDFDataRangeTransport,
|
|
|
|
PDFWorker,
|
|
|
|
PDFDocumentProxy,
|
|
|
|
PDFPageProxy,
|
2018-01-14 08:34:46 +09:00
|
|
|
setPDFNetworkStreamFactory,
|
2017-04-02 21:25:33 +09:00
|
|
|
version,
|
|
|
|
build,
|
|
|
|
};
|