2
0

api.js 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426
  1. /* Copyright 2017 Mozilla Foundation
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. 'use strict';
  16. Object.defineProperty(exports, "__esModule", {
  17. value: true
  18. });
  19. exports.build = exports.version = exports._UnsupportedManager = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFWorker = exports.PDFDataRangeTransport = exports.LoopbackPort = exports.getDocument = undefined;
  20. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  21. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
  22. var _util = require('../shared/util');
  23. var _dom_utils = require('./dom_utils');
  24. var _font_loader = require('./font_loader');
  25. var _canvas = require('./canvas');
  26. var _metadata = require('./metadata');
  27. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  28. var DEFAULT_RANGE_CHUNK_SIZE = 65536;
  29. var isWorkerDisabled = false;
  30. var workerSrc;
  31. var isPostMessageTransfersDisabled = false;
  32. var pdfjsFilePath = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : null;
  33. var fakeWorkerFilesLoader = null;
  34. var useRequireEnsure = false;
  35. if (typeof __pdfjsdev_webpack__ === 'undefined') {
  36. if (typeof window === 'undefined') {
  37. isWorkerDisabled = true;
  38. if (typeof require.ensure === 'undefined') {
  39. require.ensure = require('node-ensure');
  40. }
  41. useRequireEnsure = true;
  42. } else if (typeof require !== 'undefined' && typeof require.ensure === 'function') {
  43. useRequireEnsure = true;
  44. }
  45. if (typeof requirejs !== 'undefined' && requirejs.toUrl) {
  46. workerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js');
  47. }
  48. var dynamicLoaderSupported = typeof requirejs !== 'undefined' && requirejs.load;
  49. fakeWorkerFilesLoader = useRequireEnsure ? function (callback) {
  50. require.ensure([], function () {
  51. var worker = require('./pdf.worker.js');
  52. callback(worker.WorkerMessageHandler);
  53. });
  54. } : dynamicLoaderSupported ? function (callback) {
  55. requirejs(['pdfjs-dist/build/pdf.worker'], function (worker) {
  56. callback(worker.WorkerMessageHandler);
  57. });
  58. } : null;
  59. }
  60. function getDocument(src, pdfDataRangeTransport, passwordCallback, progressCallback) {
  61. var task = new PDFDocumentLoadingTask();
  62. if (arguments.length > 1) {
  63. (0, _util.deprecated)('getDocument is called with pdfDataRangeTransport, ' + 'passwordCallback or progressCallback argument');
  64. }
  65. if (pdfDataRangeTransport) {
  66. if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) {
  67. pdfDataRangeTransport = Object.create(pdfDataRangeTransport);
  68. pdfDataRangeTransport.length = src.length;
  69. pdfDataRangeTransport.initialData = src.initialData;
  70. if (!pdfDataRangeTransport.abort) {
  71. pdfDataRangeTransport.abort = function () {};
  72. }
  73. }
  74. src = Object.create(src);
  75. src.range = pdfDataRangeTransport;
  76. }
  77. task.onPassword = passwordCallback || null;
  78. task.onProgress = progressCallback || null;
  79. var source;
  80. if (typeof src === 'string') {
  81. source = { url: src };
  82. } else if ((0, _util.isArrayBuffer)(src)) {
  83. source = { data: src };
  84. } else if (src instanceof PDFDataRangeTransport) {
  85. source = { range: src };
  86. } else {
  87. if ((typeof src === 'undefined' ? 'undefined' : _typeof(src)) !== 'object') {
  88. (0, _util.error)('Invalid parameter in getDocument, need either Uint8Array, ' + 'string or a parameter object');
  89. }
  90. if (!src.url && !src.data && !src.range) {
  91. (0, _util.error)('Invalid parameter object: need either .data, .range or .url');
  92. }
  93. source = src;
  94. }
  95. var params = {};
  96. var rangeTransport = null;
  97. var worker = null;
  98. for (var key in source) {
  99. if (key === 'url' && typeof window !== 'undefined') {
  100. params[key] = new URL(source[key], window.location).href;
  101. continue;
  102. } else if (key === 'range') {
  103. rangeTransport = source[key];
  104. continue;
  105. } else if (key === 'worker') {
  106. worker = source[key];
  107. continue;
  108. } else if (key === 'data' && !(source[key] instanceof Uint8Array)) {
  109. var pdfBytes = source[key];
  110. if (typeof pdfBytes === 'string') {
  111. params[key] = (0, _util.stringToBytes)(pdfBytes);
  112. } else if ((typeof pdfBytes === 'undefined' ? 'undefined' : _typeof(pdfBytes)) === 'object' && pdfBytes !== null && !isNaN(pdfBytes.length)) {
  113. params[key] = new Uint8Array(pdfBytes);
  114. } else if ((0, _util.isArrayBuffer)(pdfBytes)) {
  115. params[key] = new Uint8Array(pdfBytes);
  116. } else {
  117. (0, _util.error)('Invalid PDF binary data: either typed array, string or ' + 'array-like object is expected in the data property.');
  118. }
  119. continue;
  120. }
  121. params[key] = source[key];
  122. }
  123. params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;
  124. params.ignoreErrors = params.stopAtErrors !== true;
  125. var CMapReaderFactory = params.CMapReaderFactory || _dom_utils.DOMCMapReaderFactory;
  126. if (params.disableNativeImageDecoder !== undefined) {
  127. (0, _util.deprecated)('parameter disableNativeImageDecoder, ' + 'use nativeImageDecoderSupport instead');
  128. }
  129. params.nativeImageDecoderSupport = params.nativeImageDecoderSupport || (params.disableNativeImageDecoder === true ? _util.NativeImageDecoding.NONE : _util.NativeImageDecoding.DECODE);
  130. if (params.nativeImageDecoderSupport !== _util.NativeImageDecoding.DECODE && params.nativeImageDecoderSupport !== _util.NativeImageDecoding.NONE && params.nativeImageDecoderSupport !== _util.NativeImageDecoding.DISPLAY) {
  131. (0, _util.warn)('Invalid parameter nativeImageDecoderSupport: ' + 'need a state of enum {NativeImageDecoding}');
  132. params.nativeImageDecoderSupport = _util.NativeImageDecoding.DECODE;
  133. }
  134. if (!worker) {
  135. var workerPort = (0, _dom_utils.getDefaultSetting)('workerPort');
  136. worker = workerPort ? new PDFWorker(null, workerPort) : new PDFWorker();
  137. task._worker = worker;
  138. }
  139. var docId = task.docId;
  140. worker.promise.then(function () {
  141. if (task.destroyed) {
  142. throw new Error('Loading aborted');
  143. }
  144. return _fetchDocument(worker, params, rangeTransport, docId).then(function (workerId) {
  145. if (task.destroyed) {
  146. throw new Error('Loading aborted');
  147. }
  148. var messageHandler = new _util.MessageHandler(docId, workerId, worker.port);
  149. var transport = new WorkerTransport(messageHandler, task, rangeTransport, CMapReaderFactory);
  150. task._transport = transport;
  151. messageHandler.send('Ready', null);
  152. });
  153. }).catch(task._capability.reject);
  154. return task;
  155. }
  156. function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
  157. if (worker.destroyed) {
  158. return Promise.reject(new Error('Worker was destroyed'));
  159. }
  160. source.disableAutoFetch = (0, _dom_utils.getDefaultSetting)('disableAutoFetch');
  161. source.disableStream = (0, _dom_utils.getDefaultSetting)('disableStream');
  162. source.chunkedViewerLoading = !!pdfDataRangeTransport;
  163. if (pdfDataRangeTransport) {
  164. source.length = pdfDataRangeTransport.length;
  165. source.initialData = pdfDataRangeTransport.initialData;
  166. }
  167. return worker.messageHandler.sendWithPromise('GetDocRequest', {
  168. docId: docId,
  169. source: source,
  170. disableRange: (0, _dom_utils.getDefaultSetting)('disableRange'),
  171. maxImageSize: (0, _dom_utils.getDefaultSetting)('maxImageSize'),
  172. disableFontFace: (0, _dom_utils.getDefaultSetting)('disableFontFace'),
  173. disableCreateObjectURL: (0, _dom_utils.getDefaultSetting)('disableCreateObjectURL'),
  174. postMessageTransfers: (0, _dom_utils.getDefaultSetting)('postMessageTransfers') && !isPostMessageTransfersDisabled,
  175. docBaseUrl: source.docBaseUrl,
  176. nativeImageDecoderSupport: source.nativeImageDecoderSupport,
  177. ignoreErrors: source.ignoreErrors
  178. }).then(function (workerId) {
  179. if (worker.destroyed) {
  180. throw new Error('Worker was destroyed');
  181. }
  182. return workerId;
  183. });
  184. }
  185. var PDFDocumentLoadingTask = function PDFDocumentLoadingTaskClosure() {
  186. var nextDocumentId = 0;
  187. function PDFDocumentLoadingTask() {
  188. this._capability = (0, _util.createPromiseCapability)();
  189. this._transport = null;
  190. this._worker = null;
  191. this.docId = 'd' + nextDocumentId++;
  192. this.destroyed = false;
  193. this.onPassword = null;
  194. this.onProgress = null;
  195. this.onUnsupportedFeature = null;
  196. }
  197. PDFDocumentLoadingTask.prototype = {
  198. get promise() {
  199. return this._capability.promise;
  200. },
  201. destroy: function destroy() {
  202. var _this = this;
  203. this.destroyed = true;
  204. var transportDestroyed = !this._transport ? Promise.resolve() : this._transport.destroy();
  205. return transportDestroyed.then(function () {
  206. _this._transport = null;
  207. if (_this._worker) {
  208. _this._worker.destroy();
  209. _this._worker = null;
  210. }
  211. });
  212. },
  213. then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) {
  214. return this.promise.then.apply(this.promise, arguments);
  215. }
  216. };
  217. return PDFDocumentLoadingTask;
  218. }();
  219. var PDFDataRangeTransport = function pdfDataRangeTransportClosure() {
  220. function PDFDataRangeTransport(length, initialData) {
  221. this.length = length;
  222. this.initialData = initialData;
  223. this._rangeListeners = [];
  224. this._progressListeners = [];
  225. this._progressiveReadListeners = [];
  226. this._readyCapability = (0, _util.createPromiseCapability)();
  227. }
  228. PDFDataRangeTransport.prototype = {
  229. addRangeListener: function PDFDataRangeTransport_addRangeListener(listener) {
  230. this._rangeListeners.push(listener);
  231. },
  232. addProgressListener: function PDFDataRangeTransport_addProgressListener(listener) {
  233. this._progressListeners.push(listener);
  234. },
  235. addProgressiveReadListener: function PDFDataRangeTransport_addProgressiveReadListener(listener) {
  236. this._progressiveReadListeners.push(listener);
  237. },
  238. onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) {
  239. var listeners = this._rangeListeners;
  240. for (var i = 0, n = listeners.length; i < n; ++i) {
  241. listeners[i](begin, chunk);
  242. }
  243. },
  244. onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) {
  245. var _this2 = this;
  246. this._readyCapability.promise.then(function () {
  247. var listeners = _this2._progressListeners;
  248. for (var i = 0, n = listeners.length; i < n; ++i) {
  249. listeners[i](loaded);
  250. }
  251. });
  252. },
  253. onDataProgressiveRead: function PDFDataRangeTransport_onDataProgress(chunk) {
  254. var _this3 = this;
  255. this._readyCapability.promise.then(function () {
  256. var listeners = _this3._progressiveReadListeners;
  257. for (var i = 0, n = listeners.length; i < n; ++i) {
  258. listeners[i](chunk);
  259. }
  260. });
  261. },
  262. transportReady: function PDFDataRangeTransport_transportReady() {
  263. this._readyCapability.resolve();
  264. },
  265. requestDataRange: function PDFDataRangeTransport_requestDataRange(begin, end) {
  266. throw new Error('Abstract method PDFDataRangeTransport.requestDataRange');
  267. },
  268. abort: function PDFDataRangeTransport_abort() {}
  269. };
  270. return PDFDataRangeTransport;
  271. }();
  272. var PDFDocumentProxy = function PDFDocumentProxyClosure() {
  273. function PDFDocumentProxy(pdfInfo, transport, loadingTask) {
  274. this.pdfInfo = pdfInfo;
  275. this.transport = transport;
  276. this.loadingTask = loadingTask;
  277. }
  278. PDFDocumentProxy.prototype = {
  279. get numPages() {
  280. return this.pdfInfo.numPages;
  281. },
  282. get fingerprint() {
  283. return this.pdfInfo.fingerprint;
  284. },
  285. getPage: function PDFDocumentProxy_getPage(pageNumber) {
  286. return this.transport.getPage(pageNumber);
  287. },
  288. getPageIndex: function PDFDocumentProxy_getPageIndex(ref) {
  289. return this.transport.getPageIndex(ref);
  290. },
  291. getDestinations: function PDFDocumentProxy_getDestinations() {
  292. return this.transport.getDestinations();
  293. },
  294. getDestination: function PDFDocumentProxy_getDestination(id) {
  295. return this.transport.getDestination(id);
  296. },
  297. getPageLabels: function PDFDocumentProxy_getPageLabels() {
  298. return this.transport.getPageLabels();
  299. },
  300. getAttachments: function PDFDocumentProxy_getAttachments() {
  301. return this.transport.getAttachments();
  302. },
  303. getJavaScript: function PDFDocumentProxy_getJavaScript() {
  304. return this.transport.getJavaScript();
  305. },
  306. getOutline: function PDFDocumentProxy_getOutline() {
  307. return this.transport.getOutline();
  308. },
  309. getMetadata: function PDFDocumentProxy_getMetadata() {
  310. return this.transport.getMetadata();
  311. },
  312. getData: function PDFDocumentProxy_getData() {
  313. return this.transport.getData();
  314. },
  315. getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() {
  316. return this.transport.downloadInfoCapability.promise;
  317. },
  318. getStats: function PDFDocumentProxy_getStats() {
  319. return this.transport.getStats();
  320. },
  321. cleanup: function PDFDocumentProxy_cleanup() {
  322. this.transport.startCleanup();
  323. },
  324. destroy: function PDFDocumentProxy_destroy() {
  325. return this.loadingTask.destroy();
  326. }
  327. };
  328. return PDFDocumentProxy;
  329. }();
  330. var PDFPageProxy = function PDFPageProxyClosure() {
  331. function PDFPageProxy(pageIndex, pageInfo, transport) {
  332. this.pageIndex = pageIndex;
  333. this.pageInfo = pageInfo;
  334. this.transport = transport;
  335. this.stats = new _util.StatTimer();
  336. this.stats.enabled = (0, _dom_utils.getDefaultSetting)('enableStats');
  337. this.commonObjs = transport.commonObjs;
  338. this.objs = new PDFObjects();
  339. this.cleanupAfterRender = false;
  340. this.pendingCleanup = false;
  341. this.intentStates = Object.create(null);
  342. this.destroyed = false;
  343. }
  344. PDFPageProxy.prototype = {
  345. get pageNumber() {
  346. return this.pageIndex + 1;
  347. },
  348. get rotate() {
  349. return this.pageInfo.rotate;
  350. },
  351. get ref() {
  352. return this.pageInfo.ref;
  353. },
  354. get userUnit() {
  355. return this.pageInfo.userUnit;
  356. },
  357. get view() {
  358. return this.pageInfo.view;
  359. },
  360. getViewport: function PDFPageProxy_getViewport(scale, rotate) {
  361. if (arguments.length < 2) {
  362. rotate = this.rotate;
  363. }
  364. return new _util.PageViewport(this.view, scale, rotate, 0, 0);
  365. },
  366. getAnnotations: function PDFPageProxy_getAnnotations(params) {
  367. var intent = params && params.intent || null;
  368. if (!this.annotationsPromise || this.annotationsIntent !== intent) {
  369. this.annotationsPromise = this.transport.getAnnotations(this.pageIndex, intent);
  370. this.annotationsIntent = intent;
  371. }
  372. return this.annotationsPromise;
  373. },
  374. render: function PDFPageProxy_render(params) {
  375. var _this4 = this;
  376. var stats = this.stats;
  377. stats.time('Overall');
  378. this.pendingCleanup = false;
  379. var renderingIntent = params.intent === 'print' ? 'print' : 'display';
  380. var canvasFactory = params.canvasFactory || new _dom_utils.DOMCanvasFactory();
  381. if (!this.intentStates[renderingIntent]) {
  382. this.intentStates[renderingIntent] = Object.create(null);
  383. }
  384. var intentState = this.intentStates[renderingIntent];
  385. if (!intentState.displayReadyCapability) {
  386. intentState.receivingOperatorList = true;
  387. intentState.displayReadyCapability = (0, _util.createPromiseCapability)();
  388. intentState.operatorList = {
  389. fnArray: [],
  390. argsArray: [],
  391. lastChunk: false
  392. };
  393. this.stats.time('Page Request');
  394. this.transport.messageHandler.send('RenderPageRequest', {
  395. pageIndex: this.pageNumber - 1,
  396. intent: renderingIntent,
  397. renderInteractiveForms: params.renderInteractiveForms === true
  398. });
  399. }
  400. var complete = function complete(error) {
  401. var i = intentState.renderTasks.indexOf(internalRenderTask);
  402. if (i >= 0) {
  403. intentState.renderTasks.splice(i, 1);
  404. }
  405. if (_this4.cleanupAfterRender) {
  406. _this4.pendingCleanup = true;
  407. }
  408. _this4._tryCleanup();
  409. if (error) {
  410. internalRenderTask.capability.reject(error);
  411. } else {
  412. internalRenderTask.capability.resolve();
  413. }
  414. stats.timeEnd('Rendering');
  415. stats.timeEnd('Overall');
  416. };
  417. var internalRenderTask = new InternalRenderTask(complete, params, this.objs, this.commonObjs, intentState.operatorList, this.pageNumber, canvasFactory);
  418. internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print';
  419. if (!intentState.renderTasks) {
  420. intentState.renderTasks = [];
  421. }
  422. intentState.renderTasks.push(internalRenderTask);
  423. var renderTask = internalRenderTask.task;
  424. if (params.continueCallback) {
  425. (0, _util.deprecated)('render is used with continueCallback parameter');
  426. renderTask.onContinue = params.continueCallback;
  427. }
  428. intentState.displayReadyCapability.promise.then(function (transparency) {
  429. if (_this4.pendingCleanup) {
  430. complete();
  431. return;
  432. }
  433. stats.time('Rendering');
  434. internalRenderTask.initializeGraphics(transparency);
  435. internalRenderTask.operatorListChanged();
  436. }, complete);
  437. return renderTask;
  438. },
  439. getOperatorList: function PDFPageProxy_getOperatorList() {
  440. function operatorListChanged() {
  441. if (intentState.operatorList.lastChunk) {
  442. intentState.opListReadCapability.resolve(intentState.operatorList);
  443. var i = intentState.renderTasks.indexOf(opListTask);
  444. if (i >= 0) {
  445. intentState.renderTasks.splice(i, 1);
  446. }
  447. }
  448. }
  449. var renderingIntent = 'oplist';
  450. if (!this.intentStates[renderingIntent]) {
  451. this.intentStates[renderingIntent] = Object.create(null);
  452. }
  453. var intentState = this.intentStates[renderingIntent];
  454. var opListTask;
  455. if (!intentState.opListReadCapability) {
  456. opListTask = {};
  457. opListTask.operatorListChanged = operatorListChanged;
  458. intentState.receivingOperatorList = true;
  459. intentState.opListReadCapability = (0, _util.createPromiseCapability)();
  460. intentState.renderTasks = [];
  461. intentState.renderTasks.push(opListTask);
  462. intentState.operatorList = {
  463. fnArray: [],
  464. argsArray: [],
  465. lastChunk: false
  466. };
  467. this.transport.messageHandler.send('RenderPageRequest', {
  468. pageIndex: this.pageIndex,
  469. intent: renderingIntent
  470. });
  471. }
  472. return intentState.opListReadCapability.promise;
  473. },
  474. getTextContent: function PDFPageProxy_getTextContent(params) {
  475. params = params || {};
  476. return this.transport.messageHandler.sendWithPromise('GetTextContent', {
  477. pageIndex: this.pageNumber - 1,
  478. normalizeWhitespace: params.normalizeWhitespace === true,
  479. combineTextItems: params.disableCombineTextItems !== true
  480. });
  481. },
  482. _destroy: function PDFPageProxy_destroy() {
  483. this.destroyed = true;
  484. this.transport.pageCache[this.pageIndex] = null;
  485. var waitOn = [];
  486. Object.keys(this.intentStates).forEach(function (intent) {
  487. if (intent === 'oplist') {
  488. return;
  489. }
  490. var intentState = this.intentStates[intent];
  491. intentState.renderTasks.forEach(function (renderTask) {
  492. var renderCompleted = renderTask.capability.promise.catch(function () {});
  493. waitOn.push(renderCompleted);
  494. renderTask.cancel();
  495. });
  496. }, this);
  497. this.objs.clear();
  498. this.annotationsPromise = null;
  499. this.pendingCleanup = false;
  500. return Promise.all(waitOn);
  501. },
  502. destroy: function destroy() {
  503. (0, _util.deprecated)('page destroy method, use cleanup() instead');
  504. this.cleanup();
  505. },
  506. cleanup: function PDFPageProxy_cleanup() {
  507. this.pendingCleanup = true;
  508. this._tryCleanup();
  509. },
  510. _tryCleanup: function PDFPageProxy_tryCleanup() {
  511. if (!this.pendingCleanup || Object.keys(this.intentStates).some(function (intent) {
  512. var intentState = this.intentStates[intent];
  513. return intentState.renderTasks.length !== 0 || intentState.receivingOperatorList;
  514. }, this)) {
  515. return;
  516. }
  517. Object.keys(this.intentStates).forEach(function (intent) {
  518. delete this.intentStates[intent];
  519. }, this);
  520. this.objs.clear();
  521. this.annotationsPromise = null;
  522. this.pendingCleanup = false;
  523. },
  524. _startRenderPage: function PDFPageProxy_startRenderPage(transparency, intent) {
  525. var intentState = this.intentStates[intent];
  526. if (intentState.displayReadyCapability) {
  527. intentState.displayReadyCapability.resolve(transparency);
  528. }
  529. },
  530. _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk, intent) {
  531. var intentState = this.intentStates[intent];
  532. var i, ii;
  533. for (i = 0, ii = operatorListChunk.length; i < ii; i++) {
  534. intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);
  535. intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);
  536. }
  537. intentState.operatorList.lastChunk = operatorListChunk.lastChunk;
  538. for (i = 0; i < intentState.renderTasks.length; i++) {
  539. intentState.renderTasks[i].operatorListChanged();
  540. }
  541. if (operatorListChunk.lastChunk) {
  542. intentState.receivingOperatorList = false;
  543. this._tryCleanup();
  544. }
  545. }
  546. };
  547. return PDFPageProxy;
  548. }();
  549. var LoopbackPort = function () {
  550. function LoopbackPort(defer) {
  551. _classCallCheck(this, LoopbackPort);
  552. this._listeners = [];
  553. this._defer = defer;
  554. this._deferred = Promise.resolve(undefined);
  555. }
  556. _createClass(LoopbackPort, [{
  557. key: 'postMessage',
  558. value: function postMessage(obj, transfers) {
  559. var _this5 = this;
  560. function cloneValue(value) {
  561. if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) !== 'object' || value === null) {
  562. return value;
  563. }
  564. if (cloned.has(value)) {
  565. return cloned.get(value);
  566. }
  567. var result;
  568. var buffer;
  569. if ((buffer = value.buffer) && (0, _util.isArrayBuffer)(buffer)) {
  570. var transferable = transfers && transfers.indexOf(buffer) >= 0;
  571. if (value === buffer) {
  572. result = value;
  573. } else if (transferable) {
  574. result = new value.constructor(buffer, value.byteOffset, value.byteLength);
  575. } else {
  576. result = new value.constructor(value);
  577. }
  578. cloned.set(value, result);
  579. return result;
  580. }
  581. result = (0, _util.isArray)(value) ? [] : {};
  582. cloned.set(value, result);
  583. for (var i in value) {
  584. var desc,
  585. p = value;
  586. while (!(desc = Object.getOwnPropertyDescriptor(p, i))) {
  587. p = Object.getPrototypeOf(p);
  588. }
  589. if (typeof desc.value === 'undefined' || typeof desc.value === 'function') {
  590. continue;
  591. }
  592. result[i] = cloneValue(desc.value);
  593. }
  594. return result;
  595. }
  596. if (!this._defer) {
  597. this._listeners.forEach(function (listener) {
  598. listener.call(this, { data: obj });
  599. }, this);
  600. return;
  601. }
  602. var cloned = new WeakMap();
  603. var e = { data: cloneValue(obj) };
  604. this._deferred.then(function () {
  605. _this5._listeners.forEach(function (listener) {
  606. listener.call(this, e);
  607. }, _this5);
  608. });
  609. }
  610. }, {
  611. key: 'addEventListener',
  612. value: function addEventListener(name, listener) {
  613. this._listeners.push(listener);
  614. }
  615. }, {
  616. key: 'removeEventListener',
  617. value: function removeEventListener(name, listener) {
  618. var i = this._listeners.indexOf(listener);
  619. this._listeners.splice(i, 1);
  620. }
  621. }, {
  622. key: 'terminate',
  623. value: function terminate() {
  624. this._listeners = [];
  625. }
  626. }]);
  627. return LoopbackPort;
  628. }();
  629. var PDFWorker = function PDFWorkerClosure() {
  630. var nextFakeWorkerId = 0;
  631. function getWorkerSrc() {
  632. if (typeof workerSrc !== 'undefined') {
  633. return workerSrc;
  634. }
  635. if ((0, _dom_utils.getDefaultSetting)('workerSrc')) {
  636. return (0, _dom_utils.getDefaultSetting)('workerSrc');
  637. }
  638. if (pdfjsFilePath) {
  639. return pdfjsFilePath.replace(/(\.(?:min\.)?js)(\?.*)?$/i, '.worker$1$2');
  640. }
  641. (0, _util.error)('No PDFJS.workerSrc specified');
  642. }
  643. var fakeWorkerFilesLoadedCapability;
  644. function setupFakeWorkerGlobal() {
  645. var WorkerMessageHandler;
  646. if (fakeWorkerFilesLoadedCapability) {
  647. return fakeWorkerFilesLoadedCapability.promise;
  648. }
  649. fakeWorkerFilesLoadedCapability = (0, _util.createPromiseCapability)();
  650. var loader = fakeWorkerFilesLoader || function (callback) {
  651. _util.Util.loadScript(getWorkerSrc(), function () {
  652. callback(window.pdfjsDistBuildPdfWorker.WorkerMessageHandler);
  653. });
  654. };
  655. loader(fakeWorkerFilesLoadedCapability.resolve);
  656. return fakeWorkerFilesLoadedCapability.promise;
  657. }
  658. function createCDNWrapper(url) {
  659. var wrapper = 'importScripts(\'' + url + '\');';
  660. return URL.createObjectURL(new Blob([wrapper]));
  661. }
  662. function PDFWorker(name, port) {
  663. this.name = name;
  664. this.destroyed = false;
  665. this._readyCapability = (0, _util.createPromiseCapability)();
  666. this._port = null;
  667. this._webWorker = null;
  668. this._messageHandler = null;
  669. if (port) {
  670. this._initializeFromPort(port);
  671. return;
  672. }
  673. this._initialize();
  674. }
  675. PDFWorker.prototype = {
  676. get promise() {
  677. return this._readyCapability.promise;
  678. },
  679. get port() {
  680. return this._port;
  681. },
  682. get messageHandler() {
  683. return this._messageHandler;
  684. },
  685. _initializeFromPort: function PDFWorker_initializeFromPort(port) {
  686. this._port = port;
  687. this._messageHandler = new _util.MessageHandler('main', 'worker', port);
  688. this._messageHandler.on('ready', function () {});
  689. this._readyCapability.resolve();
  690. },
  691. _initialize: function PDFWorker_initialize() {
  692. var _this6 = this;
  693. if (!isWorkerDisabled && !(0, _dom_utils.getDefaultSetting)('disableWorker') && typeof Worker !== 'undefined') {
  694. var workerSrc = getWorkerSrc();
  695. try {
  696. if (!(0, _util.isSameOrigin)(window.location.href, workerSrc)) {
  697. workerSrc = createCDNWrapper(new URL(workerSrc, window.location).href);
  698. }
  699. var worker = new Worker(workerSrc);
  700. var messageHandler = new _util.MessageHandler('main', 'worker', worker);
  701. var terminateEarly = function terminateEarly() {
  702. worker.removeEventListener('error', onWorkerError);
  703. messageHandler.destroy();
  704. worker.terminate();
  705. if (_this6.destroyed) {
  706. _this6._readyCapability.reject(new Error('Worker was destroyed'));
  707. } else {
  708. _this6._setupFakeWorker();
  709. }
  710. };
  711. var onWorkerError = function onWorkerError() {
  712. if (!_this6._webWorker) {
  713. terminateEarly();
  714. }
  715. };
  716. worker.addEventListener('error', onWorkerError);
  717. messageHandler.on('test', function (data) {
  718. worker.removeEventListener('error', onWorkerError);
  719. if (_this6.destroyed) {
  720. terminateEarly();
  721. return;
  722. }
  723. var supportTypedArray = data && data.supportTypedArray;
  724. if (supportTypedArray) {
  725. _this6._messageHandler = messageHandler;
  726. _this6._port = worker;
  727. _this6._webWorker = worker;
  728. if (!data.supportTransfers) {
  729. isPostMessageTransfersDisabled = true;
  730. }
  731. _this6._readyCapability.resolve();
  732. messageHandler.send('configure', { verbosity: (0, _util.getVerbosityLevel)() });
  733. } else {
  734. _this6._setupFakeWorker();
  735. messageHandler.destroy();
  736. worker.terminate();
  737. }
  738. });
  739. messageHandler.on('console_log', function (data) {
  740. console.log.apply(console, data);
  741. });
  742. messageHandler.on('console_error', function (data) {
  743. console.error.apply(console, data);
  744. });
  745. messageHandler.on('ready', function (data) {
  746. worker.removeEventListener('error', onWorkerError);
  747. if (_this6.destroyed) {
  748. terminateEarly();
  749. return;
  750. }
  751. try {
  752. sendTest();
  753. } catch (e) {
  754. _this6._setupFakeWorker();
  755. }
  756. });
  757. var sendTest = function sendTest() {
  758. var postMessageTransfers = (0, _dom_utils.getDefaultSetting)('postMessageTransfers') && !isPostMessageTransfersDisabled;
  759. var testObj = new Uint8Array([postMessageTransfers ? 255 : 0]);
  760. try {
  761. messageHandler.send('test', testObj, [testObj.buffer]);
  762. } catch (ex) {
  763. (0, _util.info)('Cannot use postMessage transfers');
  764. testObj[0] = 0;
  765. messageHandler.send('test', testObj);
  766. }
  767. };
  768. sendTest();
  769. return;
  770. } catch (e) {
  771. (0, _util.info)('The worker has been disabled.');
  772. }
  773. }
  774. this._setupFakeWorker();
  775. },
  776. _setupFakeWorker: function PDFWorker_setupFakeWorker() {
  777. var _this7 = this;
  778. if (!isWorkerDisabled && !(0, _dom_utils.getDefaultSetting)('disableWorker')) {
  779. (0, _util.warn)('Setting up fake worker.');
  780. isWorkerDisabled = true;
  781. }
  782. setupFakeWorkerGlobal().then(function (WorkerMessageHandler) {
  783. if (_this7.destroyed) {
  784. _this7._readyCapability.reject(new Error('Worker was destroyed'));
  785. return;
  786. }
  787. var isTypedArraysPresent = Uint8Array !== Float32Array;
  788. var port = new LoopbackPort(isTypedArraysPresent);
  789. _this7._port = port;
  790. var id = 'fake' + nextFakeWorkerId++;
  791. var workerHandler = new _util.MessageHandler(id + '_worker', id, port);
  792. WorkerMessageHandler.setup(workerHandler, port);
  793. var messageHandler = new _util.MessageHandler(id, id + '_worker', port);
  794. _this7._messageHandler = messageHandler;
  795. _this7._readyCapability.resolve();
  796. });
  797. },
  798. destroy: function PDFWorker_destroy() {
  799. this.destroyed = true;
  800. if (this._webWorker) {
  801. this._webWorker.terminate();
  802. this._webWorker = null;
  803. }
  804. this._port = null;
  805. if (this._messageHandler) {
  806. this._messageHandler.destroy();
  807. this._messageHandler = null;
  808. }
  809. }
  810. };
  811. return PDFWorker;
  812. }();
  813. var WorkerTransport = function WorkerTransportClosure() {
  814. function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport, CMapReaderFactory) {
  815. this.messageHandler = messageHandler;
  816. this.loadingTask = loadingTask;
  817. this.pdfDataRangeTransport = pdfDataRangeTransport;
  818. this.commonObjs = new PDFObjects();
  819. this.fontLoader = new _font_loader.FontLoader(loadingTask.docId);
  820. this.CMapReaderFactory = new CMapReaderFactory({
  821. baseUrl: (0, _dom_utils.getDefaultSetting)('cMapUrl'),
  822. isCompressed: (0, _dom_utils.getDefaultSetting)('cMapPacked')
  823. });
  824. this.destroyed = false;
  825. this.destroyCapability = null;
  826. this._passwordCapability = null;
  827. this.pageCache = [];
  828. this.pagePromises = [];
  829. this.downloadInfoCapability = (0, _util.createPromiseCapability)();
  830. this.setupMessageHandler();
  831. }
  832. WorkerTransport.prototype = {
  833. destroy: function WorkerTransport_destroy() {
  834. var _this8 = this;
  835. if (this.destroyCapability) {
  836. return this.destroyCapability.promise;
  837. }
  838. this.destroyed = true;
  839. this.destroyCapability = (0, _util.createPromiseCapability)();
  840. if (this._passwordCapability) {
  841. this._passwordCapability.reject(new Error('Worker was destroyed during onPassword callback'));
  842. }
  843. var waitOn = [];
  844. this.pageCache.forEach(function (page) {
  845. if (page) {
  846. waitOn.push(page._destroy());
  847. }
  848. });
  849. this.pageCache = [];
  850. this.pagePromises = [];
  851. var terminated = this.messageHandler.sendWithPromise('Terminate', null);
  852. waitOn.push(terminated);
  853. Promise.all(waitOn).then(function () {
  854. _this8.fontLoader.clear();
  855. if (_this8.pdfDataRangeTransport) {
  856. _this8.pdfDataRangeTransport.abort();
  857. _this8.pdfDataRangeTransport = null;
  858. }
  859. if (_this8.messageHandler) {
  860. _this8.messageHandler.destroy();
  861. _this8.messageHandler = null;
  862. }
  863. _this8.destroyCapability.resolve();
  864. }, this.destroyCapability.reject);
  865. return this.destroyCapability.promise;
  866. },
  867. setupMessageHandler: function WorkerTransport_setupMessageHandler() {
  868. var messageHandler = this.messageHandler;
  869. var loadingTask = this.loadingTask;
  870. var pdfDataRangeTransport = this.pdfDataRangeTransport;
  871. if (pdfDataRangeTransport) {
  872. pdfDataRangeTransport.addRangeListener(function (begin, chunk) {
  873. messageHandler.send('OnDataRange', {
  874. begin: begin,
  875. chunk: chunk
  876. });
  877. });
  878. pdfDataRangeTransport.addProgressListener(function (loaded) {
  879. messageHandler.send('OnDataProgress', { loaded: loaded });
  880. });
  881. pdfDataRangeTransport.addProgressiveReadListener(function (chunk) {
  882. messageHandler.send('OnDataRange', { chunk: chunk });
  883. });
  884. messageHandler.on('RequestDataRange', function transportDataRange(data) {
  885. pdfDataRangeTransport.requestDataRange(data.begin, data.end);
  886. }, this);
  887. }
  888. messageHandler.on('GetDoc', function transportDoc(data) {
  889. var pdfInfo = data.pdfInfo;
  890. this.numPages = data.pdfInfo.numPages;
  891. var loadingTask = this.loadingTask;
  892. var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask);
  893. this.pdfDocument = pdfDocument;
  894. loadingTask._capability.resolve(pdfDocument);
  895. }, this);
  896. messageHandler.on('PasswordRequest', function transportPasswordRequest(exception) {
  897. var _this9 = this;
  898. this._passwordCapability = (0, _util.createPromiseCapability)();
  899. if (loadingTask.onPassword) {
  900. var updatePassword = function updatePassword(password) {
  901. _this9._passwordCapability.resolve({ password: password });
  902. };
  903. loadingTask.onPassword(updatePassword, exception.code);
  904. } else {
  905. this._passwordCapability.reject(new _util.PasswordException(exception.message, exception.code));
  906. }
  907. return this._passwordCapability.promise;
  908. }, this);
  909. messageHandler.on('PasswordException', function transportPasswordException(exception) {
  910. loadingTask._capability.reject(new _util.PasswordException(exception.message, exception.code));
  911. }, this);
  912. messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) {
  913. this.loadingTask._capability.reject(new _util.InvalidPDFException(exception.message));
  914. }, this);
  915. messageHandler.on('MissingPDF', function transportMissingPDF(exception) {
  916. this.loadingTask._capability.reject(new _util.MissingPDFException(exception.message));
  917. }, this);
  918. messageHandler.on('UnexpectedResponse', function transportUnexpectedResponse(exception) {
  919. this.loadingTask._capability.reject(new _util.UnexpectedResponseException(exception.message, exception.status));
  920. }, this);
  921. messageHandler.on('UnknownError', function transportUnknownError(exception) {
  922. this.loadingTask._capability.reject(new _util.UnknownErrorException(exception.message, exception.details));
  923. }, this);
  924. messageHandler.on('DataLoaded', function transportPage(data) {
  925. this.downloadInfoCapability.resolve(data);
  926. }, this);
  927. messageHandler.on('PDFManagerReady', function transportPage(data) {
  928. if (this.pdfDataRangeTransport) {
  929. this.pdfDataRangeTransport.transportReady();
  930. }
  931. }, this);
  932. messageHandler.on('StartRenderPage', function transportRender(data) {
  933. if (this.destroyed) {
  934. return;
  935. }
  936. var page = this.pageCache[data.pageIndex];
  937. page.stats.timeEnd('Page Request');
  938. page._startRenderPage(data.transparency, data.intent);
  939. }, this);
  940. messageHandler.on('RenderPageChunk', function transportRender(data) {
  941. if (this.destroyed) {
  942. return;
  943. }
  944. var page = this.pageCache[data.pageIndex];
  945. page._renderPageChunk(data.operatorList, data.intent);
  946. }, this);
  947. messageHandler.on('commonobj', function transportObj(data) {
  948. var _this10 = this;
  949. if (this.destroyed) {
  950. return;
  951. }
  952. var id = data[0];
  953. var type = data[1];
  954. if (this.commonObjs.hasData(id)) {
  955. return;
  956. }
  957. switch (type) {
  958. case 'Font':
  959. var exportedData = data[2];
  960. if ('error' in exportedData) {
  961. var exportedError = exportedData.error;
  962. (0, _util.warn)('Error during font loading: ' + exportedError);
  963. this.commonObjs.resolve(id, exportedError);
  964. break;
  965. }
  966. var fontRegistry = null;
  967. if ((0, _dom_utils.getDefaultSetting)('pdfBug') && _util.globalScope.FontInspector && _util.globalScope['FontInspector'].enabled) {
  968. fontRegistry = {
  969. registerFont: function registerFont(font, url) {
  970. _util.globalScope['FontInspector'].fontAdded(font, url);
  971. }
  972. };
  973. }
  974. var font = new _font_loader.FontFaceObject(exportedData, {
  975. isEvalSuported: (0, _dom_utils.getDefaultSetting)('isEvalSupported'),
  976. disableFontFace: (0, _dom_utils.getDefaultSetting)('disableFontFace'),
  977. fontRegistry: fontRegistry
  978. });
  979. var fontReady = function fontReady(fontObjs) {
  980. _this10.commonObjs.resolve(id, font);
  981. };
  982. this.fontLoader.bind([font], fontReady);
  983. break;
  984. case 'FontPath':
  985. this.commonObjs.resolve(id, data[2]);
  986. break;
  987. default:
  988. (0, _util.error)('Got unknown common object type ' + type);
  989. }
  990. }, this);
  991. messageHandler.on('obj', function transportObj(data) {
  992. if (this.destroyed) {
  993. return;
  994. }
  995. var id = data[0];
  996. var pageIndex = data[1];
  997. var type = data[2];
  998. var pageProxy = this.pageCache[pageIndex];
  999. var imageData;
  1000. if (pageProxy.objs.hasData(id)) {
  1001. return;
  1002. }
  1003. switch (type) {
  1004. case 'JpegStream':
  1005. imageData = data[3];
  1006. (0, _util.loadJpegStream)(id, imageData, pageProxy.objs);
  1007. break;
  1008. case 'Image':
  1009. imageData = data[3];
  1010. pageProxy.objs.resolve(id, imageData);
  1011. var MAX_IMAGE_SIZE_TO_STORE = 8000000;
  1012. if (imageData && 'data' in imageData && imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {
  1013. pageProxy.cleanupAfterRender = true;
  1014. }
  1015. break;
  1016. default:
  1017. (0, _util.error)('Got unknown object type ' + type);
  1018. }
  1019. }, this);
  1020. messageHandler.on('DocProgress', function transportDocProgress(data) {
  1021. if (this.destroyed) {
  1022. return;
  1023. }
  1024. var loadingTask = this.loadingTask;
  1025. if (loadingTask.onProgress) {
  1026. loadingTask.onProgress({
  1027. loaded: data.loaded,
  1028. total: data.total
  1029. });
  1030. }
  1031. }, this);
  1032. messageHandler.on('PageError', function transportError(data) {
  1033. if (this.destroyed) {
  1034. return;
  1035. }
  1036. var page = this.pageCache[data.pageNum - 1];
  1037. var intentState = page.intentStates[data.intent];
  1038. if (intentState.displayReadyCapability) {
  1039. intentState.displayReadyCapability.reject(data.error);
  1040. } else {
  1041. (0, _util.error)(data.error);
  1042. }
  1043. if (intentState.operatorList) {
  1044. intentState.operatorList.lastChunk = true;
  1045. for (var i = 0; i < intentState.renderTasks.length; i++) {
  1046. intentState.renderTasks[i].operatorListChanged();
  1047. }
  1048. }
  1049. }, this);
  1050. messageHandler.on('UnsupportedFeature', function transportUnsupportedFeature(data) {
  1051. if (this.destroyed) {
  1052. return;
  1053. }
  1054. var featureId = data.featureId;
  1055. var loadingTask = this.loadingTask;
  1056. if (loadingTask.onUnsupportedFeature) {
  1057. loadingTask.onUnsupportedFeature(featureId);
  1058. }
  1059. _UnsupportedManager.notify(featureId);
  1060. }, this);
  1061. messageHandler.on('JpegDecode', function (data) {
  1062. if (this.destroyed) {
  1063. return Promise.reject(new Error('Worker was destroyed'));
  1064. }
  1065. if (typeof document === 'undefined') {
  1066. return Promise.reject(new Error('"document" is not defined.'));
  1067. }
  1068. var imageUrl = data[0];
  1069. var components = data[1];
  1070. if (components !== 3 && components !== 1) {
  1071. return Promise.reject(new Error('Only 3 components or 1 component can be returned'));
  1072. }
  1073. return new Promise(function (resolve, reject) {
  1074. var img = new Image();
  1075. img.onload = function () {
  1076. var width = img.width;
  1077. var height = img.height;
  1078. var size = width * height;
  1079. var rgbaLength = size * 4;
  1080. var buf = new Uint8Array(size * components);
  1081. var tmpCanvas = document.createElement('canvas');
  1082. tmpCanvas.width = width;
  1083. tmpCanvas.height = height;
  1084. var tmpCtx = tmpCanvas.getContext('2d');
  1085. tmpCtx.drawImage(img, 0, 0);
  1086. var data = tmpCtx.getImageData(0, 0, width, height).data;
  1087. var i, j;
  1088. if (components === 3) {
  1089. for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
  1090. buf[j] = data[i];
  1091. buf[j + 1] = data[i + 1];
  1092. buf[j + 2] = data[i + 2];
  1093. }
  1094. } else if (components === 1) {
  1095. for (i = 0, j = 0; i < rgbaLength; i += 4, j++) {
  1096. buf[j] = data[i];
  1097. }
  1098. }
  1099. resolve({
  1100. data: buf,
  1101. width: width,
  1102. height: height
  1103. });
  1104. };
  1105. img.onerror = function () {
  1106. reject(new Error('JpegDecode failed to load image'));
  1107. };
  1108. img.src = imageUrl;
  1109. });
  1110. }, this);
  1111. messageHandler.on('FetchBuiltInCMap', function (data) {
  1112. if (this.destroyed) {
  1113. return Promise.reject(new Error('Worker was destroyed'));
  1114. }
  1115. return this.CMapReaderFactory.fetch({ name: data.name });
  1116. }, this);
  1117. },
  1118. getData: function WorkerTransport_getData() {
  1119. return this.messageHandler.sendWithPromise('GetData', null);
  1120. },
  1121. getPage: function WorkerTransport_getPage(pageNumber, capability) {
  1122. var _this11 = this;
  1123. if (!(0, _util.isInt)(pageNumber) || pageNumber <= 0 || pageNumber > this.numPages) {
  1124. return Promise.reject(new Error('Invalid page request'));
  1125. }
  1126. var pageIndex = pageNumber - 1;
  1127. if (pageIndex in this.pagePromises) {
  1128. return this.pagePromises[pageIndex];
  1129. }
  1130. var promise = this.messageHandler.sendWithPromise('GetPage', { pageIndex: pageIndex }).then(function (pageInfo) {
  1131. if (_this11.destroyed) {
  1132. throw new Error('Transport destroyed');
  1133. }
  1134. var page = new PDFPageProxy(pageIndex, pageInfo, _this11);
  1135. _this11.pageCache[pageIndex] = page;
  1136. return page;
  1137. });
  1138. this.pagePromises[pageIndex] = promise;
  1139. return promise;
  1140. },
  1141. getPageIndex: function WorkerTransport_getPageIndexByRef(ref) {
  1142. return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref }).catch(function (reason) {
  1143. return Promise.reject(new Error(reason));
  1144. });
  1145. },
  1146. getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) {
  1147. return this.messageHandler.sendWithPromise('GetAnnotations', {
  1148. pageIndex: pageIndex,
  1149. intent: intent
  1150. });
  1151. },
  1152. getDestinations: function WorkerTransport_getDestinations() {
  1153. return this.messageHandler.sendWithPromise('GetDestinations', null);
  1154. },
  1155. getDestination: function WorkerTransport_getDestination(id) {
  1156. return this.messageHandler.sendWithPromise('GetDestination', { id: id });
  1157. },
  1158. getPageLabels: function WorkerTransport_getPageLabels() {
  1159. return this.messageHandler.sendWithPromise('GetPageLabels', null);
  1160. },
  1161. getAttachments: function WorkerTransport_getAttachments() {
  1162. return this.messageHandler.sendWithPromise('GetAttachments', null);
  1163. },
  1164. getJavaScript: function WorkerTransport_getJavaScript() {
  1165. return this.messageHandler.sendWithPromise('GetJavaScript', null);
  1166. },
  1167. getOutline: function WorkerTransport_getOutline() {
  1168. return this.messageHandler.sendWithPromise('GetOutline', null);
  1169. },
  1170. getMetadata: function WorkerTransport_getMetadata() {
  1171. return this.messageHandler.sendWithPromise('GetMetadata', null).then(function transportMetadata(results) {
  1172. return {
  1173. info: results[0],
  1174. metadata: results[1] ? new _metadata.Metadata(results[1]) : null
  1175. };
  1176. });
  1177. },
  1178. getStats: function WorkerTransport_getStats() {
  1179. return this.messageHandler.sendWithPromise('GetStats', null);
  1180. },
  1181. startCleanup: function WorkerTransport_startCleanup() {
  1182. var _this12 = this;
  1183. this.messageHandler.sendWithPromise('Cleanup', null).then(function () {
  1184. for (var i = 0, ii = _this12.pageCache.length; i < ii; i++) {
  1185. var page = _this12.pageCache[i];
  1186. if (page) {
  1187. page.cleanup();
  1188. }
  1189. }
  1190. _this12.commonObjs.clear();
  1191. _this12.fontLoader.clear();
  1192. });
  1193. }
  1194. };
  1195. return WorkerTransport;
  1196. }();
  1197. var PDFObjects = function PDFObjectsClosure() {
  1198. function PDFObjects() {
  1199. this.objs = Object.create(null);
  1200. }
  1201. PDFObjects.prototype = {
  1202. ensureObj: function PDFObjects_ensureObj(objId) {
  1203. if (this.objs[objId]) {
  1204. return this.objs[objId];
  1205. }
  1206. var obj = {
  1207. capability: (0, _util.createPromiseCapability)(),
  1208. data: null,
  1209. resolved: false
  1210. };
  1211. this.objs[objId] = obj;
  1212. return obj;
  1213. },
  1214. get: function PDFObjects_get(objId, callback) {
  1215. if (callback) {
  1216. this.ensureObj(objId).capability.promise.then(callback);
  1217. return null;
  1218. }
  1219. var obj = this.objs[objId];
  1220. if (!obj || !obj.resolved) {
  1221. (0, _util.error)('Requesting object that isn\'t resolved yet ' + objId);
  1222. }
  1223. return obj.data;
  1224. },
  1225. resolve: function PDFObjects_resolve(objId, data) {
  1226. var obj = this.ensureObj(objId);
  1227. obj.resolved = true;
  1228. obj.data = data;
  1229. obj.capability.resolve(data);
  1230. },
  1231. isResolved: function PDFObjects_isResolved(objId) {
  1232. var objs = this.objs;
  1233. if (!objs[objId]) {
  1234. return false;
  1235. }
  1236. return objs[objId].resolved;
  1237. },
  1238. hasData: function PDFObjects_hasData(objId) {
  1239. return this.isResolved(objId);
  1240. },
  1241. getData: function PDFObjects_getData(objId) {
  1242. var objs = this.objs;
  1243. if (!objs[objId] || !objs[objId].resolved) {
  1244. return null;
  1245. }
  1246. return objs[objId].data;
  1247. },
  1248. clear: function PDFObjects_clear() {
  1249. this.objs = Object.create(null);
  1250. }
  1251. };
  1252. return PDFObjects;
  1253. }();
  1254. var RenderTask = function RenderTaskClosure() {
  1255. function RenderTask(internalRenderTask) {
  1256. this._internalRenderTask = internalRenderTask;
  1257. this.onContinue = null;
  1258. }
  1259. RenderTask.prototype = {
  1260. get promise() {
  1261. return this._internalRenderTask.capability.promise;
  1262. },
  1263. cancel: function RenderTask_cancel() {
  1264. this._internalRenderTask.cancel();
  1265. },
  1266. then: function RenderTask_then(onFulfilled, onRejected) {
  1267. return this.promise.then.apply(this.promise, arguments);
  1268. }
  1269. };
  1270. return RenderTask;
  1271. }();
  1272. var InternalRenderTask = function InternalRenderTaskClosure() {
  1273. function InternalRenderTask(callback, params, objs, commonObjs, operatorList, pageNumber, canvasFactory) {
  1274. this.callback = callback;
  1275. this.params = params;
  1276. this.objs = objs;
  1277. this.commonObjs = commonObjs;
  1278. this.operatorListIdx = null;
  1279. this.operatorList = operatorList;
  1280. this.pageNumber = pageNumber;
  1281. this.canvasFactory = canvasFactory;
  1282. this.running = false;
  1283. this.graphicsReadyCallback = null;
  1284. this.graphicsReady = false;
  1285. this.useRequestAnimationFrame = false;
  1286. this.cancelled = false;
  1287. this.capability = (0, _util.createPromiseCapability)();
  1288. this.task = new RenderTask(this);
  1289. this._continueBound = this._continue.bind(this);
  1290. this._scheduleNextBound = this._scheduleNext.bind(this);
  1291. this._nextBound = this._next.bind(this);
  1292. }
  1293. InternalRenderTask.prototype = {
  1294. initializeGraphics: function InternalRenderTask_initializeGraphics(transparency) {
  1295. if (this.cancelled) {
  1296. return;
  1297. }
  1298. if ((0, _dom_utils.getDefaultSetting)('pdfBug') && _util.globalScope.StepperManager && _util.globalScope.StepperManager.enabled) {
  1299. this.stepper = _util.globalScope.StepperManager.create(this.pageNumber - 1);
  1300. this.stepper.init(this.operatorList);
  1301. this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();
  1302. }
  1303. var params = this.params;
  1304. this.gfx = new _canvas.CanvasGraphics(params.canvasContext, this.commonObjs, this.objs, this.canvasFactory, params.imageLayer);
  1305. this.gfx.beginDrawing(params.transform, params.viewport, transparency);
  1306. this.operatorListIdx = 0;
  1307. this.graphicsReady = true;
  1308. if (this.graphicsReadyCallback) {
  1309. this.graphicsReadyCallback();
  1310. }
  1311. },
  1312. cancel: function InternalRenderTask_cancel() {
  1313. this.running = false;
  1314. this.cancelled = true;
  1315. if ((0, _dom_utils.getDefaultSetting)('pdfjsNext')) {
  1316. this.callback(new _dom_utils.RenderingCancelledException('Rendering cancelled, page ' + this.pageNumber, 'canvas'));
  1317. } else {
  1318. this.callback('cancelled');
  1319. }
  1320. },
  1321. operatorListChanged: function InternalRenderTask_operatorListChanged() {
  1322. if (!this.graphicsReady) {
  1323. if (!this.graphicsReadyCallback) {
  1324. this.graphicsReadyCallback = this._continueBound;
  1325. }
  1326. return;
  1327. }
  1328. if (this.stepper) {
  1329. this.stepper.updateOperatorList(this.operatorList);
  1330. }
  1331. if (this.running) {
  1332. return;
  1333. }
  1334. this._continue();
  1335. },
  1336. _continue: function InternalRenderTask__continue() {
  1337. this.running = true;
  1338. if (this.cancelled) {
  1339. return;
  1340. }
  1341. if (this.task.onContinue) {
  1342. this.task.onContinue(this._scheduleNextBound);
  1343. } else {
  1344. this._scheduleNext();
  1345. }
  1346. },
  1347. _scheduleNext: function InternalRenderTask__scheduleNext() {
  1348. if (this.useRequestAnimationFrame && typeof window !== 'undefined') {
  1349. window.requestAnimationFrame(this._nextBound);
  1350. } else {
  1351. Promise.resolve(undefined).then(this._nextBound);
  1352. }
  1353. },
  1354. _next: function InternalRenderTask__next() {
  1355. if (this.cancelled) {
  1356. return;
  1357. }
  1358. this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper);
  1359. if (this.operatorListIdx === this.operatorList.argsArray.length) {
  1360. this.running = false;
  1361. if (this.operatorList.lastChunk) {
  1362. this.gfx.endDrawing();
  1363. this.callback();
  1364. }
  1365. }
  1366. }
  1367. };
  1368. return InternalRenderTask;
  1369. }();
  1370. var _UnsupportedManager = function UnsupportedManagerClosure() {
  1371. var listeners = [];
  1372. return {
  1373. listen: function listen(cb) {
  1374. (0, _util.deprecated)('Global UnsupportedManager.listen is used: ' + ' use PDFDocumentLoadingTask.onUnsupportedFeature instead');
  1375. listeners.push(cb);
  1376. },
  1377. notify: function notify(featureId) {
  1378. for (var i = 0, ii = listeners.length; i < ii; i++) {
  1379. listeners[i](featureId);
  1380. }
  1381. }
  1382. };
  1383. }();
  1384. var version, build;
  1385. {
  1386. exports.version = version = '1.8.346';
  1387. exports.build = build = '15425d5b';
  1388. }
  1389. exports.getDocument = getDocument;
  1390. exports.LoopbackPort = LoopbackPort;
  1391. exports.PDFDataRangeTransport = PDFDataRangeTransport;
  1392. exports.PDFWorker = PDFWorker;
  1393. exports.PDFDocumentProxy = PDFDocumentProxy;
  1394. exports.PDFPageProxy = PDFPageProxy;
  1395. exports._UnsupportedManager = _UnsupportedManager;
  1396. exports.version = version;
  1397. exports.build = build;