2
0

api.js 51 KB

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