api.js 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443
  1. /**
  2. * @licstart The following is the entire license notice for the
  3. * Javascript code in this page
  4. *
  5. * Copyright 2021 Mozilla Foundation
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. *
  19. * @licend The above is the entire license notice for the
  20. * Javascript code in this page
  21. */
  22. "use strict";
  23. Object.defineProperty(exports, "__esModule", {
  24. value: true
  25. });
  26. exports.getDocument = getDocument;
  27. exports.setPDFNetworkStreamFactory = setPDFNetworkStreamFactory;
  28. exports.version = exports.RenderTask = exports.PDFWorker = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFDocumentLoadingTask = exports.PDFDataRangeTransport = exports.LoopbackPort = exports.DefaultStandardFontDataFactory = exports.DefaultCMapReaderFactory = exports.DefaultCanvasFactory = exports.build = void 0;
  29. var _util = require("../shared/util.js");
  30. var _display_utils = require("./display_utils.js");
  31. var _font_loader = require("./font_loader.js");
  32. var _node_utils = require("./node_utils.js");
  33. var _annotation_storage = require("./annotation_storage.js");
  34. var _canvas = require("./canvas.js");
  35. var _worker_options = require("./worker_options.js");
  36. var _is_node = require("../shared/is_node.js");
  37. var _message_handler = require("../shared/message_handler.js");
  38. var _metadata = require("./metadata.js");
  39. var _optional_content_config = require("./optional_content_config.js");
  40. var _transport_stream = require("./transport_stream.js");
  41. var _xfa_text = require("./xfa_text.js");
  42. const DEFAULT_RANGE_CHUNK_SIZE = 65536;
  43. const RENDERING_CANCELLED_TIMEOUT = 100;
  44. const DefaultCanvasFactory = _is_node.isNodeJS ? _node_utils.NodeCanvasFactory : _display_utils.DOMCanvasFactory;
  45. exports.DefaultCanvasFactory = DefaultCanvasFactory;
  46. const DefaultCMapReaderFactory = _is_node.isNodeJS ? _node_utils.NodeCMapReaderFactory : _display_utils.DOMCMapReaderFactory;
  47. exports.DefaultCMapReaderFactory = DefaultCMapReaderFactory;
  48. const DefaultStandardFontDataFactory = _is_node.isNodeJS ? _node_utils.NodeStandardFontDataFactory : _display_utils.DOMStandardFontDataFactory;
  49. exports.DefaultStandardFontDataFactory = DefaultStandardFontDataFactory;
  50. let createPDFNetworkStream;
  51. function setPDFNetworkStreamFactory(pdfNetworkStreamFactory) {
  52. createPDFNetworkStream = pdfNetworkStreamFactory;
  53. }
  54. function getDocument(src) {
  55. const task = new PDFDocumentLoadingTask();
  56. let source;
  57. if (typeof src === "string" || src instanceof URL) {
  58. source = {
  59. url: src
  60. };
  61. } else if ((0, _util.isArrayBuffer)(src)) {
  62. source = {
  63. data: src
  64. };
  65. } else if (src instanceof PDFDataRangeTransport) {
  66. source = {
  67. range: src
  68. };
  69. } else {
  70. if (typeof src !== "object") {
  71. throw new Error("Invalid parameter in getDocument, " + "need either string, URL, Uint8Array, or parameter object.");
  72. }
  73. if (!src.url && !src.data && !src.range) {
  74. throw new Error("Invalid parameter object: need either .data, .range or .url");
  75. }
  76. source = src;
  77. }
  78. const params = Object.create(null);
  79. let rangeTransport = null,
  80. worker = null;
  81. for (const key in source) {
  82. const value = source[key];
  83. switch (key) {
  84. case "url":
  85. if (typeof window !== "undefined") {
  86. try {
  87. params[key] = new URL(value, window.location).href;
  88. continue;
  89. } catch (ex) {
  90. (0, _util.warn)(`Cannot create valid URL: "${ex}".`);
  91. }
  92. } else if (typeof value === "string" || value instanceof URL) {
  93. params[key] = value.toString();
  94. continue;
  95. }
  96. throw new Error("Invalid PDF url data: " + "either string or URL-object is expected in the url property.");
  97. case "range":
  98. rangeTransport = value;
  99. continue;
  100. case "worker":
  101. worker = value;
  102. continue;
  103. case "data":
  104. if (_is_node.isNodeJS && typeof Buffer !== "undefined" && value instanceof Buffer) {
  105. params[key] = new Uint8Array(value);
  106. } else if (value instanceof Uint8Array) {
  107. break;
  108. } else if (typeof value === "string") {
  109. params[key] = (0, _util.stringToBytes)(value);
  110. } else if (typeof value === "object" && value !== null && !isNaN(value.length)) {
  111. params[key] = new Uint8Array(value);
  112. } else if ((0, _util.isArrayBuffer)(value)) {
  113. params[key] = new Uint8Array(value);
  114. } else {
  115. throw new Error("Invalid PDF binary data: either typed array, " + "string, or array-like object is expected in the data property.");
  116. }
  117. continue;
  118. }
  119. params[key] = value;
  120. }
  121. params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;
  122. params.CMapReaderFactory = params.CMapReaderFactory || DefaultCMapReaderFactory;
  123. params.StandardFontDataFactory = params.StandardFontDataFactory || DefaultStandardFontDataFactory;
  124. params.ignoreErrors = params.stopAtErrors !== true;
  125. params.fontExtraProperties = params.fontExtraProperties === true;
  126. params.pdfBug = params.pdfBug === true;
  127. params.enableXfa = params.enableXfa === true;
  128. if (typeof params.docBaseUrl !== "string" || (0, _display_utils.isDataScheme)(params.docBaseUrl)) {
  129. params.docBaseUrl = null;
  130. }
  131. if (!Number.isInteger(params.maxImageSize)) {
  132. params.maxImageSize = -1;
  133. }
  134. if (typeof params.useWorkerFetch !== "boolean") {
  135. params.useWorkerFetch = params.CMapReaderFactory === _display_utils.DOMCMapReaderFactory && params.StandardFontDataFactory === _display_utils.DOMStandardFontDataFactory;
  136. }
  137. if (typeof params.isEvalSupported !== "boolean") {
  138. params.isEvalSupported = true;
  139. }
  140. if (typeof params.disableFontFace !== "boolean") {
  141. params.disableFontFace = _is_node.isNodeJS;
  142. }
  143. if (typeof params.useSystemFonts !== "boolean") {
  144. params.useSystemFonts = !_is_node.isNodeJS && !params.disableFontFace;
  145. }
  146. if (typeof params.ownerDocument === "undefined") {
  147. params.ownerDocument = globalThis.document;
  148. }
  149. if (typeof params.disableRange !== "boolean") {
  150. params.disableRange = false;
  151. }
  152. if (typeof params.disableStream !== "boolean") {
  153. params.disableStream = false;
  154. }
  155. if (typeof params.disableAutoFetch !== "boolean") {
  156. params.disableAutoFetch = false;
  157. }
  158. (0, _util.setVerbosityLevel)(params.verbosity);
  159. if (!worker) {
  160. const workerParams = {
  161. verbosity: params.verbosity,
  162. port: _worker_options.GlobalWorkerOptions.workerPort
  163. };
  164. worker = workerParams.port ? PDFWorker.fromPort(workerParams) : new PDFWorker(workerParams);
  165. task._worker = worker;
  166. }
  167. const docId = task.docId;
  168. worker.promise.then(function () {
  169. if (task.destroyed) {
  170. throw new Error("Loading aborted");
  171. }
  172. const workerIdPromise = _fetchDocument(worker, params, rangeTransport, docId);
  173. const networkStreamPromise = new Promise(function (resolve) {
  174. let networkStream;
  175. if (rangeTransport) {
  176. networkStream = new _transport_stream.PDFDataTransportStream({
  177. length: params.length,
  178. initialData: params.initialData,
  179. progressiveDone: params.progressiveDone,
  180. contentDispositionFilename: params.contentDispositionFilename,
  181. disableRange: params.disableRange,
  182. disableStream: params.disableStream
  183. }, rangeTransport);
  184. } else if (!params.data) {
  185. networkStream = createPDFNetworkStream({
  186. url: params.url,
  187. length: params.length,
  188. httpHeaders: params.httpHeaders,
  189. withCredentials: params.withCredentials,
  190. rangeChunkSize: params.rangeChunkSize,
  191. disableRange: params.disableRange,
  192. disableStream: params.disableStream
  193. });
  194. }
  195. resolve(networkStream);
  196. });
  197. return Promise.all([workerIdPromise, networkStreamPromise]).then(function ([workerId, networkStream]) {
  198. if (task.destroyed) {
  199. throw new Error("Loading aborted");
  200. }
  201. const messageHandler = new _message_handler.MessageHandler(docId, workerId, worker.port);
  202. messageHandler.postMessageTransfers = worker.postMessageTransfers;
  203. const transport = new WorkerTransport(messageHandler, task, networkStream, params);
  204. task._transport = transport;
  205. messageHandler.send("Ready", null);
  206. });
  207. }).catch(task._capability.reject);
  208. return task;
  209. }
  210. async function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
  211. if (worker.destroyed) {
  212. throw new Error("Worker was destroyed");
  213. }
  214. if (pdfDataRangeTransport) {
  215. source.length = pdfDataRangeTransport.length;
  216. source.initialData = pdfDataRangeTransport.initialData;
  217. source.progressiveDone = pdfDataRangeTransport.progressiveDone;
  218. source.contentDispositionFilename = pdfDataRangeTransport.contentDispositionFilename;
  219. }
  220. const workerId = await worker.messageHandler.sendWithPromise("GetDocRequest", {
  221. docId,
  222. apiVersion: '2.11.338',
  223. source: {
  224. data: source.data,
  225. url: source.url,
  226. password: source.password,
  227. disableAutoFetch: source.disableAutoFetch,
  228. rangeChunkSize: source.rangeChunkSize,
  229. length: source.length
  230. },
  231. maxImageSize: source.maxImageSize,
  232. disableFontFace: source.disableFontFace,
  233. postMessageTransfers: worker.postMessageTransfers,
  234. docBaseUrl: source.docBaseUrl,
  235. ignoreErrors: source.ignoreErrors,
  236. isEvalSupported: source.isEvalSupported,
  237. fontExtraProperties: source.fontExtraProperties,
  238. enableXfa: source.enableXfa,
  239. useSystemFonts: source.useSystemFonts,
  240. cMapUrl: source.useWorkerFetch ? source.cMapUrl : null,
  241. standardFontDataUrl: source.useWorkerFetch ? source.standardFontDataUrl : null
  242. });
  243. if (worker.destroyed) {
  244. throw new Error("Worker was destroyed");
  245. }
  246. return workerId;
  247. }
  248. class PDFDocumentLoadingTask {
  249. static get idCounters() {
  250. return (0, _util.shadow)(this, "idCounters", {
  251. doc: 0
  252. });
  253. }
  254. constructor() {
  255. this._capability = (0, _util.createPromiseCapability)();
  256. this._transport = null;
  257. this._worker = null;
  258. this.docId = `d${PDFDocumentLoadingTask.idCounters.doc++}`;
  259. this.destroyed = false;
  260. this.onPassword = null;
  261. this.onProgress = null;
  262. this.onUnsupportedFeature = null;
  263. }
  264. get promise() {
  265. return this._capability.promise;
  266. }
  267. async destroy() {
  268. this.destroyed = true;
  269. await this._transport?.destroy();
  270. this._transport = null;
  271. if (this._worker) {
  272. this._worker.destroy();
  273. this._worker = null;
  274. }
  275. }
  276. }
  277. exports.PDFDocumentLoadingTask = PDFDocumentLoadingTask;
  278. class PDFDataRangeTransport {
  279. constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) {
  280. this.length = length;
  281. this.initialData = initialData;
  282. this.progressiveDone = progressiveDone;
  283. this.contentDispositionFilename = contentDispositionFilename;
  284. this._rangeListeners = [];
  285. this._progressListeners = [];
  286. this._progressiveReadListeners = [];
  287. this._progressiveDoneListeners = [];
  288. this._readyCapability = (0, _util.createPromiseCapability)();
  289. }
  290. addRangeListener(listener) {
  291. this._rangeListeners.push(listener);
  292. }
  293. addProgressListener(listener) {
  294. this._progressListeners.push(listener);
  295. }
  296. addProgressiveReadListener(listener) {
  297. this._progressiveReadListeners.push(listener);
  298. }
  299. addProgressiveDoneListener(listener) {
  300. this._progressiveDoneListeners.push(listener);
  301. }
  302. onDataRange(begin, chunk) {
  303. for (const listener of this._rangeListeners) {
  304. listener(begin, chunk);
  305. }
  306. }
  307. onDataProgress(loaded, total) {
  308. this._readyCapability.promise.then(() => {
  309. for (const listener of this._progressListeners) {
  310. listener(loaded, total);
  311. }
  312. });
  313. }
  314. onDataProgressiveRead(chunk) {
  315. this._readyCapability.promise.then(() => {
  316. for (const listener of this._progressiveReadListeners) {
  317. listener(chunk);
  318. }
  319. });
  320. }
  321. onDataProgressiveDone() {
  322. this._readyCapability.promise.then(() => {
  323. for (const listener of this._progressiveDoneListeners) {
  324. listener();
  325. }
  326. });
  327. }
  328. transportReady() {
  329. this._readyCapability.resolve();
  330. }
  331. requestDataRange(begin, end) {
  332. (0, _util.unreachable)("Abstract method PDFDataRangeTransport.requestDataRange");
  333. }
  334. abort() {}
  335. }
  336. exports.PDFDataRangeTransport = PDFDataRangeTransport;
  337. class PDFDocumentProxy {
  338. constructor(pdfInfo, transport) {
  339. this._pdfInfo = pdfInfo;
  340. this._transport = transport;
  341. Object.defineProperty(this, "fingerprint", {
  342. get() {
  343. (0, _display_utils.deprecated)("`PDFDocumentProxy.fingerprint`, " + "please use `PDFDocumentProxy.fingerprints` instead.");
  344. return this.fingerprints[0];
  345. }
  346. });
  347. }
  348. get annotationStorage() {
  349. return this._transport.annotationStorage;
  350. }
  351. get numPages() {
  352. return this._pdfInfo.numPages;
  353. }
  354. get fingerprints() {
  355. return this._pdfInfo.fingerprints;
  356. }
  357. get isPureXfa() {
  358. return !!this._transport._htmlForXfa;
  359. }
  360. get allXfaHtml() {
  361. return this._transport._htmlForXfa;
  362. }
  363. getPage(pageNumber) {
  364. return this._transport.getPage(pageNumber);
  365. }
  366. getPageIndex(ref) {
  367. return this._transport.getPageIndex(ref);
  368. }
  369. getDestinations() {
  370. return this._transport.getDestinations();
  371. }
  372. getDestination(id) {
  373. return this._transport.getDestination(id);
  374. }
  375. getPageLabels() {
  376. return this._transport.getPageLabels();
  377. }
  378. getPageLayout() {
  379. return this._transport.getPageLayout();
  380. }
  381. getPageMode() {
  382. return this._transport.getPageMode();
  383. }
  384. getViewerPreferences() {
  385. return this._transport.getViewerPreferences();
  386. }
  387. getOpenAction() {
  388. return this._transport.getOpenAction();
  389. }
  390. getAttachments() {
  391. return this._transport.getAttachments();
  392. }
  393. getJavaScript() {
  394. return this._transport.getJavaScript();
  395. }
  396. getJSActions() {
  397. return this._transport.getDocJSActions();
  398. }
  399. getOutline() {
  400. return this._transport.getOutline();
  401. }
  402. getOptionalContentConfig() {
  403. return this._transport.getOptionalContentConfig();
  404. }
  405. getPermissions() {
  406. return this._transport.getPermissions();
  407. }
  408. getMetadata() {
  409. return this._transport.getMetadata();
  410. }
  411. getMarkInfo() {
  412. return this._transport.getMarkInfo();
  413. }
  414. getData() {
  415. return this._transport.getData();
  416. }
  417. getDownloadInfo() {
  418. return this._transport.downloadInfoCapability.promise;
  419. }
  420. getStats() {
  421. return this._transport.getStats();
  422. }
  423. cleanup(keepLoadedFonts = false) {
  424. return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa);
  425. }
  426. destroy() {
  427. return this.loadingTask.destroy();
  428. }
  429. get loadingParams() {
  430. return this._transport.loadingParams;
  431. }
  432. get loadingTask() {
  433. return this._transport.loadingTask;
  434. }
  435. saveDocument() {
  436. if (this._transport.annotationStorage.size <= 0) {
  437. (0, _display_utils.deprecated)("saveDocument called while `annotationStorage` is empty, " + "please use the getData-method instead.");
  438. }
  439. return this._transport.saveDocument();
  440. }
  441. getFieldObjects() {
  442. return this._transport.getFieldObjects();
  443. }
  444. hasJSActions() {
  445. return this._transport.hasJSActions();
  446. }
  447. getCalculationOrderIds() {
  448. return this._transport.getCalculationOrderIds();
  449. }
  450. }
  451. exports.PDFDocumentProxy = PDFDocumentProxy;
  452. class PDFPageProxy {
  453. constructor(pageIndex, pageInfo, transport, ownerDocument, pdfBug = false) {
  454. this._pageIndex = pageIndex;
  455. this._pageInfo = pageInfo;
  456. this._ownerDocument = ownerDocument;
  457. this._transport = transport;
  458. this._stats = pdfBug ? new _display_utils.StatTimer() : null;
  459. this._pdfBug = pdfBug;
  460. this.commonObjs = transport.commonObjs;
  461. this.objs = new PDFObjects();
  462. this.cleanupAfterRender = false;
  463. this.pendingCleanup = false;
  464. this._intentStates = new Map();
  465. this._annotationPromises = new Map();
  466. this.destroyed = false;
  467. }
  468. get pageNumber() {
  469. return this._pageIndex + 1;
  470. }
  471. get rotate() {
  472. return this._pageInfo.rotate;
  473. }
  474. get ref() {
  475. return this._pageInfo.ref;
  476. }
  477. get userUnit() {
  478. return this._pageInfo.userUnit;
  479. }
  480. get view() {
  481. return this._pageInfo.view;
  482. }
  483. getViewport({
  484. scale,
  485. rotation = this.rotate,
  486. offsetX = 0,
  487. offsetY = 0,
  488. dontFlip = false
  489. } = {}) {
  490. return new _display_utils.PageViewport({
  491. viewBox: this.view,
  492. scale,
  493. rotation,
  494. offsetX,
  495. offsetY,
  496. dontFlip
  497. });
  498. }
  499. getAnnotations({
  500. intent = "display"
  501. } = {}) {
  502. const intentArgs = this._transport.getRenderingIntent(intent);
  503. let promise = this._annotationPromises.get(intentArgs.cacheKey);
  504. if (!promise) {
  505. promise = this._transport.getAnnotations(this._pageIndex, intentArgs.renderingIntent);
  506. this._annotationPromises.set(intentArgs.cacheKey, promise);
  507. promise = promise.then(annotations => {
  508. for (const annotation of annotations) {
  509. if (annotation.titleObj !== undefined) {
  510. Object.defineProperty(annotation, "title", {
  511. get() {
  512. (0, _display_utils.deprecated)("`title`-property on annotation, please use `titleObj` instead.");
  513. return annotation.titleObj.str;
  514. }
  515. });
  516. }
  517. if (annotation.contentsObj !== undefined) {
  518. Object.defineProperty(annotation, "contents", {
  519. get() {
  520. (0, _display_utils.deprecated)("`contents`-property on annotation, please use `contentsObj` instead.");
  521. return annotation.contentsObj.str;
  522. }
  523. });
  524. }
  525. }
  526. return annotations;
  527. });
  528. }
  529. return promise;
  530. }
  531. getJSActions() {
  532. return this._jsActionsPromise ||= this._transport.getPageJSActions(this._pageIndex);
  533. }
  534. async getXfa() {
  535. return this._transport._htmlForXfa?.children[this._pageIndex] || null;
  536. }
  537. render({
  538. canvasContext,
  539. viewport,
  540. intent = "display",
  541. annotationMode = _util.AnnotationMode.ENABLE,
  542. transform = null,
  543. imageLayer = null,
  544. canvasFactory = null,
  545. background = null,
  546. optionalContentConfigPromise = null
  547. }) {
  548. if (arguments[0]?.renderInteractiveForms !== undefined) {
  549. (0, _display_utils.deprecated)("render no longer accepts the `renderInteractiveForms`-option, " + "please use the `annotationMode`-option instead.");
  550. if (arguments[0].renderInteractiveForms === true && annotationMode === _util.AnnotationMode.ENABLE) {
  551. annotationMode = _util.AnnotationMode.ENABLE_FORMS;
  552. }
  553. }
  554. if (arguments[0]?.includeAnnotationStorage !== undefined) {
  555. (0, _display_utils.deprecated)("render no longer accepts the `includeAnnotationStorage`-option, " + "please use the `annotationMode`-option instead.");
  556. if (arguments[0].includeAnnotationStorage === true && annotationMode === _util.AnnotationMode.ENABLE) {
  557. annotationMode = _util.AnnotationMode.ENABLE_STORAGE;
  558. }
  559. }
  560. if (this._stats) {
  561. this._stats.time("Overall");
  562. }
  563. const intentArgs = this._transport.getRenderingIntent(intent, annotationMode);
  564. this.pendingCleanup = false;
  565. if (!optionalContentConfigPromise) {
  566. optionalContentConfigPromise = this._transport.getOptionalContentConfig();
  567. }
  568. let intentState = this._intentStates.get(intentArgs.cacheKey);
  569. if (!intentState) {
  570. intentState = Object.create(null);
  571. this._intentStates.set(intentArgs.cacheKey, intentState);
  572. }
  573. if (intentState.streamReaderCancelTimeout) {
  574. clearTimeout(intentState.streamReaderCancelTimeout);
  575. intentState.streamReaderCancelTimeout = null;
  576. }
  577. const canvasFactoryInstance = canvasFactory || new DefaultCanvasFactory({
  578. ownerDocument: this._ownerDocument
  579. });
  580. const intentPrint = !!(intentArgs.renderingIntent & _util.RenderingIntentFlag.PRINT);
  581. if (!intentState.displayReadyCapability) {
  582. intentState.displayReadyCapability = (0, _util.createPromiseCapability)();
  583. intentState.operatorList = {
  584. fnArray: [],
  585. argsArray: [],
  586. lastChunk: false
  587. };
  588. if (this._stats) {
  589. this._stats.time("Page Request");
  590. }
  591. this._pumpOperatorList(intentArgs);
  592. }
  593. const complete = error => {
  594. intentState.renderTasks.delete(internalRenderTask);
  595. if (this.cleanupAfterRender || intentPrint) {
  596. this.pendingCleanup = true;
  597. }
  598. this._tryCleanup();
  599. if (error) {
  600. internalRenderTask.capability.reject(error);
  601. this._abortOperatorList({
  602. intentState,
  603. reason: error instanceof Error ? error : new Error(error)
  604. });
  605. } else {
  606. internalRenderTask.capability.resolve();
  607. }
  608. if (this._stats) {
  609. this._stats.timeEnd("Rendering");
  610. this._stats.timeEnd("Overall");
  611. }
  612. };
  613. const internalRenderTask = new InternalRenderTask({
  614. callback: complete,
  615. params: {
  616. canvasContext,
  617. viewport,
  618. transform,
  619. imageLayer,
  620. background
  621. },
  622. objs: this.objs,
  623. commonObjs: this.commonObjs,
  624. operatorList: intentState.operatorList,
  625. pageIndex: this._pageIndex,
  626. canvasFactory: canvasFactoryInstance,
  627. useRequestAnimationFrame: !intentPrint,
  628. pdfBug: this._pdfBug
  629. });
  630. (intentState.renderTasks ||= new Set()).add(internalRenderTask);
  631. const renderTask = internalRenderTask.task;
  632. Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => {
  633. if (this.pendingCleanup) {
  634. complete();
  635. return;
  636. }
  637. if (this._stats) {
  638. this._stats.time("Rendering");
  639. }
  640. internalRenderTask.initializeGraphics({
  641. transparency,
  642. optionalContentConfig
  643. });
  644. internalRenderTask.operatorListChanged();
  645. }).catch(complete);
  646. return renderTask;
  647. }
  648. getOperatorList({
  649. intent = "display",
  650. annotationMode = _util.AnnotationMode.ENABLE
  651. } = {}) {
  652. function operatorListChanged() {
  653. if (intentState.operatorList.lastChunk) {
  654. intentState.opListReadCapability.resolve(intentState.operatorList);
  655. intentState.renderTasks.delete(opListTask);
  656. }
  657. }
  658. const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, true);
  659. let intentState = this._intentStates.get(intentArgs.cacheKey);
  660. if (!intentState) {
  661. intentState = Object.create(null);
  662. this._intentStates.set(intentArgs.cacheKey, intentState);
  663. }
  664. let opListTask;
  665. if (!intentState.opListReadCapability) {
  666. opListTask = Object.create(null);
  667. opListTask.operatorListChanged = operatorListChanged;
  668. intentState.opListReadCapability = (0, _util.createPromiseCapability)();
  669. (intentState.renderTasks ||= new Set()).add(opListTask);
  670. intentState.operatorList = {
  671. fnArray: [],
  672. argsArray: [],
  673. lastChunk: false
  674. };
  675. if (this._stats) {
  676. this._stats.time("Page Request");
  677. }
  678. this._pumpOperatorList(intentArgs);
  679. }
  680. return intentState.opListReadCapability.promise;
  681. }
  682. streamTextContent({
  683. normalizeWhitespace = false,
  684. disableCombineTextItems = false,
  685. includeMarkedContent = false
  686. } = {}) {
  687. const TEXT_CONTENT_CHUNK_SIZE = 100;
  688. return this._transport.messageHandler.sendWithStream("GetTextContent", {
  689. pageIndex: this._pageIndex,
  690. normalizeWhitespace: normalizeWhitespace === true,
  691. combineTextItems: disableCombineTextItems !== true,
  692. includeMarkedContent: includeMarkedContent === true
  693. }, {
  694. highWaterMark: TEXT_CONTENT_CHUNK_SIZE,
  695. size(textContent) {
  696. return textContent.items.length;
  697. }
  698. });
  699. }
  700. getTextContent(params = {}) {
  701. if (this._transport._htmlForXfa) {
  702. return this.getXfa().then(xfa => {
  703. return _xfa_text.XfaText.textContent(xfa);
  704. });
  705. }
  706. const readableStream = this.streamTextContent(params);
  707. return new Promise(function (resolve, reject) {
  708. function pump() {
  709. reader.read().then(function ({
  710. value,
  711. done
  712. }) {
  713. if (done) {
  714. resolve(textContent);
  715. return;
  716. }
  717. Object.assign(textContent.styles, value.styles);
  718. textContent.items.push(...value.items);
  719. pump();
  720. }, reject);
  721. }
  722. const reader = readableStream.getReader();
  723. const textContent = {
  724. items: [],
  725. styles: Object.create(null)
  726. };
  727. pump();
  728. });
  729. }
  730. getStructTree() {
  731. return this._structTreePromise ||= this._transport.getStructTree(this._pageIndex);
  732. }
  733. _destroy() {
  734. this.destroyed = true;
  735. this._transport.pageCache[this._pageIndex] = null;
  736. const waitOn = [];
  737. for (const intentState of this._intentStates.values()) {
  738. this._abortOperatorList({
  739. intentState,
  740. reason: new Error("Page was destroyed."),
  741. force: true
  742. });
  743. if (intentState.opListReadCapability) {
  744. continue;
  745. }
  746. for (const internalRenderTask of intentState.renderTasks) {
  747. waitOn.push(internalRenderTask.completed);
  748. internalRenderTask.cancel();
  749. }
  750. }
  751. this.objs.clear();
  752. this._annotationPromises.clear();
  753. this._jsActionsPromise = null;
  754. this._structTreePromise = null;
  755. this.pendingCleanup = false;
  756. return Promise.all(waitOn);
  757. }
  758. cleanup(resetStats = false) {
  759. this.pendingCleanup = true;
  760. return this._tryCleanup(resetStats);
  761. }
  762. _tryCleanup(resetStats = false) {
  763. if (!this.pendingCleanup) {
  764. return false;
  765. }
  766. for (const {
  767. renderTasks,
  768. operatorList
  769. } of this._intentStates.values()) {
  770. if (renderTasks.size > 0 || !operatorList.lastChunk) {
  771. return false;
  772. }
  773. }
  774. this._intentStates.clear();
  775. this.objs.clear();
  776. this._annotationPromises.clear();
  777. this._jsActionsPromise = null;
  778. this._structTreePromise = null;
  779. if (resetStats && this._stats) {
  780. this._stats = new _display_utils.StatTimer();
  781. }
  782. this.pendingCleanup = false;
  783. return true;
  784. }
  785. _startRenderPage(transparency, cacheKey) {
  786. const intentState = this._intentStates.get(cacheKey);
  787. if (!intentState) {
  788. return;
  789. }
  790. if (this._stats) {
  791. this._stats.timeEnd("Page Request");
  792. }
  793. if (intentState.displayReadyCapability) {
  794. intentState.displayReadyCapability.resolve(transparency);
  795. }
  796. }
  797. _renderPageChunk(operatorListChunk, intentState) {
  798. for (let i = 0, ii = operatorListChunk.length; i < ii; i++) {
  799. intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);
  800. intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);
  801. }
  802. intentState.operatorList.lastChunk = operatorListChunk.lastChunk;
  803. for (const internalRenderTask of intentState.renderTasks) {
  804. internalRenderTask.operatorListChanged();
  805. }
  806. if (operatorListChunk.lastChunk) {
  807. this._tryCleanup();
  808. }
  809. }
  810. _pumpOperatorList({
  811. renderingIntent,
  812. cacheKey
  813. }) {
  814. const readableStream = this._transport.messageHandler.sendWithStream("GetOperatorList", {
  815. pageIndex: this._pageIndex,
  816. intent: renderingIntent,
  817. cacheKey,
  818. annotationStorage: renderingIntent & _util.RenderingIntentFlag.ANNOTATIONS_STORAGE ? this._transport.annotationStorage.serializable : null
  819. });
  820. const reader = readableStream.getReader();
  821. const intentState = this._intentStates.get(cacheKey);
  822. intentState.streamReader = reader;
  823. const pump = () => {
  824. reader.read().then(({
  825. value,
  826. done
  827. }) => {
  828. if (done) {
  829. intentState.streamReader = null;
  830. return;
  831. }
  832. if (this._transport.destroyed) {
  833. return;
  834. }
  835. this._renderPageChunk(value, intentState);
  836. pump();
  837. }, reason => {
  838. intentState.streamReader = null;
  839. if (this._transport.destroyed) {
  840. return;
  841. }
  842. if (intentState.operatorList) {
  843. intentState.operatorList.lastChunk = true;
  844. for (const internalRenderTask of intentState.renderTasks) {
  845. internalRenderTask.operatorListChanged();
  846. }
  847. this._tryCleanup();
  848. }
  849. if (intentState.displayReadyCapability) {
  850. intentState.displayReadyCapability.reject(reason);
  851. } else if (intentState.opListReadCapability) {
  852. intentState.opListReadCapability.reject(reason);
  853. } else {
  854. throw reason;
  855. }
  856. });
  857. };
  858. pump();
  859. }
  860. _abortOperatorList({
  861. intentState,
  862. reason,
  863. force = false
  864. }) {
  865. if (!intentState.streamReader) {
  866. return;
  867. }
  868. if (!force) {
  869. if (intentState.renderTasks.size > 0) {
  870. return;
  871. }
  872. if (reason instanceof _display_utils.RenderingCancelledException) {
  873. intentState.streamReaderCancelTimeout = setTimeout(() => {
  874. this._abortOperatorList({
  875. intentState,
  876. reason,
  877. force: true
  878. });
  879. intentState.streamReaderCancelTimeout = null;
  880. }, RENDERING_CANCELLED_TIMEOUT);
  881. return;
  882. }
  883. }
  884. intentState.streamReader.cancel(new _util.AbortException(reason.message)).catch(() => {});
  885. intentState.streamReader = null;
  886. if (this._transport.destroyed) {
  887. return;
  888. }
  889. for (const [curCacheKey, curIntentState] of this._intentStates) {
  890. if (curIntentState === intentState) {
  891. this._intentStates.delete(curCacheKey);
  892. break;
  893. }
  894. }
  895. this.cleanup();
  896. }
  897. get stats() {
  898. return this._stats;
  899. }
  900. }
  901. exports.PDFPageProxy = PDFPageProxy;
  902. class LoopbackPort {
  903. constructor() {
  904. this._listeners = [];
  905. this._deferred = Promise.resolve(undefined);
  906. }
  907. postMessage(obj, transfers) {
  908. function cloneValue(value) {
  909. if (typeof value === "function" || typeof value === "symbol" || value instanceof URL) {
  910. throw new Error(`LoopbackPort.postMessage - cannot clone: ${value?.toString()}`);
  911. }
  912. if (typeof value !== "object" || value === null) {
  913. return value;
  914. }
  915. if (cloned.has(value)) {
  916. return cloned.get(value);
  917. }
  918. let buffer, result;
  919. if ((buffer = value.buffer) && (0, _util.isArrayBuffer)(buffer)) {
  920. if (transfers?.includes(buffer)) {
  921. result = new value.constructor(buffer, value.byteOffset, value.byteLength);
  922. } else {
  923. result = new value.constructor(value);
  924. }
  925. cloned.set(value, result);
  926. return result;
  927. }
  928. if (value instanceof Map) {
  929. result = new Map();
  930. cloned.set(value, result);
  931. for (const [key, val] of value) {
  932. result.set(key, cloneValue(val));
  933. }
  934. return result;
  935. }
  936. if (value instanceof Set) {
  937. result = new Set();
  938. cloned.set(value, result);
  939. for (const val of value) {
  940. result.add(cloneValue(val));
  941. }
  942. return result;
  943. }
  944. result = Array.isArray(value) ? [] : Object.create(null);
  945. cloned.set(value, result);
  946. for (const i in value) {
  947. let desc,
  948. p = value;
  949. while (!(desc = Object.getOwnPropertyDescriptor(p, i))) {
  950. p = Object.getPrototypeOf(p);
  951. }
  952. if (typeof desc.value === "undefined") {
  953. continue;
  954. }
  955. if (typeof desc.value === "function" && !value.hasOwnProperty?.(i)) {
  956. continue;
  957. }
  958. result[i] = cloneValue(desc.value);
  959. }
  960. return result;
  961. }
  962. const cloned = new WeakMap();
  963. const event = {
  964. data: cloneValue(obj)
  965. };
  966. this._deferred.then(() => {
  967. for (const listener of this._listeners) {
  968. listener.call(this, event);
  969. }
  970. });
  971. }
  972. addEventListener(name, listener) {
  973. this._listeners.push(listener);
  974. }
  975. removeEventListener(name, listener) {
  976. const i = this._listeners.indexOf(listener);
  977. this._listeners.splice(i, 1);
  978. }
  979. terminate() {
  980. this._listeners.length = 0;
  981. }
  982. }
  983. exports.LoopbackPort = LoopbackPort;
  984. const PDFWorkerUtil = {
  985. isWorkerDisabled: false,
  986. fallbackWorkerSrc: null,
  987. fakeWorkerId: 0
  988. };
  989. {
  990. if (_is_node.isNodeJS && typeof require === "function") {
  991. PDFWorkerUtil.isWorkerDisabled = true;
  992. PDFWorkerUtil.fallbackWorkerSrc = "../pdf.worker.js";
  993. } else if (typeof document === "object") {
  994. const pdfjsFilePath = document?.currentScript?.src;
  995. if (pdfjsFilePath) {
  996. PDFWorkerUtil.fallbackWorkerSrc = pdfjsFilePath.replace(/(\.(?:min\.)?js)(\?.*)?$/i, ".worker$1$2");
  997. }
  998. }
  999. PDFWorkerUtil.createCDNWrapper = function (url) {
  1000. const wrapper = `importScripts("${url}");`;
  1001. return URL.createObjectURL(new Blob([wrapper]));
  1002. };
  1003. }
  1004. class PDFWorker {
  1005. static get _workerPorts() {
  1006. return (0, _util.shadow)(this, "_workerPorts", new WeakMap());
  1007. }
  1008. constructor({
  1009. name = null,
  1010. port = null,
  1011. verbosity = (0, _util.getVerbosityLevel)()
  1012. } = {}) {
  1013. if (port && PDFWorker._workerPorts.has(port)) {
  1014. throw new Error("Cannot use more than one PDFWorker per port.");
  1015. }
  1016. this.name = name;
  1017. this.destroyed = false;
  1018. this.postMessageTransfers = true;
  1019. this.verbosity = verbosity;
  1020. this._readyCapability = (0, _util.createPromiseCapability)();
  1021. this._port = null;
  1022. this._webWorker = null;
  1023. this._messageHandler = null;
  1024. if (port) {
  1025. PDFWorker._workerPorts.set(port, this);
  1026. this._initializeFromPort(port);
  1027. return;
  1028. }
  1029. this._initialize();
  1030. }
  1031. get promise() {
  1032. return this._readyCapability.promise;
  1033. }
  1034. get port() {
  1035. return this._port;
  1036. }
  1037. get messageHandler() {
  1038. return this._messageHandler;
  1039. }
  1040. _initializeFromPort(port) {
  1041. this._port = port;
  1042. this._messageHandler = new _message_handler.MessageHandler("main", "worker", port);
  1043. this._messageHandler.on("ready", function () {});
  1044. this._readyCapability.resolve();
  1045. }
  1046. _initialize() {
  1047. if (typeof Worker !== "undefined" && !PDFWorkerUtil.isWorkerDisabled && !PDFWorker._mainThreadWorkerMessageHandler) {
  1048. let workerSrc = PDFWorker.workerSrc;
  1049. try {
  1050. if (!(0, _util.isSameOrigin)(window.location.href, workerSrc)) {
  1051. workerSrc = PDFWorkerUtil.createCDNWrapper(new URL(workerSrc, window.location).href);
  1052. }
  1053. const worker = new Worker(workerSrc);
  1054. const messageHandler = new _message_handler.MessageHandler("main", "worker", worker);
  1055. const terminateEarly = () => {
  1056. worker.removeEventListener("error", onWorkerError);
  1057. messageHandler.destroy();
  1058. worker.terminate();
  1059. if (this.destroyed) {
  1060. this._readyCapability.reject(new Error("Worker was destroyed"));
  1061. } else {
  1062. this._setupFakeWorker();
  1063. }
  1064. };
  1065. const onWorkerError = () => {
  1066. if (!this._webWorker) {
  1067. terminateEarly();
  1068. }
  1069. };
  1070. worker.addEventListener("error", onWorkerError);
  1071. messageHandler.on("test", data => {
  1072. worker.removeEventListener("error", onWorkerError);
  1073. if (this.destroyed) {
  1074. terminateEarly();
  1075. return;
  1076. }
  1077. if (data) {
  1078. this._messageHandler = messageHandler;
  1079. this._port = worker;
  1080. this._webWorker = worker;
  1081. if (!data.supportTransfers) {
  1082. this.postMessageTransfers = false;
  1083. }
  1084. this._readyCapability.resolve();
  1085. messageHandler.send("configure", {
  1086. verbosity: this.verbosity
  1087. });
  1088. } else {
  1089. this._setupFakeWorker();
  1090. messageHandler.destroy();
  1091. worker.terminate();
  1092. }
  1093. });
  1094. messageHandler.on("ready", data => {
  1095. worker.removeEventListener("error", onWorkerError);
  1096. if (this.destroyed) {
  1097. terminateEarly();
  1098. return;
  1099. }
  1100. try {
  1101. sendTest();
  1102. } catch (e) {
  1103. this._setupFakeWorker();
  1104. }
  1105. });
  1106. const sendTest = () => {
  1107. const testObj = new Uint8Array([this.postMessageTransfers ? 255 : 0]);
  1108. try {
  1109. messageHandler.send("test", testObj, [testObj.buffer]);
  1110. } catch (ex) {
  1111. (0, _util.warn)("Cannot use postMessage transfers.");
  1112. testObj[0] = 0;
  1113. messageHandler.send("test", testObj);
  1114. }
  1115. };
  1116. sendTest();
  1117. return;
  1118. } catch (e) {
  1119. (0, _util.info)("The worker has been disabled.");
  1120. }
  1121. }
  1122. this._setupFakeWorker();
  1123. }
  1124. _setupFakeWorker() {
  1125. if (!PDFWorkerUtil.isWorkerDisabled) {
  1126. (0, _util.warn)("Setting up fake worker.");
  1127. PDFWorkerUtil.isWorkerDisabled = true;
  1128. }
  1129. PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => {
  1130. if (this.destroyed) {
  1131. this._readyCapability.reject(new Error("Worker was destroyed"));
  1132. return;
  1133. }
  1134. const port = new LoopbackPort();
  1135. this._port = port;
  1136. const id = `fake${PDFWorkerUtil.fakeWorkerId++}`;
  1137. const workerHandler = new _message_handler.MessageHandler(id + "_worker", id, port);
  1138. WorkerMessageHandler.setup(workerHandler, port);
  1139. const messageHandler = new _message_handler.MessageHandler(id, id + "_worker", port);
  1140. this._messageHandler = messageHandler;
  1141. this._readyCapability.resolve();
  1142. messageHandler.send("configure", {
  1143. verbosity: this.verbosity
  1144. });
  1145. }).catch(reason => {
  1146. this._readyCapability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`));
  1147. });
  1148. }
  1149. destroy() {
  1150. this.destroyed = true;
  1151. if (this._webWorker) {
  1152. this._webWorker.terminate();
  1153. this._webWorker = null;
  1154. }
  1155. PDFWorker._workerPorts.delete(this._port);
  1156. this._port = null;
  1157. if (this._messageHandler) {
  1158. this._messageHandler.destroy();
  1159. this._messageHandler = null;
  1160. }
  1161. }
  1162. static fromPort(params) {
  1163. if (!params?.port) {
  1164. throw new Error("PDFWorker.fromPort - invalid method signature.");
  1165. }
  1166. if (this._workerPorts.has(params.port)) {
  1167. return this._workerPorts.get(params.port);
  1168. }
  1169. return new PDFWorker(params);
  1170. }
  1171. static get workerSrc() {
  1172. if (_worker_options.GlobalWorkerOptions.workerSrc) {
  1173. return _worker_options.GlobalWorkerOptions.workerSrc;
  1174. }
  1175. if (PDFWorkerUtil.fallbackWorkerSrc !== null) {
  1176. if (!_is_node.isNodeJS) {
  1177. (0, _display_utils.deprecated)('No "GlobalWorkerOptions.workerSrc" specified.');
  1178. }
  1179. return PDFWorkerUtil.fallbackWorkerSrc;
  1180. }
  1181. throw new Error('No "GlobalWorkerOptions.workerSrc" specified.');
  1182. }
  1183. static get _mainThreadWorkerMessageHandler() {
  1184. try {
  1185. return globalThis.pdfjsWorker?.WorkerMessageHandler || null;
  1186. } catch (ex) {
  1187. return null;
  1188. }
  1189. }
  1190. static get _setupFakeWorkerGlobal() {
  1191. const loader = async () => {
  1192. const mainWorkerMessageHandler = this._mainThreadWorkerMessageHandler;
  1193. if (mainWorkerMessageHandler) {
  1194. return mainWorkerMessageHandler;
  1195. }
  1196. if (_is_node.isNodeJS && typeof require === "function") {
  1197. const worker = eval("require")(this.workerSrc);
  1198. return worker.WorkerMessageHandler;
  1199. }
  1200. await (0, _display_utils.loadScript)(this.workerSrc);
  1201. return window.pdfjsWorker.WorkerMessageHandler;
  1202. };
  1203. return (0, _util.shadow)(this, "_setupFakeWorkerGlobal", loader());
  1204. }
  1205. }
  1206. exports.PDFWorker = PDFWorker;
  1207. {
  1208. PDFWorker.getWorkerSrc = function () {
  1209. (0, _display_utils.deprecated)("`PDFWorker.getWorkerSrc()`, please use `PDFWorker.workerSrc` instead.");
  1210. return this.workerSrc;
  1211. };
  1212. }
  1213. class WorkerTransport {
  1214. constructor(messageHandler, loadingTask, networkStream, params) {
  1215. this.messageHandler = messageHandler;
  1216. this.loadingTask = loadingTask;
  1217. this.commonObjs = new PDFObjects();
  1218. this.fontLoader = new _font_loader.FontLoader({
  1219. docId: loadingTask.docId,
  1220. onUnsupportedFeature: this._onUnsupportedFeature.bind(this),
  1221. ownerDocument: params.ownerDocument,
  1222. styleElement: params.styleElement
  1223. });
  1224. this._params = params;
  1225. if (!params.useWorkerFetch) {
  1226. this.CMapReaderFactory = new params.CMapReaderFactory({
  1227. baseUrl: params.cMapUrl,
  1228. isCompressed: params.cMapPacked
  1229. });
  1230. this.StandardFontDataFactory = new params.StandardFontDataFactory({
  1231. baseUrl: params.standardFontDataUrl
  1232. });
  1233. }
  1234. this.destroyed = false;
  1235. this.destroyCapability = null;
  1236. this._passwordCapability = null;
  1237. this._networkStream = networkStream;
  1238. this._fullReader = null;
  1239. this._lastProgress = null;
  1240. this.pageCache = [];
  1241. this.pagePromises = [];
  1242. this.downloadInfoCapability = (0, _util.createPromiseCapability)();
  1243. this.setupMessageHandler();
  1244. }
  1245. get annotationStorage() {
  1246. return (0, _util.shadow)(this, "annotationStorage", new _annotation_storage.AnnotationStorage());
  1247. }
  1248. getRenderingIntent(intent, annotationMode = _util.AnnotationMode.ENABLE, isOpList = false) {
  1249. let renderingIntent = _util.RenderingIntentFlag.DISPLAY;
  1250. let lastModified = "";
  1251. switch (intent) {
  1252. case "any":
  1253. renderingIntent = _util.RenderingIntentFlag.ANY;
  1254. break;
  1255. case "display":
  1256. break;
  1257. case "print":
  1258. renderingIntent = _util.RenderingIntentFlag.PRINT;
  1259. break;
  1260. default:
  1261. (0, _util.warn)(`getRenderingIntent - invalid intent: ${intent}`);
  1262. }
  1263. switch (annotationMode) {
  1264. case _util.AnnotationMode.DISABLE:
  1265. renderingIntent += _util.RenderingIntentFlag.ANNOTATIONS_DISABLE;
  1266. break;
  1267. case _util.AnnotationMode.ENABLE:
  1268. break;
  1269. case _util.AnnotationMode.ENABLE_FORMS:
  1270. renderingIntent += _util.RenderingIntentFlag.ANNOTATIONS_FORMS;
  1271. break;
  1272. case _util.AnnotationMode.ENABLE_STORAGE:
  1273. renderingIntent += _util.RenderingIntentFlag.ANNOTATIONS_STORAGE;
  1274. lastModified = this.annotationStorage.lastModified;
  1275. break;
  1276. default:
  1277. (0, _util.warn)(`getRenderingIntent - invalid annotationMode: ${annotationMode}`);
  1278. }
  1279. if (isOpList) {
  1280. renderingIntent += _util.RenderingIntentFlag.OPLIST;
  1281. }
  1282. return {
  1283. renderingIntent,
  1284. cacheKey: `${renderingIntent}_${lastModified}`
  1285. };
  1286. }
  1287. destroy() {
  1288. if (this.destroyCapability) {
  1289. return this.destroyCapability.promise;
  1290. }
  1291. this.destroyed = true;
  1292. this.destroyCapability = (0, _util.createPromiseCapability)();
  1293. if (this._passwordCapability) {
  1294. this._passwordCapability.reject(new Error("Worker was destroyed during onPassword callback"));
  1295. }
  1296. const waitOn = [];
  1297. for (const page of this.pageCache) {
  1298. if (page) {
  1299. waitOn.push(page._destroy());
  1300. }
  1301. }
  1302. this.pageCache.length = 0;
  1303. this.pagePromises.length = 0;
  1304. if (this.hasOwnProperty("annotationStorage")) {
  1305. this.annotationStorage.resetModified();
  1306. }
  1307. const terminated = this.messageHandler.sendWithPromise("Terminate", null);
  1308. waitOn.push(terminated);
  1309. Promise.all(waitOn).then(() => {
  1310. this.commonObjs.clear();
  1311. this.fontLoader.clear();
  1312. this._getFieldObjectsPromise = null;
  1313. this._hasJSActionsPromise = null;
  1314. if (this._networkStream) {
  1315. this._networkStream.cancelAllRequests(new _util.AbortException("Worker was terminated."));
  1316. }
  1317. if (this.messageHandler) {
  1318. this.messageHandler.destroy();
  1319. this.messageHandler = null;
  1320. }
  1321. this.destroyCapability.resolve();
  1322. }, this.destroyCapability.reject);
  1323. return this.destroyCapability.promise;
  1324. }
  1325. setupMessageHandler() {
  1326. const {
  1327. messageHandler,
  1328. loadingTask
  1329. } = this;
  1330. messageHandler.on("GetReader", (data, sink) => {
  1331. (0, _util.assert)(this._networkStream, "GetReader - no `IPDFStream` instance available.");
  1332. this._fullReader = this._networkStream.getFullReader();
  1333. this._fullReader.onProgress = evt => {
  1334. this._lastProgress = {
  1335. loaded: evt.loaded,
  1336. total: evt.total
  1337. };
  1338. };
  1339. sink.onPull = () => {
  1340. this._fullReader.read().then(function ({
  1341. value,
  1342. done
  1343. }) {
  1344. if (done) {
  1345. sink.close();
  1346. return;
  1347. }
  1348. (0, _util.assert)((0, _util.isArrayBuffer)(value), "GetReader - expected an ArrayBuffer.");
  1349. sink.enqueue(new Uint8Array(value), 1, [value]);
  1350. }).catch(reason => {
  1351. sink.error(reason);
  1352. });
  1353. };
  1354. sink.onCancel = reason => {
  1355. this._fullReader.cancel(reason);
  1356. sink.ready.catch(readyReason => {
  1357. if (this.destroyed) {
  1358. return;
  1359. }
  1360. throw readyReason;
  1361. });
  1362. };
  1363. });
  1364. messageHandler.on("ReaderHeadersReady", data => {
  1365. const headersCapability = (0, _util.createPromiseCapability)();
  1366. const fullReader = this._fullReader;
  1367. fullReader.headersReady.then(() => {
  1368. if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) {
  1369. if (this._lastProgress && loadingTask.onProgress) {
  1370. loadingTask.onProgress(this._lastProgress);
  1371. }
  1372. fullReader.onProgress = evt => {
  1373. if (loadingTask.onProgress) {
  1374. loadingTask.onProgress({
  1375. loaded: evt.loaded,
  1376. total: evt.total
  1377. });
  1378. }
  1379. };
  1380. }
  1381. headersCapability.resolve({
  1382. isStreamingSupported: fullReader.isStreamingSupported,
  1383. isRangeSupported: fullReader.isRangeSupported,
  1384. contentLength: fullReader.contentLength
  1385. });
  1386. }, headersCapability.reject);
  1387. return headersCapability.promise;
  1388. });
  1389. messageHandler.on("GetRangeReader", (data, sink) => {
  1390. (0, _util.assert)(this._networkStream, "GetRangeReader - no `IPDFStream` instance available.");
  1391. const rangeReader = this._networkStream.getRangeReader(data.begin, data.end);
  1392. if (!rangeReader) {
  1393. sink.close();
  1394. return;
  1395. }
  1396. sink.onPull = () => {
  1397. rangeReader.read().then(function ({
  1398. value,
  1399. done
  1400. }) {
  1401. if (done) {
  1402. sink.close();
  1403. return;
  1404. }
  1405. (0, _util.assert)((0, _util.isArrayBuffer)(value), "GetRangeReader - expected an ArrayBuffer.");
  1406. sink.enqueue(new Uint8Array(value), 1, [value]);
  1407. }).catch(reason => {
  1408. sink.error(reason);
  1409. });
  1410. };
  1411. sink.onCancel = reason => {
  1412. rangeReader.cancel(reason);
  1413. sink.ready.catch(readyReason => {
  1414. if (this.destroyed) {
  1415. return;
  1416. }
  1417. throw readyReason;
  1418. });
  1419. };
  1420. });
  1421. messageHandler.on("GetDoc", ({
  1422. pdfInfo
  1423. }) => {
  1424. this._numPages = pdfInfo.numPages;
  1425. this._htmlForXfa = pdfInfo.htmlForXfa;
  1426. delete pdfInfo.htmlForXfa;
  1427. loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this));
  1428. });
  1429. messageHandler.on("DocException", function (ex) {
  1430. let reason;
  1431. switch (ex.name) {
  1432. case "PasswordException":
  1433. reason = new _util.PasswordException(ex.message, ex.code);
  1434. break;
  1435. case "InvalidPDFException":
  1436. reason = new _util.InvalidPDFException(ex.message);
  1437. break;
  1438. case "MissingPDFException":
  1439. reason = new _util.MissingPDFException(ex.message);
  1440. break;
  1441. case "UnexpectedResponseException":
  1442. reason = new _util.UnexpectedResponseException(ex.message, ex.status);
  1443. break;
  1444. case "UnknownErrorException":
  1445. reason = new _util.UnknownErrorException(ex.message, ex.details);
  1446. break;
  1447. default:
  1448. (0, _util.unreachable)("DocException - expected a valid Error.");
  1449. }
  1450. loadingTask._capability.reject(reason);
  1451. });
  1452. messageHandler.on("PasswordRequest", exception => {
  1453. this._passwordCapability = (0, _util.createPromiseCapability)();
  1454. if (loadingTask.onPassword) {
  1455. const updatePassword = password => {
  1456. this._passwordCapability.resolve({
  1457. password
  1458. });
  1459. };
  1460. try {
  1461. loadingTask.onPassword(updatePassword, exception.code);
  1462. } catch (ex) {
  1463. this._passwordCapability.reject(ex);
  1464. }
  1465. } else {
  1466. this._passwordCapability.reject(new _util.PasswordException(exception.message, exception.code));
  1467. }
  1468. return this._passwordCapability.promise;
  1469. });
  1470. messageHandler.on("DataLoaded", data => {
  1471. if (loadingTask.onProgress) {
  1472. loadingTask.onProgress({
  1473. loaded: data.length,
  1474. total: data.length
  1475. });
  1476. }
  1477. this.downloadInfoCapability.resolve(data);
  1478. });
  1479. messageHandler.on("StartRenderPage", data => {
  1480. if (this.destroyed) {
  1481. return;
  1482. }
  1483. const page = this.pageCache[data.pageIndex];
  1484. page._startRenderPage(data.transparency, data.cacheKey);
  1485. });
  1486. messageHandler.on("commonobj", data => {
  1487. if (this.destroyed) {
  1488. return;
  1489. }
  1490. const [id, type, exportedData] = data;
  1491. if (this.commonObjs.has(id)) {
  1492. return;
  1493. }
  1494. switch (type) {
  1495. case "Font":
  1496. const params = this._params;
  1497. if ("error" in exportedData) {
  1498. const exportedError = exportedData.error;
  1499. (0, _util.warn)(`Error during font loading: ${exportedError}`);
  1500. this.commonObjs.resolve(id, exportedError);
  1501. break;
  1502. }
  1503. let fontRegistry = null;
  1504. if (params.pdfBug && globalThis.FontInspector?.enabled) {
  1505. fontRegistry = {
  1506. registerFont(font, url) {
  1507. globalThis.FontInspector.fontAdded(font, url);
  1508. }
  1509. };
  1510. }
  1511. const font = new _font_loader.FontFaceObject(exportedData, {
  1512. isEvalSupported: params.isEvalSupported,
  1513. disableFontFace: params.disableFontFace,
  1514. ignoreErrors: params.ignoreErrors,
  1515. onUnsupportedFeature: this._onUnsupportedFeature.bind(this),
  1516. fontRegistry
  1517. });
  1518. this.fontLoader.bind(font).catch(reason => {
  1519. return messageHandler.sendWithPromise("FontFallback", {
  1520. id
  1521. });
  1522. }).finally(() => {
  1523. if (!params.fontExtraProperties && font.data) {
  1524. font.data = null;
  1525. }
  1526. this.commonObjs.resolve(id, font);
  1527. });
  1528. break;
  1529. case "FontPath":
  1530. case "Image":
  1531. this.commonObjs.resolve(id, exportedData);
  1532. break;
  1533. default:
  1534. throw new Error(`Got unknown common object type ${type}`);
  1535. }
  1536. });
  1537. messageHandler.on("obj", data => {
  1538. if (this.destroyed) {
  1539. return undefined;
  1540. }
  1541. const [id, pageIndex, type, imageData] = data;
  1542. const pageProxy = this.pageCache[pageIndex];
  1543. if (pageProxy.objs.has(id)) {
  1544. return undefined;
  1545. }
  1546. switch (type) {
  1547. case "Image":
  1548. pageProxy.objs.resolve(id, imageData);
  1549. const MAX_IMAGE_SIZE_TO_STORE = 8000000;
  1550. if (imageData?.data?.length > MAX_IMAGE_SIZE_TO_STORE) {
  1551. pageProxy.cleanupAfterRender = true;
  1552. }
  1553. break;
  1554. case "Pattern":
  1555. pageProxy.objs.resolve(id, imageData);
  1556. break;
  1557. default:
  1558. throw new Error(`Got unknown object type ${type}`);
  1559. }
  1560. return undefined;
  1561. });
  1562. messageHandler.on("DocProgress", data => {
  1563. if (this.destroyed) {
  1564. return;
  1565. }
  1566. if (loadingTask.onProgress) {
  1567. loadingTask.onProgress({
  1568. loaded: data.loaded,
  1569. total: data.total
  1570. });
  1571. }
  1572. });
  1573. messageHandler.on("UnsupportedFeature", this._onUnsupportedFeature.bind(this));
  1574. messageHandler.on("FetchBuiltInCMap", data => {
  1575. if (this.destroyed) {
  1576. return Promise.reject(new Error("Worker was destroyed."));
  1577. }
  1578. if (!this.CMapReaderFactory) {
  1579. return Promise.reject(new Error("CMapReaderFactory not initialized, see the `useWorkerFetch` parameter."));
  1580. }
  1581. return this.CMapReaderFactory.fetch(data);
  1582. });
  1583. messageHandler.on("FetchStandardFontData", data => {
  1584. if (this.destroyed) {
  1585. return Promise.reject(new Error("Worker was destroyed."));
  1586. }
  1587. if (!this.StandardFontDataFactory) {
  1588. return Promise.reject(new Error("StandardFontDataFactory not initialized, see the `useWorkerFetch` parameter."));
  1589. }
  1590. return this.StandardFontDataFactory.fetch(data);
  1591. });
  1592. }
  1593. _onUnsupportedFeature({
  1594. featureId
  1595. }) {
  1596. if (this.destroyed) {
  1597. return;
  1598. }
  1599. if (this.loadingTask.onUnsupportedFeature) {
  1600. this.loadingTask.onUnsupportedFeature(featureId);
  1601. }
  1602. }
  1603. getData() {
  1604. return this.messageHandler.sendWithPromise("GetData", null);
  1605. }
  1606. getPage(pageNumber) {
  1607. if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this._numPages) {
  1608. return Promise.reject(new Error("Invalid page request"));
  1609. }
  1610. const pageIndex = pageNumber - 1;
  1611. if (pageIndex in this.pagePromises) {
  1612. return this.pagePromises[pageIndex];
  1613. }
  1614. const promise = this.messageHandler.sendWithPromise("GetPage", {
  1615. pageIndex
  1616. }).then(pageInfo => {
  1617. if (this.destroyed) {
  1618. throw new Error("Transport destroyed");
  1619. }
  1620. const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.ownerDocument, this._params.pdfBug);
  1621. this.pageCache[pageIndex] = page;
  1622. return page;
  1623. });
  1624. this.pagePromises[pageIndex] = promise;
  1625. return promise;
  1626. }
  1627. getPageIndex(ref) {
  1628. return this.messageHandler.sendWithPromise("GetPageIndex", {
  1629. ref
  1630. });
  1631. }
  1632. getAnnotations(pageIndex, intent) {
  1633. return this.messageHandler.sendWithPromise("GetAnnotations", {
  1634. pageIndex,
  1635. intent
  1636. });
  1637. }
  1638. saveDocument() {
  1639. return this.messageHandler.sendWithPromise("SaveDocument", {
  1640. isPureXfa: !!this._htmlForXfa,
  1641. numPages: this._numPages,
  1642. annotationStorage: this.annotationStorage.serializable,
  1643. filename: this._fullReader?.filename ?? null
  1644. }).finally(() => {
  1645. this.annotationStorage.resetModified();
  1646. });
  1647. }
  1648. getFieldObjects() {
  1649. return this._getFieldObjectsPromise ||= this.messageHandler.sendWithPromise("GetFieldObjects", null);
  1650. }
  1651. hasJSActions() {
  1652. return this._hasJSActionsPromise ||= this.messageHandler.sendWithPromise("HasJSActions", null);
  1653. }
  1654. getCalculationOrderIds() {
  1655. return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null);
  1656. }
  1657. getDestinations() {
  1658. return this.messageHandler.sendWithPromise("GetDestinations", null);
  1659. }
  1660. getDestination(id) {
  1661. if (typeof id !== "string") {
  1662. return Promise.reject(new Error("Invalid destination request."));
  1663. }
  1664. return this.messageHandler.sendWithPromise("GetDestination", {
  1665. id
  1666. });
  1667. }
  1668. getPageLabels() {
  1669. return this.messageHandler.sendWithPromise("GetPageLabels", null);
  1670. }
  1671. getPageLayout() {
  1672. return this.messageHandler.sendWithPromise("GetPageLayout", null);
  1673. }
  1674. getPageMode() {
  1675. return this.messageHandler.sendWithPromise("GetPageMode", null);
  1676. }
  1677. getViewerPreferences() {
  1678. return this.messageHandler.sendWithPromise("GetViewerPreferences", null);
  1679. }
  1680. getOpenAction() {
  1681. return this.messageHandler.sendWithPromise("GetOpenAction", null);
  1682. }
  1683. getAttachments() {
  1684. return this.messageHandler.sendWithPromise("GetAttachments", null);
  1685. }
  1686. getJavaScript() {
  1687. return this.messageHandler.sendWithPromise("GetJavaScript", null);
  1688. }
  1689. getDocJSActions() {
  1690. return this.messageHandler.sendWithPromise("GetDocJSActions", null);
  1691. }
  1692. getPageJSActions(pageIndex) {
  1693. return this.messageHandler.sendWithPromise("GetPageJSActions", {
  1694. pageIndex
  1695. });
  1696. }
  1697. getStructTree(pageIndex) {
  1698. return this.messageHandler.sendWithPromise("GetStructTree", {
  1699. pageIndex
  1700. });
  1701. }
  1702. getOutline() {
  1703. return this.messageHandler.sendWithPromise("GetOutline", null);
  1704. }
  1705. getOptionalContentConfig() {
  1706. return this.messageHandler.sendWithPromise("GetOptionalContentConfig", null).then(results => {
  1707. return new _optional_content_config.OptionalContentConfig(results);
  1708. });
  1709. }
  1710. getPermissions() {
  1711. return this.messageHandler.sendWithPromise("GetPermissions", null);
  1712. }
  1713. getMetadata() {
  1714. return this.messageHandler.sendWithPromise("GetMetadata", null).then(results => {
  1715. return {
  1716. info: results[0],
  1717. metadata: results[1] ? new _metadata.Metadata(results[1]) : null,
  1718. contentDispositionFilename: this._fullReader?.filename ?? null,
  1719. contentLength: this._fullReader?.contentLength ?? null
  1720. };
  1721. });
  1722. }
  1723. getMarkInfo() {
  1724. return this.messageHandler.sendWithPromise("GetMarkInfo", null);
  1725. }
  1726. getStats() {
  1727. return this.messageHandler.sendWithPromise("GetStats", null);
  1728. }
  1729. async startCleanup(keepLoadedFonts = false) {
  1730. await this.messageHandler.sendWithPromise("Cleanup", null);
  1731. if (this.destroyed) {
  1732. return;
  1733. }
  1734. for (let i = 0, ii = this.pageCache.length; i < ii; i++) {
  1735. const page = this.pageCache[i];
  1736. if (!page) {
  1737. continue;
  1738. }
  1739. const cleanupSuccessful = page.cleanup();
  1740. if (!cleanupSuccessful) {
  1741. throw new Error(`startCleanup: Page ${i + 1} is currently rendering.`);
  1742. }
  1743. }
  1744. this.commonObjs.clear();
  1745. if (!keepLoadedFonts) {
  1746. this.fontLoader.clear();
  1747. }
  1748. this._getFieldObjectsPromise = null;
  1749. this._hasJSActionsPromise = null;
  1750. }
  1751. get loadingParams() {
  1752. const params = this._params;
  1753. return (0, _util.shadow)(this, "loadingParams", {
  1754. disableAutoFetch: params.disableAutoFetch,
  1755. enableXfa: params.enableXfa
  1756. });
  1757. }
  1758. }
  1759. class PDFObjects {
  1760. constructor() {
  1761. this._objs = Object.create(null);
  1762. }
  1763. _ensureObj(objId) {
  1764. if (this._objs[objId]) {
  1765. return this._objs[objId];
  1766. }
  1767. return this._objs[objId] = {
  1768. capability: (0, _util.createPromiseCapability)(),
  1769. data: null,
  1770. resolved: false
  1771. };
  1772. }
  1773. get(objId, callback = null) {
  1774. if (callback) {
  1775. this._ensureObj(objId).capability.promise.then(callback);
  1776. return null;
  1777. }
  1778. const obj = this._objs[objId];
  1779. if (!obj || !obj.resolved) {
  1780. throw new Error(`Requesting object that isn't resolved yet ${objId}.`);
  1781. }
  1782. return obj.data;
  1783. }
  1784. has(objId) {
  1785. const obj = this._objs[objId];
  1786. return obj?.resolved || false;
  1787. }
  1788. resolve(objId, data) {
  1789. const obj = this._ensureObj(objId);
  1790. obj.resolved = true;
  1791. obj.data = data;
  1792. obj.capability.resolve(data);
  1793. }
  1794. clear() {
  1795. this._objs = Object.create(null);
  1796. }
  1797. }
  1798. class RenderTask {
  1799. constructor(internalRenderTask) {
  1800. this._internalRenderTask = internalRenderTask;
  1801. this.onContinue = null;
  1802. }
  1803. get promise() {
  1804. return this._internalRenderTask.capability.promise;
  1805. }
  1806. cancel() {
  1807. this._internalRenderTask.cancel();
  1808. }
  1809. }
  1810. exports.RenderTask = RenderTask;
  1811. class InternalRenderTask {
  1812. static get canvasInUse() {
  1813. return (0, _util.shadow)(this, "canvasInUse", new WeakSet());
  1814. }
  1815. constructor({
  1816. callback,
  1817. params,
  1818. objs,
  1819. commonObjs,
  1820. operatorList,
  1821. pageIndex,
  1822. canvasFactory,
  1823. useRequestAnimationFrame = false,
  1824. pdfBug = false
  1825. }) {
  1826. this.callback = callback;
  1827. this.params = params;
  1828. this.objs = objs;
  1829. this.commonObjs = commonObjs;
  1830. this.operatorListIdx = null;
  1831. this.operatorList = operatorList;
  1832. this._pageIndex = pageIndex;
  1833. this.canvasFactory = canvasFactory;
  1834. this._pdfBug = pdfBug;
  1835. this.running = false;
  1836. this.graphicsReadyCallback = null;
  1837. this.graphicsReady = false;
  1838. this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== "undefined";
  1839. this.cancelled = false;
  1840. this.capability = (0, _util.createPromiseCapability)();
  1841. this.task = new RenderTask(this);
  1842. this._cancelBound = this.cancel.bind(this);
  1843. this._continueBound = this._continue.bind(this);
  1844. this._scheduleNextBound = this._scheduleNext.bind(this);
  1845. this._nextBound = this._next.bind(this);
  1846. this._canvas = params.canvasContext.canvas;
  1847. }
  1848. get completed() {
  1849. return this.capability.promise.catch(function () {});
  1850. }
  1851. initializeGraphics({
  1852. transparency = false,
  1853. optionalContentConfig
  1854. }) {
  1855. if (this.cancelled) {
  1856. return;
  1857. }
  1858. if (this._canvas) {
  1859. if (InternalRenderTask.canvasInUse.has(this._canvas)) {
  1860. throw new Error("Cannot use the same canvas during multiple render() operations. " + "Use different canvas or ensure previous operations were " + "cancelled or completed.");
  1861. }
  1862. InternalRenderTask.canvasInUse.add(this._canvas);
  1863. }
  1864. if (this._pdfBug && globalThis.StepperManager?.enabled) {
  1865. this.stepper = globalThis.StepperManager.create(this._pageIndex);
  1866. this.stepper.init(this.operatorList);
  1867. this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();
  1868. }
  1869. const {
  1870. canvasContext,
  1871. viewport,
  1872. transform,
  1873. imageLayer,
  1874. background
  1875. } = this.params;
  1876. this.gfx = new _canvas.CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, imageLayer, optionalContentConfig);
  1877. this.gfx.beginDrawing({
  1878. transform,
  1879. viewport,
  1880. transparency,
  1881. background
  1882. });
  1883. this.operatorListIdx = 0;
  1884. this.graphicsReady = true;
  1885. if (this.graphicsReadyCallback) {
  1886. this.graphicsReadyCallback();
  1887. }
  1888. }
  1889. cancel(error = null) {
  1890. this.running = false;
  1891. this.cancelled = true;
  1892. if (this.gfx) {
  1893. this.gfx.endDrawing();
  1894. }
  1895. if (this._canvas) {
  1896. InternalRenderTask.canvasInUse.delete(this._canvas);
  1897. }
  1898. this.callback(error || new _display_utils.RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, "canvas"));
  1899. }
  1900. operatorListChanged() {
  1901. if (!this.graphicsReady) {
  1902. if (!this.graphicsReadyCallback) {
  1903. this.graphicsReadyCallback = this._continueBound;
  1904. }
  1905. return;
  1906. }
  1907. if (this.stepper) {
  1908. this.stepper.updateOperatorList(this.operatorList);
  1909. }
  1910. if (this.running) {
  1911. return;
  1912. }
  1913. this._continue();
  1914. }
  1915. _continue() {
  1916. this.running = true;
  1917. if (this.cancelled) {
  1918. return;
  1919. }
  1920. if (this.task.onContinue) {
  1921. this.task.onContinue(this._scheduleNextBound);
  1922. } else {
  1923. this._scheduleNext();
  1924. }
  1925. }
  1926. _scheduleNext() {
  1927. if (this._useRequestAnimationFrame) {
  1928. window.requestAnimationFrame(() => {
  1929. this._nextBound().catch(this._cancelBound);
  1930. });
  1931. } else {
  1932. Promise.resolve().then(this._nextBound).catch(this._cancelBound);
  1933. }
  1934. }
  1935. async _next() {
  1936. if (this.cancelled) {
  1937. return;
  1938. }
  1939. this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper);
  1940. if (this.operatorListIdx === this.operatorList.argsArray.length) {
  1941. this.running = false;
  1942. if (this.operatorList.lastChunk) {
  1943. this.gfx.endDrawing();
  1944. if (this._canvas) {
  1945. InternalRenderTask.canvasInUse.delete(this._canvas);
  1946. }
  1947. this.callback();
  1948. }
  1949. }
  1950. }
  1951. }
  1952. const version = '2.11.338';
  1953. exports.version = version;
  1954. const build = 'dedff3c98';
  1955. exports.build = build;