api.js 46 KB

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