display_utils.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. /**
  2. * @licstart The following is the entire license notice for the
  3. * Javascript code in this page
  4. *
  5. * Copyright 2019 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.addLinkAttributes = addLinkAttributes;
  27. exports.getFilenameFromUrl = getFilenameFromUrl;
  28. exports.isFetchSupported = isFetchSupported;
  29. exports.isValidFetchUrl = isValidFetchUrl;
  30. exports.loadScript = loadScript;
  31. exports.deprecated = deprecated;
  32. exports.releaseImageResources = releaseImageResources;
  33. exports.PDFDateString = exports.DummyStatTimer = exports.StatTimer = exports.DOMSVGFactory = exports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = exports.LinkTarget = exports.RenderingCancelledException = exports.PageViewport = void 0;
  34. var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
  35. var _util = require("../shared/util");
  36. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  37. function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
  38. function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
  39. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  40. function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
  41. function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
  42. var DEFAULT_LINK_REL = 'noopener noreferrer nofollow';
  43. exports.DEFAULT_LINK_REL = DEFAULT_LINK_REL;
  44. var SVG_NS = 'http://www.w3.org/2000/svg';
  45. var DOMCanvasFactory =
  46. /*#__PURE__*/
  47. function () {
  48. function DOMCanvasFactory() {
  49. _classCallCheck(this, DOMCanvasFactory);
  50. }
  51. _createClass(DOMCanvasFactory, [{
  52. key: "create",
  53. value: function create(width, height) {
  54. if (width <= 0 || height <= 0) {
  55. throw new Error('Invalid canvas size');
  56. }
  57. var canvas = document.createElement('canvas');
  58. var context = canvas.getContext('2d');
  59. canvas.width = width;
  60. canvas.height = height;
  61. return {
  62. canvas: canvas,
  63. context: context
  64. };
  65. }
  66. }, {
  67. key: "reset",
  68. value: function reset(canvasAndContext, width, height) {
  69. if (!canvasAndContext.canvas) {
  70. throw new Error('Canvas is not specified');
  71. }
  72. if (width <= 0 || height <= 0) {
  73. throw new Error('Invalid canvas size');
  74. }
  75. canvasAndContext.canvas.width = width;
  76. canvasAndContext.canvas.height = height;
  77. }
  78. }, {
  79. key: "destroy",
  80. value: function destroy(canvasAndContext) {
  81. if (!canvasAndContext.canvas) {
  82. throw new Error('Canvas is not specified');
  83. }
  84. canvasAndContext.canvas.width = 0;
  85. canvasAndContext.canvas.height = 0;
  86. canvasAndContext.canvas = null;
  87. canvasAndContext.context = null;
  88. }
  89. }]);
  90. return DOMCanvasFactory;
  91. }();
  92. exports.DOMCanvasFactory = DOMCanvasFactory;
  93. var DOMCMapReaderFactory =
  94. /*#__PURE__*/
  95. function () {
  96. function DOMCMapReaderFactory(_ref) {
  97. var _ref$baseUrl = _ref.baseUrl,
  98. baseUrl = _ref$baseUrl === void 0 ? null : _ref$baseUrl,
  99. _ref$isCompressed = _ref.isCompressed,
  100. isCompressed = _ref$isCompressed === void 0 ? false : _ref$isCompressed;
  101. _classCallCheck(this, DOMCMapReaderFactory);
  102. this.baseUrl = baseUrl;
  103. this.isCompressed = isCompressed;
  104. }
  105. _createClass(DOMCMapReaderFactory, [{
  106. key: "fetch",
  107. value: function (_fetch) {
  108. function fetch(_x) {
  109. return _fetch.apply(this, arguments);
  110. }
  111. fetch.toString = function () {
  112. return _fetch.toString();
  113. };
  114. return fetch;
  115. }(
  116. /*#__PURE__*/
  117. function () {
  118. var _ref3 = _asyncToGenerator(
  119. /*#__PURE__*/
  120. _regenerator["default"].mark(function _callee2(_ref2) {
  121. var _this = this;
  122. var name, url, compressionType;
  123. return _regenerator["default"].wrap(function _callee2$(_context2) {
  124. while (1) {
  125. switch (_context2.prev = _context2.next) {
  126. case 0:
  127. name = _ref2.name;
  128. if (this.baseUrl) {
  129. _context2.next = 3;
  130. break;
  131. }
  132. throw new Error('The CMap "baseUrl" parameter must be specified, ensure that ' + 'the "cMapUrl" and "cMapPacked" API parameters are provided.');
  133. case 3:
  134. if (name) {
  135. _context2.next = 5;
  136. break;
  137. }
  138. throw new Error('CMap name must be specified.');
  139. case 5:
  140. url = this.baseUrl + name + (this.isCompressed ? '.bcmap' : '');
  141. compressionType = this.isCompressed ? _util.CMapCompressionType.BINARY : _util.CMapCompressionType.NONE;
  142. if (!(isFetchSupported() && isValidFetchUrl(url, document.baseURI))) {
  143. _context2.next = 9;
  144. break;
  145. }
  146. return _context2.abrupt("return", fetch(url).then(
  147. /*#__PURE__*/
  148. function () {
  149. var _ref4 = _asyncToGenerator(
  150. /*#__PURE__*/
  151. _regenerator["default"].mark(function _callee(response) {
  152. var cMapData;
  153. return _regenerator["default"].wrap(function _callee$(_context) {
  154. while (1) {
  155. switch (_context.prev = _context.next) {
  156. case 0:
  157. if (response.ok) {
  158. _context.next = 2;
  159. break;
  160. }
  161. throw new Error(response.statusText);
  162. case 2:
  163. if (!_this.isCompressed) {
  164. _context.next = 10;
  165. break;
  166. }
  167. _context.t0 = Uint8Array;
  168. _context.next = 6;
  169. return response.arrayBuffer();
  170. case 6:
  171. _context.t1 = _context.sent;
  172. cMapData = new _context.t0(_context.t1);
  173. _context.next = 15;
  174. break;
  175. case 10:
  176. _context.t2 = _util.stringToBytes;
  177. _context.next = 13;
  178. return response.text();
  179. case 13:
  180. _context.t3 = _context.sent;
  181. cMapData = (0, _context.t2)(_context.t3);
  182. case 15:
  183. return _context.abrupt("return", {
  184. cMapData: cMapData,
  185. compressionType: compressionType
  186. });
  187. case 16:
  188. case "end":
  189. return _context.stop();
  190. }
  191. }
  192. }, _callee);
  193. }));
  194. return function (_x3) {
  195. return _ref4.apply(this, arguments);
  196. };
  197. }())["catch"](function (reason) {
  198. throw new Error("Unable to load ".concat(_this.isCompressed ? 'binary ' : '') + "CMap at: ".concat(url));
  199. }));
  200. case 9:
  201. return _context2.abrupt("return", new Promise(function (resolve, reject) {
  202. var request = new XMLHttpRequest();
  203. request.open('GET', url, true);
  204. if (_this.isCompressed) {
  205. request.responseType = 'arraybuffer';
  206. }
  207. request.onreadystatechange = function () {
  208. if (request.readyState !== XMLHttpRequest.DONE) {
  209. return;
  210. }
  211. if (request.status === 200 || request.status === 0) {
  212. var cMapData;
  213. if (_this.isCompressed && request.response) {
  214. cMapData = new Uint8Array(request.response);
  215. } else if (!_this.isCompressed && request.responseText) {
  216. cMapData = (0, _util.stringToBytes)(request.responseText);
  217. }
  218. if (cMapData) {
  219. resolve({
  220. cMapData: cMapData,
  221. compressionType: compressionType
  222. });
  223. return;
  224. }
  225. }
  226. reject(new Error(request.statusText));
  227. };
  228. request.send(null);
  229. })["catch"](function (reason) {
  230. throw new Error("Unable to load ".concat(_this.isCompressed ? 'binary ' : '') + "CMap at: ".concat(url));
  231. }));
  232. case 10:
  233. case "end":
  234. return _context2.stop();
  235. }
  236. }
  237. }, _callee2, this);
  238. }));
  239. return function (_x2) {
  240. return _ref3.apply(this, arguments);
  241. };
  242. }())
  243. }]);
  244. return DOMCMapReaderFactory;
  245. }();
  246. exports.DOMCMapReaderFactory = DOMCMapReaderFactory;
  247. var DOMSVGFactory =
  248. /*#__PURE__*/
  249. function () {
  250. function DOMSVGFactory() {
  251. _classCallCheck(this, DOMSVGFactory);
  252. }
  253. _createClass(DOMSVGFactory, [{
  254. key: "create",
  255. value: function create(width, height) {
  256. (0, _util.assert)(width > 0 && height > 0, 'Invalid SVG dimensions');
  257. var svg = document.createElementNS(SVG_NS, 'svg:svg');
  258. svg.setAttribute('version', '1.1');
  259. svg.setAttribute('width', width + 'px');
  260. svg.setAttribute('height', height + 'px');
  261. svg.setAttribute('preserveAspectRatio', 'none');
  262. svg.setAttribute('viewBox', '0 0 ' + width + ' ' + height);
  263. return svg;
  264. }
  265. }, {
  266. key: "createElement",
  267. value: function createElement(type) {
  268. (0, _util.assert)(typeof type === 'string', 'Invalid SVG element type');
  269. return document.createElementNS(SVG_NS, type);
  270. }
  271. }]);
  272. return DOMSVGFactory;
  273. }();
  274. exports.DOMSVGFactory = DOMSVGFactory;
  275. var PageViewport =
  276. /*#__PURE__*/
  277. function () {
  278. function PageViewport(_ref5) {
  279. var viewBox = _ref5.viewBox,
  280. scale = _ref5.scale,
  281. rotation = _ref5.rotation,
  282. _ref5$offsetX = _ref5.offsetX,
  283. offsetX = _ref5$offsetX === void 0 ? 0 : _ref5$offsetX,
  284. _ref5$offsetY = _ref5.offsetY,
  285. offsetY = _ref5$offsetY === void 0 ? 0 : _ref5$offsetY,
  286. _ref5$dontFlip = _ref5.dontFlip,
  287. dontFlip = _ref5$dontFlip === void 0 ? false : _ref5$dontFlip;
  288. _classCallCheck(this, PageViewport);
  289. this.viewBox = viewBox;
  290. this.scale = scale;
  291. this.rotation = rotation;
  292. this.offsetX = offsetX;
  293. this.offsetY = offsetY;
  294. var centerX = (viewBox[2] + viewBox[0]) / 2;
  295. var centerY = (viewBox[3] + viewBox[1]) / 2;
  296. var rotateA, rotateB, rotateC, rotateD;
  297. rotation = rotation % 360;
  298. rotation = rotation < 0 ? rotation + 360 : rotation;
  299. switch (rotation) {
  300. case 180:
  301. rotateA = -1;
  302. rotateB = 0;
  303. rotateC = 0;
  304. rotateD = 1;
  305. break;
  306. case 90:
  307. rotateA = 0;
  308. rotateB = 1;
  309. rotateC = 1;
  310. rotateD = 0;
  311. break;
  312. case 270:
  313. rotateA = 0;
  314. rotateB = -1;
  315. rotateC = -1;
  316. rotateD = 0;
  317. break;
  318. default:
  319. rotateA = 1;
  320. rotateB = 0;
  321. rotateC = 0;
  322. rotateD = -1;
  323. break;
  324. }
  325. if (dontFlip) {
  326. rotateC = -rotateC;
  327. rotateD = -rotateD;
  328. }
  329. var offsetCanvasX, offsetCanvasY;
  330. var width, height;
  331. if (rotateA === 0) {
  332. offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
  333. offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
  334. width = Math.abs(viewBox[3] - viewBox[1]) * scale;
  335. height = Math.abs(viewBox[2] - viewBox[0]) * scale;
  336. } else {
  337. offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
  338. offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
  339. width = Math.abs(viewBox[2] - viewBox[0]) * scale;
  340. height = Math.abs(viewBox[3] - viewBox[1]) * scale;
  341. }
  342. this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];
  343. this.width = width;
  344. this.height = height;
  345. }
  346. _createClass(PageViewport, [{
  347. key: "clone",
  348. value: function clone() {
  349. var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  350. _ref6$scale = _ref6.scale,
  351. scale = _ref6$scale === void 0 ? this.scale : _ref6$scale,
  352. _ref6$rotation = _ref6.rotation,
  353. rotation = _ref6$rotation === void 0 ? this.rotation : _ref6$rotation,
  354. _ref6$dontFlip = _ref6.dontFlip,
  355. dontFlip = _ref6$dontFlip === void 0 ? false : _ref6$dontFlip;
  356. return new PageViewport({
  357. viewBox: this.viewBox.slice(),
  358. scale: scale,
  359. rotation: rotation,
  360. offsetX: this.offsetX,
  361. offsetY: this.offsetY,
  362. dontFlip: dontFlip
  363. });
  364. }
  365. }, {
  366. key: "convertToViewportPoint",
  367. value: function convertToViewportPoint(x, y) {
  368. return _util.Util.applyTransform([x, y], this.transform);
  369. }
  370. }, {
  371. key: "convertToViewportRectangle",
  372. value: function convertToViewportRectangle(rect) {
  373. var topLeft = _util.Util.applyTransform([rect[0], rect[1]], this.transform);
  374. var bottomRight = _util.Util.applyTransform([rect[2], rect[3]], this.transform);
  375. return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]];
  376. }
  377. }, {
  378. key: "convertToPdfPoint",
  379. value: function convertToPdfPoint(x, y) {
  380. return _util.Util.applyInverseTransform([x, y], this.transform);
  381. }
  382. }]);
  383. return PageViewport;
  384. }();
  385. exports.PageViewport = PageViewport;
  386. var RenderingCancelledException = function RenderingCancelledException() {
  387. function RenderingCancelledException(msg, type) {
  388. this.message = msg;
  389. this.type = type;
  390. }
  391. RenderingCancelledException.prototype = new Error();
  392. RenderingCancelledException.prototype.name = 'RenderingCancelledException';
  393. RenderingCancelledException.constructor = RenderingCancelledException;
  394. return RenderingCancelledException;
  395. }();
  396. exports.RenderingCancelledException = RenderingCancelledException;
  397. var LinkTarget = {
  398. NONE: 0,
  399. SELF: 1,
  400. BLANK: 2,
  401. PARENT: 3,
  402. TOP: 4
  403. };
  404. exports.LinkTarget = LinkTarget;
  405. var LinkTargetStringMap = ['', '_self', '_blank', '_parent', '_top'];
  406. function addLinkAttributes(link) {
  407. var _ref7 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  408. url = _ref7.url,
  409. target = _ref7.target,
  410. rel = _ref7.rel;
  411. link.href = link.title = url ? (0, _util.removeNullCharacters)(url) : '';
  412. if (url) {
  413. var LinkTargetValues = Object.values(LinkTarget);
  414. var targetIndex = LinkTargetValues.includes(target) ? target : LinkTarget.NONE;
  415. link.target = LinkTargetStringMap[targetIndex];
  416. link.rel = typeof rel === 'string' ? rel : DEFAULT_LINK_REL;
  417. }
  418. }
  419. function getFilenameFromUrl(url) {
  420. var anchor = url.indexOf('#');
  421. var query = url.indexOf('?');
  422. var end = Math.min(anchor > 0 ? anchor : url.length, query > 0 ? query : url.length);
  423. return url.substring(url.lastIndexOf('/', end) + 1, end);
  424. }
  425. var StatTimer =
  426. /*#__PURE__*/
  427. function () {
  428. function StatTimer() {
  429. var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
  430. _classCallCheck(this, StatTimer);
  431. this.enabled = !!enable;
  432. this.started = Object.create(null);
  433. this.times = [];
  434. }
  435. _createClass(StatTimer, [{
  436. key: "time",
  437. value: function time(name) {
  438. if (!this.enabled) {
  439. return;
  440. }
  441. if (name in this.started) {
  442. (0, _util.warn)('Timer is already running for ' + name);
  443. }
  444. this.started[name] = Date.now();
  445. }
  446. }, {
  447. key: "timeEnd",
  448. value: function timeEnd(name) {
  449. if (!this.enabled) {
  450. return;
  451. }
  452. if (!(name in this.started)) {
  453. (0, _util.warn)('Timer has not been started for ' + name);
  454. }
  455. this.times.push({
  456. 'name': name,
  457. 'start': this.started[name],
  458. 'end': Date.now()
  459. });
  460. delete this.started[name];
  461. }
  462. }, {
  463. key: "toString",
  464. value: function toString() {
  465. var out = '',
  466. longest = 0;
  467. var _iteratorNormalCompletion = true;
  468. var _didIteratorError = false;
  469. var _iteratorError = undefined;
  470. try {
  471. for (var _iterator = this.times[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
  472. var time = _step.value;
  473. var name = time.name;
  474. if (name.length > longest) {
  475. longest = name.length;
  476. }
  477. }
  478. } catch (err) {
  479. _didIteratorError = true;
  480. _iteratorError = err;
  481. } finally {
  482. try {
  483. if (!_iteratorNormalCompletion && _iterator["return"] != null) {
  484. _iterator["return"]();
  485. }
  486. } finally {
  487. if (_didIteratorError) {
  488. throw _iteratorError;
  489. }
  490. }
  491. }
  492. var _iteratorNormalCompletion2 = true;
  493. var _didIteratorError2 = false;
  494. var _iteratorError2 = undefined;
  495. try {
  496. for (var _iterator2 = this.times[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
  497. var _time = _step2.value;
  498. var duration = _time.end - _time.start;
  499. out += "".concat(_time.name.padEnd(longest), " ").concat(duration, "ms\n");
  500. }
  501. } catch (err) {
  502. _didIteratorError2 = true;
  503. _iteratorError2 = err;
  504. } finally {
  505. try {
  506. if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
  507. _iterator2["return"]();
  508. }
  509. } finally {
  510. if (_didIteratorError2) {
  511. throw _iteratorError2;
  512. }
  513. }
  514. }
  515. return out;
  516. }
  517. }]);
  518. return StatTimer;
  519. }();
  520. exports.StatTimer = StatTimer;
  521. var DummyStatTimer =
  522. /*#__PURE__*/
  523. function () {
  524. function DummyStatTimer() {
  525. _classCallCheck(this, DummyStatTimer);
  526. (0, _util.unreachable)('Cannot initialize DummyStatTimer.');
  527. }
  528. _createClass(DummyStatTimer, null, [{
  529. key: "time",
  530. value: function time(name) {}
  531. }, {
  532. key: "timeEnd",
  533. value: function timeEnd(name) {}
  534. }, {
  535. key: "toString",
  536. value: function toString() {
  537. return '';
  538. }
  539. }]);
  540. return DummyStatTimer;
  541. }();
  542. exports.DummyStatTimer = DummyStatTimer;
  543. function isFetchSupported() {
  544. return typeof fetch !== 'undefined' && typeof Response !== 'undefined' && 'body' in Response.prototype && typeof ReadableStream !== 'undefined';
  545. }
  546. function isValidFetchUrl(url, baseUrl) {
  547. try {
  548. var _ref8 = baseUrl ? new _util.URL(url, baseUrl) : new _util.URL(url),
  549. protocol = _ref8.protocol;
  550. return protocol === 'http:' || protocol === 'https:';
  551. } catch (ex) {
  552. return false;
  553. }
  554. }
  555. function loadScript(src) {
  556. return new Promise(function (resolve, reject) {
  557. var script = document.createElement('script');
  558. script.src = src;
  559. script.onload = resolve;
  560. script.onerror = function () {
  561. reject(new Error("Cannot load script at: ".concat(script.src)));
  562. };
  563. (document.head || document.documentElement).appendChild(script);
  564. });
  565. }
  566. function deprecated(details) {
  567. console.log('Deprecated API usage: ' + details);
  568. }
  569. function releaseImageResources(img) {
  570. (0, _util.assert)(img instanceof Image, 'Invalid `img` parameter.');
  571. var url = img.src;
  572. if (typeof url === 'string' && url.startsWith('blob:') && _util.URL.revokeObjectURL) {
  573. _util.URL.revokeObjectURL(url);
  574. }
  575. img.removeAttribute('src');
  576. }
  577. var pdfDateStringRegex;
  578. var PDFDateString =
  579. /*#__PURE__*/
  580. function () {
  581. function PDFDateString() {
  582. _classCallCheck(this, PDFDateString);
  583. }
  584. _createClass(PDFDateString, null, [{
  585. key: "toDateObject",
  586. value: function toDateObject(input) {
  587. if (!input || !(0, _util.isString)(input)) {
  588. return null;
  589. }
  590. if (!pdfDateStringRegex) {
  591. pdfDateStringRegex = new RegExp('^D:' + '(\\d{4})' + '(\\d{2})?' + '(\\d{2})?' + '(\\d{2})?' + '(\\d{2})?' + '(\\d{2})?' + '([Z|+|-])?' + '(\\d{2})?' + '\'?' + '(\\d{2})?' + '\'?');
  592. }
  593. var matches = pdfDateStringRegex.exec(input);
  594. if (!matches) {
  595. return null;
  596. }
  597. var year = parseInt(matches[1], 10);
  598. var month = parseInt(matches[2], 10);
  599. month = month >= 1 && month <= 12 ? month - 1 : 0;
  600. var day = parseInt(matches[3], 10);
  601. day = day >= 1 && day <= 31 ? day : 1;
  602. var hour = parseInt(matches[4], 10);
  603. hour = hour >= 0 && hour <= 23 ? hour : 0;
  604. var minute = parseInt(matches[5], 10);
  605. minute = minute >= 0 && minute <= 59 ? minute : 0;
  606. var second = parseInt(matches[6], 10);
  607. second = second >= 0 && second <= 59 ? second : 0;
  608. var universalTimeRelation = matches[7] || 'Z';
  609. var offsetHour = parseInt(matches[8], 10);
  610. offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0;
  611. var offsetMinute = parseInt(matches[9], 10) || 0;
  612. offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0;
  613. if (universalTimeRelation === '-') {
  614. hour += offsetHour;
  615. minute += offsetMinute;
  616. } else if (universalTimeRelation === '+') {
  617. hour -= offsetHour;
  618. minute -= offsetMinute;
  619. }
  620. return new Date(Date.UTC(year, month, day, hour, minute, second));
  621. }
  622. }]);
  623. return PDFDateString;
  624. }();
  625. exports.PDFDateString = PDFDateString;