diff options
Diffstat (limited to 'third-party/pdfjs/build/pdf.js')
-rw-r--r-- | third-party/pdfjs/build/pdf.js | 3129 |
1 files changed, 2046 insertions, 1083 deletions
diff --git a/third-party/pdfjs/build/pdf.js b/third-party/pdfjs/build/pdf.js index 8d59e6dd9..e2c2e2be1 100644 --- a/third-party/pdfjs/build/pdf.js +++ b/third-party/pdfjs/build/pdf.js @@ -30,294 +30,209 @@ else root["pdfjs-dist/build/pdf"] = root.pdfjsLib = factory(); })(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __w_pdfjs_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __w_pdfjs_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __w_pdfjs_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __w_pdfjs_require__.d = function(exports, name, getter) { -/******/ if(!__w_pdfjs_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __w_pdfjs_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __w_pdfjs_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __w_pdfjs_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __w_pdfjs_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __w_pdfjs_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __w_pdfjs_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __w_pdfjs_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __w_pdfjs_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __w_pdfjs_require__(__w_pdfjs_require__.s = 0); -/******/ }) -/************************************************************************/ -/******/ ([ +return /******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ([ /* 0 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); -Object.defineProperty(exports, "addLinkAttributes", { +})); +Object.defineProperty(exports, "addLinkAttributes", ({ enumerable: true, get: function () { return _display_utils.addLinkAttributes; } -}); -Object.defineProperty(exports, "getFilenameFromUrl", { +})); +Object.defineProperty(exports, "getFilenameFromUrl", ({ enumerable: true, get: function () { return _display_utils.getFilenameFromUrl; } -}); -Object.defineProperty(exports, "LinkTarget", { +})); +Object.defineProperty(exports, "LinkTarget", ({ enumerable: true, get: function () { return _display_utils.LinkTarget; } -}); -Object.defineProperty(exports, "loadScript", { +})); +Object.defineProperty(exports, "loadScript", ({ enumerable: true, get: function () { return _display_utils.loadScript; } -}); -Object.defineProperty(exports, "PDFDateString", { +})); +Object.defineProperty(exports, "PDFDateString", ({ enumerable: true, get: function () { return _display_utils.PDFDateString; } -}); -Object.defineProperty(exports, "RenderingCancelledException", { +})); +Object.defineProperty(exports, "RenderingCancelledException", ({ enumerable: true, get: function () { return _display_utils.RenderingCancelledException; } -}); -Object.defineProperty(exports, "build", { +})); +Object.defineProperty(exports, "build", ({ enumerable: true, get: function () { return _api.build; } -}); -Object.defineProperty(exports, "getDocument", { +})); +Object.defineProperty(exports, "getDocument", ({ enumerable: true, get: function () { return _api.getDocument; } -}); -Object.defineProperty(exports, "LoopbackPort", { +})); +Object.defineProperty(exports, "LoopbackPort", ({ enumerable: true, get: function () { return _api.LoopbackPort; } -}); -Object.defineProperty(exports, "PDFDataRangeTransport", { +})); +Object.defineProperty(exports, "PDFDataRangeTransport", ({ enumerable: true, get: function () { return _api.PDFDataRangeTransport; } -}); -Object.defineProperty(exports, "PDFWorker", { +})); +Object.defineProperty(exports, "PDFWorker", ({ enumerable: true, get: function () { return _api.PDFWorker; } -}); -Object.defineProperty(exports, "version", { +})); +Object.defineProperty(exports, "version", ({ enumerable: true, get: function () { return _api.version; } -}); -Object.defineProperty(exports, "CMapCompressionType", { +})); +Object.defineProperty(exports, "CMapCompressionType", ({ enumerable: true, get: function () { return _util.CMapCompressionType; } -}); -Object.defineProperty(exports, "createObjectURL", { +})); +Object.defineProperty(exports, "createObjectURL", ({ enumerable: true, get: function () { return _util.createObjectURL; } -}); -Object.defineProperty(exports, "createPromiseCapability", { +})); +Object.defineProperty(exports, "createPromiseCapability", ({ enumerable: true, get: function () { return _util.createPromiseCapability; } -}); -Object.defineProperty(exports, "createValidAbsoluteUrl", { +})); +Object.defineProperty(exports, "createValidAbsoluteUrl", ({ enumerable: true, get: function () { return _util.createValidAbsoluteUrl; } -}); -Object.defineProperty(exports, "InvalidPDFException", { +})); +Object.defineProperty(exports, "InvalidPDFException", ({ enumerable: true, get: function () { return _util.InvalidPDFException; } -}); -Object.defineProperty(exports, "MissingPDFException", { +})); +Object.defineProperty(exports, "MissingPDFException", ({ enumerable: true, get: function () { return _util.MissingPDFException; } -}); -Object.defineProperty(exports, "OPS", { +})); +Object.defineProperty(exports, "OPS", ({ enumerable: true, get: function () { return _util.OPS; } -}); -Object.defineProperty(exports, "PasswordResponses", { +})); +Object.defineProperty(exports, "PasswordResponses", ({ enumerable: true, get: function () { return _util.PasswordResponses; } -}); -Object.defineProperty(exports, "PermissionFlag", { +})); +Object.defineProperty(exports, "PermissionFlag", ({ enumerable: true, get: function () { return _util.PermissionFlag; } -}); -Object.defineProperty(exports, "removeNullCharacters", { +})); +Object.defineProperty(exports, "removeNullCharacters", ({ enumerable: true, get: function () { return _util.removeNullCharacters; } -}); -Object.defineProperty(exports, "shadow", { +})); +Object.defineProperty(exports, "shadow", ({ enumerable: true, get: function () { return _util.shadow; } -}); -Object.defineProperty(exports, "UnexpectedResponseException", { +})); +Object.defineProperty(exports, "UnexpectedResponseException", ({ enumerable: true, get: function () { return _util.UnexpectedResponseException; } -}); -Object.defineProperty(exports, "UNSUPPORTED_FEATURES", { +})); +Object.defineProperty(exports, "UNSUPPORTED_FEATURES", ({ enumerable: true, get: function () { return _util.UNSUPPORTED_FEATURES; } -}); -Object.defineProperty(exports, "Util", { +})); +Object.defineProperty(exports, "Util", ({ enumerable: true, get: function () { return _util.Util; } -}); -Object.defineProperty(exports, "VerbosityLevel", { +})); +Object.defineProperty(exports, "VerbosityLevel", ({ enumerable: true, get: function () { return _util.VerbosityLevel; } -}); -Object.defineProperty(exports, "AnnotationLayer", { +})); +Object.defineProperty(exports, "AnnotationLayer", ({ enumerable: true, get: function () { return _annotation_layer.AnnotationLayer; } -}); -Object.defineProperty(exports, "apiCompatibilityParams", { +})); +Object.defineProperty(exports, "apiCompatibilityParams", ({ enumerable: true, get: function () { return _api_compatibility.apiCompatibilityParams; } -}); -Object.defineProperty(exports, "GlobalWorkerOptions", { +})); +Object.defineProperty(exports, "GlobalWorkerOptions", ({ enumerable: true, get: function () { return _worker_options.GlobalWorkerOptions; } -}); -Object.defineProperty(exports, "renderTextLayer", { +})); +Object.defineProperty(exports, "renderTextLayer", ({ enumerable: true, get: function () { return _text_layer.renderTextLayer; } -}); -Object.defineProperty(exports, "SVGGraphics", { +})); +Object.defineProperty(exports, "SVGGraphics", ({ enumerable: true, get: function () { return _svg.SVGGraphics; } -}); +})); var _display_utils = __w_pdfjs_require__(1); @@ -331,30 +246,30 @@ var _api_compatibility = __w_pdfjs_require__(9); var _worker_options = __w_pdfjs_require__(12); -var _text_layer = __w_pdfjs_require__(20); +var _text_layer = __w_pdfjs_require__(21); -var _svg = __w_pdfjs_require__(21); +var _svg = __w_pdfjs_require__(22); -const pdfjsVersion = '2.6.347'; -const pdfjsBuild = '3be9c65f'; +const pdfjsVersion = '2.7.570'; +const pdfjsBuild = 'f2c7338b0'; { const { isNodeJS } = __w_pdfjs_require__(4); if (isNodeJS) { - const PDFNodeStream = __w_pdfjs_require__(22).PDFNodeStream; + const PDFNodeStream = __w_pdfjs_require__(23).PDFNodeStream; (0, _api.setPDFNetworkStreamFactory)(params => { return new PDFNodeStream(params); }); } else { - const PDFNetworkStream = __w_pdfjs_require__(25).PDFNetworkStream; + const PDFNetworkStream = __w_pdfjs_require__(26).PDFNetworkStream; let PDFFetchStream; if ((0, _display_utils.isFetchSupported)()) { - PDFFetchStream = __w_pdfjs_require__(26).PDFFetchStream; + PDFFetchStream = __w_pdfjs_require__(27).PDFFetchStream; } (0, _api.setPDFNetworkStreamFactory)(params => { @@ -369,21 +284,20 @@ const pdfjsBuild = '3be9c65f'; /***/ }), /* 1 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.addLinkAttributes = addLinkAttributes; +exports.deprecated = deprecated; exports.getFilenameFromUrl = getFilenameFromUrl; exports.isFetchSupported = isFetchSupported; exports.isValidFetchUrl = isValidFetchUrl; exports.loadScript = loadScript; -exports.deprecated = deprecated; -exports.PDFDateString = exports.StatTimer = exports.DOMSVGFactory = exports.DOMCMapReaderFactory = exports.BaseCMapReaderFactory = exports.DOMCanvasFactory = exports.BaseCanvasFactory = exports.DEFAULT_LINK_REL = exports.LinkTarget = exports.RenderingCancelledException = exports.PageViewport = void 0; +exports.StatTimer = exports.RenderingCancelledException = exports.PDFDateString = exports.PageViewport = exports.LinkTarget = exports.DOMSVGFactory = exports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = exports.BaseCMapReaderFactory = exports.BaseCanvasFactory = void 0; var _util = __w_pdfjs_require__(2); @@ -836,11 +750,18 @@ function isValidFetchUrl(url, baseUrl) { } } -function loadScript(src) { +function loadScript(src, removeScriptElement = false) { return new Promise((resolve, reject) => { const script = document.createElement("script"); script.src = src; - script.onload = resolve; + + script.onload = function (evt) { + if (removeScriptElement) { + script.remove(); + } + + resolve(evt); + }; script.onerror = function () { reject(new Error(`Cannot load script at: ${script.src}`)); @@ -906,41 +827,45 @@ exports.PDFDateString = PDFDateString; /***/ }), /* 2 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.arrayByteLength = arrayByteLength; exports.arraysToBytes = arraysToBytes; exports.assert = assert; exports.bytesToString = bytesToString; exports.createPromiseCapability = createPromiseCapability; +exports.createValidAbsoluteUrl = createValidAbsoluteUrl; +exports.encodeToXmlString = encodeToXmlString; exports.escapeString = escapeString; exports.getModificationDate = getModificationDate; exports.getVerbosityLevel = getVerbosityLevel; exports.info = info; exports.isArrayBuffer = isArrayBuffer; exports.isArrayEqual = isArrayEqual; +exports.isAscii = isAscii; exports.isBool = isBool; exports.isNum = isNum; -exports.isString = isString; exports.isSameOrigin = isSameOrigin; -exports.createValidAbsoluteUrl = createValidAbsoluteUrl; +exports.isString = isString; +exports.objectFromEntries = objectFromEntries; +exports.objectSize = objectSize; exports.removeNullCharacters = removeNullCharacters; exports.setVerbosityLevel = setVerbosityLevel; exports.shadow = shadow; exports.string32 = string32; exports.stringToBytes = stringToBytes; exports.stringToPDFString = stringToPDFString; +exports.stringToUTF16BEString = stringToUTF16BEString; exports.stringToUTF8String = stringToUTF8String; +exports.unreachable = unreachable; exports.utf8StringToString = utf8StringToString; exports.warn = warn; -exports.unreachable = unreachable; -exports.IsEvalSupportedCached = exports.IsLittleEndianCached = exports.createObjectURL = exports.FormatError = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.MissingPDFException = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VerbosityLevel = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = exports.BaseException = void 0; +exports.VerbosityLevel = exports.Util = exports.UNSUPPORTED_FEATURES = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.PageActionEventType = exports.OPS = exports.MissingPDFException = exports.IsLittleEndianCached = exports.IsEvalSupportedCached = exports.InvalidPDFException = exports.ImageKind = exports.IDENTITY_MATRIX = exports.FormatError = exports.FontType = exports.FONT_IDENTITY_MATRIX = exports.DocumentActionEventType = exports.createObjectURL = exports.CMapCompressionType = exports.BaseException = exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.AnnotationActionEventType = exports.AbortException = void 0; __w_pdfjs_require__(3); @@ -1073,6 +998,36 @@ const AnnotationBorderStyleType = { UNDERLINE: 5 }; exports.AnnotationBorderStyleType = AnnotationBorderStyleType; +const AnnotationActionEventType = { + E: "Mouse Enter", + X: "Mouse Exit", + D: "Mouse Down", + U: "Mouse Up", + Fo: "Focus", + Bl: "Blur", + PO: "PageOpen", + PC: "PageClose", + PV: "PageVisible", + PI: "PageInvisible", + K: "Keystroke", + F: "Format", + V: "Validate", + C: "Calculate" +}; +exports.AnnotationActionEventType = AnnotationActionEventType; +const DocumentActionEventType = { + WC: "WillClose", + WS: "WillSave", + DS: "DidSave", + WP: "WillPrint", + DP: "DidPrint" +}; +exports.DocumentActionEventType = DocumentActionEventType; +const PageActionEventType = { + O: "PageOpen", + C: "PageClose" +}; +exports.PageActionEventType = PageActionEventType; const StreamType = { UNKNOWN: "UNKNOWN", FLATE: "FLATE", @@ -1481,6 +1436,14 @@ function string32(value) { return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); } +function objectSize(obj) { + return Object.keys(obj).length; +} + +function objectFromEntries(iterable) { + return Object.assign(Object.create(null), Object.fromEntries(iterable)); +} + function isLittleEndian() { const buffer8 = new Uint8Array(4); buffer8[0] = 1; @@ -1512,14 +1475,11 @@ const IsEvalSupportedCached = { }; exports.IsEvalSupportedCached = IsEvalSupportedCached; -const rgbBuf = ["rgb(", 0, ",", 0, ",", 0, ")"]; +const hexNumbers = [...Array(256).keys()].map(n => n.toString(16).padStart(2, "0")); class Util { - static makeCssRgb(r, g, b) { - rgbBuf[1] = r; - rgbBuf[3] = g; - rgbBuf[5] = b; - return rgbBuf.join(""); + static makeHexColor(r, g, b) { + return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; } static transform(m1, m2) { @@ -1641,7 +1601,31 @@ function stringToPDFString(str) { } function escapeString(str) { - return str.replace(/([\(\)\\])/g, "\\$1"); + return str.replace(/([()\\\n\r])/g, match => { + if (match === "\n") { + return "\\n"; + } else if (match === "\r") { + return "\\r"; + } + + return `\\${match}`; + }); +} + +function isAscii(str) { + return /^[\x00-\x7F]*$/.test(str); +} + +function stringToUTF16BEString(str) { + const buf = ["\xFE\xFF"]; + + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + buf.push(String.fromCharCode(char >> 8 & 0xff)); + buf.push(String.fromCharCode(char & 0xff)); + } + + return buf.join(""); } function stringToUTF8String(str) { @@ -1678,8 +1662,8 @@ function isArrayEqual(arr1, arr2) { }); } -function getModificationDate(date = new Date(Date.now())) { - const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), (date.getUTCDate() + 1).toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; +function getModificationDate(date = new Date()) { + const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; return buffer.join(""); } @@ -1734,12 +1718,62 @@ const createObjectURL = function createObjectURLClosure() { }(); exports.createObjectURL = createObjectURL; +const XMLEntities = { + 0x3c: "<", + 0x3e: ">", + 0x26: "&", + 0x22: """, + 0x27: "'" +}; + +function encodeToXmlString(str) { + const buffer = []; + let start = 0; + + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.codePointAt(i); + + if (0x20 <= char && char <= 0x7e) { + const entity = XMLEntities[char]; + + if (entity) { + if (start < i) { + buffer.push(str.substring(start, i)); + } + + buffer.push(entity); + start = i + 1; + } + } else { + if (start < i) { + buffer.push(str.substring(start, i)); + } + + buffer.push(`&#x${char.toString(16).toUpperCase()};`); + + if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) { + i++; + } + + start = i + 1; + } + } + + if (buffer.length === 0) { + return str; + } + + if (start < str.length) { + buffer.push(str.substring(start, str.length)); + } + + return buffer.join(""); +} /***/ }), /* 3 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => { -"use strict"; var _is_node = __w_pdfjs_require__(4); @@ -1748,31 +1782,29 @@ var _is_node = __w_pdfjs_require__(4); /***/ }), /* 4 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.isNodeJS = void 0; const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); exports.isNodeJS = isNodeJS; /***/ }), /* 5 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.getDocument = getDocument; exports.setPDFNetworkStreamFactory = setPDFNetworkStreamFactory; -exports.build = exports.version = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFWorker = exports.PDFDataRangeTransport = exports.LoopbackPort = void 0; +exports.version = exports.PDFWorker = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFDataRangeTransport = exports.LoopbackPort = exports.DefaultCMapReaderFactory = exports.DefaultCanvasFactory = exports.build = void 0; var _util = __w_pdfjs_require__(2); @@ -1805,7 +1837,9 @@ var _webgl = __w_pdfjs_require__(18); const DEFAULT_RANGE_CHUNK_SIZE = 65536; const RENDERING_CANCELLED_TIMEOUT = 100; const DefaultCanvasFactory = _is_node.isNodeJS ? _node_utils.NodeCanvasFactory : _display_utils.DOMCanvasFactory; +exports.DefaultCanvasFactory = DefaultCanvasFactory; const DefaultCMapReaderFactory = _is_node.isNodeJS ? _node_utils.NodeCMapReaderFactory : _display_utils.DOMCMapReaderFactory; +exports.DefaultCMapReaderFactory = DefaultCMapReaderFactory; let createPDFNetworkStream; function setPDFNetworkStreamFactory(pdfNetworkStreamFactory) { @@ -1979,7 +2013,7 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { return worker.messageHandler.sendWithPromise("GetDocRequest", { docId, - apiVersion: '2.6.347', + apiVersion: '2.7.570', source: { data: source.data, url: source.url, @@ -2176,6 +2210,10 @@ class PDFDocumentProxy { return this._transport.getJavaScript(); } + getJSActions() { + return this._transport.getDocJSActions(); + } + getOutline() { return this._transport.getOutline(); } @@ -2192,6 +2230,10 @@ class PDFDocumentProxy { return this._transport.getMetadata(); } + getMarkInfo() { + return this._transport.getMarkInfo(); + } + getData() { return this._transport.getData(); } @@ -2224,6 +2266,18 @@ class PDFDocumentProxy { return this._transport.saveDocument(annotationStorage); } + getFieldObjects() { + return this._transport.getFieldObjects(); + } + + hasJSActions() { + return this._transport.hasJSActions(); + } + + getCalculationOrderIds() { + return this._transport.getCalculationOrderIds(); + } + } exports.PDFDocumentProxy = PDFDocumentProxy; @@ -2292,6 +2346,10 @@ class PDFPageProxy { return this.annotationsPromise; } + getJSActions() { + return this._jsActionsPromise || (this._jsActionsPromise = this._transport.getPageJSActions(this._pageIndex)); + } + render({ canvasContext, viewport, @@ -2352,7 +2410,7 @@ class PDFPageProxy { pageIndex: this._pageIndex, intent: renderingIntent, renderInteractiveForms: renderInteractiveForms === true, - annotationStorage: annotationStorage && annotationStorage.getAll() || null + annotationStorage: annotationStorage?.getAll() || null }); } @@ -2551,6 +2609,7 @@ class PDFPageProxy { this.objs.clear(); this.annotationsPromise = null; + this._jsActionsPromise = null; this.pendingCleanup = false; return Promise.all(waitOn); } @@ -2578,6 +2637,7 @@ class PDFPageProxy { this.objs.clear(); this.annotationsPromise = null; + this._jsActionsPromise = null; if (resetStats && this._stats) { this._stats = new _display_utils.StatTimer(); @@ -2708,7 +2768,7 @@ class PDFPageProxy { } } - intentState.streamReader.cancel(new _util.AbortException(reason && reason.message)); + intentState.streamReader.cancel(new _util.AbortException(reason?.message)); intentState.streamReader = null; if (this._transport.destroyed) { @@ -2754,9 +2814,7 @@ class LoopbackPort { let buffer, result; if ((buffer = value.buffer) && (0, _util.isArrayBuffer)(buffer)) { - const transferable = transfers && transfers.includes(buffer); - - if (transferable) { + if (transfers?.includes(buffer)) { result = new value.constructor(buffer, value.byteOffset, value.byteLength); } else { result = new value.constructor(value); @@ -2846,7 +2904,7 @@ const PDFWorker = function PDFWorkerClosure() { isWorkerDisabled = true; fallbackWorkerSrc = "./pdf.worker.js"; } else if (typeof document === "object" && "currentScript" in document) { - const pdfjsFilePath = document.currentScript && document.currentScript.src; + const pdfjsFilePath = document.currentScript?.src; if (pdfjsFilePath) { fallbackWorkerSrc = pdfjsFilePath.replace(/(\.(?:min\.)?js)(\?.*)?$/i, ".worker$1$2"); @@ -2873,7 +2931,7 @@ const PDFWorker = function PDFWorkerClosure() { let mainWorkerMessageHandler; try { - mainWorkerMessageHandler = globalThis.pdfjsWorker && globalThis.pdfjsWorker.WorkerMessageHandler; + mainWorkerMessageHandler = globalThis.pdfjsWorker?.WorkerMessageHandler; } catch (ex) {} return mainWorkerMessageHandler || null; @@ -3159,6 +3217,10 @@ class WorkerTransport { this.setupMessageHandler(); } + get loadingTaskSettled() { + return this.loadingTask._capability.settled; + } + destroy() { if (this.destroyCapability) { return this.destroyCapability.promise; @@ -3181,8 +3243,20 @@ class WorkerTransport { this.pagePromises.length = 0; const terminated = this.messageHandler.sendWithPromise("Terminate", null); waitOn.push(terminated); + + if (this.loadingTaskSettled) { + const annotationStorageResetModified = this.loadingTask.promise.then(pdfDocument => { + if (pdfDocument.hasOwnProperty("annotationStorage")) { + pdfDocument.annotationStorage.resetModified(); + } + }).catch(() => {}); + waitOn.push(annotationStorageResetModified); + } + Promise.all(waitOn).then(() => { + this.commonObjs.clear(); this.fontLoader.clear(); + this._hasJSActionsPromise = null; if (this._networkStream) { this._networkStream.cancelAllRequests(new _util.AbortException("Worker was terminated.")); @@ -3411,7 +3485,7 @@ class WorkerTransport { let fontRegistry = null; - if (params.pdfBug && globalThis.FontInspector && globalThis.FontInspector.enabled) { + if (params.pdfBug && globalThis.FontInspector?.enabled) { fontRegistry = { registerFont(font, url) { globalThis.FontInspector.fontAdded(font, url); @@ -3466,7 +3540,7 @@ class WorkerTransport { pageProxy.objs.resolve(id, imageData); const MAX_IMAGE_SIZE_TO_STORE = 8000000; - if (imageData && "data" in imageData && imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) { + if (imageData?.data?.length > MAX_IMAGE_SIZE_TO_STORE) { pageProxy.cleanupAfterRender = true; } @@ -3575,8 +3649,8 @@ class WorkerTransport { saveDocument(annotationStorage) { return this.messageHandler.sendWithPromise("SaveDocument", { numPages: this._numPages, - annotationStorage: annotationStorage && annotationStorage.getAll() || null, - filename: this._fullReader ? this._fullReader.filename : null + annotationStorage: annotationStorage?.getAll() || null, + filename: this._fullReader?.filename ?? null }).finally(() => { if (annotationStorage) { annotationStorage.resetModified(); @@ -3584,6 +3658,18 @@ class WorkerTransport { }); } + getFieldObjects() { + return this.messageHandler.sendWithPromise("GetFieldObjects", null); + } + + hasJSActions() { + return this._hasJSActionsPromise || (this._hasJSActionsPromise = this.messageHandler.sendWithPromise("HasJSActions", null)); + } + + getCalculationOrderIds() { + return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null); + } + getDestinations() { return this.messageHandler.sendWithPromise("GetDestinations", null); } @@ -3626,6 +3712,16 @@ class WorkerTransport { return this.messageHandler.sendWithPromise("GetJavaScript", null); } + getDocJSActions() { + return this.messageHandler.sendWithPromise("GetDocJSActions", null); + } + + getPageJSActions(pageIndex) { + return this.messageHandler.sendWithPromise("GetPageJSActions", { + pageIndex + }); + } + getOutline() { return this.messageHandler.sendWithPromise("GetOutline", null); } @@ -3645,11 +3741,16 @@ class WorkerTransport { return { info: results[0], metadata: results[1] ? new _metadata.Metadata(results[1]) : null, - contentDispositionFilename: this._fullReader ? this._fullReader.filename : null + contentDispositionFilename: this._fullReader?.filename ?? null, + contentLength: this._fullReader?.contentLength ?? null }; }); } + getMarkInfo() { + return this.messageHandler.sendWithPromise("GetMarkInfo", null); + } + getStats() { return this.messageHandler.sendWithPromise("GetStats", null); } @@ -3670,6 +3771,7 @@ class WorkerTransport { this.commonObjs.clear(); this.fontLoader.clear(); + this._hasJSActionsPromise = null; }); } @@ -3718,7 +3820,7 @@ class PDFObjects { has(objId) { const obj = this._objs[objId]; - return obj ? obj.resolved : false; + return obj?.resolved || false; } resolve(objId, data) { @@ -3810,7 +3912,7 @@ const InternalRenderTask = function InternalRenderTaskClosure() { canvasInRendering.add(this._canvas); } - if (this._pdfBug && globalThis.StepperManager && globalThis.StepperManager.enabled) { + if (this._pdfBug && globalThis.StepperManager?.enabled) { this.stepper = globalThis.StepperManager.create(this._pageIndex); this.stepper.init(this.operatorList); this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint(); @@ -3924,21 +4026,20 @@ const InternalRenderTask = function InternalRenderTaskClosure() { return InternalRenderTask; }(); -const version = '2.6.347'; +const version = '2.7.570'; exports.version = version; -const build = '3be9c65f'; +const build = 'f2c7338b0'; exports.build = build; /***/ }), /* 6 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.FontLoader = exports.FontFaceObject = void 0; var _util = __w_pdfjs_require__(2); @@ -4043,8 +4144,7 @@ class BaseFontLoader { } get isFontLoadingAPISupported() { - const supported = typeof this._document !== "undefined" && !!this._document.fonts; - return (0, _util.shadow)(this, "isFontLoadingAPISupported", supported); + return (0, _util.shadow)(this, "isFontLoadingAPISupported", !!this._document?.fonts); } get isSyncFontLoadingSupported() { @@ -4082,7 +4182,7 @@ exports.FontLoader = FontLoader; } else { const m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent); - if (m && m[1] >= 14) { + if (m?.[1] >= 14) { supported = true; } } @@ -4329,14 +4429,13 @@ exports.FontFaceObject = FontFaceObject; /***/ }), /* 7 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.NodeCMapReaderFactory = exports.NodeCanvasFactory = void 0; var _display_utils = __w_pdfjs_require__(1); @@ -4401,16 +4500,17 @@ if (_is_node.isNodeJS) { /***/ }), /* 8 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.AnnotationStorage = void 0; +var _util = __w_pdfjs_require__(2); + class AnnotationStorage { constructor() { this._storage = new Map(); @@ -4430,11 +4530,26 @@ class AnnotationStorage { } setValue(key, value) { - if (this._storage.get(key) !== value) { - this._setModified(); + const obj = this._storage.get(key); + + let modified = false; + + if (obj !== undefined) { + for (const [entry, val] of Object.entries(value)) { + if (obj[entry] !== val) { + modified = true; + obj[entry] = val; + } + } + } else { + this._storage.set(key, value); + + modified = true; } - this._storage.set(key, value); + if (modified) { + this._setModified(); + } } getAll() { @@ -4442,7 +4557,7 @@ class AnnotationStorage { return null; } - return Object.fromEntries(this._storage); + return (0, _util.objectFromEntries)(this._storage); } get size() { @@ -4475,14 +4590,13 @@ exports.AnnotationStorage = AnnotationStorage; /***/ }), /* 9 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.apiCompatibilityParams = void 0; var _is_node = __w_pdfjs_require__(4); @@ -4500,27 +4614,25 @@ exports.apiCompatibilityParams = apiCompatibilityParams; /***/ }), /* 10 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.CanvasGraphics = void 0; var _util = __w_pdfjs_require__(2); var _pattern_helper = __w_pdfjs_require__(11); -var MIN_FONT_SIZE = 16; -var MAX_FONT_SIZE = 100; -var MAX_GROUP_SIZE = 4096; -var MIN_WIDTH_FACTOR = 0.65; -var COMPILE_TYPE3_GLYPHS = true; -var MAX_SIZE_TO_COMPILE = 1000; -var FULL_CHUNK_HEIGHT = 16; +const MIN_FONT_SIZE = 16; +const MAX_FONT_SIZE = 100; +const MAX_GROUP_SIZE = 4096; +const COMPILE_TYPE3_GLYPHS = true; +const MAX_SIZE_TO_COMPILE = 1000; +const FULL_CHUNK_HEIGHT = 16; function addContextCurrentTransform(ctx) { if (!ctx.mozCurrentTransform) { @@ -4540,21 +4652,21 @@ function addContextCurrentTransform(ctx) { }); Object.defineProperty(ctx, "mozCurrentTransformInverse", { get: function getCurrentTransformInverse() { - var m = this._transformMatrix; - var a = m[0], - b = m[1], - c = m[2], - d = m[3], - e = m[4], - f = m[5]; - var ad_bc = a * d - b * c; - var bc_ad = b * c - a * d; + const m = this._transformMatrix; + const a = m[0], + b = m[1], + c = m[2], + d = m[3], + e = m[4], + f = m[5]; + const ad_bc = a * d - b * c; + const bc_ad = b * c - a * d; return [d / ad_bc, b / bc_ad, c / bc_ad, a / ad_bc, (d * e - c * f) / bc_ad, (b * e - a * f) / ad_bc]; } }); ctx.save = function ctxSave() { - var old = this._transformMatrix; + const old = this._transformMatrix; this._transformStack.push(old); @@ -4564,7 +4676,7 @@ function addContextCurrentTransform(ctx) { }; ctx.restore = function ctxRestore() { - var prev = this._transformStack.pop(); + const prev = this._transformStack.pop(); if (prev) { this._transformMatrix = prev; @@ -4574,7 +4686,7 @@ function addContextCurrentTransform(ctx) { }; ctx.translate = function ctxTranslate(x, y) { - var m = this._transformMatrix; + const m = this._transformMatrix; m[4] = m[0] * x + m[2] * y + m[4]; m[5] = m[1] * x + m[3] * y + m[5]; @@ -4582,7 +4694,7 @@ function addContextCurrentTransform(ctx) { }; ctx.scale = function ctxScale(x, y) { - var m = this._transformMatrix; + const m = this._transformMatrix; m[0] = m[0] * x; m[1] = m[1] * x; m[2] = m[2] * y; @@ -4592,7 +4704,7 @@ function addContextCurrentTransform(ctx) { }; ctx.transform = function ctxTransform(a, b, c, d, e, f) { - var m = this._transformMatrix; + const m = this._transformMatrix; this._transformMatrix = [m[0] * a + m[2] * b, m[1] * a + m[3] * b, m[0] * c + m[2] * d, m[1] * c + m[3] * d, m[0] * e + m[2] * f + m[4], m[1] * e + m[3] * f + m[5]]; ctx._originalTransform(a, b, c, d, e, f); @@ -4605,9 +4717,9 @@ function addContextCurrentTransform(ctx) { }; ctx.rotate = function ctxRotate(angle) { - var cosValue = Math.cos(angle); - var sinValue = Math.sin(angle); - var m = this._transformMatrix; + const cosValue = Math.cos(angle); + const sinValue = Math.sin(angle); + const m = this._transformMatrix; this._transformMatrix = [m[0] * cosValue + m[2] * sinValue, m[1] * cosValue + m[3] * sinValue, m[0] * -sinValue + m[2] * cosValue, m[1] * -sinValue + m[3] * cosValue, m[4], m[5]]; this._originalRotate(angle); @@ -4615,7 +4727,7 @@ function addContextCurrentTransform(ctx) { } } -var CachedCanvases = function CachedCanvasesClosure() { +const CachedCanvases = function CachedCanvasesClosure() { function CachedCanvases(canvasFactory) { this.canvasFactory = canvasFactory; this.cache = Object.create(null); @@ -4623,7 +4735,7 @@ var CachedCanvases = function CachedCanvasesClosure() { CachedCanvases.prototype = { getCanvas: function CachedCanvases_getCanvas(id, width, height, trackTransform) { - var canvasEntry; + let canvasEntry; if (this.cache[id] !== undefined) { canvasEntry = this.cache[id]; @@ -4642,8 +4754,8 @@ var CachedCanvases = function CachedCanvasesClosure() { }, clear() { - for (var id in this.cache) { - var canvasEntry = this.cache[id]; + for (const id in this.cache) { + const canvasEntry = this.cache[id]; this.canvasFactory.destroy(canvasEntry); delete this.cache[id]; } @@ -4654,24 +4766,21 @@ var CachedCanvases = function CachedCanvasesClosure() { }(); function compileType3Glyph(imgData) { - var POINT_TO_PROCESS_LIMIT = 1000; - var width = imgData.width, - height = imgData.height; - var i, - j, - j0, - width1 = width + 1; - var points = new Uint8Array(width1 * (height + 1)); - var POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]); - var lineSize = width + 7 & ~7, - data0 = imgData.data; - var data = new Uint8Array(lineSize * height), - pos = 0, - ii; + const POINT_TO_PROCESS_LIMIT = 1000; + const width = imgData.width, + height = imgData.height, + width1 = width + 1; + let i, ii, j, j0; + const points = new Uint8Array(width1 * (height + 1)); + const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]); + const lineSize = width + 7 & ~7, + data0 = imgData.data; + const data = new Uint8Array(lineSize * height); + let pos = 0; for (i = 0, ii = data0.length; i < ii; i++) { - var mask = 128, - elem = data0[i]; + const elem = data0[i]; + let mask = 128; while (mask > 0) { data[pos++] = elem & mask ? 0 : 255; @@ -4679,7 +4788,7 @@ function compileType3Glyph(imgData) { } } - var count = 0; + let count = 0; pos = 0; if (data[pos] !== 0) { @@ -4710,7 +4819,7 @@ function compileType3Glyph(imgData) { ++count; } - var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); + let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); for (j = 1; j < width; j++) { sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0); @@ -4759,12 +4868,12 @@ function compileType3Glyph(imgData) { return null; } - var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]); - var outlines = []; + const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]); + const outlines = []; for (i = 0; count && i <= height; i++) { - var p = i * width1; - var end = p + width; + let p = i * width1; + const end = p + width; while (p < end && !points[p]) { p++; @@ -4774,19 +4883,18 @@ function compileType3Glyph(imgData) { continue; } - var coords = [p % width1, i]; - var type = points[p], - p0 = p, - pp; + const coords = [p % width1, i]; + const p0 = p; + let type = points[p]; do { - var step = steps[type]; + const step = steps[type]; do { p += step; } while (!points[p]); - pp = points[p]; + const pp = points[p]; if (pp !== 5 && pp !== 10) { type = pp; @@ -4808,14 +4916,14 @@ function compileType3Glyph(imgData) { --i; } - var drawOutline = function (c) { + const drawOutline = function (c) { c.save(); c.scale(1 / width, -1 / height); c.translate(0, -height); c.beginPath(); for (let k = 0, kk = outlines.length; k < kk; k++) { - var o = outlines[k]; + const o = outlines[k]; c.moveTo(o[0], o[1]); for (let l = 2, ll = o.length; l < ll; l += 2) { @@ -4831,7 +4939,7 @@ function compileType3Glyph(imgData) { return drawOutline; } -var CanvasExtraState = function CanvasExtraStateClosure() { +const CanvasExtraState = function CanvasExtraStateClosure() { function CanvasExtraState() { this.alphaIsShape = false; this.fontSize = 0; @@ -4872,9 +4980,9 @@ var CanvasExtraState = function CanvasExtraStateClosure() { return CanvasExtraState; }(); -var CanvasGraphics = function CanvasGraphicsClosure() { - var EXECUTION_TIME = 15; - var EXECUTION_STEPS = 10; +const CanvasGraphics = function CanvasGraphicsClosure() { + const EXECUTION_TIME = 15; + const EXECUTION_STEPS = 10; function CanvasGraphics(canvasCtx, commonObjs, objs, canvasFactory, webGLContext, imageLayer, optionalContentConfig) { this.ctx = canvasCtx; @@ -4915,17 +5023,17 @@ var CanvasGraphics = function CanvasGraphicsClosure() { return; } - var height = imgData.height, - width = imgData.width; - var partialChunkHeight = height % FULL_CHUNK_HEIGHT; - var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; - var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; - var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); - var srcPos = 0, + const height = imgData.height, + width = imgData.width; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0, destPos; - var src = imgData.data; - var dest = chunkImgData.data; - var i, j, thisChunkHeight, elemsInThisChunk; + const src = imgData.data; + const dest = chunkImgData.data; + let i, j, thisChunkHeight, elemsInThisChunk; let transferMapRed, transferMapGreen, transferMapBlue, transferMapGray; if (transferMaps) { @@ -4947,12 +5055,12 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } if (imgData.kind === _util.ImageKind.GRAYSCALE_1BPP) { - var srcLength = src.byteLength; - var dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2); - var dest32DataLength = dest32.length; - var fullSrcDiff = width + 7 >> 3; - var white = 0xffffffff; - var black = _util.IsLittleEndianCached.value ? 0xff000000 : 0x000000ff; + const srcLength = src.byteLength; + const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2); + const dest32DataLength = dest32.length; + const fullSrcDiff = width + 7 >> 3; + let white = 0xffffffff; + let black = _util.IsLittleEndianCached.value ? 0xff000000 : 0x000000ff; if (transferMapGray) { if (transferMapGray[0] === 0xff && transferMapGray[0xff] === 0) { @@ -4965,12 +5073,12 @@ var CanvasGraphics = function CanvasGraphicsClosure() { destPos = 0; for (j = 0; j < thisChunkHeight; j++) { - var srcDiff = srcLength - srcPos; + const srcDiff = srcLength - srcPos; let k = 0; - var kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7; - var kEndUnrolled = kEnd & ~7; - var mask = 0; - var srcByte = 0; + const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7; + const kEndUnrolled = kEnd & ~7; + let mask = 0; + let srcByte = 0; for (; k < kEndUnrolled; k += 8) { srcByte = src[srcPos++]; @@ -5096,26 +5204,27 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } function putBinaryImageMask(ctx, imgData) { - var height = imgData.height, - width = imgData.width; - var partialChunkHeight = height % FULL_CHUNK_HEIGHT; - var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; - var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; - var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); - var srcPos = 0; - var src = imgData.data; - var dest = chunkImgData.data; - - for (var i = 0; i < totalChunks; i++) { - var thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; - var destPos = 3; - - for (var j = 0; j < thisChunkHeight; j++) { - var mask = 0; - - for (var k = 0; k < width; k++) { + const height = imgData.height, + width = imgData.width; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0; + const src = imgData.data; + const dest = chunkImgData.data; + + for (let i = 0; i < totalChunks; i++) { + const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; + let destPos = 3; + + for (let j = 0; j < thisChunkHeight; j++) { + let elem, + mask = 0; + + for (let k = 0; k < width; k++) { if (!mask) { - var elem = src[srcPos++]; + elem = src[srcPos++]; mask = 128; } @@ -5130,10 +5239,10 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } function copyCtxState(sourceCtx, destCtx) { - var properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font"]; + const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font"]; - for (var i = 0, ii = properties.length; i < ii; i++) { - var property = properties[i]; + for (let i = 0, ii = properties.length; i < ii; i++) { + const property = properties[i]; if (sourceCtx[property] !== undefined) { destCtx[property] = sourceCtx[property]; @@ -5165,17 +5274,17 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } function composeSMaskBackdrop(bytes, r0, g0, b0) { - var length = bytes.length; + const length = bytes.length; - for (var i = 3; i < length; i += 4) { - var alpha = bytes[i]; + for (let i = 3; i < length; i += 4) { + const alpha = bytes[i]; if (alpha === 0) { bytes[i - 3] = r0; bytes[i - 2] = g0; bytes[i - 1] = b0; } else if (alpha < 255) { - var alpha_ = 255 - alpha; + const alpha_ = 255 - alpha; bytes[i - 3] = bytes[i - 3] * alpha + r0 * alpha_ >> 8; bytes[i - 2] = bytes[i - 2] * alpha + g0 * alpha_ >> 8; bytes[i - 1] = bytes[i - 1] * alpha + b0 * alpha_ >> 8; @@ -5184,30 +5293,30 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } function composeSMaskAlpha(maskData, layerData, transferMap) { - var length = maskData.length; - var scale = 1 / 255; + const length = maskData.length; + const scale = 1 / 255; - for (var i = 3; i < length; i += 4) { - var alpha = transferMap ? transferMap[maskData[i]] : maskData[i]; + for (let i = 3; i < length; i += 4) { + const alpha = transferMap ? transferMap[maskData[i]] : maskData[i]; layerData[i] = layerData[i] * alpha * scale | 0; } } function composeSMaskLuminosity(maskData, layerData, transferMap) { - var length = maskData.length; + const length = maskData.length; - for (var i = 3; i < length; i += 4) { - var y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28; + for (let i = 3; i < length; i += 4) { + const y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28; layerData[i] = transferMap ? layerData[i] * transferMap[y >> 8] >> 8 : layerData[i] * y >> 16; } } function genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap) { - var hasBackdrop = !!backdrop; - var r0 = hasBackdrop ? backdrop[0] : 0; - var g0 = hasBackdrop ? backdrop[1] : 0; - var b0 = hasBackdrop ? backdrop[2] : 0; - var composeFn; + const hasBackdrop = !!backdrop; + const r0 = hasBackdrop ? backdrop[0] : 0; + const g0 = hasBackdrop ? backdrop[1] : 0; + const b0 = hasBackdrop ? backdrop[2] : 0; + let composeFn; if (subtype === "Luminosity") { composeFn = composeSMaskLuminosity; @@ -5215,13 +5324,13 @@ var CanvasGraphics = function CanvasGraphicsClosure() { composeFn = composeSMaskAlpha; } - var PIXELS_TO_PROCESS = 1048576; - var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width)); + const PIXELS_TO_PROCESS = 1048576; + const chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width)); - for (var row = 0; row < height; row += chunkSize) { - var chunkHeight = Math.min(chunkSize, height - row); - var maskData = maskCtx.getImageData(0, row, width, chunkHeight); - var layerData = layerCtx.getImageData(0, row, width, chunkHeight); + for (let row = 0; row < height; row += chunkSize) { + const chunkHeight = Math.min(chunkSize, height - row); + const maskData = maskCtx.getImageData(0, row, width, chunkHeight); + const layerData = layerCtx.getImageData(0, row, width, chunkHeight); if (hasBackdrop) { composeSMaskBackdrop(maskData.data, r0, g0, b0); @@ -5233,10 +5342,10 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } function composeSMask(ctx, smask, layerCtx, webGLContext) { - var mask = smask.canvas; - var maskCtx = smask.context; + const mask = smask.canvas; + const maskCtx = smask.context; ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY, smask.offsetX, smask.offsetY); - var backdrop = smask.backdrop || null; + const backdrop = smask.backdrop || null; if (!smask.transferMap && webGLContext.isEnabled) { const composed = webGLContext.composeSMask({ @@ -5256,10 +5365,10 @@ var CanvasGraphics = function CanvasGraphicsClosure() { ctx.drawImage(mask, 0, 0); } - var LINE_CAP_STYLES = ["butt", "round", "square"]; - var LINE_JOIN_STYLES = ["miter", "round", "bevel"]; - var NORMAL_CLIP = {}; - var EO_CLIP = {}; + const LINE_CAP_STYLES = ["butt", "round", "square"]; + const LINE_JOIN_STYLES = ["miter", "round", "bevel"]; + const NORMAL_CLIP = {}; + const EO_CLIP = {}; CanvasGraphics.prototype = { beginDrawing({ transform, @@ -5267,15 +5376,15 @@ var CanvasGraphics = function CanvasGraphicsClosure() { transparency = false, background = null }) { - var width = this.ctx.canvas.width; - var height = this.ctx.canvas.height; + const width = this.ctx.canvas.width; + const height = this.ctx.canvas.height; this.ctx.save(); this.ctx.fillStyle = background || "rgb(255, 255, 255)"; this.ctx.fillRect(0, 0, width, height); this.ctx.restore(); if (transparency) { - var transparentCanvas = this.cachedCanvases.getCanvas("transparent", width, height, true); + const transparentCanvas = this.cachedCanvases.getCanvas("transparent", width, height, true); this.compositeCtx = this.ctx; this.transparentCanvas = transparentCanvas.canvas; this.ctx = transparentCanvas.context; @@ -5292,6 +5401,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.ctx.transform.apply(this.ctx, viewport.transform); this.baseTransform = this.ctx.mozCurrentTransform.slice(); + this._combinedScaleFactor = Math.hypot(this.baseTransform[0], this.baseTransform[2]); if (this.imageLayer) { this.imageLayer.beginLayout(); @@ -5299,21 +5409,21 @@ var CanvasGraphics = function CanvasGraphicsClosure() { }, executeOperatorList: function CanvasGraphics_executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) { - var argsArray = operatorList.argsArray; - var fnArray = operatorList.fnArray; - var i = executionStartIdx || 0; - var argsArrayLen = argsArray.length; + const argsArray = operatorList.argsArray; + const fnArray = operatorList.fnArray; + let i = executionStartIdx || 0; + const argsArrayLen = argsArray.length; if (argsArrayLen === i) { return i; } - var chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === "function"; - var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; - var steps = 0; - var commonObjs = this.commonObjs; - var objs = this.objs; - var fnId; + const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === "function"; + const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; + let steps = 0; + const commonObjs = this.commonObjs; + const objs = this.objs; + let fnId; while (true) { if (stepper !== undefined && i === stepper.nextBreakPoint) { @@ -5353,8 +5463,8 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } }, endDrawing: function CanvasGraphics_endDrawing() { - if (this.current.activeSMask !== null) { - this.endSMaskGroup(); + while (this.stateStack.length || this.current.activeSMask !== null) { + this.restore(); } this.ctx.restore(); @@ -5389,7 +5499,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.ctx.miterLimit = limit; }, setDash: function CanvasGraphics_setDash(dashArray, dashPhase) { - var ctx = this.ctx; + const ctx = this.ctx; if (ctx.setLineDash !== undefined) { ctx.setLineDash(dashArray); @@ -5402,10 +5512,10 @@ var CanvasGraphics = function CanvasGraphicsClosure() { setFlatness(flatness) {}, setGState: function CanvasGraphics_setGState(states) { - for (var i = 0, ii = states.length; i < ii; i++) { - var state = states[i]; - var key = state[0]; - var value = state[1]; + for (let i = 0, ii = states.length; i < ii; i++) { + const state = states[i]; + const key = state[0]; + const value = state[1]; switch (key) { case "LW": @@ -5477,15 +5587,15 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } }, beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() { - var activeSMask = this.current.activeSMask; - var drawnWidth = activeSMask.canvas.width; - var drawnHeight = activeSMask.canvas.height; - var cacheId = "smaskGroupAt" + this.groupLevel; - var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true); - var currentCtx = this.ctx; - var currentTransform = currentCtx.mozCurrentTransform; + const activeSMask = this.current.activeSMask; + const drawnWidth = activeSMask.canvas.width; + const drawnHeight = activeSMask.canvas.height; + const cacheId = "smaskGroupAt" + this.groupLevel; + const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true); + const currentCtx = this.ctx; + const currentTransform = currentCtx.mozCurrentTransform; this.ctx.save(); - var groupCtx = scratchCanvas.context; + const groupCtx = scratchCanvas.context; groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY); groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY); groupCtx.transform.apply(groupCtx, currentTransform); @@ -5497,7 +5607,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.groupLevel++; }, suspendSMaskGroup: function CanvasGraphics_endSMaskGroup() { - var groupCtx = this.ctx; + const groupCtx = this.ctx; this.groupLevel--; this.ctx = this.groupStack.pop(); composeSMask(this.ctx, this.current.activeSMask, groupCtx, this.webGLContext); @@ -5506,7 +5616,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { copyCtxState(groupCtx, this.ctx); this.current.resumeSMaskCtx = groupCtx; - var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform); + const deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform); this.ctx.transform.apply(this.ctx, deltaTransform); groupCtx.save(); @@ -5514,28 +5624,28 @@ var CanvasGraphics = function CanvasGraphicsClosure() { groupCtx.clearRect(0, 0, groupCtx.canvas.width, groupCtx.canvas.height); groupCtx.restore(); }, - resumeSMaskGroup: function CanvasGraphics_endSMaskGroup() { - var groupCtx = this.current.resumeSMaskCtx; - var currentCtx = this.ctx; + resumeSMaskGroup: function CanvasGraphics_resumeSMaskGroup() { + const groupCtx = this.current.resumeSMaskCtx; + const currentCtx = this.ctx; this.ctx = groupCtx; this.groupStack.push(currentCtx); this.groupLevel++; }, endSMaskGroup: function CanvasGraphics_endSMaskGroup() { - var groupCtx = this.ctx; + const groupCtx = this.ctx; this.groupLevel--; this.ctx = this.groupStack.pop(); composeSMask(this.ctx, this.current.activeSMask, groupCtx, this.webGLContext); this.ctx.restore(); copyCtxState(groupCtx, this.ctx); - var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform); + const deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform); this.ctx.transform.apply(this.ctx, deltaTransform); }, save: function CanvasGraphics_save() { this.ctx.save(); - var old = this.current; + const old = this.current; this.stateStack.push(old); this.current = old.clone(); this.current.resumeSMaskCtx = null; @@ -5554,6 +5664,8 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.ctx.restore(); this.pendingClip = null; this._cachedGetSinglePixelWidth = null; + } else { + this.current.activeSMask = null; } }, transform: function CanvasGraphics_transform(a, b, c, d, e, f) { @@ -5561,34 +5673,30 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this._cachedGetSinglePixelWidth = null; }, constructPath: function CanvasGraphics_constructPath(ops, args) { - var ctx = this.ctx; - var current = this.current; - var x = current.x, + const ctx = this.ctx; + const current = this.current; + let x = current.x, y = current.y; - for (var i = 0, j = 0, ii = ops.length; i < ii; i++) { + for (let i = 0, j = 0, ii = ops.length; i < ii; i++) { switch (ops[i] | 0) { case _util.OPS.rectangle: x = args[j++]; y = args[j++]; - var width = args[j++]; - var height = args[j++]; - - if (width === 0 && ctx.lineWidth < this.getSinglePixelWidth()) { - width = this.getSinglePixelWidth(); - } + const width = args[j++]; + const height = args[j++]; + const xw = x + width; + const yh = y + height; + ctx.moveTo(x, y); - if (height === 0 && ctx.lineWidth < this.getSinglePixelWidth()) { - height = this.getSinglePixelWidth(); + if (width === 0 || height === 0) { + ctx.lineTo(xw, yh); + } else { + ctx.lineTo(xw, y); + ctx.lineTo(xw, yh); + ctx.lineTo(x, yh); } - var xw = x + width; - var yh = y + height; - ctx.moveTo(x, y); - ctx.lineTo(xw, y); - ctx.lineTo(xw, yh); - ctx.lineTo(x, yh); - ctx.lineTo(x, y); ctx.closePath(); break; @@ -5638,24 +5746,43 @@ var CanvasGraphics = function CanvasGraphicsClosure() { }, stroke: function CanvasGraphics_stroke(consumePath) { consumePath = typeof consumePath !== "undefined" ? consumePath : true; - var ctx = this.ctx; - var strokeColor = this.current.strokeColor; + const ctx = this.ctx; + const strokeColor = this.current.strokeColor; ctx.globalAlpha = this.current.strokeAlpha; if (this.contentVisible) { - if (strokeColor && strokeColor.hasOwnProperty("type") && strokeColor.type === "Pattern") { + if (typeof strokeColor === "object" && strokeColor?.getPattern) { ctx.save(); const transform = ctx.mozCurrentTransform; const scale = _util.Util.singularValueDecompose2dScale(transform)[0]; ctx.strokeStyle = strokeColor.getPattern(ctx, this); - ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth * scale); + const lineWidth = this.getSinglePixelWidth(); + const scaledLineWidth = this.current.lineWidth * scale; + + if (lineWidth < 0 && -lineWidth >= scaledLineWidth) { + ctx.resetTransform(); + ctx.lineWidth = Math.round(this._combinedScaleFactor); + } else { + ctx.lineWidth = Math.max(lineWidth, scaledLineWidth); + } + ctx.stroke(); ctx.restore(); } else { - ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth); - ctx.stroke(); + const lineWidth = this.getSinglePixelWidth(); + + if (lineWidth < 0 && -lineWidth >= this.current.lineWidth) { + ctx.save(); + ctx.resetTransform(); + ctx.lineWidth = Math.round(this._combinedScaleFactor); + ctx.stroke(); + ctx.restore(); + } else { + ctx.lineWidth = Math.max(lineWidth, this.current.lineWidth); + ctx.stroke(); + } } } @@ -5671,10 +5798,10 @@ var CanvasGraphics = function CanvasGraphicsClosure() { }, fill: function CanvasGraphics_fill(consumePath) { consumePath = typeof consumePath !== "undefined" ? consumePath : true; - var ctx = this.ctx; - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - var needRestore = false; + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + let needRestore = false; if (isPatternFill) { ctx.save(); @@ -5742,8 +5869,8 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.current.y = this.current.lineY = 0; }, endText: function CanvasGraphics_endText() { - var paths = this.pendingTextPaths; - var ctx = this.ctx; + const paths = this.pendingTextPaths; + const ctx = this.ctx; if (paths === undefined) { ctx.beginPath(); @@ -5753,8 +5880,8 @@ var CanvasGraphics = function CanvasGraphicsClosure() { ctx.save(); ctx.beginPath(); - for (var i = 0; i < paths.length; i++) { - var path = paths[i]; + for (let i = 0; i < paths.length; i++) { + const path = paths[i]; ctx.setTransform.apply(ctx, path.transform); ctx.translate(path.x, path.y); path.addToPath(ctx, path.fontSize); @@ -5778,14 +5905,14 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.current.leading = -leading; }, setFont: function CanvasGraphics_setFont(fontRefName, size) { - var fontObj = this.commonObjs.get(fontRefName); - var current = this.current; + const fontObj = this.commonObjs.get(fontRefName); + const current = this.current; if (!fontObj) { throw new Error(`Can't find font for ${fontRefName}`); } - current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix : _util.FONT_IDENTITY_MATRIX; + current.fontMatrix = fontObj.fontMatrix || _util.FONT_IDENTITY_MATRIX; if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) { (0, _util.warn)("Invalid font matrix for font " + fontRefName); @@ -5805,7 +5932,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { return; } - var name = fontObj.loadedName || "sans-serif"; + const name = fontObj.loadedName || "sans-serif"; let bold = "normal"; if (fontObj.black) { @@ -5814,8 +5941,8 @@ var CanvasGraphics = function CanvasGraphicsClosure() { bold = "bold"; } - var italic = fontObj.italic ? "italic" : "normal"; - var typeface = `"${name}", ${fontObj.fallbackName}`; + const italic = fontObj.italic ? "italic" : "normal"; + const typeface = `"${name}", ${fontObj.fallbackName}`; let browserFontSize = size; if (size < MIN_FONT_SIZE) { @@ -5851,16 +5978,16 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.moveText(0, this.current.leading); }, - paintChar(character, x, y, patternTransform) { - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var textRenderingMode = current.textRenderingMode; - var fontSize = current.fontSize / current.fontSizeScale; - var fillStrokeMode = textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK; - var isAddToPathSet = !!(textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG); + paintChar(character, x, y, patternTransform, resetLineWidthToOne) { + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const textRenderingMode = current.textRenderingMode; + const fontSize = current.fontSize / current.fontSizeScale; + const fillStrokeMode = textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK; + const isAddToPathSet = !!(textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG); const patternFill = current.patternFill && !font.missingFile; - var addToPath; + let addToPath; if (font.disableFontFace || isAddToPathSet || patternFill) { addToPath = font.getPathGenerator(this.commonObjs, character); @@ -5881,6 +6008,11 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { + if (resetLineWidthToOne) { + ctx.resetTransform(); + ctx.lineWidth = Math.round(this._combinedScaleFactor); + } + ctx.stroke(); } @@ -5891,12 +6023,21 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { - ctx.strokeText(character, x, y); + if (resetLineWidthToOne) { + ctx.save(); + ctx.moveTo(x, y); + ctx.resetTransform(); + ctx.lineWidth = Math.round(this._combinedScaleFactor); + ctx.strokeText(character, 0, 0); + ctx.restore(); + } else { + ctx.strokeText(character, x, y); + } } } if (isAddToPathSet) { - var paths = this.pendingTextPaths || (this.pendingTextPaths = []); + const paths = this.pendingTextPaths || (this.pendingTextPaths = []); paths.push({ transform: ctx.mozCurrentTransform, x, @@ -5913,10 +6054,10 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10); ctx.scale(1.5, 1); ctx.fillText("I", 0, 10); - var data = ctx.getImageData(0, 0, 10, 10).data; - var enabled = false; + const data = ctx.getImageData(0, 0, 10, 10).data; + let enabled = false; - for (var i = 3; i < data.length; i += 4) { + for (let i = 3; i < data.length; i += 4) { if (data[i] > 0 && data[i] < 255) { enabled = true; break; @@ -5927,31 +6068,31 @@ var CanvasGraphics = function CanvasGraphicsClosure() { }, showText: function CanvasGraphics_showText(glyphs) { - var current = this.current; - var font = current.font; + const current = this.current; + const font = current.font; if (font.isType3Font) { return this.showType3Text(glyphs); } - var fontSize = current.fontSize; + const fontSize = current.fontSize; if (fontSize === 0) { return undefined; } - var ctx = this.ctx; - var fontSizeScale = current.fontSizeScale; - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var fontDirection = current.fontDirection; - var textHScale = current.textHScale * fontDirection; - var glyphsLength = glyphs.length; - var vertical = font.vertical; - var spacingDir = vertical ? 1 : -1; - var defaultVMetrics = font.defaultVMetrics; - var widthAdvanceScale = fontSize * current.fontMatrix[0]; - var simpleFillText = current.textRenderingMode === _util.TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill; + const ctx = this.ctx; + const fontSizeScale = current.fontSizeScale; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const fontDirection = current.fontDirection; + const textHScale = current.textHScale * fontDirection; + const glyphsLength = glyphs.length; + const vertical = font.vertical; + const spacingDir = vertical ? 1 : -1; + const defaultVMetrics = font.defaultVMetrics; + const widthAdvanceScale = fontSize * current.fontMatrix[0]; + const simpleFillText = current.textRenderingMode === _util.TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill; ctx.save(); let patternTransform; @@ -5972,15 +6113,17 @@ var CanvasGraphics = function CanvasGraphicsClosure() { ctx.scale(textHScale, 1); } - var lineWidth = current.lineWidth; - var scale = current.textMatrixScale; + let lineWidth = current.lineWidth; + let resetLineWidthToOne = false; + const scale = current.textMatrixScale; if (scale === 0 || lineWidth === 0) { - var fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK; + const fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK; if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { this._cachedGetSinglePixelWidth = null; - lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR; + lineWidth = this.getSinglePixelWidth(); + resetLineWidthToOne = lineWidth < 0; } } else { lineWidth /= scale; @@ -5992,30 +6135,28 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } ctx.lineWidth = lineWidth; - var x = 0, + let x = 0, i; for (i = 0; i < glyphsLength; ++i) { - var glyph = glyphs[i]; + const glyph = glyphs[i]; if ((0, _util.isNum)(glyph)) { x += spacingDir * glyph * fontSize / 1000; continue; } - var restoreNeeded = false; - var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - var character = glyph.fontChar; - var accent = glyph.accent; - var scaledX, scaledY, scaledAccentX, scaledAccentY; - var width = glyph.width; + let restoreNeeded = false; + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const character = glyph.fontChar; + const accent = glyph.accent; + let scaledX, scaledY; + let width = glyph.width; if (vertical) { - var vmetric, vx, vy; - vmetric = glyph.vmetric || defaultVMetrics; - vx = glyph.vmetric ? vmetric[1] : width * 0.5; - vx = -vx * widthAdvanceScale; - vy = vmetric[2] * widthAdvanceScale; + const vmetric = glyph.vmetric || defaultVMetrics; + const vx = -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale; + const vy = vmetric[2] * widthAdvanceScale; width = vmetric ? -vmetric[0] : width; scaledX = vx / fontSizeScale; scaledY = (x + vy) / fontSizeScale; @@ -6025,10 +6166,10 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } if (font.remeasure && width > 0) { - var measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale; + const measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale; if (width < measuredWidth && this.isFontSubpixelAAEnabled) { - var characterScaleX = width / measuredWidth; + const characterScaleX = width / measuredWidth; restoreNeeded = true; ctx.save(); ctx.scale(characterScaleX, 1); @@ -6042,17 +6183,17 @@ var CanvasGraphics = function CanvasGraphicsClosure() { if (simpleFillText && !accent) { ctx.fillText(character, scaledX, scaledY); } else { - this.paintChar(character, scaledX, scaledY, patternTransform); + this.paintChar(character, scaledX, scaledY, patternTransform, resetLineWidthToOne); if (accent) { - scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale; - scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale; - this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform); + const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale; + const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale; + this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform, resetLineWidthToOne); } } } - var charWidth; + let charWidth; if (vertical) { charWidth = width * widthAdvanceScale - spacing * fontDirection; @@ -6076,19 +6217,19 @@ var CanvasGraphics = function CanvasGraphicsClosure() { ctx.restore(); }, showType3Text: function CanvasGraphics_showType3Text(glyphs) { - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var fontSize = current.fontSize; - var fontDirection = current.fontDirection; - var spacingDir = font.vertical ? 1 : -1; - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var textHScale = current.textHScale * fontDirection; - var fontMatrix = current.fontMatrix || _util.FONT_IDENTITY_MATRIX; - var glyphsLength = glyphs.length; - var isTextInvisible = current.textRenderingMode === _util.TextRenderingMode.INVISIBLE; - var i, glyph, width, spacingLength; + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const fontSize = current.fontSize; + const fontDirection = current.fontDirection; + const spacingDir = font.vertical ? 1 : -1; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const textHScale = current.textHScale * fontDirection; + const fontMatrix = current.fontMatrix || _util.FONT_IDENTITY_MATRIX; + const glyphsLength = glyphs.length; + const isTextInvisible = current.textRenderingMode === _util.TextRenderingMode.INVISIBLE; + let i, glyph, width, spacingLength; if (isTextInvisible || fontSize === 0) { return; @@ -6110,8 +6251,8 @@ var CanvasGraphics = function CanvasGraphicsClosure() { continue; } - var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - var operatorList = font.charProcOperatorList[glyph.operatorListId]; + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const operatorList = font.charProcOperatorList[glyph.operatorListId]; if (!operatorList) { (0, _util.warn)(`Type3 character "${glyph.operatorListId}" is not available.`); @@ -6127,7 +6268,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.restore(); } - var transformed = _util.Util.applyTransform([glyph.width, 0], fontMatrix); + const transformed = _util.Util.applyTransform([glyph.width, 0], fontMatrix); width = transformed[0] * fontSize + spacing; ctx.translate(width, 0); @@ -6144,12 +6285,12 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.endPath(); }, getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) { - var pattern; + let pattern; if (IR[0] === "TilingPattern") { - var color = IR[1]; - var baseTransform = this.baseTransform || this.ctx.mozCurrentTransform.slice(); - var canvasGraphicsFactory = { + const color = IR[1]; + const baseTransform = this.baseTransform || this.ctx.mozCurrentTransform.slice(); + const canvasGraphicsFactory = { createCanvasGraphics: ctx => { return new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.webGLContext); } @@ -6169,13 +6310,13 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.current.patternFill = true; }, setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) { - var color = _util.Util.makeCssRgb(r, g, b); + const color = _util.Util.makeHexColor(r, g, b); this.ctx.strokeStyle = color; this.current.strokeColor = color; }, setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) { - var color = _util.Util.makeCssRgb(r, g, b); + const color = _util.Util.makeHexColor(r, g, b); this.ctx.fillStyle = color; this.current.fillColor = color; @@ -6186,29 +6327,29 @@ var CanvasGraphics = function CanvasGraphicsClosure() { return; } - var ctx = this.ctx; + const ctx = this.ctx; this.save(); - var pattern = (0, _pattern_helper.getShadingPatternFromIR)(patternIR); + const pattern = (0, _pattern_helper.getShadingPatternFromIR)(patternIR); ctx.fillStyle = pattern.getPattern(ctx, this, true); - var inv = ctx.mozCurrentTransformInverse; + const inv = ctx.mozCurrentTransformInverse; if (inv) { - var canvas = ctx.canvas; - var width = canvas.width; - var height = canvas.height; + const canvas = ctx.canvas; + const width = canvas.width; + const height = canvas.height; - var bl = _util.Util.applyTransform([0, 0], inv); + const bl = _util.Util.applyTransform([0, 0], inv); - var br = _util.Util.applyTransform([0, height], inv); + const br = _util.Util.applyTransform([0, height], inv); - var ul = _util.Util.applyTransform([width, 0], inv); + const ul = _util.Util.applyTransform([width, 0], inv); - var ur = _util.Util.applyTransform([width, height], inv); + const ur = _util.Util.applyTransform([width, height], inv); - var x0 = Math.min(bl[0], br[0], ul[0], ur[0]); - var y0 = Math.min(bl[1], br[1], ul[1], ur[1]); - var x1 = Math.max(bl[0], br[0], ul[0], ur[0]); - var y1 = Math.max(bl[1], br[1], ul[1], ur[1]); + const x0 = Math.min(bl[0], br[0], ul[0], ur[0]); + const y0 = Math.min(bl[1], br[1], ul[1], ur[1]); + const x1 = Math.max(bl[0], br[0], ul[0], ur[0]); + const y1 = Math.max(bl[1], br[1], ul[1], ur[1]); this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); } else { this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); @@ -6237,8 +6378,8 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.baseTransform = this.ctx.mozCurrentTransform; if (bbox) { - var width = bbox[2] - bbox[0]; - var height = bbox[3] - bbox[1]; + const width = bbox[2] - bbox[0]; + const height = bbox[3] - bbox[1]; this.ctx.rect(bbox[0], bbox[1], width, height); this.clip(); this.endPath(); @@ -6258,7 +6399,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } this.save(); - var currentCtx = this.ctx; + const currentCtx = this.ctx; if (!group.isolated) { (0, _util.info)("TODO: Support non-isolated groups."); @@ -6268,7 +6409,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { (0, _util.warn)("Knockout groups not supported."); } - var currentTransform = currentCtx.mozCurrentTransform; + const currentTransform = currentCtx.mozCurrentTransform; if (group.matrix) { currentCtx.transform.apply(currentCtx, group.matrix); @@ -6278,15 +6419,15 @@ var CanvasGraphics = function CanvasGraphicsClosure() { throw new Error("Bounding box is required."); } - var bounds = _util.Util.getAxialAlignedBoundingBox(group.bbox, currentCtx.mozCurrentTransform); + let bounds = _util.Util.getAxialAlignedBoundingBox(group.bbox, currentCtx.mozCurrentTransform); - var canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height]; + const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height]; bounds = _util.Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; - var offsetX = Math.floor(bounds[0]); - var offsetY = Math.floor(bounds[1]); - var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); - var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); - var scaleX = 1, + const offsetX = Math.floor(bounds[0]); + const offsetY = Math.floor(bounds[1]); + let drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); + let drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); + let scaleX = 1, scaleY = 1; if (drawnWidth > MAX_GROUP_SIZE) { @@ -6299,14 +6440,14 @@ var CanvasGraphics = function CanvasGraphicsClosure() { drawnHeight = MAX_GROUP_SIZE; } - var cacheId = "groupAt" + this.groupLevel; + let cacheId = "groupAt" + this.groupLevel; if (group.smask) { cacheId += "_smask_" + this.smaskCounter++ % 2; } - var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true); - var groupCtx = scratchCanvas.context; + const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true); + const groupCtx = scratchCanvas.context; groupCtx.scale(1 / scaleX, 1 / scaleY); groupCtx.translate(-offsetX, -offsetY); groupCtx.transform.apply(groupCtx, currentTransform); @@ -6343,7 +6484,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } this.groupLevel--; - var groupCtx = this.ctx; + const groupCtx = this.ctx; this.ctx = this.groupStack.pop(); if (this.ctx.imageSmoothingEnabled !== undefined) { @@ -6376,8 +6517,8 @@ var CanvasGraphics = function CanvasGraphicsClosure() { this.current = new CanvasExtraState(); if (Array.isArray(rect) && rect.length === 4) { - var width = rect[2] - rect[0]; - var height = rect[3] - rect[1]; + const width = rect[2] - rect[0]; + const height = rect[3] - rect[1]; this.ctx.rect(rect[0], rect[1], width, height); this.clip(); this.endPath(); @@ -6394,12 +6535,12 @@ var CanvasGraphics = function CanvasGraphicsClosure() { return; } - var ctx = this.ctx; - var width = img.width, - height = img.height; - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - var glyph = this.processingType3; + const ctx = this.ctx; + const width = img.width, + height = img.height; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + const glyph = this.processingType3; if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) { if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) { @@ -6413,13 +6554,13 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } } - if (glyph && glyph.compiled) { + if (glyph?.compiled) { glyph.compiled(ctx); return; } - var maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); - var maskCtx = maskCanvas.context; + const maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + const maskCtx = maskCanvas.context; maskCtx.save(); putBinaryImageMask(maskCtx, img); maskCtx.globalCompositeOperation = "source-in"; @@ -6434,21 +6575,21 @@ var CanvasGraphics = function CanvasGraphicsClosure() { return; } - var width = imgData.width; - var height = imgData.height; - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - var maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); - var maskCtx = maskCanvas.context; + const width = imgData.width; + const height = imgData.height; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + const maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + const maskCtx = maskCanvas.context; maskCtx.save(); putBinaryImageMask(maskCtx, imgData); maskCtx.globalCompositeOperation = "source-in"; maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor; maskCtx.fillRect(0, 0, width, height); maskCtx.restore(); - var ctx = this.ctx; + const ctx = this.ctx; - for (var i = 0, ii = positions.length; i < ii; i += 2) { + for (let i = 0, ii = positions.length; i < ii; i += 2) { ctx.save(); ctx.transform(scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]); ctx.scale(1, -1); @@ -6462,16 +6603,16 @@ var CanvasGraphics = function CanvasGraphicsClosure() { return; } - var ctx = this.ctx; - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - - for (var i = 0, ii = images.length; i < ii; i++) { - var image = images[i]; - var width = image.width, - height = image.height; - var maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); - var maskCtx = maskCanvas.context; + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + + for (let i = 0, ii = images.length; i < ii; i++) { + const image = images[i]; + const width = image.width, + height = image.height; + const maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + const maskCtx = maskCanvas.context; maskCtx.save(); putBinaryImageMask(maskCtx, image); maskCtx.globalCompositeOperation = "source-in"; @@ -6511,11 +6652,11 @@ var CanvasGraphics = function CanvasGraphicsClosure() { return; } - var width = imgData.width; - var height = imgData.height; - var map = []; + const width = imgData.width; + const height = imgData.height; + const map = []; - for (var i = 0, ii = positions.length; i < ii; i += 2) { + for (let i = 0, ii = positions.length; i < ii; i += 2) { map.push({ transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]], x: 0, @@ -6532,35 +6673,35 @@ var CanvasGraphics = function CanvasGraphicsClosure() { return; } - var width = imgData.width; - var height = imgData.height; - var ctx = this.ctx; + const width = imgData.width; + const height = imgData.height; + const ctx = this.ctx; this.save(); ctx.scale(1 / width, -1 / height); - var currentTransform = ctx.mozCurrentTransformInverse; - var a = currentTransform[0], - b = currentTransform[1]; - var widthScale = Math.max(Math.sqrt(a * a + b * b), 1); - var c = currentTransform[2], - d = currentTransform[3]; - var heightScale = Math.max(Math.sqrt(c * c + d * d), 1); - var imgToPaint, tmpCanvas; + const currentTransform = ctx.mozCurrentTransformInverse; + const a = currentTransform[0], + b = currentTransform[1]; + let widthScale = Math.max(Math.sqrt(a * a + b * b), 1); + const c = currentTransform[2], + d = currentTransform[3]; + let heightScale = Math.max(Math.sqrt(c * c + d * d), 1); + let imgToPaint, tmpCanvas, tmpCtx; if (typeof HTMLElement === "function" && imgData instanceof HTMLElement || !imgData.data) { imgToPaint = imgData; } else { tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); - var tmpCtx = tmpCanvas.context; + tmpCtx = tmpCanvas.context; putBinaryImageData(tmpCtx, imgData, this.current.transferMaps); imgToPaint = tmpCanvas.canvas; } - var paintWidth = width, + let paintWidth = width, paintHeight = height; - var tmpCanvasId = "prescale1"; + let tmpCanvasId = "prescale1"; while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) { - var newWidth = paintWidth, + let newWidth = paintWidth, newHeight = paintHeight; if (widthScale > 2 && paintWidth > 1) { @@ -6586,7 +6727,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, -height, width, height); if (this.imageLayer) { - var position = this.getCanvasPosition(0, -height); + const position = this.getCanvasPosition(0, -height); this.imageLayer.appendImage({ imgData, left: position[0], @@ -6603,22 +6744,22 @@ var CanvasGraphics = function CanvasGraphicsClosure() { return; } - var ctx = this.ctx; - var w = imgData.width; - var h = imgData.height; - var tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h); - var tmpCtx = tmpCanvas.context; + const ctx = this.ctx; + const w = imgData.width; + const h = imgData.height; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h); + const tmpCtx = tmpCanvas.context; putBinaryImageData(tmpCtx, imgData, this.current.transferMaps); - for (var i = 0, ii = map.length; i < ii; i++) { - var entry = map[i]; + for (let i = 0, ii = map.length; i < ii; i++) { + const entry = map[i]; ctx.save(); ctx.transform.apply(ctx, entry.transform); ctx.scale(1, -1); ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1); if (this.imageLayer) { - var position = this.getCanvasPosition(entry.x, entry.y); + const position = this.getCanvasPosition(entry.x, entry.y); this.imageLayer.appendImage({ imgData, left: position[0], @@ -6665,7 +6806,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { beginCompat: function CanvasGraphics_beginCompat() {}, endCompat: function CanvasGraphics_endCompat() {}, consumePath: function CanvasGraphics_consumePath() { - var ctx = this.ctx; + const ctx = this.ctx; if (this.pendingClip) { if (this.pendingClip === EO_CLIP) { @@ -6680,17 +6821,28 @@ var CanvasGraphics = function CanvasGraphicsClosure() { ctx.beginPath(); }, - getSinglePixelWidth(scale) { + getSinglePixelWidth() { if (this._cachedGetSinglePixelWidth === null) { - const inverse = this.ctx.mozCurrentTransformInverse; - this._cachedGetSinglePixelWidth = Math.sqrt(Math.max(inverse[0] * inverse[0] + inverse[1] * inverse[1], inverse[2] * inverse[2] + inverse[3] * inverse[3])); + const m = this.ctx.mozCurrentTransform; + const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]); + const sqNorm1 = m[0] ** 2 + m[2] ** 2; + const sqNorm2 = m[1] ** 2 + m[3] ** 2; + const pixelHeight = Math.sqrt(Math.max(sqNorm1, sqNorm2)) / absDet; + + if (sqNorm1 !== sqNorm2 && this._combinedScaleFactor * pixelHeight > 1) { + this._cachedGetSinglePixelWidth = -(this._combinedScaleFactor * pixelHeight); + } else if (absDet > Number.EPSILON) { + this._cachedGetSinglePixelWidth = pixelHeight * 1.0000001; + } else { + this._cachedGetSinglePixelWidth = 1; + } } return this._cachedGetSinglePixelWidth; }, getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) { - var transform = this.ctx.mozCurrentTransform; + const transform = this.ctx.mozCurrentTransform; return [transform[0] * x + transform[2] * y + transform[4], transform[1] * x + transform[3] * y + transform[5]]; }, isContentVisible: function CanvasGraphics_isContentVisible() { @@ -6704,7 +6856,7 @@ var CanvasGraphics = function CanvasGraphicsClosure() { } }; - for (var op in _util.OPS) { + for (const op in _util.OPS) { CanvasGraphics.prototype[_util.OPS[op]] = CanvasGraphics.prototype[op]; } @@ -6715,20 +6867,19 @@ exports.CanvasGraphics = CanvasGraphics; /***/ }), /* 11 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.getShadingPatternFromIR = getShadingPatternFromIR; exports.TilingPattern = void 0; var _util = __w_pdfjs_require__(2); -var ShadingIRs = {}; +const ShadingIRs = {}; function applyBoundingBox(ctx, bbox) { if (!bbox || typeof Path2D === "undefined") { @@ -6744,18 +6895,17 @@ function applyBoundingBox(ctx, bbox) { ShadingIRs.RadialAxial = { fromIR: function RadialAxial_fromIR(raw) { - var type = raw[1]; - var bbox = raw[2]; - var colorStops = raw[3]; - var p0 = raw[4]; - var p1 = raw[5]; - var r0 = raw[6]; - var r1 = raw[7]; + const type = raw[1]; + const bbox = raw[2]; + const colorStops = raw[3]; + const p0 = raw[4]; + const p1 = raw[5]; + const r0 = raw[6]; + const r1 = raw[7]; return { - type: "Pattern", getPattern: function RadialAxial_getPattern(ctx) { applyBoundingBox(ctx, bbox); - var grad; + let grad; if (type === "axial") { grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]); @@ -6763,8 +6913,8 @@ ShadingIRs.RadialAxial = { grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1); } - for (var i = 0, ii = colorStops.length; i < ii; ++i) { - var c = colorStops[i]; + for (let i = 0, ii = colorStops.length; i < ii; ++i) { + const c = colorStops[i]; grad.addColorStop(c[0], c[1]); } @@ -6774,13 +6924,13 @@ ShadingIRs.RadialAxial = { } }; -var createMeshCanvas = function createMeshCanvasClosure() { +const createMeshCanvas = function createMeshCanvasClosure() { function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { - var coords = context.coords, - colors = context.colors; - var bytes = data.data, - rowSize = data.width * 4; - var tmp; + const coords = context.coords, + colors = context.colors; + const bytes = data.data, + rowSize = data.width * 4; + let tmp; if (coords[p1 + 1] > coords[p2 + 1]) { tmp = p1; @@ -6809,32 +6959,32 @@ var createMeshCanvas = function createMeshCanvasClosure() { c2 = tmp; } - var x1 = (coords[p1] + context.offsetX) * context.scaleX; - var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; - var x2 = (coords[p2] + context.offsetX) * context.scaleX; - var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; - var x3 = (coords[p3] + context.offsetX) * context.scaleX; - var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; + const x1 = (coords[p1] + context.offsetX) * context.scaleX; + const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; + const x2 = (coords[p2] + context.offsetX) * context.scaleX; + const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; + const x3 = (coords[p3] + context.offsetX) * context.scaleX; + const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; if (y1 >= y3) { return; } - var c1r = colors[c1], - c1g = colors[c1 + 1], - c1b = colors[c1 + 2]; - var c2r = colors[c2], - c2g = colors[c2 + 1], - c2b = colors[c2 + 2]; - var c3r = colors[c3], - c3g = colors[c3 + 1], - c3b = colors[c3 + 2]; - var minY = Math.round(y1), - maxY = Math.round(y3); - var xa, car, cag, cab; - var xb, cbr, cbg, cbb; - - for (var y = minY; y <= maxY; y++) { + const c1r = colors[c1], + c1g = colors[c1 + 1], + c1b = colors[c1 + 2]; + const c2r = colors[c2], + c2g = colors[c2 + 1], + c2b = colors[c2 + 2]; + const c3r = colors[c3], + c3g = colors[c3 + 1], + c3b = colors[c3 + 2]; + const minY = Math.round(y1), + maxY = Math.round(y3); + let xa, car, cag, cab; + let xb, cbr, cbg, cbb; + + for (let y = minY; y <= maxY; y++) { if (y < y2) { let k; @@ -6881,11 +7031,11 @@ var createMeshCanvas = function createMeshCanvasClosure() { cbr = c1r - (c1r - c3r) * k; cbg = c1g - (c1g - c3g) * k; cbb = c1b - (c1b - c3b) * k; - var x1_ = Math.round(Math.min(xa, xb)); - var x2_ = Math.round(Math.max(xa, xb)); - var j = rowSize * y + x1_ * 4; + const x1_ = Math.round(Math.min(xa, xb)); + const x2_ = Math.round(Math.max(xa, xb)); + let j = rowSize * y + x1_ * 4; - for (var x = x1_; x <= x2_; x++) { + for (let x = x1_; x <= x2_; x++) { k = (xa - x) / (xa - xb); if (k < 0) { @@ -6903,20 +7053,20 @@ var createMeshCanvas = function createMeshCanvasClosure() { } function drawFigure(data, figure, context) { - var ps = figure.coords; - var cs = figure.colors; - var i, ii; + const ps = figure.coords; + const cs = figure.colors; + let i, ii; switch (figure.type) { case "lattice": - var verticesPerRow = figure.verticesPerRow; - var rows = Math.floor(ps.length / verticesPerRow) - 1; - var cols = verticesPerRow - 1; + const verticesPerRow = figure.verticesPerRow; + const rows = Math.floor(ps.length / verticesPerRow) - 1; + const cols = verticesPerRow - 1; for (i = 0; i < rows; i++) { - var q = i * verticesPerRow; + let q = i * verticesPerRow; - for (var j = 0; j < cols; j++, q++) { + for (let j = 0; j < cols; j++, q++) { drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]); drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]); } @@ -6937,18 +7087,18 @@ var createMeshCanvas = function createMeshCanvasClosure() { } function createMeshCanvas(bounds, combinesScale, coords, colors, figures, backgroundColor, cachedCanvases, webGLContext) { - var EXPECTED_SCALE = 1.1; - var MAX_PATTERN_SIZE = 3000; - var BORDER_SIZE = 2; - var offsetX = Math.floor(bounds[0]); - var offsetY = Math.floor(bounds[1]); - var boundsWidth = Math.ceil(bounds[2]) - offsetX; - var boundsHeight = Math.ceil(bounds[3]) - offsetY; - var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); - var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); - var scaleX = boundsWidth / width; - var scaleY = boundsHeight / height; - var context = { + const EXPECTED_SCALE = 1.1; + const MAX_PATTERN_SIZE = 3000; + const BORDER_SIZE = 2; + const offsetX = Math.floor(bounds[0]); + const offsetY = Math.floor(bounds[1]); + const boundsWidth = Math.ceil(bounds[2]) - offsetX; + const boundsHeight = Math.ceil(bounds[3]) - offsetY; + const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + const scaleX = boundsWidth / width; + const scaleY = boundsHeight / height; + const context = { coords, colors, offsetX: -offsetX, @@ -6956,9 +7106,9 @@ var createMeshCanvas = function createMeshCanvasClosure() { scaleX: 1 / scaleX, scaleY: 1 / scaleY }; - var paddedWidth = width + BORDER_SIZE * 2; - var paddedHeight = height + BORDER_SIZE * 2; - var canvas, tmpCanvas, i, ii; + const paddedWidth = width + BORDER_SIZE * 2; + const paddedHeight = height + BORDER_SIZE * 2; + let canvas, tmpCanvas, i, ii; if (webGLContext.isEnabled) { canvas = webGLContext.drawFigures({ @@ -6973,11 +7123,11 @@ var createMeshCanvas = function createMeshCanvasClosure() { canvas = tmpCanvas.canvas; } else { tmpCanvas = cachedCanvases.getCanvas("mesh", paddedWidth, paddedHeight, false); - var tmpCtx = tmpCanvas.context; - var data = tmpCtx.createImageData(width, height); + const tmpCtx = tmpCanvas.context; + const data = tmpCtx.createImageData(width, height); if (backgroundColor) { - var bytes = data.data; + const bytes = data.data; for (i = 0, ii = bytes.length; i < ii; i += 4) { bytes[i] = backgroundColor[0]; @@ -7009,18 +7159,17 @@ var createMeshCanvas = function createMeshCanvasClosure() { ShadingIRs.Mesh = { fromIR: function Mesh_fromIR(raw) { - var coords = raw[2]; - var colors = raw[3]; - var figures = raw[4]; - var bounds = raw[5]; - var matrix = raw[6]; - var bbox = raw[7]; - var background = raw[8]; + const coords = raw[2]; + const colors = raw[3]; + const figures = raw[4]; + const bounds = raw[5]; + const matrix = raw[6]; + const bbox = raw[7]; + const background = raw[8]; return { - type: "Pattern", getPattern: function Mesh_getPattern(ctx, owner, shadingFill) { applyBoundingBox(ctx, bbox); - var scale; + let scale; if (shadingFill) { scale = _util.Util.singularValueDecompose2dScale(ctx.mozCurrentTransform); @@ -7028,13 +7177,13 @@ ShadingIRs.Mesh = { scale = _util.Util.singularValueDecompose2dScale(owner.baseTransform); if (matrix) { - var matrixScale = _util.Util.singularValueDecompose2dScale(matrix); + const matrixScale = _util.Util.singularValueDecompose2dScale(matrix); scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]]; } } - var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, colors, figures, shadingFill ? null : background, owner.cachedCanvases, owner.webGLContext); + const temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, colors, figures, shadingFill ? null : background, owner.cachedCanvases, owner.webGLContext); if (!shadingFill) { ctx.setTransform.apply(ctx, owner.baseTransform); @@ -7054,7 +7203,6 @@ ShadingIRs.Mesh = { ShadingIRs.Dummy = { fromIR: function Dummy_fromIR() { return { - type: "Pattern", getPattern: function Dummy_fromIR_getPattern() { return "hotpink"; } @@ -7063,7 +7211,7 @@ ShadingIRs.Dummy = { }; function getShadingPatternFromIR(raw) { - var shadingIR = ShadingIRs[raw[0]]; + const shadingIR = ShadingIRs[raw[0]]; if (!shadingIR) { throw new Error(`Unknown IR type: ${raw[0]}`); @@ -7072,12 +7220,12 @@ function getShadingPatternFromIR(raw) { return shadingIR.fromIR(raw); } -var TilingPattern = function TilingPatternClosure() { - var PaintType = { +const TilingPattern = function TilingPatternClosure() { + const PaintType = { COLORED: 1, UNCOLORED: 2 }; - var MAX_PATTERN_SIZE = 3000; + const MAX_PATTERN_SIZE = 3000; function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) { this.operatorList = IR[2]; @@ -7090,36 +7238,35 @@ var TilingPattern = function TilingPatternClosure() { this.color = color; this.canvasGraphicsFactory = canvasGraphicsFactory; this.baseTransform = baseTransform; - this.type = "Pattern"; this.ctx = ctx; } TilingPattern.prototype = { createPatternCanvas: function TilinPattern_createPatternCanvas(owner) { - var operatorList = this.operatorList; - var bbox = this.bbox; - var xstep = this.xstep; - var ystep = this.ystep; - var paintType = this.paintType; - var tilingType = this.tilingType; - var color = this.color; - var canvasGraphicsFactory = this.canvasGraphicsFactory; + const operatorList = this.operatorList; + const bbox = this.bbox; + const xstep = this.xstep; + const ystep = this.ystep; + const paintType = this.paintType; + const tilingType = this.tilingType; + const color = this.color; + const canvasGraphicsFactory = this.canvasGraphicsFactory; (0, _util.info)("TilingType: " + tilingType); - var x0 = bbox[0], - y0 = bbox[1], - x1 = bbox[2], - y1 = bbox[3]; + const x0 = bbox[0], + y0 = bbox[1], + x1 = bbox[2], + y1 = bbox[3]; - var matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix); + const matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix); - var curMatrixScale = _util.Util.singularValueDecompose2dScale(this.baseTransform); + const curMatrixScale = _util.Util.singularValueDecompose2dScale(this.baseTransform); - var combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]]; - var dimx = this.getSizeAndScale(xstep, this.ctx.canvas.width, combinedScale[0]); - var dimy = this.getSizeAndScale(ystep, this.ctx.canvas.height, combinedScale[1]); - var tmpCanvas = owner.cachedCanvases.getCanvas("pattern", dimx.size, dimy.size, true); - var tmpCtx = tmpCanvas.context; - var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); + const combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]]; + const dimx = this.getSizeAndScale(xstep, this.ctx.canvas.width, combinedScale[0]); + const dimy = this.getSizeAndScale(ystep, this.ctx.canvas.height, combinedScale[1]); + const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", dimx.size, dimy.size, true); + const tmpCtx = tmpCanvas.context; + const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); graphics.groupLevel = owner.groupLevel; this.setFillAndStrokeStyleToContext(graphics, paintType, color); graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0); @@ -7132,8 +7279,8 @@ var TilingPattern = function TilingPatternClosure() { }, getSizeAndScale: function TilingPattern_getSizeAndScale(step, realOutputSize, scale) { step = Math.abs(step); - var maxSize = Math.max(MAX_PATTERN_SIZE, realOutputSize); - var size = Math.ceil(step * scale); + const maxSize = Math.max(MAX_PATTERN_SIZE, realOutputSize); + let size = Math.ceil(step * scale); if (size >= maxSize) { size = maxSize; @@ -7148,8 +7295,8 @@ var TilingPattern = function TilingPatternClosure() { }, clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) { if (Array.isArray(bbox) && bbox.length === 4) { - var bboxWidth = x1 - x0; - var bboxHeight = y1 - y0; + const bboxWidth = x1 - x0; + const bboxHeight = y1 - y0; graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); graphics.clip(); graphics.endPath(); @@ -7161,7 +7308,7 @@ var TilingPattern = function TilingPatternClosure() { switch (paintType) { case PaintType.COLORED: - var ctx = this.ctx; + const ctx = this.ctx; context.fillStyle = ctx.fillStyle; context.strokeStyle = ctx.strokeStyle; current.fillColor = ctx.fillStyle; @@ -7169,7 +7316,7 @@ var TilingPattern = function TilingPatternClosure() { break; case PaintType.UNCOLORED: - var cssColor = _util.Util.makeCssRgb(color[0], color[1], color[2]); + const cssColor = _util.Util.makeHexColor(color[0], color[1], color[2]); context.fillStyle = cssColor; context.strokeStyle = cssColor; @@ -7185,7 +7332,7 @@ var TilingPattern = function TilingPatternClosure() { ctx = this.ctx; ctx.setTransform.apply(ctx, this.baseTransform); ctx.transform.apply(ctx, this.matrix); - var temporaryPatternCanvas = this.createPatternCanvas(owner); + const temporaryPatternCanvas = this.createPatternCanvas(owner); return ctx.createPattern(temporaryPatternCanvas, "repeat"); } }; @@ -7196,14 +7343,13 @@ exports.TilingPattern = TilingPattern; /***/ }), /* 12 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.GlobalWorkerOptions = void 0; const GlobalWorkerOptions = Object.create(null); exports.GlobalWorkerOptions = GlobalWorkerOptions; @@ -7212,14 +7358,13 @@ GlobalWorkerOptions.workerSrc = GlobalWorkerOptions.workerSrc === undefined ? "" /***/ }), /* 13 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.MessageHandler = void 0; var _util = __w_pdfjs_require__(2); @@ -7713,14 +7858,13 @@ exports.MessageHandler = MessageHandler; /***/ }), /* 14 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.Metadata = void 0; var _util = __w_pdfjs_require__(2); @@ -7731,13 +7875,17 @@ class Metadata { constructor(data) { (0, _util.assert)(typeof data === "string", "Metadata: input is not a string"); data = this._repair(data); - const parser = new _xml_parser.SimpleXMLParser(); + const parser = new _xml_parser.SimpleXMLParser({ + lowerCaseName: true + }); const xmlDocument = parser.parseFromString(data); this._metadataMap = new Map(); if (xmlDocument) { this._parse(xmlDocument); } + + this._data = data; } _repair(data) { @@ -7780,49 +7928,79 @@ class Metadata { }); } + _getSequence(entry) { + const name = entry.nodeName; + + if (name !== "rdf:bag" && name !== "rdf:seq" && name !== "rdf:alt") { + return null; + } + + return entry.childNodes.filter(node => node.nodeName === "rdf:li"); + } + + _getCreators(entry) { + if (entry.nodeName !== "dc:creator") { + return false; + } + + if (!entry.hasChildNodes()) { + return true; + } + + const seqNode = entry.childNodes[0]; + const authors = this._getSequence(seqNode) || []; + + this._metadataMap.set(entry.nodeName, authors.map(node => node.textContent.trim())); + + return true; + } + _parse(xmlDocument) { let rdf = xmlDocument.documentElement; - if (rdf.nodeName.toLowerCase() !== "rdf:rdf") { + if (rdf.nodeName !== "rdf:rdf") { rdf = rdf.firstChild; - while (rdf && rdf.nodeName.toLowerCase() !== "rdf:rdf") { + while (rdf && rdf.nodeName !== "rdf:rdf") { rdf = rdf.nextSibling; } } - const nodeName = rdf ? rdf.nodeName.toLowerCase() : null; - - if (!rdf || nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) { + if (!rdf || rdf.nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) { return; } - const children = rdf.childNodes; - - for (let i = 0, ii = children.length; i < ii; i++) { - const desc = children[i]; - - if (desc.nodeName.toLowerCase() !== "rdf:description") { + for (const desc of rdf.childNodes) { + if (desc.nodeName !== "rdf:description") { continue; } - for (let j = 0, jj = desc.childNodes.length; j < jj; j++) { - if (desc.childNodes[j].nodeName.toLowerCase() !== "#text") { - const entry = desc.childNodes[j]; - const name = entry.nodeName.toLowerCase(); + for (const entry of desc.childNodes) { + const name = entry.nodeName; - this._metadataMap.set(name, entry.textContent.trim()); + if (name === "#text") { + continue; + } + + if (this._getCreators(entry)) { + continue; } + + this._metadataMap.set(name, entry.textContent.trim()); } } } + getRaw() { + return this._data; + } + get(name) { - return this._metadataMap.has(name) ? this._metadataMap.get(name) : null; + return this._metadataMap.get(name) ?? null; } getAll() { - return Object.fromEntries(this._metadataMap); + return (0, _util.objectFromEntries)(this._metadataMap); } has(name) { @@ -7835,15 +8013,17 @@ exports.Metadata = Metadata; /***/ }), /* 15 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); -exports.SimpleXMLParser = void 0; +})); +exports.SimpleXMLParser = exports.SimpleDOMNode = void 0; + +var _util = __w_pdfjs_require__(2); + const XMLParserErrorCode = { NoError: 0, EndOfDocument: -1, @@ -7877,9 +8057,9 @@ class XMLParserBase { _resolveEntities(s) { return s.replace(/&([^;]+);/g, (all, entity) => { if (entity.substring(0, 2) === "#x") { - return String.fromCharCode(parseInt(entity.substring(2), 16)); + return String.fromCodePoint(parseInt(entity.substring(2), 16)); } else if (entity.substring(0, 1) === "#") { - return String.fromCharCode(parseInt(entity.substring(1), 10)); + return String.fromCodePoint(parseInt(entity.substring(1), 10)); } switch (entity) { @@ -8184,14 +8364,111 @@ class SimpleDOMNode { return this.childNodes && this.childNodes.length > 0; } + searchNode(paths, pos) { + if (pos >= paths.length) { + return this; + } + + const component = paths[pos]; + const stack = []; + let node = this; + + while (true) { + if (component.name === node.nodeName) { + if (component.pos === 0) { + const res = node.searchNode(paths, pos + 1); + + if (res !== null) { + return res; + } + } else if (stack.length === 0) { + return null; + } else { + const [parent] = stack.pop(); + let siblingPos = 0; + + for (const child of parent.childNodes) { + if (component.name === child.nodeName) { + if (siblingPos === component.pos) { + return child.searchNode(paths, pos + 1); + } + + siblingPos++; + } + } + + return node.searchNode(paths, pos + 1); + } + } + + if (node.childNodes && node.childNodes.length !== 0) { + stack.push([node, 0]); + node = node.childNodes[0]; + } else if (stack.length === 0) { + return null; + } else { + while (stack.length !== 0) { + const [parent, currentPos] = stack.pop(); + const newPos = currentPos + 1; + + if (newPos < parent.childNodes.length) { + stack.push([parent, newPos]); + node = parent.childNodes[newPos]; + break; + } + } + + if (stack.length === 0) { + return null; + } + } + } + } + + dump(buffer) { + if (this.nodeName === "#text") { + buffer.push((0, _util.encodeToXmlString)(this.nodeValue)); + return; + } + + buffer.push(`<${this.nodeName}`); + + if (this.attributes) { + for (const attribute of this.attributes) { + buffer.push(` ${attribute.name}="${(0, _util.encodeToXmlString)(attribute.value)}"`); + } + } + + if (this.hasChildNodes()) { + buffer.push(">"); + + for (const child of this.childNodes) { + child.dump(buffer); + } + + buffer.push(`</${this.nodeName}>`); + } else if (this.nodeValue) { + buffer.push(`>${(0, _util.encodeToXmlString)(this.nodeValue)}</${this.nodeName}>`); + } else { + buffer.push("/>"); + } + } + } +exports.SimpleDOMNode = SimpleDOMNode; + class SimpleXMLParser extends XMLParserBase { - constructor() { + constructor({ + hasAttributes = false, + lowerCaseName = false + }) { super(); this._currentFragment = null; this._stack = null; this._errorCode = XMLParserErrorCode.NoError; + this._hasAttributes = hasAttributes; + this._lowerCaseName = lowerCaseName; } parseFromString(data) { @@ -8241,9 +8518,17 @@ class SimpleXMLParser extends XMLParserBase { } onBeginElement(name, attributes, isEmpty) { + if (this._lowerCaseName) { + name = name.toLowerCase(); + } + const node = new SimpleDOMNode(name); node.childNodes = []; + if (this._hasAttributes) { + node.attributes = attributes; + } + this._currentFragment.push(node); if (isEmpty) { @@ -8278,14 +8563,13 @@ exports.SimpleXMLParser = SimpleXMLParser; /***/ }), /* 16 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.OptionalContentConfig = void 0; var _util = __w_pdfjs_require__(2); @@ -8434,7 +8718,7 @@ class OptionalContentConfig { return null; } - return Object.fromEntries(this._groups); + return (0, _util.objectFromEntries)(this._groups); } getGroup(id) { @@ -8447,14 +8731,13 @@ exports.OptionalContentConfig = OptionalContentConfig; /***/ }), /* 17 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.PDFDataTransportStream = void 0; var _util = __w_pdfjs_require__(2); @@ -8466,7 +8749,7 @@ class PDFDataTransportStream { this._progressiveDone = params.progressiveDone || false; const initialData = params.initialData; - if (initialData && initialData.length > 0) { + if (initialData?.length > 0) { const buffer = new Uint8Array(initialData).buffer; this._queuedChunks.push(buffer); @@ -8531,14 +8814,14 @@ class PDFDataTransportStream { } get _progressiveDataLength() { - return this._fullRequestReader ? this._fullRequestReader._loaded : 0; + return this._fullRequestReader?._loaded ?? 0; } _onProgress(evt) { if (evt.total === undefined) { const firstReader = this._rangeReaders[0]; - if (firstReader && firstReader.onProgress) { + if (firstReader?.onProgress) { firstReader.onProgress({ loaded: evt.loaded }); @@ -8546,7 +8829,7 @@ class PDFDataTransportStream { } else { const fullReader = this._fullRequestReader; - if (fullReader && fullReader.onProgress) { + if (fullReader?.onProgress) { fullReader.onProgress({ loaded: evt.loaded, total: evt.total @@ -8802,14 +9085,13 @@ class PDFDataTransportStreamRangeReader { /***/ }), /* 18 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.WebGLContext = void 0; var _util = __w_pdfjs_require__(2); @@ -8857,15 +9139,15 @@ class WebGLContext { exports.WebGLContext = WebGLContext; -var WebGLUtils = function WebGLUtilsClosure() { +const WebGLUtils = function WebGLUtilsClosure() { function loadShader(gl, code, shaderType) { - var shader = gl.createShader(shaderType); + const shader = gl.createShader(shaderType); gl.shaderSource(shader, code); gl.compileShader(shader); - var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS); + const compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS); if (!compiled) { - var errorMsg = gl.getShaderInfoLog(shader); + const errorMsg = gl.getShaderInfoLog(shader); throw new Error("Error during shader compilation: " + errorMsg); } @@ -8881,17 +9163,17 @@ var WebGLUtils = function WebGLUtilsClosure() { } function createProgram(gl, shaders) { - var program = gl.createProgram(); + const program = gl.createProgram(); - for (var i = 0, ii = shaders.length; i < ii; ++i) { + for (let i = 0, ii = shaders.length; i < ii; ++i) { gl.attachShader(program, shaders[i]); } gl.linkProgram(program); - var linked = gl.getProgramParameter(program, gl.LINK_STATUS); + const linked = gl.getProgramParameter(program, gl.LINK_STATUS); if (!linked) { - var errorMsg = gl.getProgramInfoLog(program); + const errorMsg = gl.getProgramInfoLog(program); throw new Error("Error during program linking: " + errorMsg); } @@ -8900,7 +9182,7 @@ var WebGLUtils = function WebGLUtilsClosure() { function createTexture(gl, image, textureId) { gl.activeTexture(textureId); - var texture = gl.createTexture(); + const texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); @@ -8910,7 +9192,7 @@ var WebGLUtils = function WebGLUtilsClosure() { return texture; } - var currentGL, currentCanvas; + let currentGL, currentCanvas; function generateGL() { if (currentGL) { @@ -8923,7 +9205,7 @@ var WebGLUtils = function WebGLUtilsClosure() { }); } - var smaskVertexShaderCode = "\ + const smaskVertexShaderCode = "\ attribute vec2 a_position; \ attribute vec2 a_texCoord; \ \ @@ -8937,7 +9219,7 @@ var WebGLUtils = function WebGLUtilsClosure() { \ v_texCoord = a_texCoord; \ } "; - var smaskFragmentShaderCode = "\ + const smaskFragmentShaderCode = "\ precision mediump float; \ \ uniform vec4 u_backdrop; \ @@ -8965,30 +9247,29 @@ var WebGLUtils = function WebGLUtilsClosure() { imageColor.rgb *= imageColor.a; \ gl_FragColor = imageColor; \ } "; - var smaskCache = null; + let smaskCache = null; function initSmaskGL() { - var canvas, gl; generateGL(); - canvas = currentCanvas; + const canvas = currentCanvas; currentCanvas = null; - gl = currentGL; + const gl = currentGL; currentGL = null; - var vertexShader = createVertexShader(gl, smaskVertexShaderCode); - var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode); - var program = createProgram(gl, [vertexShader, fragmentShader]); + const vertexShader = createVertexShader(gl, smaskVertexShaderCode); + const fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode); + const program = createProgram(gl, [vertexShader, fragmentShader]); gl.useProgram(program); - var cache = {}; + const cache = {}; cache.gl = gl; cache.canvas = canvas; cache.resolutionLocation = gl.getUniformLocation(program, "u_resolution"); cache.positionLocation = gl.getAttribLocation(program, "a_position"); cache.backdropLocation = gl.getUniformLocation(program, "u_backdrop"); cache.subtypeLocation = gl.getUniformLocation(program, "u_subtype"); - var texCoordLocation = gl.getAttribLocation(program, "a_texCoord"); - var texLayerLocation = gl.getUniformLocation(program, "u_image"); - var texMaskLocation = gl.getUniformLocation(program, "u_mask"); - var texCoordBuffer = gl.createBuffer(); + const texCoordLocation = gl.getAttribLocation(program, "a_texCoord"); + const texLayerLocation = gl.getUniformLocation(program, "u_image"); + const texMaskLocation = gl.getUniformLocation(program, "u_mask"); + const texCoordBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]), gl.STATIC_DRAW); gl.enableVertexAttribArray(texCoordLocation); @@ -8999,16 +9280,16 @@ var WebGLUtils = function WebGLUtilsClosure() { } function composeSMask(layer, mask, properties) { - var width = layer.width, - height = layer.height; + const width = layer.width, + height = layer.height; if (!smaskCache) { initSmaskGL(); } - var cache = smaskCache, - canvas = cache.canvas, - gl = cache.gl; + const cache = smaskCache, + canvas = cache.canvas, + gl = cache.gl; canvas.width = width; canvas.height = height; gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); @@ -9021,9 +9302,9 @@ var WebGLUtils = function WebGLUtilsClosure() { } gl.uniform1i(cache.subtypeLocation, properties.subtype === "Luminosity" ? 1 : 0); - var texture = createTexture(gl, layer, gl.TEXTURE0); - var maskTexture = createTexture(gl, mask, gl.TEXTURE1); - var buffer = gl.createBuffer(); + const texture = createTexture(gl, layer, gl.TEXTURE0); + const maskTexture = createTexture(gl, mask, gl.TEXTURE1); + const buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, buffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, width, 0, 0, height, 0, height, width, 0, width, height]), gl.STATIC_DRAW); gl.enableVertexAttribArray(cache.positionLocation); @@ -9040,7 +9321,7 @@ var WebGLUtils = function WebGLUtilsClosure() { return canvas; } - var figuresVertexShaderCode = "\ + const figuresVertexShaderCode = "\ attribute vec2 a_position; \ attribute vec3 a_color; \ \ @@ -9057,7 +9338,7 @@ var WebGLUtils = function WebGLUtilsClosure() { \ v_color = vec4(a_color / 255.0, 1.0); \ } "; - var figuresFragmentShaderCode = "\ + const figuresFragmentShaderCode = "\ precision mediump float; \ \ varying vec4 v_color; \ @@ -9065,20 +9346,19 @@ var WebGLUtils = function WebGLUtilsClosure() { void main() { \ gl_FragColor = v_color; \ } "; - var figuresCache = null; + let figuresCache = null; function initFiguresGL() { - var canvas, gl; generateGL(); - canvas = currentCanvas; + const canvas = currentCanvas; currentCanvas = null; - gl = currentGL; + const gl = currentGL; currentGL = null; - var vertexShader = createVertexShader(gl, figuresVertexShaderCode); - var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode); - var program = createProgram(gl, [vertexShader, fragmentShader]); + const vertexShader = createVertexShader(gl, figuresVertexShaderCode); + const fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode); + const program = createProgram(gl, [vertexShader, fragmentShader]); gl.useProgram(program); - var cache = {}; + const cache = {}; cache.gl = gl; cache.canvas = canvas; cache.resolutionLocation = gl.getUniformLocation(program, "u_resolution"); @@ -9094,20 +9374,19 @@ var WebGLUtils = function WebGLUtilsClosure() { initFiguresGL(); } - var cache = figuresCache, - canvas = cache.canvas, - gl = cache.gl; + const cache = figuresCache, + canvas = cache.canvas, + gl = cache.gl; canvas.width = width; canvas.height = height; gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); gl.uniform2f(cache.resolutionLocation, width, height); - var count = 0; - var i, ii, rows; + let count = 0; - for (i = 0, ii = figures.length; i < ii; i++) { + for (let i = 0, ii = figures.length; i < ii; i++) { switch (figures[i].type) { case "lattice": - rows = figures[i].coords.length / figures[i].verticesPerRow | 0; + const rows = figures[i].coords.length / figures[i].verticesPerRow | 0; count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6; break; @@ -9117,27 +9396,27 @@ var WebGLUtils = function WebGLUtilsClosure() { } } - var coords = new Float32Array(count * 2); - var colors = new Uint8Array(count * 3); - var coordsMap = context.coords, - colorsMap = context.colors; - var pIndex = 0, + const coords = new Float32Array(count * 2); + const colors = new Uint8Array(count * 3); + const coordsMap = context.coords, + colorsMap = context.colors; + let pIndex = 0, cIndex = 0; - for (i = 0, ii = figures.length; i < ii; i++) { - var figure = figures[i], - ps = figure.coords, - cs = figure.colors; + for (let i = 0, ii = figures.length; i < ii; i++) { + const figure = figures[i], + ps = figure.coords, + cs = figure.colors; switch (figure.type) { case "lattice": - var cols = figure.verticesPerRow; - rows = ps.length / cols | 0; + const cols = figure.verticesPerRow; + const rows = ps.length / cols | 0; - for (var row = 1; row < rows; row++) { - var offset = row * cols + 1; + for (let row = 1; row < rows; row++) { + let offset = row * cols + 1; - for (var col = 1; col < cols; col++, offset++) { + for (let col = 1; col < cols; col++, offset++) { coords[pIndex] = coordsMap[ps[offset - cols - 1]]; coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1]; coords[pIndex + 2] = coordsMap[ps[offset - cols]]; @@ -9176,7 +9455,7 @@ var WebGLUtils = function WebGLUtilsClosure() { break; case "triangles": - for (var j = 0, jj = ps.length; j < jj; j++) { + for (let j = 0, jj = ps.length; j < jj; j++) { coords[pIndex] = coordsMap[ps[j]]; coords[pIndex + 1] = coordsMap[ps[j] + 1]; colors[cIndex] = colorsMap[cs[j]]; @@ -9197,12 +9476,12 @@ var WebGLUtils = function WebGLUtilsClosure() { } gl.clear(gl.COLOR_BUFFER_BIT); - var coordsBuffer = gl.createBuffer(); + const coordsBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer); gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW); gl.enableVertexAttribArray(cache.positionLocation); gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0); - var colorsBuffer = gl.createBuffer(); + const colorsBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer); gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW); gl.enableVertexAttribArray(cache.colorLocation); @@ -9230,12 +9509,12 @@ var WebGLUtils = function WebGLUtilsClosure() { drawFigures, cleanup() { - if (smaskCache && smaskCache.canvas) { + if (smaskCache?.canvas) { smaskCache.canvas.width = 0; smaskCache.canvas.height = 0; } - if (figuresCache && figuresCache.canvas) { + if (figuresCache?.canvas) { figuresCache.canvas.width = 0; figuresCache.canvas.height = 0; } @@ -9249,14 +9528,13 @@ var WebGLUtils = function WebGLUtilsClosure() { /***/ }), /* 19 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.AnnotationLayer = void 0; var _display_utils = __w_pdfjs_require__(1); @@ -9265,6 +9543,8 @@ var _util = __w_pdfjs_require__(2); var _annotation_storage = __w_pdfjs_require__(8); +var _scripting_utils = __w_pdfjs_require__(20); + class AnnotationElementFactory { static create(parameters) { const subtype = parameters.data.annotationType; @@ -9351,7 +9631,11 @@ class AnnotationElementFactory { } class AnnotationElement { - constructor(parameters, isRenderable = false, ignoreBorder = false) { + constructor(parameters, { + isRenderable = false, + ignoreBorder = false, + createQuadrilaterals = false + } = {}) { this.isRenderable = isRenderable; this.data = parameters.data; this.layer = parameters.layer; @@ -9363,10 +9647,17 @@ class AnnotationElement { this.renderInteractiveForms = parameters.renderInteractiveForms; this.svgFactory = parameters.svgFactory; this.annotationStorage = parameters.annotationStorage; + this.enableScripting = parameters.enableScripting; + this.hasJSActions = parameters.hasJSActions; + this._mouseState = parameters.mouseState; if (isRenderable) { this.container = this._createContainer(ignoreBorder); } + + if (createQuadrilaterals) { + this.quadrilaterals = this._createQuadrilaterals(ignoreBorder); + } } _createContainer(ignoreBorder = false) { @@ -9381,7 +9672,7 @@ class AnnotationElement { const rect = _util.Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]); container.style.transform = `matrix(${viewport.transform.join(",")})`; - container.style.transformOrigin = `-${rect[0]}px -${rect[1]}px`; + container.style.transformOrigin = `${-rect[0]}px ${-rect[1]}px`; if (!ignoreBorder && data.borderStyle.width > 0) { container.style.borderWidth = `${data.borderStyle.width}px`; @@ -9425,7 +9716,7 @@ class AnnotationElement { } if (data.color) { - container.style.borderColor = _util.Util.makeCssRgb(data.color[0] | 0, data.color[1] | 0, data.color[2] | 0); + container.style.borderColor = _util.Util.makeHexColor(data.color[0] | 0, data.color[1] | 0, data.color[2] | 0); } else { container.style.borderWidth = 0; } @@ -9438,7 +9729,31 @@ class AnnotationElement { return container; } - _createPopup(container, trigger, data) { + _createQuadrilaterals(ignoreBorder = false) { + if (!this.data.quadPoints) { + return null; + } + + const quadrilaterals = []; + const savedRect = this.data.rect; + + for (const quadPoint of this.data.quadPoints) { + this.data.rect = [quadPoint[2].x, quadPoint[2].y, quadPoint[1].x, quadPoint[1].y]; + quadrilaterals.push(this._createContainer(ignoreBorder)); + } + + this.data.rect = savedRect; + return quadrilaterals; + } + + _createPopup(trigger, data) { + let container = this.container; + + if (this.quadrilaterals) { + trigger = trigger || this.quadrilaterals; + container = this.quadrilaterals[0]; + } + if (!trigger) { trigger = document.createElement("div"); trigger.style.height = container.style.height; @@ -9460,6 +9775,13 @@ class AnnotationElement { container.appendChild(popup); } + _renderQuadrilaterals(className) { + this.quadrilaterals.forEach(quadrilateral => { + quadrilateral.className = className; + }); + return this.quadrilaterals; + } + render() { (0, _util.unreachable)("Abstract method `AnnotationElement.render` called"); } @@ -9468,12 +9790,14 @@ class AnnotationElement { class LinkAnnotationElement extends AnnotationElement { constructor(parameters) { - const isRenderable = !!(parameters.data.url || parameters.data.dest || parameters.data.action); - super(parameters, isRenderable); + const isRenderable = !!(parameters.data.url || parameters.data.dest || parameters.data.action || parameters.data.isTooltipOnly || parameters.data.actions && (parameters.data.actions.Action || parameters.data.actions["Mouse Up"] || parameters.data.actions["Mouse Down"])); + super(parameters, { + isRenderable, + createQuadrilaterals: true + }); } render() { - this.container.className = "linkAnnotation"; const { data, linkService @@ -9489,10 +9813,23 @@ class LinkAnnotationElement extends AnnotationElement { }); } else if (data.action) { this._bindNamedAction(link, data.action); - } else { + } else if (data.dest) { this._bindLink(link, data.dest); + } else if (data.actions && (data.actions.Action || data.actions["Mouse Up"] || data.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions) { + this._bindJSAction(link, data); + } else { + this._bindLink(link, ""); + } + + if (this.quadrilaterals) { + return this._renderQuadrilaterals("linkAnnotation").map((quadrilateral, index) => { + const linkElement = index === 0 ? link : link.cloneNode(); + quadrilateral.appendChild(linkElement); + return quadrilateral; + }); } + this.container.className = "linkAnnotation"; this.container.appendChild(link); return this.container; } @@ -9502,13 +9839,13 @@ class LinkAnnotationElement extends AnnotationElement { link.onclick = () => { if (destination) { - this.linkService.navigateTo(destination); + this.linkService.goToDestination(destination); } return false; }; - if (destination) { + if (destination || destination === "") { link.className = "internalLink"; } } @@ -9524,12 +9861,40 @@ class LinkAnnotationElement extends AnnotationElement { link.className = "internalLink"; } + _bindJSAction(link, data) { + link.href = this.linkService.getAnchorUrl(""); + const map = new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]); + + for (const name of Object.keys(data.actions)) { + const jsName = map.get(name); + + if (!jsName) { + continue; + } + + link[jsName] = () => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: data.id, + name + } + }); + return false; + }; + } + + link.className = "internalLink"; + } + } class TextAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); - super(parameters, isRenderable); + super(parameters, { + isRenderable + }); } render() { @@ -9545,7 +9910,7 @@ class TextAnnotationElement extends AnnotationElement { }); if (!this.data.hasPopup) { - this._createPopup(this.container, image, this.data); + this._createPopup(image, this.data); } this.container.appendChild(image); @@ -9556,26 +9921,79 @@ class TextAnnotationElement extends AnnotationElement { class WidgetAnnotationElement extends AnnotationElement { render() { + if (this.data.alternativeText) { + this.container.title = this.data.alternativeText; + } + return this.container; } + _getKeyModifier(event) { + return navigator.platform.includes("Win") && event.ctrlKey || navigator.platform.includes("Mac") && event.metaKey; + } + + _setEventListener(element, baseName, eventName, valueGetter) { + if (baseName.includes("mouse")) { + element.addEventListener(baseName, event => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event), + shift: event.shiftKey, + modifier: this._getKeyModifier(event) + } + }); + }); + } else { + element.addEventListener(baseName, event => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: event.target.checked + } + }); + }); + } + } + + _setEventListeners(element, names, getter) { + for (const [baseName, eventName] of names) { + if (eventName === "Action" || this.data.actions?.[eventName]) { + this._setEventListener(element, baseName, eventName, getter); + } + } + } + } class TextWidgetAnnotationElement extends WidgetAnnotationElement { constructor(parameters) { const isRenderable = parameters.renderInteractiveForms || !parameters.data.hasAppearance && !!parameters.data.fieldValue; - super(parameters, isRenderable); + super(parameters, { + isRenderable + }); } render() { - const TEXT_ALIGNMENT = ["left", "center", "right"]; const storage = this.annotationStorage; const id = this.data.id; this.container.className = "textWidgetAnnotation"; let element = null; if (this.renderInteractiveForms) { - const textContent = storage.getOrCreateValue(id, this.data.fieldValue); + const textContent = storage.getOrCreateValue(id, { + value: this.data.fieldValue + }).value; + const elementData = { + userValue: null, + formattedValue: null, + beforeInputSelectionRange: null, + beforeInputValue: null + }; if (this.data.multiLine) { element = document.createElement("textarea"); @@ -9586,9 +10004,192 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement { element.setAttribute("value", textContent); } + elementData.userValue = textContent; + element.setAttribute("id", id); element.addEventListener("input", function (event) { - storage.setValue(id, event.target.value); + storage.setValue(id, { + value: event.target.value + }); }); + + let blurListener = event => { + if (elementData.formattedValue) { + event.target.value = elementData.formattedValue; + } + + event.target.setSelectionRange(0, 0); + elementData.beforeInputSelectionRange = null; + }; + + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("focus", event => { + if (elementData.userValue) { + event.target.value = elementData.userValue; + } + }); + element.addEventListener("updatefromsandbox", function (event) { + const { + detail + } = event; + const actions = { + value() { + elementData.userValue = detail.value || ""; + storage.setValue(id, { + value: elementData.userValue.toString() + }); + + if (!elementData.formattedValue) { + event.target.value = elementData.userValue; + } + }, + + valueAsString() { + elementData.formattedValue = detail.valueAsString || ""; + + if (event.target !== document.activeElement) { + event.target.value = elementData.formattedValue; + } + + storage.setValue(id, { + formattedValue: elementData.formattedValue + }); + }, + + focus() { + setTimeout(() => event.target.focus({ + preventScroll: false + }), 0); + }, + + userName() { + event.target.title = detail.userName; + }, + + hidden() { + event.target.style.visibility = detail.hidden ? "hidden" : "visible"; + storage.setValue(id, { + hidden: detail.hidden + }); + }, + + editable() { + event.target.disabled = !detail.editable; + }, + + selRange() { + const [selStart, selEnd] = detail.selRange; + + if (selStart >= 0 && selEnd < event.target.value.length) { + event.target.setSelectionRange(selStart, selEnd); + } + }, + + strokeColor() { + const color = detail.strokeColor; + event.target.style.color = _scripting_utils.ColorConverters[`${color[0]}_HTML`](color.slice(1)); + } + + }; + Object.keys(detail).filter(name => name in actions).forEach(name => actions[name]()); + }); + + if (this.data.actions) { + element.addEventListener("keydown", event => { + elementData.beforeInputValue = event.target.value; + let commitKey = -1; + + if (event.key === "Escape") { + commitKey = 0; + } else if (event.key === "Enter") { + commitKey = 2; + } else if (event.key === "Tab") { + commitKey = 3; + } + + if (commitKey === -1) { + return; + } + + elementData.userValue = event.target.value; + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value: event.target.value, + willCommit: true, + commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + }); + const _blurListener = blurListener; + blurListener = null; + element.addEventListener("blur", event => { + if (this._mouseState.isDown) { + elementData.userValue = event.target.value; + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value: event.target.value, + willCommit: true, + commitKey: 1, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + } + + _blurListener(event); + }); + element.addEventListener("mousedown", event => { + elementData.beforeInputValue = event.target.value; + elementData.beforeInputSelectionRange = null; + }); + element.addEventListener("keyup", event => { + if (event.target.selectionStart === event.target.selectionEnd) { + elementData.beforeInputSelectionRange = null; + } + }); + element.addEventListener("select", event => { + elementData.beforeInputSelectionRange = [event.target.selectionStart, event.target.selectionEnd]; + }); + + if ("Keystroke" in this.data.actions) { + element.addEventListener("input", event => { + let selStart = -1; + let selEnd = -1; + + if (elementData.beforeInputSelectionRange) { + [selStart, selEnd] = elementData.beforeInputSelectionRange; + } + + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value: elementData.beforeInputValue, + change: event.data, + willCommit: false, + selStart, + selEnd + } + }); + }); + } + + this._setEventListeners(element, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.value); + } + } + + if (blurListener) { + element.addEventListener("blur", blurListener); + } + element.disabled = this.data.readOnly; element.name = this.data.fieldName; @@ -9607,59 +10208,49 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement { element.textContent = this.data.fieldValue; element.style.verticalAlign = "middle"; element.style.display = "table-cell"; - let font = null; - - if (this.data.fontRefName && this.page.commonObjs.has(this.data.fontRefName)) { - font = this.page.commonObjs.get(this.data.fontRefName); - } - - this._setTextStyle(element, font); } - if (this.data.textAlignment !== null) { - element.style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; - } + this._setTextStyle(element); this.container.appendChild(element); return this.container; } - _setTextStyle(element, font) { + _setTextStyle(element) { + const TEXT_ALIGNMENT = ["left", "center", "right"]; + const { + fontSize, + fontColor + } = this.data.defaultAppearanceData; const style = element.style; - style.fontSize = `${this.data.fontSize}px`; - style.direction = this.data.fontDirection < 0 ? "rtl" : "ltr"; - if (!font) { - return; + if (fontSize) { + style.fontSize = `${fontSize}px`; } - let bold = "normal"; + style.color = _util.Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]); - if (font.black) { - bold = "900"; - } else if (font.bold) { - bold = "bold"; + if (this.data.textAlignment !== null) { + style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; } - - style.fontWeight = bold; - style.fontStyle = font.italic ? "italic" : "normal"; - const fontFamily = font.loadedName ? `"${font.loadedName}", ` : ""; - const fallbackName = font.fallbackName || "Helvetica, sans-serif"; - style.fontFamily = fontFamily + fallbackName; } } class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement { constructor(parameters) { - super(parameters, parameters.renderInteractiveForms); + super(parameters, { + isRenderable: parameters.renderInteractiveForms + }); } render() { const storage = this.annotationStorage; const data = this.data; const id = data.id; - const value = storage.getOrCreateValue(id, data.fieldValue && data.fieldValue !== "Off"); + const value = storage.getOrCreateValue(id, { + value: data.fieldValue && data.fieldValue !== "Off" + }).value; this.container.className = "buttonWidgetAnnotation checkBox"; const element = document.createElement("input"); element.disabled = data.readOnly; @@ -9670,9 +10261,61 @@ class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement { element.setAttribute("checked", true); } + element.setAttribute("id", id); element.addEventListener("change", function (event) { - storage.setValue(id, event.target.checked); + const name = event.target.name; + + for (const checkbox of document.getElementsByName(name)) { + if (checkbox !== event.target) { + checkbox.checked = false; + storage.setValue(checkbox.parentNode.getAttribute("data-annotation-id"), { + value: false + }); + } + } + + storage.setValue(id, { + value: event.target.checked + }); }); + + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("updatefromsandbox", event => { + const { + detail + } = event; + const actions = { + value() { + event.target.checked = detail.value !== "Off"; + storage.setValue(id, { + value: event.target.checked + }); + }, + + focus() { + setTimeout(() => event.target.focus({ + preventScroll: false + }), 0); + }, + + hidden() { + event.target.style.visibility = detail.hidden ? "hidden" : "visible"; + storage.setValue(id, { + hidden: detail.hidden + }); + }, + + editable() { + event.target.disabled = !detail.editable; + } + + }; + Object.keys(detail).filter(name => name in actions).forEach(name => actions[name]()); + }); + + this._setEventListeners(element, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this.container.appendChild(element); return this.container; } @@ -9681,7 +10324,9 @@ class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement { class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement { constructor(parameters) { - super(parameters, parameters.renderInteractiveForms); + super(parameters, { + isRenderable: parameters.renderInteractiveForms + }); } render() { @@ -9689,7 +10334,9 @@ class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement { const storage = this.annotationStorage; const data = this.data; const id = data.id; - const value = storage.getOrCreateValue(id, data.fieldValue === data.buttonValue); + const value = storage.getOrCreateValue(id, { + value: data.fieldValue === data.buttonValue + }).value; const element = document.createElement("input"); element.disabled = data.readOnly; element.type = "radio"; @@ -9699,17 +10346,75 @@ class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement { element.setAttribute("checked", true); } + element.setAttribute("pdfButtonValue", data.buttonValue); + element.setAttribute("id", id); element.addEventListener("change", function (event) { - const name = event.target.name; + const { + target + } = event; - for (const radio of document.getElementsByName(name)) { - if (radio !== event.target) { - storage.setValue(radio.parentNode.getAttribute("data-annotation-id"), false); + for (const radio of document.getElementsByName(target.name)) { + if (radio !== target) { + storage.setValue(radio.getAttribute("id"), { + value: false + }); } } - storage.setValue(id, event.target.checked); + storage.setValue(id, { + value: target.checked + }); }); + + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("updatefromsandbox", event => { + const { + detail + } = event; + const actions = { + value() { + const fieldValue = detail.value; + + for (const radio of document.getElementsByName(event.target.name)) { + const radioId = radio.getAttribute("id"); + + if (fieldValue === radio.getAttribute("pdfButtonValue")) { + radio.setAttribute("checked", true); + storage.setValue(radioId, { + value: true + }); + } else { + storage.setValue(radioId, { + value: false + }); + } + } + }, + + focus() { + setTimeout(() => event.target.focus({ + preventScroll: false + }), 0); + }, + + hidden() { + event.target.style.visibility = detail.hidden ? "hidden" : "visible"; + storage.setValue(id, { + hidden: detail.hidden + }); + }, + + editable() { + event.target.disabled = !detail.editable; + } + + }; + Object.keys(detail).filter(name => name in actions).forEach(name => actions[name]()); + }); + + this._setEventListeners(element, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this.container.appendChild(element); return this.container; } @@ -9720,6 +10425,11 @@ class PushButtonWidgetAnnotationElement extends LinkAnnotationElement { render() { const container = super.render(); container.className = "buttonWidgetAnnotation pushButton"; + + if (this.data.alternativeText) { + container.title = this.data.alternativeText; + } + return container; } @@ -9727,17 +10437,22 @@ class PushButtonWidgetAnnotationElement extends LinkAnnotationElement { class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { constructor(parameters) { - super(parameters, parameters.renderInteractiveForms); + super(parameters, { + isRenderable: parameters.renderInteractiveForms + }); } render() { this.container.className = "choiceWidgetAnnotation"; const storage = this.annotationStorage; const id = this.data.id; - storage.getOrCreateValue(id, this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null); + storage.getOrCreateValue(id, { + value: this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : undefined + }); const selectElement = document.createElement("select"); selectElement.disabled = this.data.readOnly; selectElement.name = this.data.fieldName; + selectElement.setAttribute("id", id); if (!this.data.combo) { selectElement.size = this.data.options.length; @@ -9759,11 +10474,77 @@ class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { selectElement.appendChild(optionElement); } - selectElement.addEventListener("input", function (event) { + function getValue(event) { const options = event.target.options; - const value = options[options.selectedIndex].value; - storage.setValue(id, value); - }); + return options[options.selectedIndex].value; + } + + if (this.enableScripting && this.hasJSActions) { + selectElement.addEventListener("updatefromsandbox", event => { + const { + detail + } = event; + const actions = { + value() { + const options = event.target.options; + const value = detail.value; + const i = options.indexOf(value); + + if (i !== -1) { + options.selectedIndex = i; + storage.setValue(id, { + value + }); + } + }, + + focus() { + setTimeout(() => event.target.focus({ + preventScroll: false + }), 0); + }, + + hidden() { + event.target.style.visibility = detail.hidden ? "hidden" : "visible"; + storage.setValue(id, { + hidden: detail.hidden + }); + }, + + editable() { + event.target.disabled = !detail.editable; + } + + }; + Object.keys(detail).filter(name => name in actions).forEach(name => actions[name]()); + }); + selectElement.addEventListener("input", event => { + const value = getValue(event); + storage.setValue(id, { + value + }); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + changeEx: value, + willCommit: true, + commitKey: 1, + keyDown: false + } + }); + }); + + this._setEventListeners(selectElement, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } else { + selectElement.addEventListener("input", function (event) { + storage.setValue(id, { + value: getValue(event) + }); + }); + } + this.container.appendChild(selectElement); return this.container; } @@ -9773,7 +10554,9 @@ class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { class PopupAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.title || parameters.data.contents); - super(parameters, isRenderable); + super(parameters, { + isRenderable + }); } render() { @@ -9785,24 +10568,29 @@ class PopupAnnotationElement extends AnnotationElement { } const selector = `[data-annotation-id="${this.data.parentId}"]`; - const parentElement = this.layer.querySelector(selector); + const parentElements = this.layer.querySelectorAll(selector); - if (!parentElement) { + if (parentElements.length === 0) { return this.container; } const popup = new PopupElement({ container: this.container, - trigger: parentElement, + trigger: Array.from(parentElements), color: this.data.color, title: this.data.title, modificationDate: this.data.modificationDate, contents: this.data.contents }); - const parentLeft = parseFloat(parentElement.style.left); - const parentWidth = parseFloat(parentElement.style.width); - this.container.style.transformOrigin = `-${parentLeft + parentWidth}px -${parentElement.style.top}`; - this.container.style.left = `${parentLeft + parentWidth}px`; + const page = this.page; + + const rect = _util.Util.normalizeRect([this.data.parentRect[0], page.view[3] - this.data.parentRect[1] + page.view[1], this.data.parentRect[2], page.view[3] - this.data.parentRect[3] + page.view[1]]); + + const popupLeft = rect[0] + this.data.parentRect[2] - this.data.parentRect[0]; + const popupTop = rect[1]; + this.container.style.transformOrigin = `${-popupLeft}px ${-popupTop}px`; + this.container.style.left = `${popupLeft}px`; + this.container.style.top = `${popupTop}px`; this.container.appendChild(popup.render()); return this.container; } @@ -9835,7 +10623,7 @@ class PopupElement { const r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0]; const g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1]; const b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2]; - popup.style.backgroundColor = _util.Util.makeCssRgb(r | 0, g | 0, b | 0); + popup.style.backgroundColor = _util.Util.makeHexColor(r | 0, g | 0, b | 0); } const title = document.createElement("h1"); @@ -9858,9 +10646,16 @@ class PopupElement { const contents = this._formatContents(this.contents); popup.appendChild(contents); - this.trigger.addEventListener("click", this._toggle.bind(this)); - this.trigger.addEventListener("mouseover", this._show.bind(this, false)); - this.trigger.addEventListener("mouseout", this._hide.bind(this, false)); + + if (!Array.isArray(this.trigger)) { + this.trigger = [this.trigger]; + } + + this.trigger.forEach(element => { + element.addEventListener("click", this._toggle.bind(this)); + element.addEventListener("mouseover", this._show.bind(this, false)); + element.addEventListener("mouseout", this._hide.bind(this, false)); + }); popup.addEventListener("click", this._hide.bind(this, true)); wrapper.appendChild(popup); return wrapper; @@ -9917,14 +10712,17 @@ class PopupElement { class FreeTextAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); - super(parameters, isRenderable, true); + super(parameters, { + isRenderable, + ignoreBorder: true + }); } render() { this.container.className = "freeTextAnnotation"; if (!this.data.hasPopup) { - this._createPopup(this.container, null, this.data); + this._createPopup(null, this.data); } return this.container; @@ -9935,7 +10733,10 @@ class FreeTextAnnotationElement extends AnnotationElement { class LineAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); - super(parameters, isRenderable, true); + super(parameters, { + isRenderable, + ignoreBorder: true + }); } render() { @@ -9954,7 +10755,7 @@ class LineAnnotationElement extends AnnotationElement { svg.appendChild(line); this.container.append(svg); - this._createPopup(this.container, line, data); + this._createPopup(line, data); return this.container; } @@ -9964,7 +10765,10 @@ class LineAnnotationElement extends AnnotationElement { class SquareAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); - super(parameters, isRenderable, true); + super(parameters, { + isRenderable, + ignoreBorder: true + }); } render() { @@ -9985,7 +10789,7 @@ class SquareAnnotationElement extends AnnotationElement { svg.appendChild(square); this.container.append(svg); - this._createPopup(this.container, square, data); + this._createPopup(square, data); return this.container; } @@ -9995,7 +10799,10 @@ class SquareAnnotationElement extends AnnotationElement { class CircleAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); - super(parameters, isRenderable, true); + super(parameters, { + isRenderable, + ignoreBorder: true + }); } render() { @@ -10016,7 +10823,7 @@ class CircleAnnotationElement extends AnnotationElement { svg.appendChild(circle); this.container.append(svg); - this._createPopup(this.container, circle, data); + this._createPopup(circle, data); return this.container; } @@ -10026,7 +10833,10 @@ class CircleAnnotationElement extends AnnotationElement { class PolylineAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); - super(parameters, isRenderable, true); + super(parameters, { + isRenderable, + ignoreBorder: true + }); this.containerClassName = "polylineAnnotation"; this.svgElementName = "svg:polyline"; } @@ -10054,7 +10864,7 @@ class PolylineAnnotationElement extends AnnotationElement { svg.appendChild(polyline); this.container.append(svg); - this._createPopup(this.container, polyline, data); + this._createPopup(polyline, data); return this.container; } @@ -10073,14 +10883,17 @@ class PolygonAnnotationElement extends PolylineAnnotationElement { class CaretAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); - super(parameters, isRenderable, true); + super(parameters, { + isRenderable, + ignoreBorder: true + }); } render() { this.container.className = "caretAnnotation"; if (!this.data.hasPopup) { - this._createPopup(this.container, null, this.data); + this._createPopup(null, this.data); } return this.container; @@ -10091,7 +10904,10 @@ class CaretAnnotationElement extends AnnotationElement { class InkAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); - super(parameters, isRenderable, true); + super(parameters, { + isRenderable, + ignoreBorder: true + }); this.containerClassName = "inkAnnotation"; this.svgElementName = "svg:polyline"; } @@ -10119,7 +10935,7 @@ class InkAnnotationElement extends AnnotationElement { polyline.setAttribute("stroke", "transparent"); polyline.setAttribute("fill", "none"); - this._createPopup(this.container, polyline, data); + this._createPopup(polyline, data); svg.appendChild(polyline); } @@ -10133,16 +10949,23 @@ class InkAnnotationElement extends AnnotationElement { class HighlightAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); - super(parameters, isRenderable, true); + super(parameters, { + isRenderable, + ignoreBorder: true, + createQuadrilaterals: true + }); } render() { - this.container.className = "highlightAnnotation"; - if (!this.data.hasPopup) { - this._createPopup(this.container, null, this.data); + this._createPopup(null, this.data); } + if (this.quadrilaterals) { + return this._renderQuadrilaterals("highlightAnnotation"); + } + + this.container.className = "highlightAnnotation"; return this.container; } @@ -10151,16 +10974,23 @@ class HighlightAnnotationElement extends AnnotationElement { class UnderlineAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); - super(parameters, isRenderable, true); + super(parameters, { + isRenderable, + ignoreBorder: true, + createQuadrilaterals: true + }); } render() { - this.container.className = "underlineAnnotation"; - if (!this.data.hasPopup) { - this._createPopup(this.container, null, this.data); + this._createPopup(null, this.data); + } + + if (this.quadrilaterals) { + return this._renderQuadrilaterals("underlineAnnotation"); } + this.container.className = "underlineAnnotation"; return this.container; } @@ -10169,16 +10999,23 @@ class UnderlineAnnotationElement extends AnnotationElement { class SquigglyAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); - super(parameters, isRenderable, true); + super(parameters, { + isRenderable, + ignoreBorder: true, + createQuadrilaterals: true + }); } render() { - this.container.className = "squigglyAnnotation"; - if (!this.data.hasPopup) { - this._createPopup(this.container, null, this.data); + this._createPopup(null, this.data); } + if (this.quadrilaterals) { + return this._renderQuadrilaterals("squigglyAnnotation"); + } + + this.container.className = "squigglyAnnotation"; return this.container; } @@ -10187,16 +11024,23 @@ class SquigglyAnnotationElement extends AnnotationElement { class StrikeOutAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); - super(parameters, isRenderable, true); + super(parameters, { + isRenderable, + ignoreBorder: true, + createQuadrilaterals: true + }); } render() { - this.container.className = "strikeoutAnnotation"; - if (!this.data.hasPopup) { - this._createPopup(this.container, null, this.data); + this._createPopup(null, this.data); + } + + if (this.quadrilaterals) { + return this._renderQuadrilaterals("strikeoutAnnotation"); } + this.container.className = "strikeoutAnnotation"; return this.container; } @@ -10205,14 +11049,17 @@ class StrikeOutAnnotationElement extends AnnotationElement { class StampAnnotationElement extends AnnotationElement { constructor(parameters) { const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); - super(parameters, isRenderable, true); + super(parameters, { + isRenderable, + ignoreBorder: true + }); } render() { this.container.className = "stampAnnotation"; if (!this.data.hasPopup) { - this._createPopup(this.container, null, this.data); + this._createPopup(null, this.data); } return this.container; @@ -10222,22 +11069,21 @@ class StampAnnotationElement extends AnnotationElement { class FileAttachmentAnnotationElement extends AnnotationElement { constructor(parameters) { - super(parameters, true); + super(parameters, { + isRenderable: true + }); const { filename, content } = this.data.file; this.filename = (0, _display_utils.getFilenameFromUrl)(filename); this.content = content; - - if (this.linkService.eventBus) { - this.linkService.eventBus.dispatch("fileattachmentannotation", { - source: this, - id: (0, _util.stringToPDFString)(filename), - filename, - content - }); - } + this.linkService.eventBus?.dispatch("fileattachmentannotation", { + source: this, + id: (0, _util.stringToPDFString)(filename), + filename, + content + }); } render() { @@ -10248,7 +11094,7 @@ class FileAttachmentAnnotationElement extends AnnotationElement { trigger.addEventListener("dblclick", this._download.bind(this)); if (!this.data.hasPopup && (this.data.title || this.data.contents)) { - this._createPopup(this.container, trigger, this.data); + this._createPopup(trigger, this.data); } this.container.appendChild(trigger); @@ -10299,21 +11145,46 @@ class AnnotationLayer { imageResourcesPath: parameters.imageResourcesPath || "", renderInteractiveForms: typeof parameters.renderInteractiveForms === "boolean" ? parameters.renderInteractiveForms : true, svgFactory: new _display_utils.DOMSVGFactory(), - annotationStorage: parameters.annotationStorage || new _annotation_storage.AnnotationStorage() + annotationStorage: parameters.annotationStorage || new _annotation_storage.AnnotationStorage(), + enableScripting: parameters.enableScripting, + hasJSActions: parameters.hasJSActions, + mouseState: parameters.mouseState || { + isDown: false + } }); if (element.isRenderable) { - parameters.div.appendChild(element.render()); + const rendered = element.render(); + + if (data.hidden) { + rendered.style.visibility = "hidden"; + } + + if (Array.isArray(rendered)) { + for (const renderedElement of rendered) { + parameters.div.appendChild(renderedElement); + } + } else { + if (element instanceof PopupAnnotationElement) { + parameters.div.prepend(rendered); + } else { + parameters.div.appendChild(rendered); + } + } } } } static update(parameters) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + for (const data of parameters.annotations) { - const element = parameters.div.querySelector(`[data-annotation-id="${data.id}"]`); + const elements = parameters.div.querySelectorAll(`[data-annotation-id="${data.id}"]`); - if (element) { - element.style.transform = `matrix(${parameters.viewport.transform.join(",")})`; + if (elements) { + elements.forEach(element => { + element.style.transform = transform; + }); } } @@ -10326,29 +11197,96 @@ exports.AnnotationLayer = AnnotationLayer; /***/ }), /* 20 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); +exports.ColorConverters = void 0; + +function makeColorComp(n) { + return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0"); +} + +class ColorConverters { + static CMYK_G([c, y, m, k]) { + return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; + } + + static G_CMYK([g]) { + return ["CMYK", 0, 0, 0, 1 - g]; + } + + static G_RGB([g]) { + return ["RGB", g, g, g]; + } + + static G_HTML([g]) { + const G = makeColorComp(g); + return `#${G}${G}${G}`; + } + + static RGB_G([r, g, b]) { + return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; + } + + static RGB_HTML([r, g, b]) { + const R = makeColorComp(r); + const G = makeColorComp(g); + const B = makeColorComp(b); + return `#${R}${G}${B}`; + } + + static T_HTML() { + return "#00000000"; + } + + static CMYK_RGB([c, y, m, k]) { + return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; + } + + static CMYK_HTML(components) { + return this.RGB_HTML(this.CMYK_RGB(components)); + } + + static RGB_CMYK([r, g, b]) { + const c = 1 - r; + const m = 1 - g; + const y = 1 - b; + const k = Math.min(c, m, y); + return ["CMYK", c, m, y, k]; + } + +} + +exports.ColorConverters = ColorConverters; + +/***/ }), +/* 21 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); exports.renderTextLayer = void 0; var _util = __w_pdfjs_require__(2); -var renderTextLayer = function renderTextLayerClosure() { - var MAX_TEXT_DIVS_TO_RENDER = 100000; - var NonWhitespaceRegexp = /\S/; +const renderTextLayer = function renderTextLayerClosure() { + const MAX_TEXT_DIVS_TO_RENDER = 100000; + const NonWhitespaceRegexp = /\S/; function isAllWhitespace(str) { return !NonWhitespaceRegexp.test(str); } function appendText(task, geom, styles) { - var textDiv = document.createElement("span"); - var textDivProperties = { + const textDiv = document.createElement("span"); + const textDivProperties = { angle: 0, canvasWidth: 0, isWhitespace: false, @@ -10370,17 +11308,17 @@ var renderTextLayer = function renderTextLayerClosure() { return; } - var tx = _util.Util.transform(task._viewport.transform, geom.transform); + const tx = _util.Util.transform(task._viewport.transform, geom.transform); - var angle = Math.atan2(tx[1], tx[0]); - var style = styles[geom.fontName]; + let angle = Math.atan2(tx[1], tx[0]); + const style = styles[geom.fontName]; if (style.vertical) { angle += Math.PI / 2; } - var fontHeight = Math.sqrt(tx[2] * tx[2] + tx[3] * tx[3]); - var fontAscent = fontHeight; + const fontHeight = Math.sqrt(tx[2] * tx[2] + tx[3] * tx[3]); + let fontAscent = fontHeight; if (style.ascent) { fontAscent = style.ascent * fontAscent; @@ -10440,7 +11378,7 @@ var renderTextLayer = function renderTextLayerClosure() { } if (task._enhanceTextSelection) { - var angleCos = 1, + let angleCos = 1, angleSin = 0; if (angle !== 0) { @@ -10448,9 +11386,9 @@ var renderTextLayer = function renderTextLayerClosure() { angleSin = Math.sin(angle); } - var divWidth = (style.vertical ? geom.height : geom.width) * task._viewport.scale; - var divHeight = fontHeight; - var m, b; + const divWidth = (style.vertical ? geom.height : geom.width) * task._viewport.scale; + const divHeight = fontHeight; + let m, b; if (angle !== 0) { m = [angleCos, angleSin, -angleSin, angleCos, left, top]; @@ -10476,9 +11414,9 @@ var renderTextLayer = function renderTextLayerClosure() { return; } - var textDivs = task._textDivs; - var capability = task._capability; - var textDivsLength = textDivs.length; + const textDivs = task._textDivs; + const capability = task._capability; + const textDivsLength = textDivs.length; if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) { task._renderingDone = true; @@ -10487,7 +11425,7 @@ var renderTextLayer = function renderTextLayerClosure() { } if (!task._textContentStream) { - for (var i = 0; i < textDivsLength; i++) { + for (let i = 0; i < textDivsLength; i++) { task._layoutText(textDivs[i]); } } @@ -10511,14 +11449,14 @@ var renderTextLayer = function renderTextLayerClosure() { } function expand(task) { - var bounds = task._bounds; - var viewport = task._viewport; - var expanded = expandBounds(viewport.width, viewport.height, bounds); + const bounds = task._bounds; + const viewport = task._viewport; + const expanded = expandBounds(viewport.width, viewport.height, bounds); - for (var i = 0; i < expanded.length; i++) { - var div = bounds[i].div; + for (let i = 0; i < expanded.length; i++) { + const div = bounds[i].div; - var divProperties = task._textDivProperties.get(div); + const divProperties = task._textDivProperties.get(div); if (divProperties.angle === 0) { divProperties.paddingLeft = bounds[i].left - expanded[i].left; @@ -10531,15 +11469,15 @@ var renderTextLayer = function renderTextLayerClosure() { continue; } - var e = expanded[i], - b = bounds[i]; - var m = b.m, - c = m[0], - s = m[1]; - var points = [[0, 0], [0, b.size[1]], [b.size[0], 0], b.size]; - var ts = new Float64Array(64); + const e = expanded[i], + b = bounds[i]; + const m = b.m, + c = m[0], + s = m[1]; + const points = [[0, 0], [0, b.size[1]], [b.size[0], 0], b.size]; + const ts = new Float64Array(64); points.forEach(function (p, j) { - var t = _util.Util.applyTransform(p, m); + const t = _util.Util.applyTransform(p, m); ts[j + 0] = c && (e.left - t[0]) / c; ts[j + 4] = s && (e.top - t[1]) / s; @@ -10558,7 +11496,7 @@ var renderTextLayer = function renderTextLayerClosure() { ts[j + 56] = s && (e.right - t[0]) / s; ts[j + 60] = c && (e.bottom - t[1]) / -c; }); - var boxScale = 1 + Math.min(Math.abs(c), Math.abs(s)); + const boxScale = 1 + Math.min(Math.abs(c), Math.abs(s)); divProperties.paddingLeft = findPositiveMin(ts, 32, 16) / boxScale; divProperties.paddingTop = findPositiveMin(ts, 48, 16) / boxScale; divProperties.paddingRight = findPositiveMin(ts, 0, 16) / boxScale; @@ -10569,7 +11507,7 @@ var renderTextLayer = function renderTextLayerClosure() { } function expandBounds(width, height, boxes) { - var bounds = boxes.map(function (box, i) { + const bounds = boxes.map(function (box, i) { return { x1: box.left, y1: box.top, @@ -10581,9 +11519,9 @@ var renderTextLayer = function renderTextLayerClosure() { }; }); expandBoundsLTR(width, bounds); - var expanded = new Array(boxes.length); + const expanded = new Array(boxes.length); bounds.forEach(function (b) { - var i = b.index; + const i = b.index; expanded[i] = { left: b.x1New, top: 0, @@ -10592,8 +11530,8 @@ var renderTextLayer = function renderTextLayerClosure() { }; }); boxes.map(function (box, i) { - var e = expanded[i], - b = bounds[i]; + const e = expanded[i], + b = bounds[i]; b.x1 = box.top; b.y1 = width - e.right; b.x2 = box.bottom; @@ -10604,7 +11542,7 @@ var renderTextLayer = function renderTextLayerClosure() { }); expandBoundsLTR(height, bounds); bounds.forEach(function (b) { - var i = b.index; + const i = b.index; expanded[i].top = b.x1New; expanded[i].bottom = b.x2New; }); @@ -10615,7 +11553,7 @@ var renderTextLayer = function renderTextLayerClosure() { bounds.sort(function (a, b) { return a.x1 - b.x1 || a.index - b.index; }); - var fakeBoundary = { + const fakeBoundary = { x1: -Infinity, y1: -Infinity, x2: 0, @@ -10624,33 +11562,33 @@ var renderTextLayer = function renderTextLayerClosure() { x1New: 0, x2New: 0 }; - var horizon = [{ + const horizon = [{ start: -Infinity, end: Infinity, boundary: fakeBoundary }]; bounds.forEach(function (boundary) { - var i = 0; + let i = 0; while (i < horizon.length && horizon[i].end <= boundary.y1) { i++; } - var j = horizon.length - 1; + let j = horizon.length - 1; while (j >= 0 && horizon[j].start >= boundary.y2) { j--; } - var horizonPart, affectedBoundary; - var q, + let horizonPart, affectedBoundary; + let q, k, maxXNew = -Infinity; for (q = i; q <= j; q++) { horizonPart = horizon[q]; affectedBoundary = horizonPart.boundary; - var xNew; + let xNew; if (affectedBoundary.x2 > boundary.x1) { xNew = affectedBoundary.index > boundary.index ? affectedBoundary.x1New : boundary.x1; @@ -10684,13 +11622,13 @@ var renderTextLayer = function renderTextLayerClosure() { } } - var changedHorizon = [], - lastBoundary = null; + const changedHorizon = []; + let lastBoundary = null; for (q = i; q <= j; q++) { horizonPart = horizon[q]; affectedBoundary = horizonPart.boundary; - var useBoundary = affectedBoundary.x2 > boundary.x2 ? affectedBoundary : boundary; + const useBoundary = affectedBoundary.x2 > boundary.x2 ? affectedBoundary : boundary; if (lastBoundary === useBoundary) { changedHorizon[changedHorizon.length - 1].end = horizonPart.end; @@ -10730,7 +11668,7 @@ var renderTextLayer = function renderTextLayerClosure() { continue; } - var used = false; + let used = false; for (k = i - 1; !used && k >= 0 && horizon[k].start >= affectedBoundary.y1; k--) { used = horizon[k].boundary === affectedBoundary; @@ -10752,7 +11690,7 @@ var renderTextLayer = function renderTextLayerClosure() { Array.prototype.splice.apply(horizon, [i, j - i + 1].concat(changedHorizon)); }); horizon.forEach(function (horizonPart) { - var affectedBoundary = horizonPart.boundary; + const affectedBoundary = horizonPart.boundary; if (affectedBoundary.x2New === undefined) { affectedBoundary.x2New = Math.max(width, affectedBoundary.x2); @@ -10777,7 +11715,7 @@ var renderTextLayer = function renderTextLayerClosure() { this._textDivs = textDivs || []; this._textContentItemsStr = textContentItemsStr || []; this._enhanceTextSelection = !!enhanceTextSelection; - this._fontInspectorEnabled = !!(globalThis.FontInspector && globalThis.FontInspector.enabled); + this._fontInspectorEnabled = !!globalThis.FontInspector?.enabled; this._reader = null; this._layoutTextLastFontSize = null; this._layoutTextLastFontFamily = null; @@ -10945,7 +11883,7 @@ var renderTextLayer = function renderTextLayerClosure() { const transformBuf = [], paddingBuf = []; - for (var i = 0, ii = this._textDivs.length; i < ii; i++) { + for (let i = 0, ii = this._textDivs.length; i < ii; i++) { const div = this._textDivs[i]; const divProps = this._textDivProperties.get(div); @@ -11002,7 +11940,7 @@ var renderTextLayer = function renderTextLayerClosure() { }; function renderTextLayer(renderParameters) { - var task = new TextLayerRenderTask({ + const task = new TextLayerRenderTask({ textContent: renderParameters.textContent, textContentStream: renderParameters.textContentStream, container: renderParameters.container, @@ -11023,15 +11961,14 @@ var renderTextLayer = function renderTextLayerClosure() { exports.renderTextLayer = renderTextLayer; /***/ }), -/* 21 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/* 22 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.SVGGraphics = void 0; var _util = __w_pdfjs_require__(2); @@ -11901,7 +12838,7 @@ exports.SVGGraphics = SVGGraphics; this.embeddedFonts[fontObj.loadedName] = fontObj; } - current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix : _util.FONT_IDENTITY_MATRIX; + current.fontMatrix = fontObj.fontMatrix || _util.FONT_IDENTITY_MATRIX; let bold = "normal"; if (fontObj.black) { @@ -11932,7 +12869,7 @@ exports.SVGGraphics = SVGGraphics; endText() { const current = this.current; - if (current.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG && current.txtElement && current.txtElement.hasChildNodes()) { + if (current.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG && current.txtElement?.hasChildNodes()) { current.element = current.txtElement; this.clip("nonzero"); this.endPath(); @@ -11962,7 +12899,7 @@ exports.SVGGraphics = SVGGraphics; } setStrokeRGBColor(r, g, b) { - this.current.strokeColor = _util.Util.makeCssRgb(r, g, b); + this.current.strokeColor = _util.Util.makeHexColor(r, g, b); } setFillAlpha(fillAlpha) { @@ -11970,7 +12907,7 @@ exports.SVGGraphics = SVGGraphics; } setFillRGBColor(r, g, b) { - this.current.fillColor = _util.Util.makeCssRgb(r, g, b); + this.current.fillColor = _util.Util.makeHexColor(r, g, b); this.current.tspan = this.svgFactory.createElement("svg:tspan"); this.current.xcoords = []; this.current.ycoords = []; @@ -12058,7 +12995,7 @@ exports.SVGGraphics = SVGGraphics; this.transformMatrix = matrix; if (paintType === 2) { - const cssColor = _util.Util.makeCssRgb(...color); + const cssColor = _util.Util.makeHexColor(...color); this.current.fillColor = cssColor; this.current.strokeColor = cssColor; @@ -12549,20 +13486,19 @@ exports.SVGGraphics = SVGGraphics; } /***/ }), -/* 22 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/* 23 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.PDFNodeStream = void 0; var _util = __w_pdfjs_require__(2); -var _network_utils = __w_pdfjs_require__(23); +var _network_utils = __w_pdfjs_require__(24); ; @@ -12606,7 +13542,7 @@ class PDFNodeStream { } get _progressiveDataLength() { - return this._fullRequestReader ? this._fullRequestReader._loaded : 0; + return this._fullRequestReader?._loaded ?? 0; } getFullReader() { @@ -13018,15 +13954,14 @@ class PDFNodeStreamFsRangeReader extends BaseRangeReader { } /***/ }), -/* 23 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/* 24 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.createResponseStatusError = createResponseStatusError; exports.extractFilenameFromHeader = extractFilenameFromHeader; exports.validateRangeRequestCapabilities = validateRangeRequestCapabilities; @@ -13034,7 +13969,7 @@ exports.validateResponseStatus = validateResponseStatus; var _util = __w_pdfjs_require__(2); -var _content_disposition = __w_pdfjs_require__(24); +var _content_disposition = __w_pdfjs_require__(25); function validateRangeRequestCapabilities({ getResponseHeader, @@ -13110,15 +14045,14 @@ function validateResponseStatus(status) { } /***/ }), -/* 24 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/* 25 */ +/***/ ((__unused_webpack_module, exports) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.getFilenameFromContentDispositionHeader = getFilenameFromContentDispositionHeader; function getFilenameFromContentDispositionHeader(contentDisposition) { @@ -13298,20 +14232,19 @@ function getFilenameFromContentDispositionHeader(contentDisposition) { } /***/ }), -/* 25 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/* 26 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.PDFNetworkStream = void 0; var _util = __w_pdfjs_require__(2); -var _network_utils = __w_pdfjs_require__(23); +var _network_utils = __w_pdfjs_require__(24); ; const OK_RESPONSE = 200; @@ -13841,20 +14774,19 @@ class PDFNetworkStreamRangeRequestReader { } /***/ }), -/* 26 */ -/***/ (function(module, exports, __w_pdfjs_require__) { +/* 27 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { -"use strict"; -Object.defineProperty(exports, "__esModule", { +Object.defineProperty(exports, "__esModule", ({ value: true -}); +})); exports.PDFFetchStream = void 0; var _util = __w_pdfjs_require__(2); -var _network_utils = __w_pdfjs_require__(23); +var _network_utils = __w_pdfjs_require__(24); ; @@ -13862,7 +14794,7 @@ function createFetchOptions(headers, withCredentials, abortController) { return { method: "GET", headers, - signal: abortController && abortController.signal, + signal: abortController?.signal, mode: "cors", credentials: withCredentials ? "include" : "same-origin", redirect: "follow" @@ -13895,7 +14827,7 @@ class PDFFetchStream { } get _progressiveDataLength() { - return this._fullRequestReader ? this._fullRequestReader._loaded : 0; + return this._fullRequestReader?._loaded ?? 0; } getFullReader() { @@ -14080,7 +15012,7 @@ class PDFFetchStreamRangeReader { this._reader = response.body.getReader(); }).catch(reason => { - if (reason && reason.name === "AbortError") { + if (reason?.name === "AbortError") { return; } @@ -14135,6 +15067,37 @@ class PDFFetchStreamRangeReader { } /***/ }) -/******/ ]); +/******/ ]); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __w_pdfjs_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __w_pdfjs_require__(0); +/******/ })() +; }); //# sourceMappingURL=pdf.js.map
\ No newline at end of file |