From 5ad353f238d3befaf2e8f62d033bc0b746a3b5e7 Mon Sep 17 00:00:00 2001 From: Vanessa Date: Tue, 4 Apr 2023 11:18:16 +0800 Subject: [PATCH] :arrow_up: https://github.com/siyuan-note/siyuan/issues/7874 --- app/src/asset/index.ts | 5 + app/src/asset/pdf/app.js | 94 +- app/src/asset/pdf/app_options.js | 2 +- app/src/asset/pdf/l10n_utils.js | 2 +- app/src/asset/pdf/pdf_find_controller.js | 19 +- app/src/asset/pdf/pdf_link_service.js | 4 +- app/src/asset/pdf/pdf_page_view.js | 32 +- app/src/asset/pdf/pdf_sidebar_resizer.js | 3 +- app/src/asset/pdf/pdf_viewer.js | 116 +- app/src/asset/pdf/pdfjs.js | 2 +- app/src/asset/pdf/secondary_toolbar.js | 11 +- app/src/asset/pdf/toolbar.js | 68 +- app/src/asset/pdf/ui_utils.js | 6 +- app/src/asset/pdf/viewer.js | 3 +- app/stage/protyle/js/pdf/pdf.js | 823 +++++++----- app/stage/protyle/js/pdf/pdf.worker.js | 1493 +++++++++++++++------- 16 files changed, 1677 insertions(+), 1006 deletions(-) diff --git a/app/src/asset/index.ts b/app/src/asset/index.ts index 36d03224f..bf7548cdd 100644 --- a/app/src/asset/index.ts +++ b/app/src/asset/index.ts @@ -440,6 +440,11 @@ export class Asset extends Model { + + + + +
`; diff --git a/app/src/asset/pdf/app.js b/app/src/asset/pdf/app.js index e63c45440..ed5997037 100644 --- a/app/src/asset/pdf/app.js +++ b/app/src/asset/pdf/app.js @@ -688,7 +688,7 @@ class PDFViewerApplication { get loadingBar() { // NOTE const bar = new ProgressBar(this.appConfig.appContainer.querySelector("#loadingBar")) - return shadow(this, 'loadingBar', bar) + return shadow(this, "loadingBar", bar); } get supportedMouseWheelZoomModifierKeys() { @@ -894,7 +894,11 @@ class PDFViewerApplication { } // Set the necessary API parameters, using all the available options. const apiParams = AppOptions.getAll(OptionKind.API); - const params = { ...apiParams, ...args }; + const params = { + canvasMaxAreaInBytes: this.externalServices.canvasMaxAreaInBytes, + ...apiParams, + ...args, + }; if (typeof PDFJSDev === "undefined" || !PDFJSDev.test("PRODUCTION")) { params.docBaseUrl ||= document.URL.split("#")[0]; @@ -930,18 +934,18 @@ class PDFViewerApplication { return undefined; // Ignore errors for previously opened PDF files. } - // NOTE - let key = 'loadingError' + let key = "loadingError"; if (reason instanceof InvalidPDFException) { - key = 'invalidFileError' + key = "invalidFileError"; } else if (reason instanceof MissingPDFException) { - key = 'missingFileError' + key = "missingFileError"; } else if (reason instanceof UnexpectedResponseException) { - key = 'unexpectedResponseError' + key = "unexpectedResponseError"; } + // NOTE this._documentError(window.siyuan.languages[key], {message: reason?.message}) throw reason - }, + } ); } @@ -1114,20 +1118,17 @@ class PDFViewerApplication { this.toolbar?.setPagesCount(pdfDocument.numPages, false); this.secondaryToolbar?.setPagesCount(pdfDocument.numPages); - let baseDocumentUrl; - if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) { - baseDocumentUrl = null; - } else if (PDFJSDev.test("MOZCENTRAL")) { - baseDocumentUrl = this.baseUrl; - } else if (PDFJSDev.test("CHROME")) { - baseDocumentUrl = location.href.split("#")[0]; - } - if (baseDocumentUrl && isDataScheme(baseDocumentUrl)) { + if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("CHROME")) { + const baseUrl = location.href.split("#")[0]; // Ignore "data:"-URLs for performance reasons, even though it may cause // internal links to not work perfectly in all cases (see bug 1803050). - baseDocumentUrl = null; + this.pdfLinkService.setDocument( + pdfDocument, + isDataScheme(baseUrl) ? null : baseUrl + ); + } else { + this.pdfLinkService.setDocument(pdfDocument); } - this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl); this.pdfDocumentProperties?.setDocument(pdfDocument); const pdfViewer = this.pdfViewer; @@ -2121,7 +2122,7 @@ async function loadFakeWorker() { if (typeof PDFJSDev === "undefined" || !PDFJSDev.test("PRODUCTION")) { // NOTE - window.pdfjsWorker = await import(`${Constants.PROTYLE_CDN}/js/pdf/pdf.worker.js?v=3.4.120`) + window.pdfjsWorker = await import(`${Constants.PROTYLE_CDN}/js/pdf/pdf.worker.js?v=3.5.141`) return; } await loadScript(PDFWorker.workerSrc); @@ -2202,23 +2203,19 @@ function webViewerInitialized(pdf) { if (!pdf.supportsDocumentFonts) { AppOptions.set("disableFontFace", true); - // NOTE console.warn('Web fonts are disabled: unable to use embedded PDF fonts.') } if (!pdf.supportsPrinting) { - // NOTE appConfig.toolbar?.print.classList.add("fn__hidden"); appConfig.secondaryToolbar?.printButton.classList.add("fn__hidden"); } if (!pdf.supportsFullscreen) { - // NOTE appConfig.secondaryToolbar?.presentationModeButton.classList.add("fn__hidden"); } if (pdf.supportsIntegratedFind) { - // NOTE appConfig.toolbar?.viewFind.classList.add("fn__hidden"); } @@ -2488,23 +2485,21 @@ function webViewerHashchange(evt) { if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) { // eslint-disable-next-line no-var var webViewerFileInputChange = function (evt) { - // NOTE - // if (PDFViewerApplication.pdfViewer?.isInPresentationMode) { - // return; // Opening a new PDF file isn't supported in Presentation Mode. - // } - // const file = evt.fileInput.files[0]; - // - // PDFViewerApplication.open({ - // url: URL.createObjectURL(file), - // originalUrl: file.name, - // }); + if (PDFViewerApplication.pdfViewer?.isInPresentationMode) { + return; // Opening a new PDF file isn't supported in Presentation Mode. + } + const file = evt.fileInput.files[0]; + + PDFViewerApplication.open({ + url: URL.createObjectURL(file), + originalUrl: file.name, + }); }; // eslint-disable-next-line no-var var webViewerOpenFile = function (evt) { - // NOTE - // const fileInput = PDFViewerApplication.appConfig.openFileInput; - // fileInput.click(); + const fileInput = PDFViewerApplication.appConfig.openFileInput; + fileInput.click(); }; } @@ -2640,12 +2635,12 @@ function webViewerPageNumberChanged(evt) { // Ensure that the page number input displays the correct value, even if the // value entered by the user was invalid (e.g. a floating point number). if ( - evt.value !== pdfViewer.currentPageNumber.toString() && - evt.value !== pdfViewer.currentPageLabel + evt.value !== pdfViewer.currentPageNumber.toString() && + evt.value !== pdfViewer.currentPageLabel ) { pdfInstance.toolbar?.setPageNumber( - pdfViewer.currentPageNumber, - pdfViewer.currentPageLabel + pdfViewer.currentPageNumber, + pdfViewer.currentPageLabel ); } } @@ -3102,7 +3097,7 @@ function webViewerTouchMove(evt) { } } - pdfInstance._centerAtPos( + PDFViewerApplication._centerAtPos( previousScale, (page0X + page1X) / 2, (page0Y + page1Y) / 2 @@ -3132,8 +3127,8 @@ function webViewerClick(evt) { return } - // 点击后证快捷键可正常使用,select 也可正常使用 https://github.com/siyuan-note/siyuan/issues/7869 - if (evt.target.tagName !== "SELECT") { + // 点击后证快捷键可正常使用,select 等也可正常使用 https://github.com/siyuan-note/siyuan/issues/7869 + if (!["SELECT", "TEXTAREA", "INPUT"].includes(evt.target.tagName)) { pdfInstance.pdfViewer.focus(); } @@ -3142,9 +3137,9 @@ function webViewerClick(evt) { } const appConfig = pdfInstance.appConfig; if ( - pdfInstance.pdfViewer.containsElement(evt.target) || - (appConfig.toolbar?.container.contains(evt.target) && - !appConfig.secondaryToolbar.toggleButton.contains(evt.target)) // NOTE + pdfInstance.pdfViewer.containsElement(evt.target) || + (appConfig.toolbar?.container.contains(evt.target) && + !appConfig.secondaryToolbar.toggleButton.contains(evt.target)) // NOTE ) { pdfInstance.secondaryToolbar.close(); } @@ -3160,6 +3155,7 @@ function webViewerKeyUp(evt) { if (evt.key === "Control") { pdfInstance._isCtrlKeyDown = false; } + // 快捷键高亮取消 if (evt.keyCode === 68 && pdfInstance.appConfig.toolbar.rectAnno.classList.contains('toggled')) { pdfInstance.appConfig.toolbar.rectAnno.dispatchEvent( new MouseEvent('click')) @@ -3260,7 +3256,7 @@ function webViewerKeyDown(evt) { isViewerInPresentationMode || pdfInstance.page < pdfInstance.pagesCount ) { - pdfInstance.page = pdfInstance.pagesCount; + PDFViewerApplication.page = PDFViewerApplication.pagesCount; handled = true; ensureViewerFocused = true; } @@ -3519,9 +3515,9 @@ const PDFPrintServiceFactory = { }, }; +// NOTE export { PDFPrintServiceFactory, PDFViewerApplication, - // NOTE webViewerPageNumberChanged, }; diff --git a/app/src/asset/pdf/app_options.js b/app/src/asset/pdf/app_options.js index b899ae4e6..db830a195 100644 --- a/app/src/asset/pdf/app_options.js +++ b/app/src/asset/pdf/app_options.js @@ -279,7 +279,7 @@ const defaultOptions = { workerSrc: { /** @type {string} */ // NOTE - value: `${Constants.PROTYLE_CDN}/js/pdf/pdf.worker.js?v=3.4.120`, + value: `${Constants.PROTYLE_CDN}/js/pdf/pdf.worker.js?v=3.5.141`, kind: OptionKind.WORKER, }, }; diff --git a/app/src/asset/pdf/l10n_utils.js b/app/src/asset/pdf/l10n_utils.js index 258dac7e2..42e2d46de 100644 --- a/app/src/asset/pdf/l10n_utils.js +++ b/app/src/asset/pdf/l10n_utils.js @@ -117,7 +117,7 @@ function formatL10nValue(text, args) { if (!args) { return text; } - return text.replace(/\{\{\s*(\w+)\s*\}\}/g, (all, name) => { + return text.replaceAll(/\{\{\s*(\w+)\s*\}\}/g, (all, name) => { return name in args ? args[name] : "{{" + name + "}}"; }); } diff --git a/app/src/asset/pdf/pdf_find_controller.js b/app/src/asset/pdf/pdf_find_controller.js index b675be9cf..bb069df2e 100644 --- a/app/src/asset/pdf/pdf_find_controller.js +++ b/app/src/asset/pdf/pdf_find_controller.js @@ -289,21 +289,26 @@ function normalize(text) { // "X-\n" is removed because an hyphen at the end of a line // with not a space before is likely here to mark a break // in a word. - // The \n isn't in the original text so here y = i, n = 1 and o = 2. - positions.push([i - shift + 1, 1 + shift]); + // If X is encoded with UTF-32 then it can have a length greater than 1. + // The \n isn't in the original text so here y = i, n = X.len - 2 and + // o = X.len - 1. + const len = p5.length - 2; + positions.push([i - shift + len, 1 + shift]); shift += 1; shiftOrigin += 1; eol += 1; - return p5.charAt(0); + return p5.slice(0, -2); } if (p6) { // An ideographic at the end of a line doesn't imply adding an extra // white space. - positions.push([i - shift + 1, shift]); + // A CJK can be encoded in UTF-32, hence their length isn't always 1. + const len = p6.length - 1; + positions.push([i - shift + len, shift]); shiftOrigin += 1; eol += 1; - return p6.charAt(0); + return p6.slice(0, -1); } if (p7) { @@ -364,7 +369,7 @@ function getOriginalIndex(diffs, pos, len) { * @typedef {Object} PDFFindControllerOptions * @property {IPDFLinkService} linkService - The navigation/linking service. * @property {EventBus} eventBus - The application event bus. - * @property {boolean} updateMatchesCountOnProgress - True if the matches + * @property {boolean} [updateMatchesCountOnProgress] - True if the matches * count must be updated on progress or only when the last page is reached. * The default value is `true`. */ @@ -658,7 +663,7 @@ class PDFFindController { #convertToRegExpString(query, hasDiacritics) { const { matchDiacritics } = this._state; let isUnicode = false; - query = query.replace( + query = query.replaceAll( SPECIAL_CHARS_REG_EXP, ( match, diff --git a/app/src/asset/pdf/pdf_link_service.js b/app/src/asset/pdf/pdf_link_service.js index de8172e6b..f98d3708c 100644 --- a/app/src/asset/pdf/pdf_link_service.js +++ b/app/src/asset/pdf/pdf_link_service.js @@ -336,7 +336,7 @@ class PDFLinkService { * @returns {string} The hyperlink to the PDF object. */ getAnchorUrl(anchor) { - return (this.baseUrl || "") + anchor; + return this.baseUrl ? this.baseUrl + anchor : anchor; } /** @@ -352,7 +352,7 @@ class PDFLinkService { if (params.has("search")) { this.eventBus.dispatch("findfromurlhash", { source: this, - query: params.get("search").replace(/"/g, ""), + query: params.get("search").replaceAll('"', ""), phraseSearch: params.get("phrase") === "true", }); } diff --git a/app/src/asset/pdf/pdf_page_view.js b/app/src/asset/pdf/pdf_page_view.js index 5449c40e0..31f2b18f9 100644 --- a/app/src/asset/pdf/pdf_page_view.js +++ b/app/src/asset/pdf/pdf_page_view.js @@ -606,14 +606,13 @@ class PDFPageView { isScalingRestricted = true; } } - const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000; + const onlyCssZoom = + this.useOnlyCssZoom || (this.hasRestrictedScaling && isScalingRestricted); + const postponeDrawing = + !onlyCssZoom && drawingDelay >= 0 && drawingDelay < 1000; if (this.canvas) { - if ( - postponeDrawing || - this.useOnlyCssZoom || - (this.hasRestrictedScaling && isScalingRestricted) - ) { + if (postponeDrawing || onlyCssZoom) { if ( postponeDrawing && this.renderingState !== RenderingStates.FINISHED @@ -758,10 +757,7 @@ class PDFPageView { scaleX = height / width; scaleY = width / height; } - - if (absRotation !== 0) { - target.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX}, ${scaleY})`; - } + target.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX}, ${scaleY})`; } if (redrawAnnotationLayer && this.annotationLayer) { @@ -1001,8 +997,14 @@ class PDFPageView { // is complete when `!this.renderingQueue`, to prevent black flickering. canvas.hidden = true; let isCanvasHidden = true; - const showCanvas = function () { - if (isCanvasHidden) { + const hasHCM = !!( + this.pageColors?.background && this.pageColors?.foreground + ); + const showCanvas = function (isLastShow) { + // In HCM, a final filter is applied on the canvas which means that + // before it's applied we've normal colors. Consequently, to avoid to have + // a final flash we just display it once all the drawing is done. + if (isCanvasHidden && (!hasHCM || isLastShow)) { canvas.hidden = false; isCanvasHidden = false; } @@ -1063,7 +1065,7 @@ class PDFPageView { }; const renderTask = this.pdfPage.render(renderContext); renderTask.onContinue = function (cont) { - showCanvas(); + showCanvas(false); if (result.onRenderContinue) { result.onRenderContinue(cont); } else { @@ -1073,7 +1075,7 @@ class PDFPageView { renderTask.promise.then( function () { - showCanvas(); + showCanvas(true); renderCapability.resolve(); }, function (error) { @@ -1081,7 +1083,7 @@ class PDFPageView { // a black canvas if rendering was cancelled before the `onContinue`- // callback had been invoked at least once. if (!(error instanceof RenderingCancelledException)) { - showCanvas(); + showCanvas(true); } renderCapability.reject(error); } diff --git a/app/src/asset/pdf/pdf_sidebar_resizer.js b/app/src/asset/pdf/pdf_sidebar_resizer.js index 4f634fb3a..e6675ff83 100644 --- a/app/src/asset/pdf/pdf_sidebar_resizer.js +++ b/app/src/asset/pdf/pdf_sidebar_resizer.js @@ -64,8 +64,7 @@ class PDFSidebarResizer { _updateWidth(width = 0) { // Prevent the sidebar from becoming too narrow, or from occupying more // than half of the available viewer width. - // NOTE - const maxWidth = Math.floor(this.outerContainerWidth / 3 * 2); + const maxWidth = Math.floor(this.outerContainerWidth / 2); if (width > maxWidth) { width = maxWidth; } diff --git a/app/src/asset/pdf/pdf_viewer.js b/app/src/asset/pdf/pdf_viewer.js index 6c248accc..4bcbbc938 100644 --- a/app/src/asset/pdf/pdf_viewer.js +++ b/app/src/asset/pdf/pdf_viewer.js @@ -455,7 +455,7 @@ class PDFViewer { if (!this.pdfDocument) { return; } - this._setScale(val, { noScroll: false }); + this.#setScale(val, { noScroll: false }); } /** @@ -472,7 +472,7 @@ class PDFViewer { if (!this.pdfDocument) { return; } - this._setScale(val, { noScroll: false }); + this.#setScale(val, { noScroll: false }); } /** @@ -509,7 +509,7 @@ class PDFViewer { // Prevent errors in case the rotation changes *before* the scale has been // set to a non-default value. if (this._currentScaleValue) { - this._setScale(this._currentScaleValue, { noScroll: true }); + this.#setScale(this._currentScaleValue, { noScroll: true }); } this.eventBus.dispatch("rotationchanging", { @@ -1079,7 +1079,7 @@ class PDFViewer { ); } - _setScaleUpdatePages( + #setScaleUpdatePages( newScale, newValue, { noScroll = false, preset = false, drawingDelay = -1 } @@ -1151,10 +1151,7 @@ class PDFViewer { } } - /** - * @private - */ - get _pageWidthScaleFactor() { + get #pageWidthScaleFactor() { if ( this._spreadMode !== SpreadMode.NONE && this._scrollMode !== ScrollMode.HORIZONTAL @@ -1164,12 +1161,12 @@ class PDFViewer { return 1; } - _setScale(value, options) { + #setScale(value, options) { let scale = parseFloat(value); if (scale > 0) { options.preset = false; - this._setScaleUpdatePages(scale, value, options); + this.#setScaleUpdatePages(scale, value, options); } else { const currentPage = this._pages[this._currentPageNumber - 1]; if (!currentPage) { @@ -1198,7 +1195,7 @@ class PDFViewer { const pageWidthScale = (((this.container.clientWidth - hPadding) / currentPage.width) * currentPage.scale) / - this._pageWidthScaleFactor; + this.#pageWidthScaleFactor; const pageHeightScale = ((this.container.clientHeight - vPadding) / currentPage.height) * currentPage.scale; @@ -1224,11 +1221,11 @@ class PDFViewer { scale = Math.min(MAX_AUTO_SCALE, horizontalScale); break; default: - console.error(`_setScale: "${value}" is an unknown zoom value.`); + console.error(`#setScale: "${value}" is an unknown zoom value.`); return; } options.preset = true; - this._setScaleUpdatePages(scale, value, options); + this.#setScaleUpdatePages(scale, value, options); } } @@ -1240,7 +1237,7 @@ class PDFViewer { if (this.isInPresentationMode) { // Fixes the case when PDF has different page sizes. - this._setScale(this._currentScaleValue, { noScroll: true }); + this.#setScale(this._currentScaleValue, { noScroll: true }); } this.#scrollIntoView(pageView); } @@ -1795,7 +1792,7 @@ class PDFViewer { // Call this before re-scrolling to the current page, to ensure that any // changes in scale don't move the current page. if (this._currentScaleValue && isNaN(this._currentScaleValue)) { - this._setScale(this._currentScaleValue, { noScroll: true }); + this.#setScale(this._currentScaleValue, { noScroll: true }); } this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true); this.update(); @@ -1867,7 +1864,7 @@ class PDFViewer { // Call this before re-scrolling to the current page, to ensure that any // changes in scale don't move the current page. if (this._currentScaleValue && isNaN(this._currentScaleValue)) { - this._setScale(this._currentScaleValue, { noScroll: true }); + this.#setScale(this._currentScaleValue, { noScroll: true }); } this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true); this.update(); @@ -1972,7 +1969,7 @@ class PDFViewer { /** * Go to the next page, taking scroll/spread-modes into account. - * @returns {boolean} Whether navigation occured. + * @returns {boolean} Whether navigation occurred. */ nextPage() { const currentPageNumber = this._currentPageNumber, @@ -1990,7 +1987,7 @@ class PDFViewer { /** * Go to the previous page, taking scroll/spread-modes into account. - * @returns {boolean} Whether navigation occured. + * @returns {boolean} Whether navigation occurred. */ previousPage() { const currentPageNumber = this._currentPageNumber; @@ -2006,83 +2003,58 @@ class PDFViewer { } /** - * Increase the current zoom level one, or more, times. - * @param {Object|null} [options] + * @typedef {Object} ChangeScaleOptions + * @property {number} [drawingDelay] + * @property {number} [scaleFactor] + * @property {number} [steps] */ - increaseScale(options = null) { - if ( - (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) && - typeof options === "number" - ) { - console.error( - "The `increaseScale` method-signature was updated, please use an object instead." - ); - options = { steps: options }; - } + /** + * Increase the current zoom level one, or more, times. + * @param {ChangeScaleOptions} [options] + */ + increaseScale({ drawingDelay, scaleFactor, steps } = {}) { if (!this.pdfDocument) { return; } - - options ||= Object.create(null); - let newScale = this._currentScale; - if (options.scaleFactor > 1) { - newScale = Math.min( - MAX_SCALE, - Math.round(newScale * options.scaleFactor * 100) / 100 - ); + if (scaleFactor > 1) { + newScale = Math.round(newScale * scaleFactor * 100) / 100; } else { - let steps = options.steps ?? 1; + steps ??= 1; do { - newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2); - newScale = Math.ceil(newScale * 10) / 10; - newScale = Math.min(MAX_SCALE, newScale); + newScale = + Math.ceil((newScale * DEFAULT_SCALE_DELTA).toFixed(2) * 10) / 10; } while (--steps > 0 && newScale < MAX_SCALE); } - - options.noScroll = false; - this._setScale(newScale, options); + this.#setScale(Math.min(MAX_SCALE, newScale), { + noScroll: false, + drawingDelay, + }); } /** * Decrease the current zoom level one, or more, times. - * @param {Object|null} [options] + * @param {ChangeScaleOptions} [options] */ - decreaseScale(options = null) { - if ( - (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) && - typeof options === "number" - ) { - console.error( - "The `decreaseScale` method-signature was updated, please use an object instead." - ); - options = { steps: options }; - } - + decreaseScale({ drawingDelay, scaleFactor, steps } = {}) { if (!this.pdfDocument) { return; } - - options ||= Object.create(null); - let newScale = this._currentScale; - if (options.scaleFactor > 0 && options.scaleFactor < 1) { - newScale = Math.max( - MIN_SCALE, - Math.round(newScale * options.scaleFactor * 100) / 100 - ); + if (scaleFactor > 0 && scaleFactor < 1) { + newScale = Math.round(newScale * scaleFactor * 100) / 100; } else { - let steps = options.steps ?? 1; + steps ??= 1; do { - newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2); - newScale = Math.floor(newScale * 10) / 10; - newScale = Math.max(MIN_SCALE, newScale); + newScale = + Math.floor((newScale / DEFAULT_SCALE_DELTA).toFixed(2) * 10) / 10; } while (--steps > 0 && newScale > MIN_SCALE); } - - options.noScroll = false; - this._setScale(newScale, options); + this.#setScale(Math.max(MIN_SCALE, newScale), { + noScroll: false, + drawingDelay, + }); } #updateContainerHeightCss(height = this.container.clientHeight) { diff --git a/app/src/asset/pdf/pdfjs.js b/app/src/asset/pdf/pdfjs.js index 636b9b2a9..f20f56253 100644 --- a/app/src/asset/pdf/pdfjs.js +++ b/app/src/asset/pdf/pdfjs.js @@ -18,5 +18,5 @@ const {addScriptSync} = require('../../protyle/util/addScript') const {Constants} = require('../../constants') -addScriptSync(`${Constants.PROTYLE_CDN}/js/pdf/pdf.js?v=3.4.120`, 'pdfjsScript') +addScriptSync(`${Constants.PROTYLE_CDN}/js/pdf/pdf.js?v=3.5.141`, 'pdfjsScript') module.exports = window["pdfjs-dist/build/pdf"]; diff --git a/app/src/asset/pdf/secondary_toolbar.js b/app/src/asset/pdf/secondary_toolbar.js index 332952035..68b0ab4de 100644 --- a/app/src/asset/pdf/secondary_toolbar.js +++ b/app/src/asset/pdf/secondary_toolbar.js @@ -59,9 +59,8 @@ class SecondaryToolbar { eventName: "presentationmode", close: true, }, - // NOTE - // { element: options.printButton, eventName: "print", close: true }, - // { element: options.downloadButton, eventName: "download", close: true }, + { element: options.printButton, eventName: "print", close: true }, + { element: options.downloadButton, eventName: "download", close: true }, { element: options.viewBookmarkButton, eventName: null, close: true }, { element: options.firstPageButton, eventName: "firstpage", close: true }, { element: options.lastPageButton, eventName: "lastpage", close: true }, @@ -205,11 +204,7 @@ class SecondaryToolbar { for (const { element, eventName, close, eventDetails } of this.buttons) { element.addEventListener("click", evt => { if (eventName !== null) { - const details = { source: this }; - for (const property in eventDetails) { - details[property] = eventDetails[property]; - } - this.eventBus.dispatch(eventName, details); + this.eventBus.dispatch(eventName, { source: this, ...eventDetails }); } if (close) { this.close(); diff --git a/app/src/asset/pdf/toolbar.js b/app/src/asset/pdf/toolbar.js index 1e26185ce..2e112552c 100644 --- a/app/src/asset/pdf/toolbar.js +++ b/app/src/asset/pdf/toolbar.js @@ -63,38 +63,36 @@ class Toolbar { { element: options.next, eventName: "nextpage" }, { element: options.zoomIn, eventName: "zoomin" }, { element: options.zoomOut, eventName: "zoomout" }, - // NOTE - // { element: options.print, eventName: "print" }, - // { element: options.download, eventName: "download" }, - // { - // element: options.editorFreeTextButton, - // eventName: "switchannotationeditormode", - // eventDetails: { - // get mode() { - // const { classList } = options.editorFreeTextButton; - // return classList.contains("toggled") - // ? AnnotationEditorType.NONE - // : AnnotationEditorType.FREETEXT; - // }, - // }, - // }, - // { - // element: options.editorInkButton, - // eventName: "switchannotationeditormode", - // eventDetails: { - // get mode() { - // const { classList } = options.editorInkButton; - // return classList.contains("toggled") - // ? AnnotationEditorType.NONE - // : AnnotationEditorType.INK; - // }, - // }, - // }, + { element: options.print, eventName: "print" }, + { element: options.download, eventName: "download" }, + { + element: options.editorFreeTextButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { classList } = options.editorFreeTextButton; + return classList.contains("toggled") + ? AnnotationEditorType.NONE + : AnnotationEditorType.FREETEXT; + }, + }, + }, + { + element: options.editorInkButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { classList } = options.editorInkButton; + return classList.contains("toggled") + ? AnnotationEditorType.NONE + : AnnotationEditorType.INK; + }, + }, + }, ]; - // NOTE - // if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) { - // this.buttons.push({ element: options.openFile, eventName: "openfile" }); - // } + if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) { + this.buttons.push({ element: options.openFile, eventName: "openfile" }); + } this.items = { numPages: options.numPages, pageNumber: options.pageNumber, @@ -152,13 +150,7 @@ class Toolbar { for (const { element, eventName, eventDetails } of this.buttons) { element.addEventListener("click", evt => { if (eventName !== null) { - const details = { source: this }; - if (eventDetails) { - for (const property in eventDetails) { - details[property] = eventDetails[property]; - } - } - this.eventBus.dispatch(eventName, details); + this.eventBus.dispatch(eventName, { source: this, ...eventDetails }); } }); } diff --git a/app/src/asset/pdf/ui_utils.js b/app/src/asset/pdf/ui_utils.js index 67e4ec83b..d2c18e7f8 100644 --- a/app/src/asset/pdf/ui_utils.js +++ b/app/src/asset/pdf/ui_utils.js @@ -211,7 +211,6 @@ function parseQueryString(query) { return params; } -const NullCharactersRegExp = /\x00/g; const InvisibleCharactersRegExp = /[\x01-\x1F]/g; /** @@ -224,9 +223,9 @@ function removeNullCharacters(str, replaceInvisible = false) { return str; } if (replaceInvisible) { - str = str.replace(InvisibleCharactersRegExp, " "); + str = str.replaceAll(InvisibleCharactersRegExp, " "); } - return str.replace(NullCharactersRegExp, ""); + return str.replaceAll("\x00", ""); } /** @@ -706,7 +705,6 @@ class ProgressBar { #visible = true; - // NOTE constructor(bar) { this.#classList = bar.classList; this.#style = bar.style; diff --git a/app/src/asset/pdf/viewer.js b/app/src/asset/pdf/viewer.js index 247db0143..521c4ffe6 100644 --- a/app/src/asset/pdf/viewer.js +++ b/app/src/asset/pdf/viewer.js @@ -14,7 +14,6 @@ */ import { RenderingStates, ScrollMode, SpreadMode } from "./ui_utils.js"; -import { AppOptions } from "./app_options.js"; import { LinkTarget } from "./pdf_link_service.js"; import { PDFViewerApplication } from "./app.js"; import { initAnno } from "../anno"; @@ -169,7 +168,7 @@ function getViewerConfiguration(element) { ? element.querySelector("#fileInput") : null, debuggerScriptPath: "./debugger.js", - } + }; } // NOTE diff --git a/app/stage/protyle/js/pdf/pdf.js b/app/stage/protyle/js/pdf/pdf.js index 212325e07..19fba37e9 100644 --- a/app/stage/protyle/js/pdf/pdf.js +++ b/app/stage/protyle/js/pdf/pdf.js @@ -42,7 +42,7 @@ return /******/ (() => { // webpackBootstrap Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.VerbosityLevel = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.UNSUPPORTED_FEATURES = exports.TextRenderingMode = exports.RenderingIntentFlag = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.PageActionEventType = exports.OPS = exports.MissingPDFException = exports.LINE_FACTOR = exports.LINE_DESCENT_FACTOR = exports.InvalidPDFException = exports.ImageKind = exports.IDENTITY_MATRIX = exports.FormatError = exports.FeatureTest = exports.FONT_IDENTITY_MATRIX = exports.DocumentActionEventType = exports.CMapCompressionType = exports.BaseException = exports.BASELINE_FACTOR = exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = exports.AnnotationMode = exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationEditorType = exports.AnnotationEditorPrefix = exports.AnnotationEditorParamsType = exports.AnnotationBorderStyleType = exports.AnnotationActionEventType = exports.AbortException = void 0; +exports.VerbosityLevel = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.RenderingIntentFlag = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.PageActionEventType = exports.OPS = exports.MissingPDFException = exports.MAX_IMAGE_SIZE_TO_CACHE = exports.LINE_FACTOR = exports.LINE_DESCENT_FACTOR = exports.InvalidPDFException = exports.ImageKind = exports.IDENTITY_MATRIX = exports.FormatError = exports.FeatureTest = exports.FONT_IDENTITY_MATRIX = exports.DocumentActionEventType = exports.CMapCompressionType = exports.BaseException = exports.BASELINE_FACTOR = exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = exports.AnnotationMode = exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationEditorType = exports.AnnotationEditorPrefix = exports.AnnotationEditorParamsType = exports.AnnotationBorderStyleType = exports.AnnotationActionEventType = exports.AbortException = void 0; exports.assert = assert; exports.bytesToString = bytesToString; exports.createPromiseCapability = createPromiseCapability; @@ -68,6 +68,8 @@ const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; exports.IDENTITY_MATRIX = IDENTITY_MATRIX; const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX; +const MAX_IMAGE_SIZE_TO_CACHE = 10e6; +exports.MAX_IMAGE_SIZE_TO_CACHE = MAX_IMAGE_SIZE_TO_CACHE; const LINE_FACTOR = 1.35; exports.LINE_FACTOR = LINE_FACTOR; const LINE_DESCENT_FACTOR = 0.35; @@ -367,29 +369,6 @@ const OPS = { constructPath: 91 }; exports.OPS = OPS; -const UNSUPPORTED_FEATURES = { - forms: "forms", - javaScript: "javaScript", - signatures: "signatures", - smask: "smask", - shadingPattern: "shadingPattern", - errorTilingPattern: "errorTilingPattern", - errorExtGState: "errorExtGState", - errorXObject: "errorXObject", - errorFontLoadType3: "errorFontLoadType3", - errorFontState: "errorFontState", - errorFontMissing: "errorFontMissing", - errorFontTranslate: "errorFontTranslate", - errorColorSpace: "errorColorSpace", - errorOperatorList: "errorOperatorList", - errorFontToUnicode: "errorFontToUnicode", - errorFontLoadNative: "errorFontLoadNative", - errorFontBuildPath: "errorFontBuildPath", - errorFontGetPath: "errorFontGetPath", - errorMarkedContent: "errorMarkedContent", - errorContentSubStream: "errorContentSubStream" -}; -exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES; const PasswordResponses = { NEED_PASSWORD: 1, INCORRECT_PASSWORD: 2 @@ -859,7 +838,7 @@ function createPromiseCapability() { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.build = exports.RenderTask = exports.PDFWorkerUtil = exports.PDFWorker = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFDocumentLoadingTask = exports.PDFDataRangeTransport = exports.LoopbackPort = exports.DefaultStandardFontDataFactory = exports.DefaultCanvasFactory = exports.DefaultCMapReaderFactory = void 0; +exports.build = exports.RenderTask = exports.PDFWorkerUtil = exports.PDFWorker = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFDocumentLoadingTask = exports.PDFDataRangeTransport = exports.LoopbackPort = exports.DefaultStandardFontDataFactory = exports.DefaultFilterFactory = exports.DefaultCanvasFactory = exports.DefaultCMapReaderFactory = void 0; exports.getDocument = getDocument; exports.version = void 0; var _util = __w_pdfjs_require__(1); @@ -876,20 +855,25 @@ var _transport_stream = __w_pdfjs_require__(18); var _xfa_text = __w_pdfjs_require__(19); const DEFAULT_RANGE_CHUNK_SIZE = 65536; const RENDERING_CANCELLED_TIMEOUT = 100; +const DELAYED_CLEANUP_TIMEOUT = 5000; let DefaultCanvasFactory = _display_utils.DOMCanvasFactory; exports.DefaultCanvasFactory = DefaultCanvasFactory; let DefaultCMapReaderFactory = _display_utils.DOMCMapReaderFactory; exports.DefaultCMapReaderFactory = DefaultCMapReaderFactory; +let DefaultFilterFactory = _display_utils.DOMFilterFactory; +exports.DefaultFilterFactory = DefaultFilterFactory; let DefaultStandardFontDataFactory = _display_utils.DOMStandardFontDataFactory; exports.DefaultStandardFontDataFactory = DefaultStandardFontDataFactory; if (_is_node.isNodeJS) { const { NodeCanvasFactory, NodeCMapReaderFactory, + NodeFilterFactory, NodeStandardFontDataFactory } = __w_pdfjs_require__(20); exports.DefaultCanvasFactory = DefaultCanvasFactory = NodeCanvasFactory; exports.DefaultCMapReaderFactory = DefaultCMapReaderFactory = NodeCMapReaderFactory; + exports.DefaultFilterFactory = DefaultFilterFactory = NodeFilterFactory; exports.DefaultStandardFontDataFactory = DefaultStandardFontDataFactory = NodeStandardFontDataFactory; } let createPDFNetworkStream; @@ -922,20 +906,17 @@ function getDocument(src) { src = { data: src }; - } else if (src instanceof PDFDataRangeTransport) { - (0, _display_utils.deprecated)("`PDFDataRangeTransport`-instance, " + "please use a parameter object with `range`-property instead."); - src = { - range: src - }; - } else { - if (typeof src !== "object") { - throw new Error("Invalid parameter in getDocument, " + "need either string, URL, TypedArray, or parameter object."); - } + } + if (typeof src !== "object") { + throw new Error("Invalid parameter in getDocument, need parameter object."); } if (!src.url && !src.data && !src.range) { throw new Error("Invalid parameter object: need either .data, .range or .url"); } const task = new PDFDocumentLoadingTask(); + const { + docId + } = task; const url = src.url ? getUrlProp(src.url) : null; const data = src.data ? getDataProp(src.data) : null; const httpHeaders = src.httpHeaders || null; @@ -955,6 +936,7 @@ function getDocument(src) { const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1; const isEvalSupported = src.isEvalSupported !== false; const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === "boolean" ? src.isOffscreenCanvasSupported : !_is_node.isNodeJS; + const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1; const disableFontFace = typeof src.disableFontFace === "boolean" ? src.disableFontFace : _is_node.isNodeJS; const fontExtraProperties = src.fontExtraProperties === true; const enableXfa = src.enableXfa === true; @@ -966,17 +948,28 @@ function getDocument(src) { const length = rangeTransport ? rangeTransport.length : src.length ?? NaN; const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !_is_node.isNodeJS && !disableFontFace; const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : CMapReaderFactory === _display_utils.DOMCMapReaderFactory && StandardFontDataFactory === _display_utils.DOMStandardFontDataFactory && (0, _display_utils.isValidFetchUrl)(cMapUrl, document.baseURI) && (0, _display_utils.isValidFetchUrl)(standardFontDataUrl, document.baseURI); + const canvasFactory = src.canvasFactory || new DefaultCanvasFactory({ + ownerDocument + }); + const filterFactory = src.filterFactory || new DefaultFilterFactory({ + docId, + ownerDocument + }); const styleElement = null; (0, _util.setVerbosityLevel)(verbosity); - const transportFactory = useWorkerFetch ? null : { - cMapReaderFactory: new CMapReaderFactory({ + const transportFactory = { + canvasFactory, + filterFactory + }; + if (!useWorkerFetch) { + transportFactory.cMapReaderFactory = new CMapReaderFactory({ baseUrl: cMapUrl, isCompressed: cMapPacked - }), - standardFontDataFactory: new StandardFontDataFactory({ + }); + transportFactory.standardFontDataFactory = new StandardFontDataFactory({ baseUrl: standardFontDataUrl - }) - }; + }); + } if (!worker) { const workerParams = { verbosity, @@ -985,10 +978,9 @@ function getDocument(src) { worker = workerParams.port ? PDFWorker.fromPort(workerParams) : new PDFWorker(workerParams); task._worker = worker; } - const docId = task.docId; const fetchDocParams = { docId, - apiVersion: '3.4.120', + apiVersion: '3.5.141', data, password, disableAutoFetch, @@ -1002,6 +994,7 @@ function getDocument(src) { ignoreErrors, isEvalSupported, isOffscreenCanvasSupported, + canvasMaxAreaInBytes, fontExtraProperties, useSystemFonts, cMapUrl: useWorkerFetch ? cMapUrl : null, @@ -1101,7 +1094,6 @@ function getDataProp(val) { } class PDFDocumentLoadingTask { static #docId = 0; - #onUnsupportedFeature = null; constructor() { this._capability = (0, _util.createPromiseCapability)(); this._transport = null; @@ -1111,13 +1103,6 @@ class PDFDocumentLoadingTask { this.onPassword = null; this.onProgress = null; } - get onUnsupportedFeature() { - return this.#onUnsupportedFeature; - } - set onUnsupportedFeature(callback) { - (0, _display_utils.deprecated)("The PDFDocumentLoadingTask onUnsupportedFeature property will be removed in the future."); - this.#onUnsupportedFeature = callback; - } get promise() { return this._capability.promise; } @@ -1199,6 +1184,9 @@ class PDFDocumentProxy { get annotationStorage() { return this._transport.annotationStorage; } + get filterFactory() { + return this._transport.filterFactory; + } get numPages() { return this._pdfInfo.numPages; } @@ -1295,17 +1283,17 @@ class PDFDocumentProxy { } exports.PDFDocumentProxy = PDFDocumentProxy; class PDFPageProxy { - constructor(pageIndex, pageInfo, transport, ownerDocument, pdfBug = false) { + #delayedCleanupTimeout = null; + #pendingCleanup = false; + constructor(pageIndex, pageInfo, transport, pdfBug = false) { this._pageIndex = pageIndex; this._pageInfo = pageInfo; - this._ownerDocument = ownerDocument; this._transport = transport; this._stats = pdfBug ? new _display_utils.StatTimer() : null; this._pdfBug = pdfBug; this.commonObjs = transport.commonObjs; this.objs = new PDFObjects(); - this.cleanupAfterRender = false; - this.pendingCleanup = false; + this._maybeCleanupAfterRender = false; this._intentStates = new Map(); this.destroyed = false; } @@ -1361,16 +1349,19 @@ class PDFPageProxy { intent = "display", annotationMode = _util.AnnotationMode.ENABLE, transform = null, - canvasFactory = null, background = null, optionalContentConfigPromise = null, annotationCanvasMap = null, pageColors = null, printAnnotationStorage = null }) { + if (arguments[0]?.canvasFactory) { + throw new Error("render no longer accepts the `canvasFactory`-option, " + "please pass it to the `getDocument`-function instead."); + } this._stats?.time("Overall"); const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage); - this.pendingCleanup = false; + this.#pendingCleanup = false; + this.#abortDelayedCleanup(); if (!optionalContentConfigPromise) { optionalContentConfigPromise = this._transport.getOptionalContentConfig(); } @@ -1383,9 +1374,6 @@ class PDFPageProxy { clearTimeout(intentState.streamReaderCancelTimeout); intentState.streamReaderCancelTimeout = null; } - const canvasFactoryInstance = canvasFactory || new DefaultCanvasFactory({ - ownerDocument: this._ownerDocument - }); const intentPrint = !!(intentArgs.renderingIntent & _util.RenderingIntentFlag.PRINT); if (!intentState.displayReadyCapability) { intentState.displayReadyCapability = (0, _util.createPromiseCapability)(); @@ -1400,10 +1388,10 @@ class PDFPageProxy { } const complete = error => { intentState.renderTasks.delete(internalRenderTask); - if (this.cleanupAfterRender || intentPrint) { - this.pendingCleanup = true; + if (this._maybeCleanupAfterRender || intentPrint) { + this.#pendingCleanup = true; } - this._tryCleanup(); + this.#tryCleanup(!intentPrint); if (error) { internalRenderTask.capability.reject(error); this._abortOperatorList({ @@ -1429,7 +1417,8 @@ class PDFPageProxy { annotationCanvasMap, operatorList: intentState.operatorList, pageIndex: this._pageIndex, - canvasFactory: canvasFactoryInstance, + canvasFactory: this._transport.canvasFactory, + filterFactory: this._transport.filterFactory, useRequestAnimationFrame: !intentPrint, pdfBug: this._pdfBug, pageColors @@ -1437,7 +1426,7 @@ class PDFPageProxy { (intentState.renderTasks ||= new Set()).add(internalRenderTask); const renderTask = internalRenderTask.task; Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => { - if (this.pendingCleanup) { + if (this.#pendingCleanup) { complete(); return; } @@ -1485,13 +1474,11 @@ class PDFPageProxy { return intentState.opListReadCapability.promise; } streamTextContent({ - disableCombineTextItems = false, includeMarkedContent = false } = {}) { const TEXT_CONTENT_CHUNK_SIZE = 100; return this._transport.messageHandler.sendWithStream("GetTextContent", { pageIndex: this._pageIndex, - combineTextItems: disableCombineTextItems !== true, includeMarkedContent: includeMarkedContent === true }, { highWaterMark: TEXT_CONTENT_CHUNK_SIZE, @@ -1551,15 +1538,28 @@ class PDFPageProxy { } } this.objs.clear(); - this.pendingCleanup = false; + this.#pendingCleanup = false; + this.#abortDelayedCleanup(); return Promise.all(waitOn); } cleanup(resetStats = false) { - this.pendingCleanup = true; - return this._tryCleanup(resetStats); + this.#pendingCleanup = true; + const success = this.#tryCleanup(false); + if (resetStats && success) { + this._stats &&= new _display_utils.StatTimer(); + } + return success; } - _tryCleanup(resetStats = false) { - if (!this.pendingCleanup) { + #tryCleanup(delayed = false) { + this.#abortDelayedCleanup(); + if (!this.#pendingCleanup) { + return false; + } + if (delayed) { + this.#delayedCleanupTimeout = setTimeout(() => { + this.#delayedCleanupTimeout = null; + this.#tryCleanup(false); + }, DELAYED_CLEANUP_TIMEOUT); return false; } for (const { @@ -1572,12 +1572,15 @@ class PDFPageProxy { } this._intentStates.clear(); this.objs.clear(); - if (resetStats && this._stats) { - this._stats = new _display_utils.StatTimer(); - } - this.pendingCleanup = false; + this.#pendingCleanup = false; return true; } + #abortDelayedCleanup() { + if (this.#delayedCleanupTimeout) { + clearTimeout(this.#delayedCleanupTimeout); + this.#delayedCleanupTimeout = null; + } + } _startRenderPage(transparency, cacheKey) { const intentState = this._intentStates.get(cacheKey); if (!intentState) { @@ -1597,7 +1600,7 @@ class PDFPageProxy { internalRenderTask.operatorListChanged(); } if (operatorListChunk.lastChunk) { - this._tryCleanup(); + this.#tryCleanup(true); } } _pumpOperatorList({ @@ -1638,7 +1641,7 @@ class PDFPageProxy { for (const internalRenderTask of intentState.renderTasks) { internalRenderTask.operatorListChanged(); } - this._tryCleanup(); + this.#tryCleanup(true); } if (intentState.displayReadyCapability) { intentState.displayReadyCapability.reject(reason); @@ -1704,9 +1707,11 @@ exports.PDFPageProxy = PDFPageProxy; class LoopbackPort { #listeners = new Set(); #deferred = Promise.resolve(); - postMessage(obj, transfers) { + postMessage(obj, transfer) { const event = { - data: structuredClone(obj, transfers) + data: structuredClone(obj, transfer ? { + transfer + } : null) }; this.#deferred.then(() => { for (const listener of this.#listeners) { @@ -1964,13 +1969,14 @@ class WorkerTransport { this.loadingTask = loadingTask; this.commonObjs = new PDFObjects(); this.fontLoader = new _font_loader.FontLoader({ - onUnsupportedFeature: this._onUnsupportedFeature.bind(this), ownerDocument: params.ownerDocument, styleElement: params.styleElement }); this._params = params; - this.cMapReaderFactory = factory?.cMapReaderFactory; - this.standardFontDataFactory = factory?.standardFontDataFactory; + this.canvasFactory = factory.canvasFactory; + this.filterFactory = factory.filterFactory; + this.cMapReaderFactory = factory.cMapReaderFactory; + this.standardFontDataFactory = factory.standardFontDataFactory; this.destroyed = false; this.destroyCapability = null; this._passwordCapability = null; @@ -2057,6 +2063,7 @@ class WorkerTransport { this.commonObjs.clear(); this.fontLoader.clear(); this.#methodPromises.clear(); + this.filterFactory.destroy(); if (this._networkStream) { this._networkStream.cancelAllRequests(new _util.AbortException("Worker was terminated.")); } @@ -2245,20 +2252,12 @@ class WorkerTransport { this.commonObjs.resolve(id, exportedError); break; } - let fontRegistry = null; - if (params.pdfBug && globalThis.FontInspector?.enabled) { - fontRegistry = { - registerFont(font, url) { - globalThis.FontInspector.fontAdded(font, url); - } - }; - } + const inspectFont = params.pdfBug && globalThis.FontInspector?.enabled ? (font, url) => globalThis.FontInspector.fontAdded(font, url) : null; const font = new _font_loader.FontFaceObject(exportedData, { isEvalSupported: params.isEvalSupported, disableFontFace: params.disableFontFace, ignoreErrors: params.ignoreErrors, - onUnsupportedFeature: this._onUnsupportedFeature.bind(this), - fontRegistry + inspectFont }); this.fontLoader.bind(font).catch(reason => { return messageHandler.sendWithPromise("FontFallback", { @@ -2273,6 +2272,7 @@ class WorkerTransport { break; case "FontPath": case "Image": + case "Pattern": this.commonObjs.resolve(id, exportedData); break; default: @@ -2290,7 +2290,6 @@ class WorkerTransport { switch (type) { case "Image": pageProxy.objs.resolve(id, imageData); - const MAX_IMAGE_SIZE_TO_STORE = 8000000; if (imageData) { let length; if (imageData.bitmap) { @@ -2302,8 +2301,8 @@ class WorkerTransport { } else { length = imageData.data?.length || 0; } - if (length > MAX_IMAGE_SIZE_TO_STORE) { - pageProxy.cleanupAfterRender = true; + if (length > _util.MAX_IMAGE_SIZE_TO_CACHE) { + pageProxy._maybeCleanupAfterRender = true; } } break; @@ -2323,7 +2322,6 @@ class WorkerTransport { total: data.total }); }); - messageHandler.on("UnsupportedFeature", this._onUnsupportedFeature.bind(this)); messageHandler.on("FetchBuiltInCMap", data => { if (this.destroyed) { return Promise.reject(new Error("Worker was destroyed.")); @@ -2343,14 +2341,6 @@ class WorkerTransport { return this.standardFontDataFactory.fetch(data); }); } - _onUnsupportedFeature({ - featureId - }) { - if (this.destroyed) { - return; - } - this.loadingTask.onUnsupportedFeature?.(featureId); - } getData() { return this.messageHandler.sendWithPromise("GetData", null); } @@ -2382,7 +2372,7 @@ class WorkerTransport { if (this.destroyed) { throw new Error("Transport destroyed"); } - const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.ownerDocument, this._params.pdfBug); + const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.pdfBug); this.#pageCache.set(pageIndex, page); return page; }); @@ -2505,6 +2495,7 @@ class WorkerTransport { this.fontLoader.clear(); } this.#methodPromises.clear(); + this.filterFactory.destroy(true); } get loadingParams() { const { @@ -2597,6 +2588,7 @@ class InternalRenderTask { operatorList, pageIndex, canvasFactory, + filterFactory, useRequestAnimationFrame = false, pdfBug = false, pageColors = null @@ -2610,6 +2602,7 @@ class InternalRenderTask { this.operatorList = operatorList; this._pageIndex = pageIndex; this.canvasFactory = canvasFactory; + this.filterFactory = filterFactory; this._pdfBug = pdfBug; this.pageColors = pageColors; this.running = false; @@ -2652,9 +2645,9 @@ class InternalRenderTask { transform, background } = this.params; - this.gfx = new _canvas.CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, { + this.gfx = new _canvas.CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { optionalContentConfig - }, this.annotationCanvasMap, this.pageColors); + }, this.annotationCanvasMap); this.gfx.beginDrawing({ transform, viewport, @@ -2668,7 +2661,7 @@ class InternalRenderTask { cancel(error = null, extraDelay = 0) { this.running = false; this.cancelled = true; - this.gfx?.endDrawing(); + this.gfx?.endDrawing(this.pageColors); if (this._canvas) { InternalRenderTask.#canvasInUse.delete(this._canvas); } @@ -2715,7 +2708,7 @@ class InternalRenderTask { if (this.operatorListIdx === this.operatorList.argsArray.length) { this.running = false; if (this.operatorList.lastChunk) { - this.gfx.endDrawing(); + this.gfx.endDrawing(this.pageColors); if (this._canvas) { InternalRenderTask.#canvasInUse.delete(this._canvas); } @@ -2724,9 +2717,9 @@ class InternalRenderTask { } } } -const version = '3.4.120'; +const version = '3.5.141'; exports.version = version; -const build = 'af6414988'; +const build = 'be0f6ee08'; exports.build = build; /***/ }), @@ -3885,7 +3878,7 @@ exports.AnnotationEditorUIManager = AnnotationEditorUIManager; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.StatTimer = exports.RenderingCancelledException = exports.PixelsPerInch = exports.PageViewport = exports.PDFDateString = exports.DOMStandardFontDataFactory = exports.DOMSVGFactory = exports.DOMCanvasFactory = exports.DOMCMapReaderFactory = exports.AnnotationPrefix = void 0; +exports.StatTimer = exports.RenderingCancelledException = exports.PixelsPerInch = exports.PageViewport = exports.PDFDateString = exports.DOMStandardFontDataFactory = exports.DOMSVGFactory = exports.DOMFilterFactory = exports.DOMCanvasFactory = exports.DOMCMapReaderFactory = exports.AnnotationPrefix = void 0; exports.deprecated = deprecated; exports.getColorValues = getColorValues; exports.getCurrentTransform = getCurrentTransform; @@ -3910,6 +3903,181 @@ class PixelsPerInch { static PDF_TO_CSS_UNITS = this.CSS / this.PDF; } exports.PixelsPerInch = PixelsPerInch; +class DOMFilterFactory extends _base_factory.BaseFilterFactory { + #_cache; + #_defs; + #docId; + #document; + #hcmFilter; + #hcmKey; + #hcmUrl; + #id = 0; + constructor({ + docId, + ownerDocument = globalThis.document + } = {}) { + super(); + this.#docId = docId; + this.#document = ownerDocument; + } + get #cache() { + return this.#_cache ||= new Map(); + } + get #defs() { + if (!this.#_defs) { + const div = this.#document.createElement("div"); + const { + style + } = div; + style.visibility = "hidden"; + style.contain = "strict"; + style.width = style.height = 0; + style.position = "absolute"; + style.top = style.left = 0; + style.zIndex = -1; + const svg = this.#document.createElementNS(SVG_NS, "svg"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + this.#_defs = this.#document.createElementNS(SVG_NS, "defs"); + div.append(svg); + svg.append(this.#_defs); + this.#document.body.append(div); + } + return this.#_defs; + } + #appendFeFunc(feComponentTransfer, func, table) { + const feFunc = this.#document.createElementNS(SVG_NS, func); + feFunc.setAttribute("type", "discrete"); + feFunc.setAttribute("tableValues", table); + feComponentTransfer.append(feFunc); + } + addFilter(maps) { + if (!maps) { + return "none"; + } + let value = this.#cache.get(maps); + if (value) { + return value; + } + let tableR, tableG, tableB, key; + if (maps.length === 1) { + const mapR = maps[0]; + const buffer = new Array(256); + for (let i = 0; i < 256; i++) { + buffer[i] = mapR[i] / 255; + } + key = tableR = tableG = tableB = buffer.join(","); + } else { + const [mapR, mapG, mapB] = maps; + const bufferR = new Array(256); + const bufferG = new Array(256); + const bufferB = new Array(256); + for (let i = 0; i < 256; i++) { + bufferR[i] = mapR[i] / 255; + bufferG[i] = mapG[i] / 255; + bufferB[i] = mapB[i] / 255; + } + tableR = bufferR.join(","); + tableG = bufferG.join(","); + tableB = bufferB.join(","); + key = `${tableR}${tableG}${tableB}`; + } + value = this.#cache.get(key); + if (value) { + this.#cache.set(maps, value); + return value; + } + const id = `g_${this.#docId}_transfer_map_${this.#id++}`; + const url = `url(#${id})`; + this.#cache.set(maps, url); + this.#cache.set(key, url); + const filter = this.#document.createElementNS(SVG_NS, "filter", SVG_NS); + filter.setAttribute("id", id); + filter.setAttribute("color-interpolation-filters", "sRGB"); + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncR", tableR); + this.#appendFeFunc(feComponentTransfer, "feFuncG", tableG); + this.#appendFeFunc(feComponentTransfer, "feFuncB", tableB); + this.#defs.append(filter); + return url; + } + addHCMFilter(fgColor, bgColor) { + const key = `${fgColor}-${bgColor}`; + if (this.#hcmKey === key) { + return this.#hcmUrl; + } + this.#hcmKey = key; + this.#hcmUrl = "none"; + this.#hcmFilter?.remove(); + if (!fgColor || !bgColor) { + return this.#hcmUrl; + } + this.#defs.style.color = fgColor; + fgColor = getComputedStyle(this.#defs).getPropertyValue("color"); + const fgRGB = getRGB(fgColor); + fgColor = _util.Util.makeHexColor(...fgRGB); + this.#defs.style.color = bgColor; + bgColor = getComputedStyle(this.#defs).getPropertyValue("color"); + const bgRGB = getRGB(bgColor); + bgColor = _util.Util.makeHexColor(...bgRGB); + this.#defs.style.color = ""; + if (fgColor === "#000000" && bgColor === "#ffffff" || fgColor === bgColor) { + return this.#hcmUrl; + } + const map = new Array(256); + for (let i = 0; i <= 255; i++) { + const x = i / 255; + map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; + } + const table = map.join(","); + const id = `g_${this.#docId}_hcm_filter`; + const filter = this.#hcmFilter = this.#document.createElementNS(SVG_NS, "filter", SVG_NS); + filter.setAttribute("id", id); + filter.setAttribute("color-interpolation-filters", "sRGB"); + let feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncR", table); + this.#appendFeFunc(feComponentTransfer, "feFuncG", table); + this.#appendFeFunc(feComponentTransfer, "feFuncB", table); + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"); + filter.append(feColorMatrix); + feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + const getSteps = (c, n) => { + const start = fgRGB[c] / 255; + const end = bgRGB[c] / 255; + const arr = new Array(n + 1); + for (let i = 0; i <= n; i++) { + arr[i] = start + i / n * (end - start); + } + return arr.join(","); + }; + this.#appendFeFunc(feComponentTransfer, "feFuncR", getSteps(0, 5)); + this.#appendFeFunc(feComponentTransfer, "feFuncG", getSteps(1, 5)); + this.#appendFeFunc(feComponentTransfer, "feFuncB", getSteps(2, 5)); + this.#defs.append(filter); + this.#hcmUrl = `url(#${id})`; + return this.#hcmUrl; + } + destroy(keepHCM = false) { + if (keepHCM && this.#hcmUrl) { + return; + } + if (this.#_defs) { + this.#_defs.parentNode.parentNode.remove(); + this.#_defs = null; + } + if (this.#_cache) { + this.#_cache.clear(); + this.#_cache = null; + } + this.#id = 0; + } +} +exports.DOMFilterFactory = DOMFilterFactory; class DOMCanvasFactory extends _base_factory.BaseCanvasFactory { constructor({ ownerDocument = globalThis.document @@ -4343,8 +4511,23 @@ function setLayerDimensions(div, viewport, mustFlip = false, mustRotate = true) Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.BaseStandardFontDataFactory = exports.BaseSVGFactory = exports.BaseCanvasFactory = exports.BaseCMapReaderFactory = void 0; +exports.BaseStandardFontDataFactory = exports.BaseSVGFactory = exports.BaseFilterFactory = exports.BaseCanvasFactory = exports.BaseCMapReaderFactory = void 0; var _util = __w_pdfjs_require__(1); +class BaseFilterFactory { + constructor() { + if (this.constructor === BaseFilterFactory) { + (0, _util.unreachable)("Cannot initialize BaseFilterFactory."); + } + } + addFilter(maps) { + return "none"; + } + addHCMFilter(fgColor, bgColor) { + return "none"; + } + destroy(keepHCM = false) {} +} +exports.BaseFilterFactory = BaseFilterFactory; class BaseCanvasFactory { constructor() { if (this.constructor === BaseCanvasFactory) { @@ -4594,11 +4777,9 @@ var _util = __w_pdfjs_require__(1); var _is_node = __w_pdfjs_require__(10); class FontLoader { constructor({ - onUnsupportedFeature, ownerDocument = globalThis.document, styleElement = null }) { - this._onUnsupportedFeature = onUnsupportedFeature; this._document = ownerDocument; this.nativeFontFaces = []; this.styleElement = null; @@ -4639,9 +4820,6 @@ class FontLoader { try { await nativeFontFace.loaded; } catch (ex) { - this._onUnsupportedFeature({ - featureId: _util.UNSUPPORTED_FEATURES.errorFontLoadNative - }); (0, _util.warn)(`Failed to load font '${nativeFontFace.family}': '${ex}'.`); font.disableFontFace = true; throw ex; @@ -4769,8 +4947,7 @@ class FontFaceObject { isEvalSupported = true, disableFontFace = false, ignoreErrors = false, - onUnsupportedFeature, - fontRegistry = null + inspectFont = null }) { this.compiledGlyphs = Object.create(null); for (const i in translatedData) { @@ -4779,8 +4956,7 @@ class FontFaceObject { this.isEvalSupported = isEvalSupported !== false; this.disableFontFace = disableFontFace === true; this.ignoreErrors = ignoreErrors === true; - this._onUnsupportedFeature = onUnsupportedFeature; - this.fontRegistry = fontRegistry; + this._inspectFont = inspectFont; } createNativeFontFace() { if (!this.data || this.disableFontFace) { @@ -4798,7 +4974,7 @@ class FontFaceObject { } nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css); } - this.fontRegistry?.registerFont(this); + this._inspectFont?.(this); return nativeFontFace; } createFontFaceRule() { @@ -4817,7 +4993,7 @@ class FontFaceObject { } rule = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${css}src:${url}}`; } - this.fontRegistry?.registerFont(this, url); + this._inspectFont?.(this, url); return rule; } getPathGenerator(objs, character) { @@ -4831,9 +5007,6 @@ class FontFaceObject { if (!this.ignoreErrors) { throw ex; } - this._onUnsupportedFeature({ - featureId: _util.UNSUPPORTED_FEATURES.errorFontGetPath - }); (0, _util.warn)(`getPathGenerator - ignoring character: "${ex}".`); return this.compiledGlyphs[character] = function (c, size) {}; } @@ -4884,6 +5057,7 @@ var _util = __w_pdfjs_require__(1); var _display_utils = __w_pdfjs_require__(6); var _pattern_helper = __w_pdfjs_require__(12); var _image_utils = __w_pdfjs_require__(13); +var _is_node = __w_pdfjs_require__(10); const MIN_FONT_SIZE = 16; const MAX_FONT_SIZE = 100; const MAX_GROUP_SIZE = 4096; @@ -5206,7 +5380,7 @@ class CanvasExtraState { this.strokeAlpha = 1; this.lineWidth = 1; this.activeSMask = null; - this.transferMaps = null; + this.transferMaps = "none"; this.startNewPathAndClipBox([0, 0, width, height]); } clone() { @@ -5285,7 +5459,7 @@ class CanvasExtraState { return _util.Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform)); } } -function putBinaryImageData(ctx, imgData, transferMaps = null) { +function putBinaryImageData(ctx, imgData) { if (typeof ImageData !== "undefined" && imgData instanceof ImageData) { ctx.putImageData(imgData, 0, 0); return; @@ -5301,35 +5475,13 @@ function putBinaryImageData(ctx, imgData, transferMaps = null) { const src = imgData.data; const dest = chunkImgData.data; let i, j, thisChunkHeight, elemsInThisChunk; - let transferMapRed, transferMapGreen, transferMapBlue, transferMapGray; - if (transferMaps) { - switch (transferMaps.length) { - case 1: - transferMapRed = transferMaps[0]; - transferMapGreen = transferMaps[0]; - transferMapBlue = transferMaps[0]; - transferMapGray = transferMaps[0]; - break; - case 4: - transferMapRed = transferMaps[0]; - transferMapGreen = transferMaps[1]; - transferMapBlue = transferMaps[2]; - transferMapGray = transferMaps[3]; - break; - } - } if (imgData.kind === _util.ImageKind.GRAYSCALE_1BPP) { 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.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; - if (transferMapGray) { - if (transferMapGray[0] === 0xff && transferMapGray[0xff] === 0) { - [white, black] = [black, white]; - } - } + const white = 0xffffffff; + const black = _util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; for (i = 0; i < totalChunks; i++) { thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; destPos = 0; @@ -5366,48 +5518,20 @@ function putBinaryImageData(ctx, imgData, transferMaps = null) { ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); } } else if (imgData.kind === _util.ImageKind.RGBA_32BPP) { - const hasTransferMaps = !!(transferMapRed || transferMapGreen || transferMapBlue); j = 0; elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; for (i = 0; i < fullChunks; i++) { dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); srcPos += elemsInThisChunk; - if (hasTransferMaps) { - for (let k = 0; k < elemsInThisChunk; k += 4) { - if (transferMapRed) { - dest[k + 0] = transferMapRed[dest[k + 0]]; - } - if (transferMapGreen) { - dest[k + 1] = transferMapGreen[dest[k + 1]]; - } - if (transferMapBlue) { - dest[k + 2] = transferMapBlue[dest[k + 2]]; - } - } - } ctx.putImageData(chunkImgData, 0, j); j += FULL_CHUNK_HEIGHT; } if (i < totalChunks) { elemsInThisChunk = width * partialChunkHeight * 4; dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); - if (hasTransferMaps) { - for (let k = 0; k < elemsInThisChunk; k += 4) { - if (transferMapRed) { - dest[k + 0] = transferMapRed[dest[k + 0]]; - } - if (transferMapGreen) { - dest[k + 1] = transferMapGreen[dest[k + 1]]; - } - if (transferMapBlue) { - dest[k + 2] = transferMapBlue[dest[k + 2]]; - } - } - } ctx.putImageData(chunkImgData, 0, j); } } else if (imgData.kind === _util.ImageKind.RGB_24BPP) { - const hasTransferMaps = !!(transferMapRed || transferMapGreen || transferMapBlue); thisChunkHeight = FULL_CHUNK_HEIGHT; elemsInThisChunk = width * thisChunkHeight; for (i = 0; i < totalChunks; i++) { @@ -5422,19 +5546,6 @@ function putBinaryImageData(ctx, imgData, transferMaps = null) { dest[destPos++] = src[srcPos++]; dest[destPos++] = 255; } - if (hasTransferMaps) { - for (let k = 0; k < destPos; k += 4) { - if (transferMapRed) { - dest[k + 0] = transferMapRed[dest[k + 0]]; - } - if (transferMapGreen) { - dest[k + 1] = transferMapGreen[dest[k + 1]]; - } - if (transferMapBlue) { - dest[k + 2] = transferMapBlue[dest[k + 2]]; - } - } - } ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); } } else { @@ -5459,18 +5570,19 @@ function putBinaryImageMask(ctx, imgData) { const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; ({ srcPos - } = (0, _image_utils.applyMaskImageData)({ + } = (0, _image_utils.convertBlackAndWhiteToRGBA)({ src, srcPos, dest, width, - height: thisChunkHeight + height: thisChunkHeight, + nonBlackColor: 0 })); ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); } } function copyCtxState(sourceCtx, destCtx) { - const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font"]; + const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font", "filter"]; for (const property of properties) { if (sourceCtx[property] !== undefined) { destCtx[property] = sourceCtx[property]; @@ -5481,8 +5593,8 @@ function copyCtxState(sourceCtx, destCtx) { destCtx.lineDashOffset = sourceCtx.lineDashOffset; } } -function resetCtxToDefault(ctx, foregroundColor) { - ctx.strokeStyle = ctx.fillStyle = foregroundColor || "#000000"; +function resetCtxToDefault(ctx) { + ctx.strokeStyle = ctx.fillStyle = "#000000"; ctx.fillRule = "nonzero"; ctx.globalAlpha = 1; ctx.lineWidth = 1; @@ -5495,6 +5607,9 @@ function resetCtxToDefault(ctx, foregroundColor) { ctx.setLineDash([]); ctx.lineDashOffset = 0; } + if (!_is_node.isNodeJS) { + ctx.filter = "none"; + } } function composeSMaskBackdrop(bytes, r0, g0, b0) { const length = bytes.length; @@ -5584,10 +5699,10 @@ const LINE_JOIN_STYLES = ["miter", "round", "bevel"]; const NORMAL_CLIP = {}; const EO_CLIP = {}; class CanvasGraphics { - constructor(canvasCtx, commonObjs, objs, canvasFactory, { + constructor(canvasCtx, commonObjs, objs, canvasFactory, filterFactory, { optionalContentConfig, markedContentStack = null - }, annotationCanvasMap, pageColors) { + }, annotationCanvasMap) { this.ctx = canvasCtx; this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); this.stateStack = []; @@ -5598,6 +5713,7 @@ class CanvasGraphics { this.commonObjs = commonObjs; this.objs = objs; this.canvasFactory = canvasFactory; + this.filterFactory = filterFactory; this.groupStack = []; this.processingType3 = null; this.baseTransform = null; @@ -5616,8 +5732,6 @@ class CanvasGraphics { this.viewportScale = 1; this.outputScaleX = 1; this.outputScaleY = 1; - this.backgroundColor = pageColors?.background || null; - this.foregroundColor = pageColors?.foreground || null; this._cachedScaleForStroking = null; this._cachedGetSinglePixelWidth = null; this._cachedBitmapsMap = new Map(); @@ -5636,36 +5750,10 @@ class CanvasGraphics { }) { const width = this.ctx.canvas.width; const height = this.ctx.canvas.height; - const defaultBackgroundColor = background || "#ffffff"; - this.ctx.save(); - if (this.foregroundColor && this.backgroundColor) { - this.ctx.fillStyle = this.foregroundColor; - const fg = this.foregroundColor = this.ctx.fillStyle; - this.ctx.fillStyle = this.backgroundColor; - const bg = this.backgroundColor = this.ctx.fillStyle; - let isValidDefaultBg = true; - let defaultBg = defaultBackgroundColor; - this.ctx.fillStyle = defaultBackgroundColor; - defaultBg = this.ctx.fillStyle; - isValidDefaultBg = typeof defaultBg === "string" && /^#[0-9A-Fa-f]{6}$/.test(defaultBg); - if (fg === "#000000" && bg === "#ffffff" || fg === bg || !isValidDefaultBg) { - this.foregroundColor = this.backgroundColor = null; - } else { - const [rB, gB, bB] = (0, _display_utils.getRGB)(defaultBg); - const newComp = x => { - x /= 255; - return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; - }; - const lumB = Math.round(0.2126 * newComp(rB) + 0.7152 * newComp(gB) + 0.0722 * newComp(bB)); - this.selectColor = (r, g, b) => { - const lumC = 0.2126 * newComp(r) + 0.7152 * newComp(g) + 0.0722 * newComp(b); - return Math.round(lumC) === lumB ? bg : fg; - }; - } - } - this.ctx.fillStyle = this.backgroundColor || defaultBackgroundColor; + const savedFillStyle = this.ctx.fillStyle; + this.ctx.fillStyle = background || "#ffffff"; this.ctx.fillRect(0, 0, width, height); - this.ctx.restore(); + this.ctx.fillStyle = savedFillStyle; if (transparency) { const transparentCanvas = this.cachedCanvases.getCanvas("transparent", width, height); this.compositeCtx = this.ctx; @@ -5675,7 +5763,7 @@ class CanvasGraphics { this.ctx.transform(...(0, _display_utils.getCurrentTransform)(this.compositeCtx)); } this.ctx.save(); - resetCtxToDefault(this.ctx, this.foregroundColor); + resetCtxToDefault(this.ctx); if (transform) { this.ctx.transform(...transform); this.outputScaleX = transform[0]; @@ -5743,7 +5831,7 @@ class CanvasGraphics { this.transparentCanvas = null; } } - endDrawing() { + endDrawing(pageColors = null) { this.#restoreInitialState(); this.cachedCanvases.clear(); this.cachedPatterns.clear(); @@ -5756,6 +5844,15 @@ class CanvasGraphics { cache.clear(); } this._cachedBitmapsMap.clear(); + if (pageColors) { + const hcmFilterId = this.filterFactory.addHCMFilter(pageColors.foreground, pageColors.background); + if (hcmFilterId !== "none") { + const savedFilter = this.ctx.filter; + this.ctx.filter = hcmFilterId; + this.ctx.drawImage(this.ctx.canvas, 0, 0); + this.ctx.filter = savedFilter; + } + } } _scaleImage(img, inverseTransform) { const width = img.width; @@ -5770,11 +5867,11 @@ class CanvasGraphics { let newWidth = paintWidth, newHeight = paintHeight; if (widthScale > 2 && paintWidth > 1) { - newWidth = Math.ceil(paintWidth / 2); + newWidth = paintWidth >= 16384 ? Math.floor(paintWidth / 2) - 1 || 1 : Math.ceil(paintWidth / 2); widthScale /= paintWidth / newWidth; } if (heightScale > 2 && paintHeight > 1) { - newHeight = Math.ceil(paintHeight / 2); + newHeight = paintHeight >= 16384 ? Math.floor(paintHeight / 2) - 1 || 1 : Math.ceil(paintHeight) / 2; heightScale /= paintHeight / newHeight; } tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight); @@ -5930,7 +6027,8 @@ class CanvasGraphics { this.checkSMaskState(); break; case "TR": - this.current.transferMaps = value; + this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(value); + break; } } } @@ -6554,7 +6652,7 @@ class CanvasGraphics { const baseTransform = this.baseTransform || (0, _display_utils.getCurrentTransform)(this.ctx); const canvasGraphicsFactory = { createCanvasGraphics: ctx => { - return new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, { + return new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { optionalContentConfig: this.optionalContentConfig, markedContentStack: this.markedContentStack }); @@ -6574,12 +6672,12 @@ class CanvasGraphics { this.current.patternFill = true; } setStrokeRGBColor(r, g, b) { - const color = this.selectColor?.(r, g, b) || _util.Util.makeHexColor(r, g, b); + const color = _util.Util.makeHexColor(r, g, b); this.ctx.strokeStyle = color; this.current.strokeColor = color; } setFillRGBColor(r, g, b) { - const color = this.selectColor?.(r, g, b) || _util.Util.makeHexColor(r, g, b); + const color = _util.Util.makeHexColor(r, g, b); this.ctx.fillStyle = color; this.current.fillColor = color; this.current.patternFill = false; @@ -6589,7 +6687,7 @@ class CanvasGraphics { if (this.cachedPatterns.has(objId)) { pattern = this.cachedPatterns.get(objId); } else { - pattern = (0, _pattern_helper.getShadingPattern)(this.objs.get(objId)); + pattern = (0, _pattern_helper.getShadingPattern)(this.getObject(objId)); this.cachedPatterns.set(objId, pattern); } if (matrix) { @@ -6758,7 +6856,7 @@ class CanvasGraphics { } beginAnnotation(id, rect, transform, matrix, hasOwnCanvas) { this.#restoreInitialState(); - resetCtxToDefault(this.ctx, this.foregroundColor); + resetCtxToDefault(this.ctx); this.ctx.save(); this.save(); if (this.baseTransform) { @@ -6790,9 +6888,9 @@ class CanvasGraphics { this.annotationCanvas.savedCtx = this.ctx; this.ctx = context; this.ctx.setTransform(scaleX, 0, 0, -scaleY, 0, height * scaleY); - resetCtxToDefault(this.ctx, this.foregroundColor); + resetCtxToDefault(this.ctx); } else { - resetCtxToDefault(this.ctx, this.foregroundColor); + resetCtxToDefault(this.ctx); this.ctx.rect(rect[0], rect[1], width, height); this.ctx.clip(); this.endPath(); @@ -6919,6 +7017,30 @@ class CanvasGraphics { } this.paintInlineImageXObjectGroup(imgData, map); } + applyTransferMapsToCanvas(ctx) { + if (this.current.transferMaps !== "none") { + ctx.filter = this.current.transferMaps; + ctx.drawImage(ctx.canvas, 0, 0); + ctx.filter = "none"; + } + return ctx.canvas; + } + applyTransferMapsToBitmap(imgData) { + if (this.current.transferMaps === "none") { + return imgData.bitmap; + } + const { + bitmap, + width, + height + } = imgData; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); + const tmpCtx = tmpCanvas.context; + tmpCtx.filter = this.current.transferMaps; + tmpCtx.drawImage(bitmap, 0, 0); + tmpCtx.filter = "none"; + return tmpCanvas.canvas; + } paintInlineImageXObject(imgData) { if (!this.contentVisible) { return; @@ -6927,15 +7049,20 @@ class CanvasGraphics { const height = imgData.height; const ctx = this.ctx; this.save(); + if (!_is_node.isNodeJS) { + ctx.filter = "none"; + } ctx.scale(1 / width, -1 / height); let imgToPaint; - if (typeof HTMLElement === "function" && imgData instanceof HTMLElement || !imgData.data) { + if (imgData.bitmap) { + imgToPaint = this.applyTransferMapsToBitmap(imgData); + } else if (typeof HTMLElement === "function" && imgData instanceof HTMLElement || !imgData.data) { imgToPaint = imgData; } else { const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); const tmpCtx = tmpCanvas.context; - putBinaryImageData(tmpCtx, imgData, this.current.transferMaps); - imgToPaint = tmpCanvas.canvas; + putBinaryImageData(tmpCtx, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); } const scaled = this._scaleImage(imgToPaint, (0, _display_utils.getCurrentTransformInverse)(ctx)); ctx.imageSmoothingEnabled = getImageSmoothingEnabled((0, _display_utils.getCurrentTransform)(ctx), imgData.interpolate); @@ -6948,16 +7075,22 @@ class CanvasGraphics { return; } 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); + let imgToPaint; + if (imgData.bitmap) { + imgToPaint = imgData.bitmap; + } else { + const w = imgData.width; + const h = imgData.height; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h); + const tmpCtx = tmpCanvas.context; + putBinaryImageData(tmpCtx, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); + } for (const entry of map) { ctx.save(); ctx.transform(...entry.transform); ctx.scale(1, -1); - drawImageAtIntegerCoords(ctx, tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1); + drawImageAtIntegerCoords(ctx, imgToPaint, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1); ctx.restore(); } this.compose(); @@ -7580,23 +7713,35 @@ exports.TilingPattern = TilingPattern; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.applyMaskImageData = applyMaskImageData; +exports.convertBlackAndWhiteToRGBA = convertBlackAndWhiteToRGBA; +exports.convertToRGBA = convertToRGBA; +exports.grayToRGBA = grayToRGBA; var _util = __w_pdfjs_require__(1); -function applyMaskImageData({ +function convertToRGBA(params) { + switch (params.kind) { + case _util.ImageKind.GRAYSCALE_1BPP: + return convertBlackAndWhiteToRGBA(params); + case _util.ImageKind.RGB_24BPP: + return convertRGBToRGBA(params); + } + return null; +} +function convertBlackAndWhiteToRGBA({ src, srcPos = 0, dest, - destPos = 0, width, height, + nonBlackColor = 0xffffffff, inverseDecode = false }) { - const opaque = _util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; - const [zeroMapping, oneMapping] = !inverseDecode ? [opaque, 0] : [0, opaque]; + const black = _util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; const widthInSource = width >> 3; const widthRemainder = width & 7; const srcLength = src.length; dest = new Uint32Array(dest.buffer); + let destPos = 0; for (let i = 0; i < height; i++) { for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { const elem = srcPos < srcLength ? src[srcPos] : 255; @@ -7622,6 +7767,60 @@ function applyMaskImageData({ destPos }; } +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height +}) { + let i = 0; + const len32 = src.length >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + if (_util.FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff000000; + dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000; + dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000; + dest[destPos + 3] = s3 >>> 8 | 0xff000000; + } + for (let j = i * 4, jj = src.length; j < jj; j += 3) { + dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff; + dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff; + dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff; + dest[destPos + 3] = s3 << 8 | 0xff; + } + for (let j = i * 4, jj = src.length; j < jj; j += 3) { + dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff; + } + } + return { + srcPos, + destPos + }; +} +function grayToRGBA(src, dest) { + if (_util.FeatureTest.isLittleEndian) { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x10101 | 0xff000000; + } + } else { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x1010100 | 0x000000ff; + } + } +} /***/ }), /* 14 */ @@ -8628,7 +8827,7 @@ exports.XfaText = XfaText; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NodeStandardFontDataFactory = exports.NodeCanvasFactory = exports.NodeCMapReaderFactory = void 0; +exports.NodeStandardFontDataFactory = exports.NodeFilterFactory = exports.NodeCanvasFactory = exports.NodeCMapReaderFactory = void 0; var _base_factory = __w_pdfjs_require__(7); ; const fetchData = function (url) { @@ -8643,6 +8842,8 @@ const fetchData = function (url) { }); }); }; +class NodeFilterFactory extends _base_factory.BaseFilterFactory {} +exports.NodeFilterFactory = NodeFilterFactory; class NodeCanvasFactory extends _base_factory.BaseCanvasFactory { _createCanvas(width, height) { const Canvas = require("canvas"); @@ -9193,7 +9394,7 @@ function getFilenameFromContentDispositionHeader(contentDisposition) { parts[i] = parts[i].slice(0, quotindex); parts.length = i + 1; } - parts[i] = parts[i].replace(/\\(.)/g, "$1"); + parts[i] = parts[i].replaceAll(/\\(.)/g, "$1"); } value = parts.join('"'); } @@ -9213,10 +9414,10 @@ function getFilenameFromContentDispositionHeader(contentDisposition) { if (!value.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(value)) { return value; } - return value.replace(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function (matches, charset, encoding, text) { + return value.replaceAll(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function (matches, charset, encoding, text) { if (encoding === "q" || encoding === "Q") { - text = text.replace(/_/g, " "); - text = text.replace(/=([0-9a-fA-F]{2})/g, function (match, hex) { + text = text.replaceAll("_", " "); + text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function (match, hex) { return String.fromCharCode(parseInt(hex, 16)); }); return textdecode(charset, text); @@ -10200,6 +10401,16 @@ function renderTextLayer(params) { (0, _display_utils.deprecated)("The TextLayerRender `textContent`/`textContentStream` parameters " + "will be removed in the future, please use `textContentSource` instead."); params.textContentSource = params.textContent || params.textContentStream; } + const { + container, + viewport + } = params; + const style = getComputedStyle(container); + const visibility = style.getPropertyValue("visibility"); + const scaleFactor = parseFloat(style.getPropertyValue("--scale-factor")); + if (visibility === "visible" && (!scaleFactor || Math.abs(scaleFactor - viewport.scale) > 1e-15)) { + console.error("The `--scale-factor` CSS-variable must be set, " + "to the same value as `viewport.scale`, " + "either on the `container`-element itself or higher up in the DOM."); + } const task = new TextLayerRenderTask(params); task._render(); return task; @@ -10936,7 +11147,6 @@ var _editor = __w_pdfjs_require__(4); var _pdfjsFitCurve = __w_pdfjs_require__(30); var _tools = __w_pdfjs_require__(5); const RESIZER_SIZE = 16; -const TIME_TO_WAIT_BEFORE_FIXING_DIMS = 100; class InkEditor extends _editor.AnnotationEditor { #aspectRatio = 0; #baseHeight = 0; @@ -11326,17 +11536,9 @@ class InkEditor extends _editor.AnnotationEditor { this.ctx = this.canvas.getContext("2d"); } #createObserver() { - let timeoutId = null; this.#observer = new ResizeObserver(entries => { const rect = entries[0].contentRect; if (rect.width && rect.height) { - if (timeoutId !== null) { - clearTimeout(timeoutId); - } - timeoutId = setTimeout(() => { - this.fixDims(); - timeoutId = null; - }, TIME_TO_WAIT_BEFORE_FIXING_DIMS); this.setDimensions(rect.width, rect.height); } }); @@ -11404,6 +11606,7 @@ class InkEditor extends _editor.AnnotationEditor { this.#setCanvasDims(); this.#redraw(); this.canvas.style.visibility = "visible"; + this.fixDims(); } #setScaleFactor(width, height) { const padding = this.#getPadding(); @@ -12040,6 +12243,9 @@ class AnnotationElement { } = this; const container = document.createElement("section"); container.setAttribute("data-annotation-id", data.id); + if (data.noRotate) { + container.classList.add("norotate"); + } const { pageWidth, pageHeight, @@ -12243,7 +12449,7 @@ class AnnotationElement { } if (!trigger) { trigger = document.createElement("div"); - trigger.className = "popupTriggerArea"; + trigger.classList.add("popupTriggerArea"); container.append(trigger); } const popupElement = new PopupElement({ @@ -12262,7 +12468,7 @@ class AnnotationElement { } _renderQuadrilaterals(className) { for (const quadrilateral of this.quadrilaterals) { - quadrilateral.className = className; + quadrilateral.classList.add(className); } return this.quadrilaterals; } @@ -12372,7 +12578,7 @@ class LinkAnnotationElement extends AnnotationElement { return quadrilateral; }); } - this.container.className = "linkAnnotation"; + this.container.classList.add("linkAnnotation"); if (isBound) { this.container.append(link); } @@ -12552,7 +12758,7 @@ class TextAnnotationElement extends AnnotationElement { }); } render() { - this.container.className = "textAnnotation"; + this.container.classList.add("textAnnotation"); const image = document.createElement("img"); image.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg"; image.alt = "[{{type}} Annotation]"; @@ -12674,7 +12880,7 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement { render() { const storage = this.annotationStorage; const id = this.data.id; - this.container.className = "textWidgetAnnotation"; + this.container.classList.add("textWidgetAnnotation"); let element = null; if (this.renderForms) { const storedData = storage.getValue(id, { @@ -12968,7 +13174,7 @@ class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement { value }); } - this.container.className = "buttonWidgetAnnotation checkBox"; + this.container.classList.add("buttonWidgetAnnotation", "checkBox"); const element = document.createElement("input"); GetElementsByNameSet.add(element); element.setAttribute("data-element-id", id); @@ -13030,7 +13236,7 @@ class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement { }); } render() { - this.container.className = "buttonWidgetAnnotation radioButton"; + this.container.classList.add("buttonWidgetAnnotation", "radioButton"); const storage = this.annotationStorage; const data = this.data; const id = data.id; @@ -13107,7 +13313,7 @@ class PushButtonWidgetAnnotationElement extends LinkAnnotationElement { } render() { const container = super.render(); - container.className = "buttonWidgetAnnotation pushButton"; + container.classList.add("buttonWidgetAnnotation", "pushButton"); if (this.data.alternativeText) { container.title = this.data.alternativeText; } @@ -13128,7 +13334,7 @@ class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { }); } render() { - this.container.className = "choiceWidgetAnnotation"; + this.container.classList.add("choiceWidgetAnnotation"); const storage = this.annotationStorage; const id = this.data.id; const storedData = storage.getValue(id, { @@ -13355,7 +13561,7 @@ class PopupAnnotationElement extends AnnotationElement { }); } render() { - this.container.className = "popupAnnotation"; + this.container.classList.add("popupAnnotation"); const parentElements = this.layer.querySelectorAll(`[data-annotation-id="${this.data.parentId}"]`); if (parentElements.length === 0) { return this.container; @@ -13400,11 +13606,11 @@ class PopupElement { render() { const BACKGROUND_ENLIGHT = 0.7; const wrapper = document.createElement("div"); - wrapper.className = "popupWrapper"; + wrapper.classList.add("popupWrapper"); this.hideElement = this.hideWrapper ? wrapper : this.container; this.hideElement.hidden = true; const popup = document.createElement("div"); - popup.className = "popup"; + popup.classList.add("popup"); const color = this.color; if (color) { const r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0]; @@ -13419,7 +13625,7 @@ class PopupElement { const dateObject = _display_utils.PDFDateString.toDateObject(this.modificationDate); if (dateObject) { const modificationDate = document.createElement("span"); - modificationDate.className = "popupDate"; + modificationDate.classList.add("popupDate"); modificationDate.textContent = "{{date}}, {{time}}"; modificationDate.dataset.l10nId = "annotation_date_string"; modificationDate.dataset.l10nArgs = JSON.stringify({ @@ -13434,7 +13640,7 @@ class PopupElement { intent: "richText", div: popup }); - popup.lastChild.className = "richText popupContent"; + popup.lastChild.classList.add("richText", "popupContent"); } else { const contents = this._formatContents(this.contentsObj); popup.append(contents); @@ -13456,7 +13662,7 @@ class PopupElement { dir }) { const p = document.createElement("p"); - p.className = "popupContent"; + p.classList.add("popupContent"); p.dir = dir; const lines = str.split(/(?:\r\n?|\n)/); for (let i = 0, ii = lines.length; i < ii; ++i) { @@ -13504,10 +13710,10 @@ class FreeTextAnnotationElement extends AnnotationElement { this.textContent = parameters.data.textContent; } render() { - this.container.className = "freeTextAnnotation"; + this.container.classList.add("freeTextAnnotation"); if (this.textContent) { const content = document.createElement("div"); - content.className = "annotationTextContent"; + content.classList.add("annotationTextContent"); content.setAttribute("role", "comment"); for (const line of this.textContent) { const lineSpan = document.createElement("span"); @@ -13531,7 +13737,7 @@ class LineAnnotationElement extends AnnotationElement { }); } render() { - this.container.className = "lineAnnotation"; + this.container.classList.add("lineAnnotation"); const data = this.data; const { width, @@ -13561,7 +13767,7 @@ class SquareAnnotationElement extends AnnotationElement { }); } render() { - this.container.className = "squareAnnotation"; + this.container.classList.add("squareAnnotation"); const data = this.data; const { width, @@ -13592,7 +13798,7 @@ class CircleAnnotationElement extends AnnotationElement { }); } render() { - this.container.className = "circleAnnotation"; + this.container.classList.add("circleAnnotation"); const data = this.data; const { width, @@ -13625,7 +13831,7 @@ class PolylineAnnotationElement extends AnnotationElement { this.svgElementName = "svg:polyline"; } render() { - this.container.className = this.containerClassName; + this.container.classList.add(this.containerClassName); const data = this.data; const { width, @@ -13666,7 +13872,7 @@ class CaretAnnotationElement extends AnnotationElement { }); } render() { - this.container.className = "caretAnnotation"; + this.container.classList.add("caretAnnotation"); if (!this.data.hasPopup) { this._createPopup(null, this.data); } @@ -13684,7 +13890,7 @@ class InkAnnotationElement extends AnnotationElement { this.svgElementName = "svg:polyline"; } render() { - this.container.className = this.containerClassName; + this.container.classList.add(this.containerClassName); const data = this.data; const { width, @@ -13727,7 +13933,7 @@ class HighlightAnnotationElement extends AnnotationElement { if (this.quadrilaterals) { return this._renderQuadrilaterals("highlightAnnotation"); } - this.container.className = "highlightAnnotation"; + this.container.classList.add("highlightAnnotation"); return this.container; } } @@ -13747,7 +13953,7 @@ class UnderlineAnnotationElement extends AnnotationElement { if (this.quadrilaterals) { return this._renderQuadrilaterals("underlineAnnotation"); } - this.container.className = "underlineAnnotation"; + this.container.classList.add("underlineAnnotation"); return this.container; } } @@ -13767,7 +13973,7 @@ class SquigglyAnnotationElement extends AnnotationElement { if (this.quadrilaterals) { return this._renderQuadrilaterals("squigglyAnnotation"); } - this.container.className = "squigglyAnnotation"; + this.container.classList.add("squigglyAnnotation"); return this.container; } } @@ -13787,7 +13993,7 @@ class StrikeOutAnnotationElement extends AnnotationElement { if (this.quadrilaterals) { return this._renderQuadrilaterals("strikeoutAnnotation"); } - this.container.className = "strikeoutAnnotation"; + this.container.classList.add("strikeoutAnnotation"); return this.container; } } @@ -13800,7 +14006,7 @@ class StampAnnotationElement extends AnnotationElement { }); } render() { - this.container.className = "stampAnnotation"; + this.container.classList.add("stampAnnotation"); if (!this.data.hasPopup) { this._createPopup(null, this.data); } @@ -13825,7 +14031,7 @@ class FileAttachmentAnnotationElement extends AnnotationElement { }); } render() { - this.container.className = "fileAttachmentAnnotation"; + this.container.classList.add("fileAttachmentAnnotation"); let trigger; if (this.data.hasAppearance) { trigger = document.createElement("div"); @@ -13833,7 +14039,7 @@ class FileAttachmentAnnotationElement extends AnnotationElement { trigger = document.createElement("img"); trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(this.data.name) ? "paperclip" : "pushpin"}.svg`; } - trigger.className = "popupTriggerArea"; + trigger.classList.add("popupTriggerArea"); trigger.addEventListener("dblclick", this._download.bind(this)); if (!this.data.hasPopup && (this.data.titleObj?.str || this.data.contentsObj?.str || this.data.richText)) { this._createPopup(trigger, this.data); @@ -13877,6 +14083,9 @@ class AnnotationLayer { }; let zIndex = 0; for (const data of annotations) { + if (data.noHTML) { + continue; + } if (data.annotationType !== _util.AnnotationType.POPUP) { const { width, @@ -15651,12 +15860,6 @@ Object.defineProperty(exports, "SVGGraphics", ({ return _svg.SVGGraphics; } })); -Object.defineProperty(exports, "UNSUPPORTED_FEATURES", ({ - enumerable: true, - get: function () { - return _util.UNSUPPORTED_FEATURES; - } -})); Object.defineProperty(exports, "UnexpectedResponseException", ({ enumerable: true, get: function () { @@ -15781,8 +15984,8 @@ var _annotation_layer = __w_pdfjs_require__(32); var _worker_options = __w_pdfjs_require__(14); var _svg = __w_pdfjs_require__(35); var _xfa_layer = __w_pdfjs_require__(34); -const pdfjsVersion = '3.4.120'; -const pdfjsBuild = 'af6414988'; +const pdfjsVersion = '3.5.141'; +const pdfjsBuild = 'be0f6ee08'; })(); /******/ return __webpack_exports__; diff --git a/app/stage/protyle/js/pdf/pdf.worker.js b/app/stage/protyle/js/pdf/pdf.worker.js index d7dc73ac1..7e88aa550 100644 --- a/app/stage/protyle/js/pdf/pdf.worker.js +++ b/app/stage/protyle/js/pdf/pdf.worker.js @@ -47,11 +47,11 @@ var _util = __w_pdfjs_require__(2); var _core_utils = __w_pdfjs_require__(3); var _primitives = __w_pdfjs_require__(4); var _pdf_manager = __w_pdfjs_require__(6); -var _cleanup_helper = __w_pdfjs_require__(69); -var _writer = __w_pdfjs_require__(63); -var _is_node = __w_pdfjs_require__(100); -var _message_handler = __w_pdfjs_require__(101); -var _worker_stream = __w_pdfjs_require__(102); +var _cleanup_helper = __w_pdfjs_require__(70); +var _writer = __w_pdfjs_require__(64); +var _is_node = __w_pdfjs_require__(101); +var _message_handler = __w_pdfjs_require__(102); +var _worker_stream = __w_pdfjs_require__(103); class WorkerTask { constructor(name) { this.name = name; @@ -101,7 +101,7 @@ class WorkerMessageHandler { docId, apiVersion } = docParams; - const workerVersion = '3.4.120'; + const workerVersion = '3.5.141'; if (apiVersion !== workerVersion) { throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`); } @@ -112,8 +112,8 @@ class WorkerMessageHandler { if (enumerableProperties.length) { throw new Error("The `Array.prototype` contains unexpected enumerable properties: " + enumerableProperties.join(", ") + "; thus breaking e.g. `for...in` iteration of `Array`s."); } - if (typeof ReadableStream === "undefined") { - const partialMsg = "The browser/environment lacks native support for critical " + "functionality used by the PDF.js library (e.g. `ReadableStream`); "; + if (typeof Path2D === "undefined" || typeof ReadableStream === "undefined") { + const partialMsg = "The browser/environment lacks native support for critical " + "functionality used by the PDF.js library " + "(e.g. `Path2D` and/or `ReadableStream`); "; if (_is_node.isNodeJS) { throw new Error(partialMsg + "please use a `legacy`-build instead."); } @@ -496,6 +496,7 @@ class WorkerMessageHandler { } }); } + const lastXRefStreamPos = xref.lastXRefStreamPos; newXrefInfo = { rootRef: xref.trailer.getRaw("Root") || null, encryptRef: xref.trailer.getRaw("Encrypt") || null, @@ -503,7 +504,7 @@ class WorkerMessageHandler { infoRef: xref.trailer.getRaw("Info") || null, info: infoObj, fileIds: xref.trailer.get("ID") || null, - startXRef, + startXRef: lastXRefStreamPos === null ? startXRef : lastXRefStreamPos, filename }; } @@ -555,7 +556,10 @@ class WorkerMessageHandler { }); }); handler.on("GetTextContent", function (data, sink) { - const pageIndex = data.pageIndex; + const { + pageIndex, + includeMarkedContent + } = data; pdfManager.getPage(pageIndex).then(function (page) { const task = new WorkerTask("GetTextContent: page " + pageIndex); startWorkerTask(task); @@ -564,8 +568,7 @@ class WorkerMessageHandler { handler, task, sink, - includeMarkedContent: data.includeMarkedContent, - combineTextItems: data.combineTextItems + includeMarkedContent }).then(function () { finishWorkerTask(task); if (start) { @@ -644,7 +647,7 @@ if (typeof window === "undefined" && !_is_node.isNodeJS && typeof self !== "unde Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.VerbosityLevel = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.UNSUPPORTED_FEATURES = exports.TextRenderingMode = exports.RenderingIntentFlag = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.PageActionEventType = exports.OPS = exports.MissingPDFException = exports.LINE_FACTOR = exports.LINE_DESCENT_FACTOR = exports.InvalidPDFException = exports.ImageKind = exports.IDENTITY_MATRIX = exports.FormatError = exports.FeatureTest = exports.FONT_IDENTITY_MATRIX = exports.DocumentActionEventType = exports.CMapCompressionType = exports.BaseException = exports.BASELINE_FACTOR = exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = exports.AnnotationMode = exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationEditorType = exports.AnnotationEditorPrefix = exports.AnnotationEditorParamsType = exports.AnnotationBorderStyleType = exports.AnnotationActionEventType = exports.AbortException = void 0; +exports.VerbosityLevel = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.RenderingIntentFlag = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.PageActionEventType = exports.OPS = exports.MissingPDFException = exports.MAX_IMAGE_SIZE_TO_CACHE = exports.LINE_FACTOR = exports.LINE_DESCENT_FACTOR = exports.InvalidPDFException = exports.ImageKind = exports.IDENTITY_MATRIX = exports.FormatError = exports.FeatureTest = exports.FONT_IDENTITY_MATRIX = exports.DocumentActionEventType = exports.CMapCompressionType = exports.BaseException = exports.BASELINE_FACTOR = exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = exports.AnnotationMode = exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationEditorType = exports.AnnotationEditorPrefix = exports.AnnotationEditorParamsType = exports.AnnotationBorderStyleType = exports.AnnotationActionEventType = exports.AbortException = void 0; exports.assert = assert; exports.bytesToString = bytesToString; exports.createPromiseCapability = createPromiseCapability; @@ -670,6 +673,8 @@ const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; exports.IDENTITY_MATRIX = IDENTITY_MATRIX; const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX; +const MAX_IMAGE_SIZE_TO_CACHE = 10e6; +exports.MAX_IMAGE_SIZE_TO_CACHE = MAX_IMAGE_SIZE_TO_CACHE; const LINE_FACTOR = 1.35; exports.LINE_FACTOR = LINE_FACTOR; const LINE_DESCENT_FACTOR = 0.35; @@ -969,29 +974,6 @@ const OPS = { constructPath: 91 }; exports.OPS = OPS; -const UNSUPPORTED_FEATURES = { - forms: "forms", - javaScript: "javaScript", - signatures: "signatures", - smask: "smask", - shadingPattern: "shadingPattern", - errorTilingPattern: "errorTilingPattern", - errorExtGState: "errorExtGState", - errorXObject: "errorXObject", - errorFontLoadType3: "errorFontLoadType3", - errorFontState: "errorFontState", - errorFontMissing: "errorFontMissing", - errorFontTranslate: "errorFontTranslate", - errorColorSpace: "errorColorSpace", - errorOperatorList: "errorOperatorList", - errorFontToUnicode: "errorFontToUnicode", - errorFontLoadNative: "errorFontLoadNative", - errorFontBuildPath: "errorFontBuildPath", - errorFontGetPath: "errorFontGetPath", - errorMarkedContent: "errorMarkedContent", - errorContentSubStream: "errorContentSubStream" -}; -exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES; const PasswordResponses = { NEED_PASSWORD: 1, INCORRECT_PASSWORD: 2 @@ -1664,7 +1646,7 @@ function escapePDFName(str) { return buffer.join(""); } function escapeString(str) { - return str.replace(/([()\\\n\r])/g, match => { + return str.replaceAll(/([()\\\n\r])/g, match => { if (match === "\n") { return "\\n"; } else if (match === "\r") { @@ -1699,7 +1681,7 @@ function _collectJS(entry, xref, list, parents) { } else if (typeof js === "string") { code = js; } - code = code && (0, _util.stringToPDFString)(code).replace(/\u0000/g, ""); + code = code && (0, _util.stringToPDFString)(code).replaceAll("\x00", ""); if (code) { list.push(code); } @@ -1798,20 +1780,17 @@ function validateCSSFont(cssFontInfo) { fontWeight, italicAngle } = cssFontInfo; - if (/^".*"$/.test(fontFamily)) { - if (/[^\\]"/.test(fontFamily.slice(1, fontFamily.length - 1))) { - (0, _util.warn)(`XFA - FontFamily contains some unescaped ": ${fontFamily}.`); - return false; - } - } else if (/^'.*'$/.test(fontFamily)) { - if (/[^\\]'/.test(fontFamily.slice(1, fontFamily.length - 1))) { - (0, _util.warn)(`XFA - FontFamily contains some unescaped ': ${fontFamily}.`); + const m = /^("|').*("|')$/.exec(fontFamily); + if (m && m[1] === m[2]) { + const re = new RegExp(`[^\\\\]${m[1]}`); + if (re.test(fontFamily.slice(1, -1))) { + (0, _util.warn)(`XFA - FontFamily contains unescaped ${m[1]}: ${fontFamily}.`); return false; } } else { for (const ident of fontFamily.split(/[ \t]+/)) { if (/^(\d|(-(\d|-)))/.test(ident) || !/^[\w-\\]+$/.test(ident)) { - (0, _util.warn)(`XFA - FontFamily contains some invalid : ${fontFamily}.`); + (0, _util.warn)(`XFA - FontFamily contains invalid : ${fontFamily}.`); return false; } } @@ -1824,7 +1803,7 @@ function validateCSSFont(cssFontInfo) { } function recoverJsURL(str) { const URL_OPEN_METHODS = ["app.launchURL", "window.open", "xfa.host.gotoURL"]; - const regex = new RegExp("^\\s*(" + URL_OPEN_METHODS.join("|").split(".").join("\\.") + ")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i"); + const regex = new RegExp("^\\s*(" + URL_OPEN_METHODS.join("|").replaceAll(".", "\\.") + ")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i"); const jsUrl = regex.exec(str); if (jsUrl && jsUrl[2]) { const url = jsUrl[2]; @@ -2299,6 +2278,7 @@ class BasePdfManager { this._docId = args.docId; this._password = args.password; this.enableXfa = args.enableXfa; + args.evaluatorOptions.isOffscreenCanvasSupported = args.evaluatorOptions.isOffscreenCanvasSupported && _util.FeatureTest.isOffscreenCanvasSupported; this.evaluatorOptions = args.evaluatorOptions; } get docId() { @@ -2959,22 +2939,22 @@ var _annotation = __w_pdfjs_require__(10); var _util = __w_pdfjs_require__(2); var _core_utils = __w_pdfjs_require__(3); var _primitives = __w_pdfjs_require__(4); -var _xfa_fonts = __w_pdfjs_require__(49); +var _xfa_fonts = __w_pdfjs_require__(50); var _base_stream = __w_pdfjs_require__(5); -var _crypto = __w_pdfjs_require__(65); -var _catalog = __w_pdfjs_require__(67); -var _cleanup_helper = __w_pdfjs_require__(69); -var _dataset_reader = __w_pdfjs_require__(98); +var _crypto = __w_pdfjs_require__(66); +var _catalog = __w_pdfjs_require__(68); +var _cleanup_helper = __w_pdfjs_require__(70); +var _dataset_reader = __w_pdfjs_require__(99); var _parser = __w_pdfjs_require__(15); var _stream = __w_pdfjs_require__(8); -var _object_loader = __w_pdfjs_require__(73); -var _operator_list = __w_pdfjs_require__(60); +var _object_loader = __w_pdfjs_require__(74); +var _operator_list = __w_pdfjs_require__(62); var _evaluator = __w_pdfjs_require__(13); var _decode_stream = __w_pdfjs_require__(17); -var _struct_tree = __w_pdfjs_require__(72); -var _writer = __w_pdfjs_require__(63); -var _factory = __w_pdfjs_require__(74); -var _xref = __w_pdfjs_require__(99); +var _struct_tree = __w_pdfjs_require__(73); +var _writer = __w_pdfjs_require__(64); +var _factory = __w_pdfjs_require__(75); +var _xref = __w_pdfjs_require__(100); const DEFAULT_USER_UNIT = 1.0; const LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; class Page { @@ -3094,23 +3074,20 @@ class Page { } return (0, _util.shadow)(this, "rotate", rotate); } - _onSubStreamError(handler, reason, objId) { + _onSubStreamError(reason, objId) { if (this.evaluatorOptions.ignoreErrors) { - handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.errorContentSubStream - }); (0, _util.warn)(`getContentStream - ignoring sub-stream (${objId}): "${reason}".`); return; } throw reason; } - getContentStream(handler) { + getContentStream() { return this.pdfManager.ensure(this, "content").then(content => { if (content instanceof _base_stream.BaseStream) { return content; } if (Array.isArray(content)) { - return new _decode_stream.StreamsSequenceStream(content, this._onSubStreamError.bind(this, handler)); + return new _decode_stream.StreamsSequenceStream(content, this._onSubStreamError.bind(this)); } return new _stream.NullStream(); }); @@ -3206,7 +3183,7 @@ class Page { cacheKey, annotationStorage = null }) { - const contentStreamPromise = this.getContentStream(handler); + const contentStreamPromise = this.getContentStream(); const resourcesPromise = this.loadResources(["ColorSpace", "ExtGState", "Font", "Pattern", "Properties", "Shading", "XObject"]); const partialEvaluator = new _evaluator.PartialEvaluator({ xref: this.xref, @@ -3301,10 +3278,9 @@ class Page { handler, task, includeMarkedContent, - sink, - combineTextItems + sink }) { - const contentStreamPromise = this.getContentStream(handler); + const contentStreamPromise = this.getContentStream(); const resourcesPromise = this.loadResources(["ExtGState", "Font", "Properties", "XObject"]); const dataPromises = Promise.all([contentStreamPromise, resourcesPromise]); return dataPromises.then(([contentStream]) => { @@ -3324,7 +3300,6 @@ class Page { task, resources: this.resources, includeMarkedContent, - combineTextItems, sink, viewBox: this.view }); @@ -3777,7 +3752,7 @@ class PDFDocument { continue; } let fontFamily = descriptor.get("FontFamily"); - fontFamily = fontFamily.replace(/[ ]+(\d)/g, "$1"); + fontFamily = fontFamily.replaceAll(/[ ]+(\d)/g, "$1"); const fontWeight = descriptor.get("FontWeight"); const italicAngle = -descriptor.get("ItalicAngle"); const cssFontInfo = { @@ -4229,16 +4204,16 @@ var _util = __w_pdfjs_require__(2); var _core_utils = __w_pdfjs_require__(3); var _default_appearance = __w_pdfjs_require__(11); var _primitives = __w_pdfjs_require__(4); -var _writer = __w_pdfjs_require__(63); +var _writer = __w_pdfjs_require__(64); var _base_stream = __w_pdfjs_require__(5); -var _bidi = __w_pdfjs_require__(58); -var _catalog = __w_pdfjs_require__(67); +var _bidi = __w_pdfjs_require__(59); +var _catalog = __w_pdfjs_require__(68); var _colorspace = __w_pdfjs_require__(12); -var _file_spec = __w_pdfjs_require__(70); -var _object_loader = __w_pdfjs_require__(73); -var _operator_list = __w_pdfjs_require__(60); +var _file_spec = __w_pdfjs_require__(71); +var _object_loader = __w_pdfjs_require__(74); +var _operator_list = __w_pdfjs_require__(62); var _stream = __w_pdfjs_require__(8); -var _factory = __w_pdfjs_require__(74); +var _factory = __w_pdfjs_require__(75); class AnnotationFactory { static create(xref, ref, pdfManager, idFactory, collectFields) { return Promise.all([pdfManager.ensureCatalog("acroForm"), pdfManager.ensureCatalog("baseUrl"), pdfManager.ensureCatalog("attachments"), pdfManager.ensureDoc("xfaDatasets"), collectFields ? this._getPageIndex(xref, ref, pdfManager) : -1]).then(([acroForm, baseUrl, attachments, xfaDatasets, pageIndex]) => pdfManager.ensure(this, "_create", [xref, ref, pdfManager, idFactory, acroForm, attachments, xfaDatasets, collectFields, pageIndex])); @@ -4265,7 +4240,7 @@ class AnnotationFactory { collectFields, needAppearances: !collectFields && acroFormDict.get("NeedAppearances") === true, pageIndex, - isOffscreenCanvasSupported: _util.FeatureTest.isOffscreenCanvasSupported && pdfManager.evaluatorOptions.isOffscreenCanvasSupported + isOffscreenCanvasSupported: pdfManager.evaluatorOptions.isOffscreenCanvasSupported }; switch (subtype) { case "Link": @@ -4390,8 +4365,10 @@ class AnnotationFactory { return null; } const xref = evaluator.xref; + const { + isOffscreenCanvasSupported + } = evaluator.options; const promises = []; - const isOffscreenCanvasSupported = _util.FeatureTest.isOffscreenCanvasSupported && evaluator.options.isOffscreenCanvasSupported; for (const annotation of annotations) { switch (annotation.annotationType) { case _util.AnnotationEditorType.FREETEXT: @@ -4505,6 +4482,8 @@ class Annotation { if (this.appearance) { this._streams.push(this.appearance); } + const isLocked = !!(this.flags & _util.AnnotationFlag.LOCKED); + const isContentLocked = !!(this.flags & _util.AnnotationFlag.LOCKEDCONTENTS); this.data = { annotationFlags: this.flags, borderStyle: this.borderStyle, @@ -4518,7 +4497,9 @@ class Annotation { modificationDate: this.modificationDate, rect: this.rectangle, subtype: params.subtype, - hasOwnCanvas: false + hasOwnCanvas: false, + noRotate: !!(this.flags & _util.AnnotationFlag.NOROTATE), + noHTML: isLocked && isContentLocked }; if (params.collectFields) { const kids = dict.get("Kids"); @@ -4820,7 +4801,6 @@ class Annotation { task, resources, includeMarkedContent: true, - combineTextItems: true, sink, viewBox }); @@ -5268,7 +5248,7 @@ class WidgetAnnotation extends Annotation { return str; } async getOperatorList(evaluator, task, intent, renderForms, annotationStorage) { - if (renderForms && !(this instanceof SignatureWidgetAnnotation)) { + if (renderForms && !(this instanceof SignatureWidgetAnnotation) && !this.data.noHTML) { return { opList: new _operator_list.OperatorList(), separateForm: true, @@ -6382,6 +6362,7 @@ class SignatureWidgetAnnotation extends WidgetAnnotation { constructor(params) { super(params); this.data.fieldValue = null; + this.data.hasOwnCanvas = this.data.noRotate; } getFieldObject() { return { @@ -6396,6 +6377,8 @@ class TextAnnotation extends MarkupAnnotation { constructor(params) { const DEFAULT_ICON_SIZE = 22; super(params); + this.data.noRotate = true; + this.data.hasOwnCanvas = this.data.noRotate; const { dict } = params; @@ -6490,6 +6473,7 @@ exports.PopupAnnotation = PopupAnnotation; class FreeTextAnnotation extends MarkupAnnotation { constructor(params) { super(params); + this.data.hasOwnCanvas = this.data.noRotate; const { xref } = params; @@ -6642,6 +6626,7 @@ class LineAnnotation extends MarkupAnnotation { xref } = params; this.data.annotationType = _util.AnnotationType.LINE; + this.data.hasOwnCanvas = this.data.noRotate; const lineCoordinates = dict.getArray("L"); this.data.lineCoordinates = _util.Util.normalizeRect(lineCoordinates); this.setLineEndings(dict.getArray("LE")); @@ -6681,6 +6666,7 @@ class SquareAnnotation extends MarkupAnnotation { xref } = params; this.data.annotationType = _util.AnnotationType.SQUARE; + this.data.hasOwnCanvas = this.data.noRotate; if (!this.appearance) { const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; const strokeAlpha = dict.get("CA"); @@ -6768,6 +6754,7 @@ class PolylineAnnotation extends MarkupAnnotation { xref } = params; this.data.annotationType = _util.AnnotationType.POLYLINE; + this.data.hasOwnCanvas = this.data.noRotate; this.data.vertices = []; if (!(this instanceof PolygonAnnotation)) { this.setLineEndings(dict.getArray("LE")); @@ -6830,6 +6817,7 @@ class CaretAnnotation extends MarkupAnnotation { class InkAnnotation extends MarkupAnnotation { constructor(params) { super(params); + this.data.hasOwnCanvas = this.data.noRotate; const { dict, xref @@ -7103,6 +7091,7 @@ class StampAnnotation extends MarkupAnnotation { constructor(params) { super(params); this.data.annotationType = _util.AnnotationType.STAMP; + this.data.hasOwnCanvas = this.data.noRotate; } } class FileAttachmentAnnotation extends MarkupAnnotation { @@ -7114,6 +7103,7 @@ class FileAttachmentAnnotation extends MarkupAnnotation { } = params; const file = new _file_spec.FileSpec(dict.get("FS"), xref); this.data.annotationType = _util.AnnotationType.FILEATTACHMENT; + this.data.hasOwnCanvas = this.data.noRotate; this.data.file = file.serializable; const name = dict.get("Name"); this.data.name = name instanceof _primitives.Name ? (0, _util.stringToPDFString)(name.name) : "PushPin"; @@ -8301,34 +8291,36 @@ exports.PartialEvaluator = exports.EvaluatorPreprocessor = void 0; var _util = __w_pdfjs_require__(2); var _cmap = __w_pdfjs_require__(14); var _primitives = __w_pdfjs_require__(4); -var _fonts = __w_pdfjs_require__(32); -var _encodings = __w_pdfjs_require__(35); -var _standard_fonts = __w_pdfjs_require__(39); -var _pattern = __w_pdfjs_require__(48); -var _xfa_fonts = __w_pdfjs_require__(49); -var _to_unicode_map = __w_pdfjs_require__(40); -var _function = __w_pdfjs_require__(55); +var _fonts = __w_pdfjs_require__(33); +var _encodings = __w_pdfjs_require__(36); +var _standard_fonts = __w_pdfjs_require__(40); +var _pattern = __w_pdfjs_require__(49); +var _xfa_fonts = __w_pdfjs_require__(50); +var _to_unicode_map = __w_pdfjs_require__(41); +var _function = __w_pdfjs_require__(56); var _parser = __w_pdfjs_require__(15); -var _image_utils = __w_pdfjs_require__(57); +var _image_utils = __w_pdfjs_require__(58); var _stream = __w_pdfjs_require__(8); var _base_stream = __w_pdfjs_require__(5); -var _bidi = __w_pdfjs_require__(58); +var _bidi = __w_pdfjs_require__(59); var _colorspace = __w_pdfjs_require__(12); var _decode_stream = __w_pdfjs_require__(17); -var _fonts_utils = __w_pdfjs_require__(36); -var _glyphlist = __w_pdfjs_require__(37); +var _fonts_utils = __w_pdfjs_require__(37); +var _glyphlist = __w_pdfjs_require__(38); var _core_utils = __w_pdfjs_require__(3); -var _metrics = __w_pdfjs_require__(43); -var _unicode = __w_pdfjs_require__(38); -var _murmurhash = __w_pdfjs_require__(59); -var _operator_list = __w_pdfjs_require__(60); -var _image = __w_pdfjs_require__(61); +var _metrics = __w_pdfjs_require__(44); +var _unicode = __w_pdfjs_require__(39); +var _image_resizer = __w_pdfjs_require__(60); +var _murmurhash = __w_pdfjs_require__(61); +var _operator_list = __w_pdfjs_require__(62); +var _image = __w_pdfjs_require__(63); const DefaultPartialEvaluatorOptions = Object.freeze({ maxImageSize: -1, disableFontFace: false, ignoreErrors: false, isEvalSupported: true, - isOffscreenCanvasSupported: true, + isOffscreenCanvasSupported: false, + canvasMaxAreaInBytes: -1, fontExtraProperties: false, useSystemFonts: true, cMapUrl: null, @@ -8448,6 +8440,7 @@ class PartialEvaluator { this.options = options || DefaultPartialEvaluatorOptions; this.parsingType3Font = false; this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this); + _image_resizer.ImageResizer.setMaxArea(this.options.canvasMaxAreaInBytes); } get _pdfFunctionFactory() { const pdfFunctionFactory = new _function.PDFFunctionFactory({ @@ -8747,7 +8740,7 @@ class PartialEvaluator { } return; } - imgData = _image.PDFImage.createMask({ + imgData = await _image.PDFImage.createMask({ imgArray, width: w, height: h, @@ -8799,7 +8792,8 @@ class PartialEvaluator { pdfFunctionFactory: this._pdfFunctionFactory, localColorSpaceCache }); - imgData = imageObj.createImageData(true); + imgData = await imageObj.createImageData(true, false); + operatorList.isOffscreenCanvasSupported = this.options.isOffscreenCanvasSupported; operatorList.addImageOps(_util.OPS.paintInlineImageXObject, [imgData], optionalContent); return; } @@ -8822,10 +8816,16 @@ class PartialEvaluator { isInline, pdfFunctionFactory: this._pdfFunctionFactory, localColorSpaceCache - }).then(imageObj => { - imgData = imageObj.createImageData(false); + }).then(async imageObj => { + imgData = await imageObj.createImageData(false, this.options.isOffscreenCanvasSupported); if (cacheKey && imageRef && cacheGlobally) { - this.globalImageCache.addByteSize(imageRef, imgData.data.length); + let length = 0; + if (imgData.bitmap) { + length = imgData.width * imgData.height * 4; + } else { + length = imgData.data.length; + } + this.globalImageCache.addByteSize(imageRef, length); } return this._sendImgData(objId, imgData, cacheGlobally); }).catch(reason => { @@ -8941,9 +8941,6 @@ class PartialEvaluator { return; } if (this.options.ignoreErrors) { - this.handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.errorTilingPattern - }); (0, _util.warn)(`handleTilingType - ignoring pattern: "${reason}".`); return; } @@ -8960,9 +8957,6 @@ class PartialEvaluator { operatorList.addDependencies(translated.type3Dependencies); return translated; }).catch(reason => { - this.handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.errorFontLoadType3 - }); return new TranslatedFont({ loadedName: "g_font_error", font: new _fonts.ErrorFont(`Type3 font load error: ${reason}`), @@ -8993,9 +8987,6 @@ class PartialEvaluator { } const reason = new _util.FormatError("Missing setFont (Tf) operator before text rendering operator."); if (this.options.ignoreErrors) { - this.handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.errorFontState - }); (0, _util.warn)(`ensureStateFont: "${reason}".`); return; } @@ -9118,9 +9109,6 @@ class PartialEvaluator { (0, _util.warn)(`${partialMsg}.`); return errorFont(); } - this.handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.errorFontMissing - }); (0, _util.warn)(`${partialMsg} -- attempting to fallback to a default font.`); if (fallbackFontDict) { fontRef = fallbackFontDict; @@ -9199,9 +9187,6 @@ class PartialEvaluator { evaluatorOptions: this.options })); }).catch(reason => { - this.handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.errorFontTranslate - }); (0, _util.warn)(`loadFont - translateFont failed: "${reason}".`); fontCapability.resolve(new TranslatedFont({ loadedName: font.loadedName, @@ -9281,9 +9266,6 @@ class PartialEvaluator { return null; } if (this.options.ignoreErrors) { - this.handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.errorColorSpace - }); (0, _util.warn)(`parseColorSpace - ignoring ColorSpace: "${reason}".`); return null; } @@ -9298,11 +9280,18 @@ class PartialEvaluator { }) { let id = localShadingPatternCache.get(shading); if (!id) { - var shadingFill = _pattern.Pattern.parseShading(shading, this.xref, resources, this.handler, this._pdfFunctionFactory, localColorSpaceCache); + var shadingFill = _pattern.Pattern.parseShading(shading, this.xref, resources, this._pdfFunctionFactory, localColorSpaceCache); const patternIR = shadingFill.getIR(); id = `pattern_${this.idFactory.createObjId()}`; + if (this.parsingType3Font) { + id = `${this.idFactory.getDocId()}_type3_${id}`; + } localShadingPatternCache.set(shading, id); - this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]); + if (this.parsingType3Font) { + this.handler.send("commonobj", [id, "Pattern", patternIR]); + } else { + this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]); + } } return id; } @@ -9552,9 +9541,6 @@ class PartialEvaluator { return; } if (self.options.ignoreErrors) { - self.handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.errorXObject - }); (0, _util.warn)(`getOperatorList - ignoring XObject: "${reason}".`); return; } @@ -9792,9 +9778,6 @@ class PartialEvaluator { return; } if (self.options.ignoreErrors) { - self.handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.errorExtGState - }); (0, _util.warn)(`getOperatorList - ignoring ExtGState: "${reason}".`); return; } @@ -9828,9 +9811,6 @@ class PartialEvaluator { return; } if (self.options.ignoreErrors) { - self.handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.errorMarkedContent - }); (0, _util.warn)(`getOperatorList - ignoring beginMarkedContentProps: "${reason}".`); return; } @@ -9868,9 +9848,6 @@ class PartialEvaluator { return; } if (this.options.ignoreErrors) { - this.handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.errorOperatorList - }); (0, _util.warn)(`getOperatorList - ignoring errors during "${task.name}" ` + `task: "${reason}".`); closePendingRestoreOPS(); return; @@ -9883,7 +9860,6 @@ class PartialEvaluator { task, resources, stateManager = null, - combineTextItems = false, includeMarkedContent = false, sink, seenStyles = new Set(), @@ -9933,11 +9909,12 @@ class PartialEvaluator { twoLastChars[0] = twoLastChars[1] = " "; twoLastCharsPos = 0; } - const TRACKING_SPACE_FACTOR = 0.1; + const TRACKING_SPACE_FACTOR = 0.102; const NOT_A_SPACE_FACTOR = 0.03; const NEGATIVE_SPACE_FACTOR = -0.2; - const SPACE_IN_FLOW_MIN_FACTOR = 0.1; + const SPACE_IN_FLOW_MIN_FACTOR = 0.102; const SPACE_IN_FLOW_MAX_FACTOR = 0.6; + const VERTICAL_SHIFT_RATIO = 0.25; const self = this; const xref = this.xref; const showSpacedTextBuffer = []; @@ -9988,11 +9965,14 @@ class PartialEvaluator { const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]); const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]); textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; - textContentItem.trackingSpaceMin = textState.fontSize * TRACKING_SPACE_FACTOR; - textContentItem.notASpace = textState.fontSize * NOT_A_SPACE_FACTOR; - textContentItem.negativeSpaceMax = textState.fontSize * NEGATIVE_SPACE_FACTOR; - textContentItem.spaceInFlowMin = textState.fontSize * SPACE_IN_FLOW_MIN_FACTOR; - textContentItem.spaceInFlowMax = textState.fontSize * SPACE_IN_FLOW_MAX_FACTOR; + const { + fontSize + } = textState; + textContentItem.trackingSpaceMin = fontSize * TRACKING_SPACE_FACTOR; + textContentItem.notASpace = fontSize * NOT_A_SPACE_FACTOR; + textContentItem.negativeSpaceMax = fontSize * NEGATIVE_SPACE_FACTOR; + textContentItem.spaceInFlowMin = fontSize * SPACE_IN_FLOW_MIN_FACTOR; + textContentItem.spaceInFlowMax = fontSize * SPACE_IN_FLOW_MAX_FACTOR; textContentItem.hasEOL = false; textContentItem.initialized = true; return textContentItem; @@ -10056,7 +10036,7 @@ class PartialEvaluator { if (shiftedX < 0 || shiftedX > viewBox[2] || shiftedY < 0 || shiftedY > viewBox[3]) { return false; } - if (!combineTextItems || !textState.font || !textContentItem.prevTransform) { + if (!textState.font || !textContentItem.prevTransform) { return true; } let lastPosX = textContentItem.prevTransform[4]; @@ -10126,6 +10106,9 @@ class PartialEvaluator { textContentItem.height += advanceY; } } + if (Math.abs(advanceX) > textContentItem.width * VERTICAL_SHIFT_RATIO) { + flushTextContentItem(); + } return true; } const advanceX = (posX - lastPosX) / textContentItem.textAdvanceScale; @@ -10165,6 +10148,9 @@ class PartialEvaluator { textContentItem.width += advanceX; } } + if (Math.abs(advanceY) > textContentItem.height * VERTICAL_SHIFT_RATIO) { + flushTextContentItem(); + } return true; } function buildTextContentItem({ @@ -10517,7 +10503,6 @@ class PartialEvaluator { task, resources: xobj.dict.get("Resources") || resources, stateManager: xObjStateManager, - combineTextItems, includeMarkedContent, sink: sinkWrapper, seenStyles, @@ -10794,6 +10779,15 @@ class PartialEvaluator { code = unicode; } break; + default: + switch (glyphName) { + case "f_h": + case "f_t": + case "T_h": + toUnicode[charcode] = glyphName.replaceAll("_", ""); + continue; + } + break; } if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) { if (baseEncodingName && code === +charcode) { @@ -10830,14 +10824,19 @@ class PartialEvaluator { fetchBuiltInCMap: this._fetchBuiltInCMapBound, useCMap: null }); - const toUnicode = []; + const toUnicode = [], + buf = []; properties.cMap.forEach(function (charcode, cid) { if (cid > 0xffff) { throw new _util.FormatError("Max size of CID is 65,535"); } const ucs2 = ucs2CMap.lookup(cid); if (ucs2) { - toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) + ucs2.charCodeAt(1)); + buf.length = 0; + for (let i = 0, ii = ucs2.length; i < ii; i += 2) { + buf.push((ucs2.charCodeAt(i) << 8) + ucs2.charCodeAt(i + 1)); + } + toUnicode[charcode] = String.fromCharCode(...buf); } }); return new _to_unicode_map.ToUnicodeMap(toUnicode); @@ -10893,9 +10892,6 @@ class PartialEvaluator { return null; } if (this.options.ignoreErrors) { - this.handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.errorFontToUnicode - }); (0, _util.warn)(`readToUnicode - ignoring ToUnicode data: "${reason}".`); return null; } @@ -11190,7 +11186,7 @@ class PartialEvaluator { if (!(baseFontName instanceof _primitives.Name)) { throw new _util.FormatError("Base font is not specified"); } - baseFontName = baseFontName.name.replace(/[,_]/g, "-"); + baseFontName = baseFontName.name.replaceAll(/[,_]/g, "-"); const metrics = this.getBaseFontMetrics(baseFontName); const fontNameWoStyle = baseFontName.split("-")[0]; const flags = (this.isSerifFont(fontNameWoStyle) ? _fonts_utils.FontFlags.Serif : 0) | (metrics.monospace ? _fonts_utils.FontFlags.FixedPitch : 0) | ((0, _standard_fonts.getSymbolsFonts)()[fontNameWoStyle] ? _fonts_utils.FontFlags.Symbolic : _fonts_utils.FontFlags.Nonsymbolic); @@ -11353,9 +11349,6 @@ class PartialEvaluator { handler.send("commonobj", [glyphName, "FontPath", font.renderer.getPathJs(fontChar)]); } catch (reason) { if (evaluatorOptions.ignoreErrors) { - handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.errorFontBuildPath - }); (0, _util.warn)(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`); return; } @@ -12840,11 +12833,11 @@ var _ccitt_stream = __w_pdfjs_require__(19); var _flate_stream = __w_pdfjs_require__(21); var _jbig2_stream = __w_pdfjs_require__(22); var _jpeg_stream = __w_pdfjs_require__(25); -var _jpx_stream = __w_pdfjs_require__(27); -var _lzw_stream = __w_pdfjs_require__(29); +var _jpx_stream = __w_pdfjs_require__(28); +var _lzw_stream = __w_pdfjs_require__(30); var _stream = __w_pdfjs_require__(8); -var _predictor_stream = __w_pdfjs_require__(30); -var _run_length_stream = __w_pdfjs_require__(31); +var _predictor_stream = __w_pdfjs_require__(31); +var _run_length_stream = __w_pdfjs_require__(32); const MAX_LENGTH_TO_CACHE = 1000; function getInlineImageCacheKey(bytes) { const strBuf = [], @@ -17199,7 +17192,7 @@ class JpegStream extends _decode_stream.DecodeStream { colorTransform: undefined }; const decodeArr = this.dict.getArray("D", "Decode"); - if (this.forceRGB && Array.isArray(decodeArr)) { + if ((this.forceRGBA || this.forceRGB) && Array.isArray(decodeArr)) { const bitsPerComponent = this.dict.get("BPC", "BitsPerComponent") || 8; const decodeArrLength = decodeArr.length; const transform = new Int32Array(decodeArrLength); @@ -17227,6 +17220,7 @@ class JpegStream extends _decode_stream.DecodeStream { const data = jpegImage.getData({ width: this.drawWidth, height: this.drawHeight, + forceRGBA: this.forceRGBA, forceRGB: this.forceRGB, isSourcePDF: true }); @@ -17248,6 +17242,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.JpegImage = void 0; var _util = __w_pdfjs_require__(2); +var _image_utils = __w_pdfjs_require__(27); var _core_utils = __w_pdfjs_require__(3); class JpegError extends _util.BaseException { constructor(msg) { @@ -18191,6 +18186,18 @@ class JpegImage { } return data; } + _convertYccToRgba(data, out) { + for (let i = 0, j = 0, length = data.length; i < length; i += 3, j += 4) { + const Y = data[i]; + const Cb = data[i + 1]; + const Cr = data[i + 2]; + out[j] = Y - 179.456 + 1.402 * Cr; + out[j + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr; + out[j + 2] = Y - 226.816 + 1.772 * Cb; + out[j + 3] = 255; + } + return out; + } _convertYcckToRgb(data) { let Y, Cb, Cr, k; let offset = 0; @@ -18205,6 +18212,19 @@ class JpegImage { } return data.subarray(0, offset); } + _convertYcckToRgba(data) { + for (let i = 0, length = data.length; i < length; i += 4) { + const Y = data[i]; + const Cb = data[i + 1]; + const Cr = data[i + 2]; + const k = data[i + 3]; + data[i] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776); + data[i + 1] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665); + data[i + 2] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407); + data[i + 3] = 255; + } + return data; + } _convertYcckToCmyk(data) { let Y, Cb, Cr; for (let i = 0, length = data.length; i < length; i += 4) { @@ -18231,9 +18251,23 @@ class JpegImage { } return data.subarray(0, offset); } + _convertCmykToRgba(data) { + for (let i = 0, length = data.length; i < length; i += 4) { + const c = data[i]; + const m = data[i + 1]; + const y = data[i + 2]; + const k = data[i + 3]; + data[i] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m - 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * (-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * k + 0.7430659151342254); + data[i + 1] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 * y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.0003189131175883281 * k + 0.7364883807733168); + data[i + 2] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 * m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * (5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k + 0.7063770186160144); + data[i + 3] = 255; + } + return data; + } getData({ width, height, + forceRGBA = false, forceRGB = false, isSourcePDF = false }) { @@ -18241,23 +18275,37 @@ class JpegImage { throw new JpegError("Unsupported color mode"); } const data = this._getLinearizedBlockData(width, height, isSourcePDF); - if (this.numComponents === 1 && forceRGB) { - const rgbData = new Uint8ClampedArray(data.length * 3); + if (this.numComponents === 1 && (forceRGBA || forceRGB)) { + const len = data.length * (forceRGBA ? 4 : 3); + const rgbaData = new Uint8ClampedArray(len); let offset = 0; - for (const grayColor of data) { - rgbData[offset++] = grayColor; - rgbData[offset++] = grayColor; - rgbData[offset++] = grayColor; + if (forceRGBA) { + (0, _image_utils.grayToRGBA)(data, new Uint32Array(rgbaData.buffer)); + } else { + for (const grayColor of data) { + rgbaData[offset++] = grayColor; + rgbaData[offset++] = grayColor; + rgbaData[offset++] = grayColor; + } } - return rgbData; + return rgbaData; } else if (this.numComponents === 3 && this._isColorConversionNeeded) { + if (forceRGBA) { + const rgbaData = new Uint8ClampedArray(data.length / 3 * 4); + return this._convertYccToRgba(data, rgbaData); + } return this._convertYccToRgb(data); } else if (this.numComponents === 4) { if (this._isColorConversionNeeded) { + if (forceRGBA) { + return this._convertYcckToRgba(data); + } if (forceRGB) { return this._convertYcckToRgb(data); } return this._convertYcckToCmyk(data); + } else if (forceRGBA) { + return this._convertCmykToRgba(data); } else if (forceRGB) { return this._convertCmykToRgb(data); } @@ -18273,12 +18321,130 @@ exports.JpegImage = JpegImage; +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.convertBlackAndWhiteToRGBA = convertBlackAndWhiteToRGBA; +exports.convertToRGBA = convertToRGBA; +exports.grayToRGBA = grayToRGBA; +var _util = __w_pdfjs_require__(2); +function convertToRGBA(params) { + switch (params.kind) { + case _util.ImageKind.GRAYSCALE_1BPP: + return convertBlackAndWhiteToRGBA(params); + case _util.ImageKind.RGB_24BPP: + return convertRGBToRGBA(params); + } + return null; +} +function convertBlackAndWhiteToRGBA({ + src, + srcPos = 0, + dest, + width, + height, + nonBlackColor = 0xffffffff, + inverseDecode = false +}) { + const black = _util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const srcLength = src.length; + dest = new Uint32Array(dest.buffer); + let destPos = 0; + for (let i = 0; i < height; i++) { + for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { + const elem = srcPos < srcLength ? src[srcPos] : 255; + dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; j++) { + dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; + } + } + return { + srcPos, + destPos + }; +} +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height +}) { + let i = 0; + const len32 = src.length >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + if (_util.FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff000000; + dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000; + dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000; + dest[destPos + 3] = s3 >>> 8 | 0xff000000; + } + for (let j = i * 4, jj = src.length; j < jj; j += 3) { + dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff; + dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff; + dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff; + dest[destPos + 3] = s3 << 8 | 0xff; + } + for (let j = i * 4, jj = src.length; j < jj; j += 3) { + dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff; + } + } + return { + srcPos, + destPos + }; +} +function grayToRGBA(src, dest) { + if (_util.FeatureTest.isLittleEndian) { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x10101 | 0xff000000; + } + } else { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x1010100 | 0x000000ff; + } + } +} + +/***/ }), +/* 28 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + + + Object.defineProperty(exports, "__esModule", ({ value: true })); exports.JpxStream = void 0; var _decode_stream = __w_pdfjs_require__(17); -var _jpx = __w_pdfjs_require__(28); +var _jpx = __w_pdfjs_require__(29); var _util = __w_pdfjs_require__(2); class JpxStream extends _decode_stream.DecodeStream { constructor(stream, maybeLength, params) { @@ -18333,7 +18499,7 @@ class JpxStream extends _decode_stream.DecodeStream { exports.JpxStream = JpxStream; /***/ }), -/* 28 */ +/* 29 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -20261,7 +20427,7 @@ class ReversibleTransform extends Transform { } /***/ }), -/* 29 */ +/* 30 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -20388,7 +20554,7 @@ class LZWStream extends _decode_stream.DecodeStream { exports.LZWStream = LZWStream; /***/ }), -/* 30 */ +/* 31 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -20589,7 +20755,7 @@ class PredictorStream extends _decode_stream.DecodeStream { exports.PredictorStream = PredictorStream; /***/ }), -/* 31 */ +/* 32 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -20636,7 +20802,7 @@ class RunLengthStream extends _decode_stream.DecodeStream { exports.RunLengthStream = RunLengthStream; /***/ }), -/* 32 */ +/* 33 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -20646,22 +20812,22 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.Font = exports.ErrorFont = void 0; var _util = __w_pdfjs_require__(2); -var _cff_parser = __w_pdfjs_require__(33); -var _fonts_utils = __w_pdfjs_require__(36); -var _unicode = __w_pdfjs_require__(38); -var _glyphlist = __w_pdfjs_require__(37); -var _encodings = __w_pdfjs_require__(35); -var _standard_fonts = __w_pdfjs_require__(39); -var _to_unicode_map = __w_pdfjs_require__(40); -var _cff_font = __w_pdfjs_require__(41); -var _font_renderer = __w_pdfjs_require__(42); -var _metrics = __w_pdfjs_require__(43); -var _glyf = __w_pdfjs_require__(44); +var _cff_parser = __w_pdfjs_require__(34); +var _fonts_utils = __w_pdfjs_require__(37); +var _unicode = __w_pdfjs_require__(39); +var _glyphlist = __w_pdfjs_require__(38); +var _encodings = __w_pdfjs_require__(36); +var _standard_fonts = __w_pdfjs_require__(40); +var _to_unicode_map = __w_pdfjs_require__(41); +var _cff_font = __w_pdfjs_require__(42); +var _font_renderer = __w_pdfjs_require__(43); +var _metrics = __w_pdfjs_require__(44); +var _glyf = __w_pdfjs_require__(45); var _cmap = __w_pdfjs_require__(14); -var _opentype_file_builder = __w_pdfjs_require__(45); +var _opentype_file_builder = __w_pdfjs_require__(46); var _core_utils = __w_pdfjs_require__(3); var _stream = __w_pdfjs_require__(8); -var _type1_font = __w_pdfjs_require__(46); +var _type1_font = __w_pdfjs_require__(47); const PRIVATE_USE_AREAS = [[0xe000, 0xf8ff], [0x100000, 0x10fffd]]; const PDF_GLYPH_SPACE_UNITS = 1000; const EXPORT_DATA_PROPERTIES = ["ascent", "bbox", "black", "bold", "charProcOperatorList", "composite", "cssFontInfo", "data", "defaultVMetrics", "defaultWidth", "descent", "fallbackName", "fontMatrix", "isInvalidPDFjsFont", "isType3Font", "italic", "loadedName", "mimetype", "missingFile", "name", "remeasure", "subtype", "type", "vertical"]; @@ -21191,7 +21357,7 @@ function createPostTable(properties) { return "\x00\x03\x00\x00" + (0, _util.string32)(angle) + "\x00\x00" + "\x00\x00" + (0, _util.string32)(properties.fixedPitch ? 1 : 0) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00"; } function createPostscriptName(name) { - return name.replace(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63); + return name.replaceAll(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63); } function createNameTable(name, proto) { if (!proto) { @@ -21241,7 +21407,7 @@ class Font { this._glyphCache = Object.create(null); let isSerifFont = !!(properties.flags & _fonts_utils.FontFlags.Serif); if (!isSerifFont && !properties.isSimulatedFlags) { - const baseName = name.replace(/[,_]/g, "-").split("-")[0], + const baseName = name.replaceAll(/[,_]/g, "-").split("-")[0], serifFonts = (0, _standard_fonts.getSerifFonts)(); for (const namePart of baseName.split("+")) { if (serifFonts[namePart]) { @@ -21563,7 +21729,7 @@ class Font { const [nameTable] = readNameTable(potentialTables.name); for (let j = 0, jj = nameTable.length; j < jj; j++) { for (let k = 0, kk = nameTable[j].length; k < kk; k++) { - const nameEntry = nameTable[j][k] && nameTable[j][k].replace(/\s/g, ""); + const nameEntry = nameTable[j][k] && nameTable[j][k].replaceAll(/\s/g, ""); if (!nameEntry) { continue; } @@ -23060,7 +23226,7 @@ class ErrorFont { exports.ErrorFont = ErrorFont; /***/ }), -/* 33 */ +/* 34 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -23070,8 +23236,8 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.CFFTopDict = exports.CFFStrings = exports.CFFStandardStrings = exports.CFFPrivateDict = exports.CFFParser = exports.CFFIndex = exports.CFFHeader = exports.CFFFDSelect = exports.CFFCompiler = exports.CFFCharset = exports.CFF = void 0; var _util = __w_pdfjs_require__(2); -var _charsets = __w_pdfjs_require__(34); -var _encodings = __w_pdfjs_require__(35); +var _charsets = __w_pdfjs_require__(35); +var _encodings = __w_pdfjs_require__(36); const MAX_SUBR_NESTING = 10; const CFFStandardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"]; exports.CFFStandardStrings = CFFStandardStrings; @@ -24552,7 +24718,7 @@ class CFFCompiler { exports.CFFCompiler = CFFCompiler; /***/ }), -/* 34 */ +/* 35 */ /***/ ((__unused_webpack_module, exports) => { @@ -24569,7 +24735,7 @@ const ExpertSubsetCharset = [".notdef", "space", "dollaroldstyle", "dollarsuperi exports.ExpertSubsetCharset = ExpertSubsetCharset; /***/ }), -/* 35 */ +/* 36 */ /***/ ((__unused_webpack_module, exports) => { @@ -24614,7 +24780,7 @@ function getEncoding(encodingName) { } /***/ }), -/* 36 */ +/* 37 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -24626,9 +24792,9 @@ exports.SEAC_ANALYSIS_ENABLED = exports.MacStandardGlyphOrdering = exports.FontF exports.normalizeFontName = normalizeFontName; exports.recoverGlyphName = recoverGlyphName; exports.type1FontGlyphMapping = type1FontGlyphMapping; -var _encodings = __w_pdfjs_require__(35); -var _glyphlist = __w_pdfjs_require__(37); -var _unicode = __w_pdfjs_require__(38); +var _encodings = __w_pdfjs_require__(36); +var _glyphlist = __w_pdfjs_require__(38); +var _unicode = __w_pdfjs_require__(39); var _util = __w_pdfjs_require__(2); const SEAC_ANALYSIS_ENABLED = true; exports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED; @@ -24725,11 +24891,11 @@ function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { return charCodeToGlyphId; } function normalizeFontName(name) { - return name.replace(/[,_]/g, "-").replace(/\s/g, ""); + return name.replaceAll(/[,_]/g, "-").replaceAll(/\s/g, ""); } /***/ }), -/* 37 */ +/* 38 */ /***/ ((__unused_webpack_module, __webpack_exports__, __w_pdfjs_require__) => { __w_pdfjs_require__.r(__webpack_exports__); @@ -33808,7 +33974,7 @@ const getDingbatsGlyphsUnicode = (0,_core_utils_js__WEBPACK_IMPORTED_MODULE_0__. /***/ }), -/* 38 */ +/* 39 */ /***/ ((__unused_webpack_module, __webpack_exports__, __w_pdfjs_require__) => { __w_pdfjs_require__.r(__webpack_exports__); @@ -37191,7 +37357,7 @@ function clearUnicodeCaches() { /***/ }), -/* 39 */ +/* 40 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -37203,7 +37369,7 @@ exports.getSerifFonts = exports.getNonStdFontMap = exports.getGlyphMapForStandar exports.getStandardFontName = getStandardFontName; exports.getSymbolsFonts = exports.getSupplementalGlyphMapForCalibri = exports.getSupplementalGlyphMapForArialBlack = exports.getStdFontMap = void 0; var _core_utils = __w_pdfjs_require__(3); -var _fonts_utils = __w_pdfjs_require__(36); +var _fonts_utils = __w_pdfjs_require__(37); const getStdFontMap = (0, _core_utils.getLookupTableFactory)(function (t) { t["Times-Roman"] = "Times-Roman"; t.Helvetica = "Helvetica"; @@ -38052,7 +38218,7 @@ function getStandardFontName(name) { } /***/ }), -/* 40 */ +/* 41 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -38131,7 +38297,7 @@ class IdentityToUnicodeMap { exports.IdentityToUnicodeMap = IdentityToUnicodeMap; /***/ }), -/* 41 */ +/* 42 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -38140,8 +38306,8 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.CFFFont = void 0; -var _cff_parser = __w_pdfjs_require__(33); -var _fonts_utils = __w_pdfjs_require__(36); +var _cff_parser = __w_pdfjs_require__(34); +var _fonts_utils = __w_pdfjs_require__(37); var _util = __w_pdfjs_require__(2); class CFFFont { constructor(file, properties) { @@ -38243,7 +38409,7 @@ class CFFFont { exports.CFFFont = CFFFont; /***/ }), -/* 42 */ +/* 43 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -38253,9 +38419,9 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.FontRendererFactory = void 0; var _util = __w_pdfjs_require__(2); -var _cff_parser = __w_pdfjs_require__(33); -var _glyphlist = __w_pdfjs_require__(37); -var _encodings = __w_pdfjs_require__(35); +var _cff_parser = __w_pdfjs_require__(34); +var _glyphlist = __w_pdfjs_require__(38); +var _encodings = __w_pdfjs_require__(36); var _stream = __w_pdfjs_require__(8); function getUint32(data, offset) { return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; @@ -39060,7 +39226,7 @@ class FontRendererFactory { exports.FontRendererFactory = FontRendererFactory; /***/ }), -/* 43 */ +/* 44 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -42098,7 +42264,7 @@ const getFontBasicMetrics = (0, _core_utils.getLookupTableFactory)(function (t) exports.getFontBasicMetrics = getFontBasicMetrics; /***/ }), -/* 44 */ +/* 45 */ /***/ ((__unused_webpack_module, exports) => { @@ -42643,7 +42809,7 @@ class CompositeGlyph { } /***/ }), -/* 45 */ +/* 46 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -42759,7 +42925,7 @@ class OpenTypeFileBuilder { exports.OpenTypeFileBuilder = OpenTypeFileBuilder; /***/ }), -/* 46 */ +/* 47 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -42768,12 +42934,12 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Type1Font = void 0; -var _cff_parser = __w_pdfjs_require__(33); +var _cff_parser = __w_pdfjs_require__(34); var _util = __w_pdfjs_require__(2); -var _fonts_utils = __w_pdfjs_require__(36); +var _fonts_utils = __w_pdfjs_require__(37); var _core_utils = __w_pdfjs_require__(3); var _stream = __w_pdfjs_require__(8); -var _type1_parser = __w_pdfjs_require__(47); +var _type1_parser = __w_pdfjs_require__(48); function findBlock(streamBytes, signature, startIndex) { const streamBytesLength = streamBytes.length; const signatureLength = signature.length; @@ -43045,7 +43211,7 @@ class Type1Font { exports.Type1Font = Type1Font; /***/ }), -/* 47 */ +/* 48 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -43054,7 +43220,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Type1Parser = void 0; -var _encodings = __w_pdfjs_require__(35); +var _encodings = __w_pdfjs_require__(36); var _core_utils = __w_pdfjs_require__(3); var _stream = __w_pdfjs_require__(8); var _util = __w_pdfjs_require__(2); @@ -43242,7 +43408,7 @@ class Type1CharString { subrNumber = this.stack.pop(); const numArgs = this.stack.pop(); if (subrNumber === 0 && numArgs === 3) { - const flexArgs = this.stack.splice(this.stack.length - 17, 17); + const flexArgs = this.stack.splice(-17, 17); this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]); error = this.executeCommand(13, COMMAND_MAP.flex, true); this.flexing = false; @@ -43620,7 +43786,7 @@ class Type1Parser { exports.Type1Parser = Type1Parser; /***/ }), -/* 48 */ +/* 49 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -43647,7 +43813,7 @@ class Pattern { constructor() { (0, _util.unreachable)("Cannot initialize Pattern."); } - static parseShading(shading, xref, res, handler, pdfFunctionFactory, localColorSpaceCache) { + static parseShading(shading, xref, res, pdfFunctionFactory, localColorSpaceCache) { const dict = shading instanceof _base_stream.BaseStream ? shading.dict : shading; const type = dict.get("ShadingType"); try { @@ -43667,9 +43833,6 @@ class Pattern { if (ex instanceof _core_utils.MissingDataException) { throw ex; } - handler.send("UnsupportedFeature", { - featureId: _util.UNSUPPORTED_FEATURES.shadingPattern - }); (0, _util.warn)(ex); return new DummyShading(); } @@ -44407,7 +44570,7 @@ function getTilingPatternIR(operatorList, dict, color) { } /***/ }), -/* 49 */ +/* 50 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -44417,14 +44580,14 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.getXfaFontDict = getXfaFontDict; exports.getXfaFontName = getXfaFontName; -var _calibri_factors = __w_pdfjs_require__(50); +var _calibri_factors = __w_pdfjs_require__(51); var _primitives = __w_pdfjs_require__(4); -var _helvetica_factors = __w_pdfjs_require__(51); -var _liberationsans_widths = __w_pdfjs_require__(52); -var _myriadpro_factors = __w_pdfjs_require__(53); -var _segoeui_factors = __w_pdfjs_require__(54); +var _helvetica_factors = __w_pdfjs_require__(52); +var _liberationsans_widths = __w_pdfjs_require__(53); +var _myriadpro_factors = __w_pdfjs_require__(54); +var _segoeui_factors = __w_pdfjs_require__(55); var _core_utils = __w_pdfjs_require__(3); -var _fonts_utils = __w_pdfjs_require__(36); +var _fonts_utils = __w_pdfjs_require__(37); const getXFAFontMap = (0, _core_utils.getLookupTableFactory)(function (t) { t["MyriadPro-Regular"] = t["PdfJS-Fallback-Regular"] = { name: "LiberationSans-Regular", @@ -44620,7 +44783,7 @@ function getXfaFontDict(name) { } /***/ }), -/* 50 */ +/* 51 */ /***/ ((__unused_webpack_module, exports) => { @@ -44659,7 +44822,7 @@ const CalibriRegularMetrics = { exports.CalibriRegularMetrics = CalibriRegularMetrics; /***/ }), -/* 51 */ +/* 52 */ /***/ ((__unused_webpack_module, exports) => { @@ -44698,7 +44861,7 @@ const HelveticaRegularMetrics = { exports.HelveticaRegularMetrics = HelveticaRegularMetrics; /***/ }), -/* 52 */ +/* 53 */ /***/ ((__unused_webpack_module, exports) => { @@ -44725,7 +44888,7 @@ const LiberationSansRegularMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39 exports.LiberationSansRegularMapping = LiberationSansRegularMapping; /***/ }), -/* 53 */ +/* 54 */ /***/ ((__unused_webpack_module, exports) => { @@ -44764,7 +44927,7 @@ const MyriadProRegularMetrics = { exports.MyriadProRegularMetrics = MyriadProRegularMetrics; /***/ }), -/* 54 */ +/* 55 */ /***/ ((__unused_webpack_module, exports) => { @@ -44803,7 +44966,7 @@ const SegoeuiRegularMetrics = { exports.SegoeuiRegularMetrics = SegoeuiRegularMetrics; /***/ }), -/* 55 */ +/* 56 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -44815,9 +44978,9 @@ exports.PostScriptEvaluator = exports.PostScriptCompiler = exports.PDFFunctionFa exports.isPDFFunction = isPDFFunction; var _primitives = __w_pdfjs_require__(4); var _util = __w_pdfjs_require__(2); -var _ps_parser = __w_pdfjs_require__(56); +var _ps_parser = __w_pdfjs_require__(57); var _base_stream = __w_pdfjs_require__(5); -var _image_utils = __w_pdfjs_require__(57); +var _image_utils = __w_pdfjs_require__(58); class PDFFunctionFactory { constructor({ xref, @@ -45236,9 +45399,7 @@ class PDFFunction { } function isPDFFunction(v) { let fnDict; - if (typeof v !== "object") { - return false; - } else if (v instanceof _primitives.Dict) { + if (v instanceof _primitives.Dict) { fnDict = v; } else if (v instanceof _base_stream.BaseStream) { fnDict = v.dict; @@ -45347,8 +45508,13 @@ class PostScriptEvaluator { } break; case "atan": + b = stack.pop(); a = stack.pop(); - stack.push(Math.atan(a)); + a = Math.atan2(a, b) / Math.PI * 180; + if (a < 0) { + a += 360; + } + stack.push(a); break; case "bitshift": b = stack.pop(); @@ -45369,7 +45535,7 @@ class PostScriptEvaluator { break; case "cos": a = stack.pop(); - stack.push(Math.cos(a)); + stack.push(Math.cos(a % 360 / 180 * Math.PI)); break; case "cvi": a = stack.pop() | 0; @@ -45492,7 +45658,7 @@ class PostScriptEvaluator { break; case "sin": a = stack.pop(); - stack.push(Math.sin(a)); + stack.push(Math.sin(a % 360 / 180 * Math.PI)); break; case "sqrt": a = stack.pop(); @@ -45855,7 +46021,7 @@ class PostScriptCompiler { exports.PostScriptCompiler = PostScriptCompiler; /***/ }), -/* 56 */ +/* 57 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -46059,7 +46225,7 @@ class PostScriptLexer { exports.PostScriptLexer = PostScriptLexer; /***/ }), -/* 57 */ +/* 58 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -46203,7 +46369,7 @@ class GlobalImageCache { return (0, _util.shadow)(this, "MIN_IMAGES_TO_CACHE", 10); } static get MAX_BYTE_SIZE() { - return (0, _util.shadow)(this, "MAX_BYTE_SIZE", 40e6); + return (0, _util.shadow)(this, "MAX_BYTE_SIZE", 5 * _util.MAX_IMAGE_SIZE_TO_CACHE); } constructor() { this._refCache = new _primitives.RefSetCache(); @@ -46292,7 +46458,7 @@ class GlobalImageCache { exports.GlobalImageCache = GlobalImageCache; /***/ }), -/* 58 */ +/* 59 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -46539,7 +46705,261 @@ function bidi(str, startLevel = -1, vertical = false) { } /***/ }), -/* 59 */ +/* 60 */ +/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.ImageResizer = void 0; +var _util = __w_pdfjs_require__(2); +const MIN_IMAGE_DIM = 2048; +const MAX_IMAGE_DIM = 65537; +const MAX_ERROR = 128; +class ImageResizer { + constructor(imgData, isMask) { + this._imgData = imgData; + this._isMask = isMask; + } + static needsToBeResized(width, height) { + if (width <= this._goodSquareLength && height <= this._goodSquareLength) { + return false; + } + const { + MAX_DIM + } = this; + if (width > MAX_DIM || height > MAX_DIM) { + return true; + } + const area = width * height; + if (this._hasMaxArea) { + return area > this.MAX_AREA; + } + if (area < this._goodSquareLength ** 2) { + return false; + } + if (this._areGoodDims(width, height)) { + this._goodSquareLength = Math.max(this._goodSquareLength, Math.floor(Math.sqrt(width * height))); + return false; + } + this._goodSquareLength = this._guessMax(this._goodSquareLength, MAX_DIM, MAX_ERROR, 0); + const maxArea = this.MAX_AREA = this._goodSquareLength ** 2; + return area > maxArea; + } + static get MAX_DIM() { + return (0, _util.shadow)(this, "MAX_DIM", this._guessMax(MIN_IMAGE_DIM, MAX_IMAGE_DIM, 0, 1)); + } + static get MAX_AREA() { + this._hasMaxArea = true; + return (0, _util.shadow)(this, "MAX_AREA", this._guessMax(ImageResizer._goodSquareLength, this.MAX_DIM, MAX_ERROR, 0) ** 2); + } + static set MAX_AREA(area) { + if (area >= 0) { + this._hasMaxArea = true; + (0, _util.shadow)(this, "MAX_AREA", area); + } + } + static setMaxArea(area) { + if (!this._hasMaxArea) { + this.MAX_AREA = area >> 2; + } + } + static _areGoodDims(width, height) { + try { + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + ctx.fillRect(0, 0, 1, 1); + const opacity = ctx.getImageData(0, 0, 1, 1).data[3]; + canvas.width = canvas.height = 1; + return opacity !== 0; + } catch (e) { + return false; + } + } + static _guessMax(start, end, tolerance, defaultHeight) { + while (start + tolerance + 1 < end) { + const middle = Math.floor((start + end) / 2); + const height = defaultHeight || middle; + if (this._areGoodDims(middle, height)) { + start = middle; + } else { + end = middle; + } + } + return start; + } + static async createImage(imgData, isMask = false) { + return new ImageResizer(imgData, isMask)._createImage(); + } + async _createImage() { + const data = this._encodeBMP(); + const blob = new Blob([data.buffer], { + type: "image/bmp" + }); + const bitmapPromise = createImageBitmap(blob); + const { + MAX_AREA, + MAX_DIM + } = ImageResizer; + const { + _imgData: imgData + } = this; + const { + width, + height + } = imgData; + const minFactor = Math.max(width / MAX_DIM, height / MAX_DIM, Math.sqrt(width * height / MAX_AREA)); + const firstFactor = Math.max(minFactor, 2); + const factor = Math.round(10 * (minFactor + 1.25)) / 10 / firstFactor; + const N = Math.floor(Math.log2(factor)); + const steps = new Array(N + 2).fill(2); + steps[0] = firstFactor; + steps.splice(-1, 1, factor / (1 << N)); + let newWidth = width; + let newHeight = height; + let bitmap = await bitmapPromise; + for (const step of steps) { + const prevWidth = newWidth; + const prevHeight = newHeight; + newWidth = Math.floor(newWidth / step) - 1; + newHeight = Math.floor(newHeight / step) - 1; + const canvas = new OffscreenCanvas(newWidth, newHeight); + const ctx = canvas.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + bitmap = canvas.transferToImageBitmap(); + } + imgData.data = null; + imgData.bitmap = bitmap; + imgData.width = newWidth; + imgData.height = newHeight; + return imgData; + } + _encodeBMP() { + const { + width, + height, + kind + } = this._imgData; + let data = this._imgData.data; + let bitPerPixel; + let colorTable = new Uint8Array(0); + let maskTable = colorTable; + let compression = 0; + switch (kind) { + case _util.ImageKind.GRAYSCALE_1BPP: + { + bitPerPixel = 1; + colorTable = new Uint8Array(this._isMask ? [255, 255, 255, 255, 0, 0, 0, 0] : [0, 0, 0, 0, 255, 255, 255, 255]); + const rowLen = width + 7 >> 3; + const rowSize = rowLen + 3 & -4; + if (rowLen !== rowSize) { + const newData = new Uint8Array(rowSize * height); + let k = 0; + for (let i = 0, ii = height * rowLen; i < ii; i += rowLen, k += rowSize) { + newData.set(data.subarray(i, i + rowLen), k); + } + data = newData; + } + break; + } + case _util.ImageKind.RGB_24BPP: + { + bitPerPixel = 24; + if (width & 3) { + const rowLen = 3 * width; + const rowSize = rowLen + 3 & -4; + const extraLen = rowSize - rowLen; + const newData = new Uint8Array(rowSize * height); + let k = 0; + for (let i = 0, ii = height * rowLen; i < ii; i += rowLen) { + const row = data.subarray(i, i + rowLen); + for (let j = 0; j < rowLen; j += 3) { + newData[k++] = row[j + 2]; + newData[k++] = row[j + 1]; + newData[k++] = row[j]; + } + k += extraLen; + } + data = newData; + } else { + for (let i = 0, ii = data.length; i < ii; i += 3) { + const tmp = data[i]; + data[i] = data[i + 2]; + data[i + 2] = tmp; + } + } + break; + } + case _util.ImageKind.RGBA_32BPP: + bitPerPixel = 32; + compression = 3; + maskTable = new Uint8Array(4 + 4 + 4 + 4 + 52); + const view = new DataView(maskTable.buffer); + if (_util.FeatureTest.isLittleEndian) { + view.setUint32(0, 0x000000ff, true); + view.setUint32(4, 0x0000ff00, true); + view.setUint32(8, 0x00ff0000, true); + view.setUint32(12, 0xff000000, true); + } else { + view.setUint32(0, 0xff000000, true); + view.setUint32(4, 0x00ff0000, true); + view.setUint32(8, 0x0000ff00, true); + view.setUint32(12, 0x000000ff, true); + } + break; + default: + throw new Error("invalid format"); + } + let i = 0; + const headerLength = 40 + maskTable.length; + const fileLength = 14 + headerLength + colorTable.length + data.length; + const bmpData = new Uint8Array(fileLength); + const view = new DataView(bmpData.buffer); + view.setUint16(i, 0x4d42, true); + i += 2; + view.setUint32(i, fileLength, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + view.setUint32(i, 14 + headerLength + colorTable.length, true); + i += 4; + view.setUint32(i, headerLength, true); + i += 4; + view.setInt32(i, width, true); + i += 4; + view.setInt32(i, -height, true); + i += 4; + view.setUint16(i, 1, true); + i += 2; + view.setUint16(i, bitPerPixel, true); + i += 2; + view.setUint32(i, compression, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + view.setInt32(i, 0, true); + i += 4; + view.setInt32(i, 0, true); + i += 4; + view.setUint32(i, colorTable.length / 4, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + bmpData.set(maskTable, i); + i += maskTable.length; + bmpData.set(colorTable, i); + i += colorTable.length; + bmpData.set(data, i); + return bmpData; + } +} +exports.ImageResizer = ImageResizer; +ImageResizer._goodSquareLength = MIN_IMAGE_DIM; + +/***/ }), +/* 61 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -46643,7 +47063,7 @@ class MurmurHash3_64 { exports.MurmurHash3_64 = MurmurHash3_64; /***/ }), -/* 60 */ +/* 62 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -46748,13 +47168,22 @@ addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintInli offset -= imgRowSize; } } - fnArray.splice(iFirstSave, count * 4, _util.OPS.paintInlineImageXObjectGroup); - argsArray.splice(iFirstSave, count * 4, [{ + const img = { width: imgWidth, - height: imgHeight, - kind: _util.ImageKind.RGBA_32BPP, - data: imgData - }, map]); + height: imgHeight + }; + if (context.isOffscreenCanvasSupported) { + const canvas = new OffscreenCanvas(imgWidth, imgHeight); + const ctx = canvas.getContext("2d"); + ctx.putImageData(new ImageData(new Uint8ClampedArray(imgData.buffer), imgWidth, imgHeight), 0, 0); + img.bitmap = canvas.transferToImageBitmap(); + img.data = null; + } else { + img.kind = _util.ImageKind.RGBA_32BPP; + img.data = imgData; + } + fnArray.splice(iFirstSave, count * 4, _util.OPS.paintInlineImageXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [img, map]); return iFirstSave + 1; }); addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageMaskXObject, _util.OPS.restore], null, function iterateImageMaskGroup(context, i) { @@ -46982,11 +47411,15 @@ class QueueOptimizer extends NullOptimizer { this.context = { iCurr: 0, fnArray: queue.fnArray, - argsArray: queue.argsArray + argsArray: queue.argsArray, + isOffscreenCanvasSupported: false }; this.match = null; this.lastProcessed = 0; } + set isOffscreenCanvasSupported(value) { + this.context.isOffscreenCanvasSupported = value; + } _optimize() { const fnArray = this.queue.fnArray; let i = this.lastProcessed, @@ -47067,6 +47500,9 @@ class OperatorList { this.weight = 0; this._resolved = streamSink ? null : Promise.resolve(); } + set isOffscreenCanvasSupported(value) { + this.optimizer.isOffscreenCanvasSupported = value; + } get length() { return this.argsArray.length; } @@ -47169,7 +47605,7 @@ class OperatorList { exports.OperatorList = OperatorList; /***/ }), -/* 61 */ +/* 63 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -47179,12 +47615,13 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.PDFImage = void 0; var _util = __w_pdfjs_require__(2); -var _image_utils = __w_pdfjs_require__(62); +var _image_utils = __w_pdfjs_require__(27); var _base_stream = __w_pdfjs_require__(5); var _colorspace = __w_pdfjs_require__(12); var _decode_stream = __w_pdfjs_require__(17); +var _image_resizer = __w_pdfjs_require__(60); var _jpeg_stream = __w_pdfjs_require__(25); -var _jpx = __w_pdfjs_require__(28); +var _jpx = __w_pdfjs_require__(29); var _primitives = __w_pdfjs_require__(4); function decodeAndClamp(value, addend, coefficient, max) { value = addend + value * coefficient; @@ -47435,14 +47872,14 @@ class PDFImage { interpolate }; } - static createMask({ + static async createMask({ imgArray, width, height, imageIsFromDecodeStream, inverseDecode, interpolate, - isOffscreenCanvasSupported = true + isOffscreenCanvasSupported = false }) { const isSingleOpaquePixel = width === 1 && height === 1 && inverseDecode === (imgArray.length === 0 || !!(imgArray[0] & 128)); if (isSingleOpaquePixel) { @@ -47450,15 +47887,34 @@ class PDFImage { isSingleOpaquePixel }; } - if (isOffscreenCanvasSupported && _util.FeatureTest.isOffscreenCanvasSupported) { + if (isOffscreenCanvasSupported) { + if (_image_resizer.ImageResizer.needsToBeResized(width, height)) { + const data = new Uint8ClampedArray(width * height * 4); + (0, _image_utils.convertBlackAndWhiteToRGBA)({ + src: imgArray, + dest: data, + width, + height, + nonBlackColor: 0, + inverseDecode + }); + return _image_resizer.ImageResizer.createImage({ + kind: _util.ImageKind.RGBA_32BPP, + data, + width, + height, + interpolate + }); + } const canvas = new OffscreenCanvas(width, height); const ctx = canvas.getContext("2d"); const imgData = ctx.createImageData(width, height); - (0, _image_utils.applyMaskImageData)({ + (0, _image_utils.convertBlackAndWhiteToRGBA)({ src: imgArray, dest: imgData.data, width, height, + nonBlackColor: 0, inverseDecode }); ctx.putImageData(imgData, 0, 0); @@ -47661,7 +48117,7 @@ class PDFImage { buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB; } } - createImageData(forceRGBA = false) { + async createImageData(forceRGBA = false, isOffscreenCanvasSupported = false) { const drawWidth = this.drawWidth; const drawHeight = this.drawHeight; const imgData = { @@ -47676,6 +48132,7 @@ class PDFImage { const originalHeight = this.height; const bpc = this.bpc; const rowBytes = originalWidth * numComps * bpc + 7 >> 3; + const mustBeResized = isOffscreenCanvasSupported && _image_resizer.ImageResizer.needsToBeResized(drawWidth, drawHeight); if (!forceRGBA) { let kind; if (this.colorSpace.name === "DeviceGray" && bpc === 1) { @@ -47684,8 +48141,21 @@ class PDFImage { kind = _util.ImageKind.RGB_24BPP; } if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) { + const data = this.getImageBytes(originalHeight * rowBytes, {}); + if (isOffscreenCanvasSupported) { + if (mustBeResized) { + return _image_resizer.ImageResizer.createImage({ + data, + kind, + width: drawWidth, + height: drawHeight, + interpolate: this.interpolate + }, this.needsDecode); + } + return this.createBitmap(kind, originalWidth, originalHeight, data); + } imgData.kind = kind; - imgData.data = this.getImageBytes(originalHeight * rowBytes, {}); + imgData.data = data; if (this.needsDecode) { (0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image must be grayscale."); const buffer = imgData.data; @@ -47697,18 +48167,46 @@ class PDFImage { } if (this.image instanceof _jpeg_stream.JpegStream && !this.smask && !this.mask) { let imageLength = originalHeight * rowBytes; - switch (this.colorSpace.name) { - case "DeviceGray": - imageLength *= 3; - case "DeviceRGB": - case "DeviceCMYK": - imgData.kind = _util.ImageKind.RGB_24BPP; - imgData.data = this.getImageBytes(imageLength, { + if (isOffscreenCanvasSupported && !mustBeResized) { + let isHandled = false; + switch (this.colorSpace.name) { + case "DeviceGray": + imageLength *= 4; + isHandled = true; + break; + case "DeviceRGB": + imageLength = imageLength / 3 * 4; + isHandled = true; + break; + case "DeviceCMYK": + isHandled = true; + break; + } + if (isHandled) { + const rgba = this.getImageBytes(imageLength, { drawWidth, drawHeight, - forceRGB: true + forceRGBA: true }); - return imgData; + return this.createBitmap(_util.ImageKind.RGBA_32BPP, drawWidth, drawHeight, rgba); + } + } else { + switch (this.colorSpace.name) { + case "DeviceGray": + imageLength *= 3; + case "DeviceRGB": + case "DeviceCMYK": + imgData.kind = _util.ImageKind.RGB_24BPP; + imgData.data = this.getImageBytes(imageLength, { + drawWidth, + drawHeight, + forceRGB: true + }); + if (mustBeResized) { + return _image_resizer.ImageResizer.createImage(imgData); + } + return imgData; + } } } } @@ -47718,24 +48216,54 @@ class PDFImage { const actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight; const comps = this.getComponents(imgArray); let alpha01, maybeUndoPreblend; + let canvas, ctx, canvasImgData, data; + if (isOffscreenCanvasSupported && !mustBeResized) { + canvas = new OffscreenCanvas(drawWidth, drawHeight); + ctx = canvas.getContext("2d"); + canvasImgData = ctx.createImageData(drawWidth, drawHeight); + data = canvasImgData.data; + } + imgData.kind = _util.ImageKind.RGBA_32BPP; if (!forceRGBA && !this.smask && !this.mask) { - imgData.kind = _util.ImageKind.RGB_24BPP; - imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 3); - alpha01 = 0; + if (!isOffscreenCanvasSupported || mustBeResized) { + imgData.kind = _util.ImageKind.RGB_24BPP; + data = new Uint8ClampedArray(drawWidth * drawHeight * 3); + alpha01 = 0; + } else { + const arr = new Uint32Array(data.buffer); + arr.fill(_util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff); + alpha01 = 1; + } maybeUndoPreblend = false; } else { - imgData.kind = _util.ImageKind.RGBA_32BPP; - imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 4); + if (!isOffscreenCanvasSupported || mustBeResized) { + data = new Uint8ClampedArray(drawWidth * drawHeight * 4); + } alpha01 = 1; maybeUndoPreblend = true; - this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps); + this.fillOpacity(data, drawWidth, drawHeight, actualHeight, comps); } if (this.needsDecode) { this.decodeBuffer(comps); } - this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01); + this.colorSpace.fillRgb(data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01); if (maybeUndoPreblend) { - this.undoPreblend(imgData.data, drawWidth, actualHeight); + this.undoPreblend(data, drawWidth, actualHeight); + } + if (isOffscreenCanvasSupported && !mustBeResized) { + ctx.putImageData(canvasImgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); + return { + data: null, + width: drawWidth, + height: drawHeight, + bitmap, + interpolate: this.interpolate + }; + } + imgData.data = data; + if (mustBeResized) { + return _image_resizer.ImageResizer.createImage(imgData); } return imgData; } @@ -47775,15 +48303,44 @@ class PDFImage { buffer[i] = scale * comps[i]; } } + createBitmap(kind, width, height, src) { + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + let imgData; + if (kind === _util.ImageKind.RGBA_32BPP) { + imgData = new ImageData(src, width, height); + } else { + imgData = ctx.createImageData(width, height); + (0, _image_utils.convertToRGBA)({ + kind, + src, + dest: new Uint32Array(imgData.data.buffer), + width, + height, + inverseDecode: this.needsDecode + }); + } + ctx.putImageData(imgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); + return { + data: null, + width, + height, + bitmap, + interpolate: this.interpolate + }; + } getImageBytes(length, { drawWidth, drawHeight, + forceRGBA = false, forceRGB = false, internal = false }) { this.image.reset(); this.image.drawWidth = drawWidth || this.width; this.image.drawHeight = drawHeight || this.height; + this.image.forceRGBA = !!forceRGBA; this.image.forceRGB = !!forceRGB; const imageBytes = this.image.getBytes(length); if (internal || this.image instanceof _decode_stream.DecodeStream) { @@ -47796,59 +48353,7 @@ class PDFImage { exports.PDFImage = PDFImage; /***/ }), -/* 62 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.applyMaskImageData = applyMaskImageData; -var _util = __w_pdfjs_require__(2); -function applyMaskImageData({ - src, - srcPos = 0, - dest, - destPos = 0, - width, - height, - inverseDecode = false -}) { - const opaque = _util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; - const [zeroMapping, oneMapping] = !inverseDecode ? [opaque, 0] : [0, opaque]; - const widthInSource = width >> 3; - const widthRemainder = width & 7; - const srcLength = src.length; - dest = new Uint32Array(dest.buffer); - for (let i = 0; i < height; i++) { - for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { - const elem = srcPos < srcLength ? src[srcPos] : 255; - dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; - } - if (widthRemainder === 0) { - continue; - } - const elem = srcPos < srcLength ? src[srcPos++] : 255; - for (let j = 0; j < widthRemainder; j++) { - dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; - } - } - return { - srcPos, - destPos - }; -} - -/***/ }), -/* 63 */ +/* 64 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -47862,9 +48367,9 @@ exports.writeObject = writeObject; var _util = __w_pdfjs_require__(2); var _primitives = __w_pdfjs_require__(4); var _core_utils = __w_pdfjs_require__(3); -var _xml_parser = __w_pdfjs_require__(64); +var _xml_parser = __w_pdfjs_require__(65); var _base_stream = __w_pdfjs_require__(5); -var _crypto = __w_pdfjs_require__(65); +var _crypto = __w_pdfjs_require__(66); function writeObject(ref, obj, buffer, transform) { buffer.push(`${ref.num} ${ref.gen} obj\n`); if (obj instanceof _primitives.Dict) { @@ -48164,7 +48669,7 @@ function incrementalUpdate({ } /***/ }), -/* 64 */ +/* 65 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -48202,7 +48707,7 @@ function isWhitespaceString(s) { } class XMLParserBase { _resolveEntities(s) { - return s.replace(/&([^;]+);/g, (all, entity) => { + return s.replaceAll(/&([^;]+);/g, (all, entity) => { if (entity.substring(0, 2) === "#x") { return String.fromCodePoint(parseInt(entity.substring(2), 16)); } else if (entity.substring(0, 1) === "#") { @@ -48592,7 +49097,7 @@ class SimpleXMLParser extends XMLParserBase { exports.SimpleXMLParser = SimpleXMLParser; /***/ }), -/* 65 */ +/* 66 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -48605,7 +49110,7 @@ exports.calculateSHA384 = calculateSHA384; exports.calculateSHA512 = void 0; var _util = __w_pdfjs_require__(2); var _primitives = __w_pdfjs_require__(4); -var _decrypt_stream = __w_pdfjs_require__(66); +var _decrypt_stream = __w_pdfjs_require__(67); class ARCFourCipher { constructor(key) { this.a = 0; @@ -49901,7 +50406,7 @@ const CipherTransformFactory = function CipherTransformFactoryClosure() { exports.CipherTransformFactory = CipherTransformFactory; /***/ }), -/* 66 */ +/* 67 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -49947,7 +50452,7 @@ class DecryptStream extends _decode_stream.DecodeStream { exports.DecryptStream = DecryptStream; /***/ }), -/* 67 */ +/* 68 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -49959,14 +50464,14 @@ exports.Catalog = void 0; var _core_utils = __w_pdfjs_require__(3); var _util = __w_pdfjs_require__(2); var _primitives = __w_pdfjs_require__(4); -var _name_number_tree = __w_pdfjs_require__(68); +var _name_number_tree = __w_pdfjs_require__(69); var _base_stream = __w_pdfjs_require__(5); -var _cleanup_helper = __w_pdfjs_require__(69); +var _cleanup_helper = __w_pdfjs_require__(70); var _colorspace = __w_pdfjs_require__(12); -var _file_spec = __w_pdfjs_require__(70); -var _image_utils = __w_pdfjs_require__(57); -var _metadata_parser = __w_pdfjs_require__(71); -var _struct_tree = __w_pdfjs_require__(72); +var _file_spec = __w_pdfjs_require__(71); +var _image_utils = __w_pdfjs_require__(58); +var _metadata_parser = __w_pdfjs_require__(72); +var _struct_tree = __w_pdfjs_require__(73); function fetchDestination(dest) { if (dest instanceof _primitives.Dict) { dest = dest.get("D"); @@ -50757,7 +51262,7 @@ class Catalog { if (javaScript === null) { javaScript = new Map(); } - js = (0, _util.stringToPDFString)(js).replace(/\u0000/g, ""); + js = (0, _util.stringToPDFString)(js).replaceAll("\x00", ""); javaScript.set(name, js); } if (obj instanceof _primitives.Dict && obj.has("JavaScript")) { @@ -51285,7 +51790,7 @@ class Catalog { exports.Catalog = Catalog; /***/ }), -/* 68 */ +/* 69 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -51413,7 +51918,7 @@ class NumberTree extends NameOrNumberTree { exports.NumberTree = NumberTree; /***/ }), -/* 69 */ +/* 70 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -51423,14 +51928,14 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.clearGlobalCaches = clearGlobalCaches; var _primitives = __w_pdfjs_require__(4); -var _unicode = __w_pdfjs_require__(38); +var _unicode = __w_pdfjs_require__(39); function clearGlobalCaches() { (0, _primitives.clearPrimitiveCaches)(); (0, _unicode.clearUnicodeCaches)(); } /***/ }), -/* 70 */ +/* 71 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -51479,7 +51984,7 @@ class FileSpec { get filename() { if (!this._filename && this.root) { const filename = pickPlatformItem(this.root) || "unnamed"; - this._filename = (0, _util.stringToPDFString)(filename).replace(/\\\\/g, "\\").replace(/\\\//g, "/").replace(/\\/g, "/"); + this._filename = (0, _util.stringToPDFString)(filename).replaceAll("\\\\", "\\").replaceAll("\\/", "/").replaceAll("\\", "/"); } return this._filename; } @@ -51513,7 +52018,7 @@ class FileSpec { exports.FileSpec = FileSpec; /***/ }), -/* 71 */ +/* 72 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -51522,7 +52027,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.MetadataParser = void 0; -var _xml_parser = __w_pdfjs_require__(64); +var _xml_parser = __w_pdfjs_require__(65); class MetadataParser { constructor(data) { data = this._repair(data); @@ -51537,10 +52042,10 @@ class MetadataParser { } } _repair(data) { - return data.replace(/^[^<]+/, "").replace(/>\\376\\377([^<]+)/g, function (all, codes) { - const bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) { + return data.replace(/^[^<]+/, "").replaceAll(/>\\376\\377([^<]+)/g, function (all, codes) { + const bytes = codes.replaceAll(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) { return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); - }).replace(/&(amp|apos|gt|lt|quot);/g, function (str, name) { + }).replaceAll(/&(amp|apos|gt|lt|quot);/g, function (str, name) { switch (name) { case "amp": return "&"; @@ -51621,7 +52126,7 @@ class MetadataParser { exports.MetadataParser = MetadataParser; /***/ }), -/* 72 */ +/* 73 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -51632,7 +52137,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.StructTreeRoot = exports.StructTreePage = void 0; var _primitives = __w_pdfjs_require__(4); var _util = __w_pdfjs_require__(2); -var _name_number_tree = __w_pdfjs_require__(68); +var _name_number_tree = __w_pdfjs_require__(69); const MAX_DEPTH = 40; const StructElementType = { PAGE_CONTENT: "PAGE_CONTENT", @@ -51909,7 +52414,7 @@ class StructTreePage { exports.StructTreePage = StructTreePage; /***/ }), -/* 73 */ +/* 74 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -52029,7 +52534,7 @@ class ObjectLoader { exports.ObjectLoader = ObjectLoader; /***/ }), -/* 74 */ +/* 75 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -52038,14 +52543,14 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.XFAFactory = void 0; -var _xfa_object = __w_pdfjs_require__(75); -var _bind = __w_pdfjs_require__(79); -var _data = __w_pdfjs_require__(85); -var _fonts = __w_pdfjs_require__(83); -var _utils = __w_pdfjs_require__(76); +var _xfa_object = __w_pdfjs_require__(76); +var _bind = __w_pdfjs_require__(80); +var _data = __w_pdfjs_require__(86); +var _fonts = __w_pdfjs_require__(84); +var _utils = __w_pdfjs_require__(77); var _util = __w_pdfjs_require__(2); -var _parser = __w_pdfjs_require__(86); -var _xhtml = __w_pdfjs_require__(96); +var _parser = __w_pdfjs_require__(87); +var _xhtml = __w_pdfjs_require__(97); class XFAFactory { constructor(data) { try { @@ -52180,7 +52685,7 @@ class XFAFactory { exports.XFAFactory = XFAFactory; /***/ }), -/* 75 */ +/* 76 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -52189,11 +52694,11 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.XmlObject = exports.XFAObjectArray = exports.XFAObject = exports.XFAAttribute = exports.StringObject = exports.OptionObject = exports.Option10 = exports.Option01 = exports.IntegerObject = exports.ContentObject = exports.$uid = exports.$toStyle = exports.$toString = exports.$toPages = exports.$toHTML = exports.$text = exports.$tabIndex = exports.$setValue = exports.$setSetAttributes = exports.$setId = exports.$searchNode = exports.$root = exports.$resolvePrototypes = exports.$removeChild = exports.$pushPara = exports.$pushGlyphs = exports.$popPara = exports.$onText = exports.$onChildCheck = exports.$onChild = exports.$nsAttributes = exports.$nodeName = exports.$namespaceId = exports.$isUsable = exports.$isTransparent = exports.$isThereMoreWidth = exports.$isSplittable = exports.$isNsAgnostic = exports.$isDescendent = exports.$isDataValue = exports.$isCDATAXml = exports.$isBindable = exports.$insertAt = exports.$indexOf = exports.$ids = exports.$hasSettableValue = exports.$globalData = exports.$getTemplateRoot = exports.$getSubformParent = exports.$getRealChildrenByNameIt = exports.$getParent = exports.$getNextPage = exports.$getExtra = exports.$getDataValue = exports.$getContainedChildren = exports.$getChildrenByNameIt = exports.$getChildrenByName = exports.$getChildrenByClass = exports.$getChildren = exports.$getAvailableSpace = exports.$getAttributes = exports.$getAttributeIt = exports.$flushHTML = exports.$finalize = exports.$extra = exports.$dump = exports.$data = exports.$content = exports.$consumed = exports.$clone = exports.$cleanup = exports.$cleanPage = exports.$clean = exports.$childrenToHTML = exports.$appendChild = exports.$addHTML = exports.$acceptWhitespace = void 0; -var _utils = __w_pdfjs_require__(76); +var _utils = __w_pdfjs_require__(77); var _util = __w_pdfjs_require__(2); var _core_utils = __w_pdfjs_require__(3); -var _namespaces = __w_pdfjs_require__(77); -var _som = __w_pdfjs_require__(78); +var _namespaces = __w_pdfjs_require__(78); +var _som = __w_pdfjs_require__(79); const $acceptWhitespace = Symbol(); exports.$acceptWhitespace = $acceptWhitespace; const $addHTML = Symbol(); @@ -52625,9 +53130,9 @@ class XFAObject { if (usehref) { ref = usehref; if (usehref.startsWith("#som(") && usehref.endsWith(")")) { - somExpression = usehref.slice("#som(".length, usehref.length - 1); + somExpression = usehref.slice("#som(".length, -1); } else if (usehref.startsWith(".#som(") && usehref.endsWith(")")) { - somExpression = usehref.slice(".#som(".length, usehref.length - 1); + somExpression = usehref.slice(".#som(".length, -1); } else if (usehref.startsWith("#")) { id = usehref.slice(1); } else if (usehref.startsWith(".#")) { @@ -53116,7 +53621,7 @@ class Option10 extends IntegerObject { exports.Option10 = Option10; /***/ }), -/* 76 */ +/* 77 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -53146,7 +53651,7 @@ const dimConverters = { const measurementPattern = /([+-]?\d+\.?\d*)(.*)/; function stripQuotes(str) { if (str.startsWith("'") || str.startsWith('"')) { - return str.slice(1, str.length - 1); + return str.slice(1, -1); } return str; } @@ -53335,7 +53840,7 @@ class HTMLResult { exports.HTMLResult = HTMLResult; /***/ }), -/* 77 */ +/* 78 */ /***/ ((__unused_webpack_module, exports) => { @@ -53411,7 +53916,7 @@ const NamespaceIds = { exports.NamespaceIds = NamespaceIds; /***/ }), -/* 78 */ +/* 79 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -53421,8 +53926,8 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.createDataNode = createDataNode; exports.searchNode = searchNode; -var _xfa_object = __w_pdfjs_require__(75); -var _namespaces = __w_pdfjs_require__(77); +var _xfa_object = __w_pdfjs_require__(76); +var _namespaces = __w_pdfjs_require__(78); var _util = __w_pdfjs_require__(2); const namePattern = /^[^.[]+/; const indexPattern = /^[^\]]+/; @@ -53683,7 +54188,7 @@ function createDataNode(root, container, expr) { } /***/ }), -/* 79 */ +/* 80 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -53692,10 +54197,10 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Binder = void 0; -var _xfa_object = __w_pdfjs_require__(75); -var _template = __w_pdfjs_require__(80); -var _som = __w_pdfjs_require__(78); -var _namespaces = __w_pdfjs_require__(77); +var _xfa_object = __w_pdfjs_require__(76); +var _template = __w_pdfjs_require__(81); +var _som = __w_pdfjs_require__(79); +var _namespaces = __w_pdfjs_require__(78); var _util = __w_pdfjs_require__(2); const NS_DATASETS = _namespaces.NamespaceIds.datasets.id; function createText(content) { @@ -54117,7 +54622,7 @@ class Binder { exports.Binder = Binder; /***/ }), -/* 80 */ +/* 81 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -54126,15 +54631,15 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Value = exports.Text = exports.TemplateNamespace = exports.Template = exports.SetProperty = exports.Items = exports.Field = exports.BindItems = void 0; -var _xfa_object = __w_pdfjs_require__(75); -var _namespaces = __w_pdfjs_require__(77); -var _layout = __w_pdfjs_require__(81); -var _html_utils = __w_pdfjs_require__(82); -var _utils = __w_pdfjs_require__(76); +var _xfa_object = __w_pdfjs_require__(76); +var _namespaces = __w_pdfjs_require__(78); +var _layout = __w_pdfjs_require__(82); +var _html_utils = __w_pdfjs_require__(83); +var _utils = __w_pdfjs_require__(77); var _util = __w_pdfjs_require__(2); -var _fonts = __w_pdfjs_require__(83); +var _fonts = __w_pdfjs_require__(84); var _core_utils = __w_pdfjs_require__(3); -var _som = __w_pdfjs_require__(78); +var _som = __w_pdfjs_require__(79); const TEMPLATE_NS_ID = _namespaces.NamespaceIds.template.id; const SVG_NS = "http://www.w3.org/2000/svg"; const MAX_ATTEMPTS_FOR_LRTB_LAYOUT = 2; @@ -58314,7 +58819,7 @@ class Text extends _xfa_object.ContentObject { } [_xfa_object.$finalize]() { if (typeof this[_xfa_object.$content] === "string") { - this[_xfa_object.$content] = this[_xfa_object.$content].replace(/\r\n/g, "\n"); + this[_xfa_object.$content] = this[_xfa_object.$content].replaceAll("\r\n", "\n"); } } [_xfa_object.$getExtra]() { @@ -59016,7 +59521,7 @@ class TemplateNamespace { exports.TemplateNamespace = TemplateNamespace; /***/ }), -/* 81 */ +/* 82 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -59028,8 +59533,8 @@ exports.addHTML = addHTML; exports.checkDimensions = checkDimensions; exports.flushHTML = flushHTML; exports.getAvailableSpace = getAvailableSpace; -var _xfa_object = __w_pdfjs_require__(75); -var _html_utils = __w_pdfjs_require__(82); +var _xfa_object = __w_pdfjs_require__(76); +var _html_utils = __w_pdfjs_require__(83); function createLine(node, children) { return { name: "div", @@ -59296,7 +59801,7 @@ function checkDimensions(node, space) { } /***/ }), -/* 82 */ +/* 83 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -59318,11 +59823,11 @@ exports.setFontFamily = setFontFamily; exports.setMinMaxDimensions = setMinMaxDimensions; exports.setPara = setPara; exports.toStyle = toStyle; -var _xfa_object = __w_pdfjs_require__(75); +var _xfa_object = __w_pdfjs_require__(76); var _util = __w_pdfjs_require__(2); -var _utils = __w_pdfjs_require__(76); -var _fonts = __w_pdfjs_require__(83); -var _text = __w_pdfjs_require__(84); +var _utils = __w_pdfjs_require__(77); +var _fonts = __w_pdfjs_require__(84); +var _text = __w_pdfjs_require__(85); function measureToString(m) { if (typeof m === "string") { return "0px"; @@ -59841,7 +60346,7 @@ function fixURL(str) { } /***/ }), -/* 83 */ +/* 84 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -59852,8 +60357,8 @@ Object.defineProperty(exports, "__esModule", ({ exports.FontFinder = void 0; exports.getMetrics = getMetrics; exports.selectFont = selectFont; -var _xfa_object = __w_pdfjs_require__(75); -var _utils = __w_pdfjs_require__(76); +var _xfa_object = __w_pdfjs_require__(76); +var _utils = __w_pdfjs_require__(77); var _util = __w_pdfjs_require__(2); class FontFinder { constructor(pdfFonts) { @@ -59920,7 +60425,7 @@ class FontFinder { return font; } const pattern = /,|-|_| |bolditalic|bold|italic|regular|it/gi; - let name = fontName.replace(pattern, ""); + let name = fontName.replaceAll(pattern, ""); font = this.fonts.get(name); if (font) { this.cache.set(fontName, font); @@ -59929,28 +60434,28 @@ class FontFinder { name = name.toLowerCase(); const maybe = []; for (const [family, pdfFont] of this.fonts.entries()) { - if (family.replace(pattern, "").toLowerCase().startsWith(name)) { + if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { maybe.push(pdfFont); } } if (maybe.length === 0) { for (const [, pdfFont] of this.fonts.entries()) { - if (pdfFont.regular.name && pdfFont.regular.name.replace(pattern, "").toLowerCase().startsWith(name)) { + if (pdfFont.regular.name && pdfFont.regular.name.replaceAll(pattern, "").toLowerCase().startsWith(name)) { maybe.push(pdfFont); } } } if (maybe.length === 0) { - name = name.replace(/psmt|mt/gi, ""); + name = name.replaceAll(/psmt|mt/gi, ""); for (const [family, pdfFont] of this.fonts.entries()) { - if (family.replace(pattern, "").toLowerCase().startsWith(name)) { + if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { maybe.push(pdfFont); } } } if (maybe.length === 0) { for (const pdfFont of this.fonts.values()) { - if (pdfFont.regular.name && pdfFont.regular.name.replace(pattern, "").toLowerCase().startsWith(name)) { + if (pdfFont.regular.name && pdfFont.regular.name.replaceAll(pattern, "").toLowerCase().startsWith(name)) { maybe.push(pdfFont); } } @@ -60006,7 +60511,7 @@ function getMetrics(xfaFont, real = false) { } /***/ }), -/* 84 */ +/* 85 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -60015,7 +60520,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.TextMeasure = void 0; -var _fonts = __w_pdfjs_require__(83); +var _fonts = __w_pdfjs_require__(84); const WIDTH_FACTOR = 1.02; class FontInfo { constructor(xfaFont, margin, lineHeight, fontFinder) { @@ -60226,7 +60731,7 @@ class TextMeasure { exports.TextMeasure = TextMeasure; /***/ }), -/* 85 */ +/* 86 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -60235,7 +60740,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DataHandler = void 0; -var _xfa_object = __w_pdfjs_require__(75); +var _xfa_object = __w_pdfjs_require__(76); class DataHandler { constructor(root, data) { this.data = data; @@ -60285,7 +60790,7 @@ class DataHandler { exports.DataHandler = DataHandler; /***/ }), -/* 86 */ +/* 87 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -60294,9 +60799,9 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.XFAParser = void 0; -var _xfa_object = __w_pdfjs_require__(75); -var _xml_parser = __w_pdfjs_require__(64); -var _builder = __w_pdfjs_require__(87); +var _xfa_object = __w_pdfjs_require__(76); +var _xml_parser = __w_pdfjs_require__(65); +var _builder = __w_pdfjs_require__(88); var _util = __w_pdfjs_require__(2); class XFAParser extends _xml_parser.XMLParserBase { constructor(rootNameSpace = null, richText = false) { @@ -60430,7 +60935,7 @@ class XFAParser extends _xml_parser.XMLParserBase { exports.XFAParser = XFAParser; /***/ }), -/* 87 */ +/* 88 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -60439,11 +60944,11 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Builder = void 0; -var _namespaces = __w_pdfjs_require__(77); -var _xfa_object = __w_pdfjs_require__(75); -var _setup = __w_pdfjs_require__(88); -var _template = __w_pdfjs_require__(80); -var _unknown = __w_pdfjs_require__(97); +var _namespaces = __w_pdfjs_require__(78); +var _xfa_object = __w_pdfjs_require__(76); +var _setup = __w_pdfjs_require__(89); +var _template = __w_pdfjs_require__(81); +var _unknown = __w_pdfjs_require__(98); var _util = __w_pdfjs_require__(2); class Root extends _xfa_object.XFAObject { constructor(ids) { @@ -60607,7 +61112,7 @@ class Builder { exports.Builder = Builder; /***/ }), -/* 88 */ +/* 89 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -60616,15 +61121,15 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.NamespaceSetUp = void 0; -var _config = __w_pdfjs_require__(89); -var _connection_set = __w_pdfjs_require__(90); -var _datasets = __w_pdfjs_require__(91); -var _locale_set = __w_pdfjs_require__(92); -var _signature = __w_pdfjs_require__(93); -var _stylesheet = __w_pdfjs_require__(94); -var _template = __w_pdfjs_require__(80); -var _xdp = __w_pdfjs_require__(95); -var _xhtml = __w_pdfjs_require__(96); +var _config = __w_pdfjs_require__(90); +var _connection_set = __w_pdfjs_require__(91); +var _datasets = __w_pdfjs_require__(92); +var _locale_set = __w_pdfjs_require__(93); +var _signature = __w_pdfjs_require__(94); +var _stylesheet = __w_pdfjs_require__(95); +var _template = __w_pdfjs_require__(81); +var _xdp = __w_pdfjs_require__(96); +var _xhtml = __w_pdfjs_require__(97); const NamespaceSetUp = { config: _config.ConfigNamespace, connection: _connection_set.ConnectionSetNamespace, @@ -60639,7 +61144,7 @@ const NamespaceSetUp = { exports.NamespaceSetUp = NamespaceSetUp; /***/ }), -/* 89 */ +/* 90 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -60648,9 +61153,9 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ConfigNamespace = void 0; -var _namespaces = __w_pdfjs_require__(77); -var _xfa_object = __w_pdfjs_require__(75); -var _utils = __w_pdfjs_require__(76); +var _namespaces = __w_pdfjs_require__(78); +var _xfa_object = __w_pdfjs_require__(76); +var _utils = __w_pdfjs_require__(77); var _util = __w_pdfjs_require__(2); const CONFIG_NS_ID = _namespaces.NamespaceIds.config.id; class Acrobat extends _xfa_object.XFAObject { @@ -62075,7 +62580,7 @@ class ConfigNamespace { exports.ConfigNamespace = ConfigNamespace; /***/ }), -/* 90 */ +/* 91 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -62084,8 +62589,8 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ConnectionSetNamespace = void 0; -var _namespaces = __w_pdfjs_require__(77); -var _xfa_object = __w_pdfjs_require__(75); +var _namespaces = __w_pdfjs_require__(78); +var _xfa_object = __w_pdfjs_require__(76); const CONNECTION_SET_NS_ID = _namespaces.NamespaceIds.connectionSet.id; class ConnectionSet extends _xfa_object.XFAObject { constructor(attributes) { @@ -62246,7 +62751,7 @@ class ConnectionSetNamespace { exports.ConnectionSetNamespace = ConnectionSetNamespace; /***/ }), -/* 91 */ +/* 92 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -62255,8 +62760,8 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.DatasetsNamespace = void 0; -var _xfa_object = __w_pdfjs_require__(75); -var _namespaces = __w_pdfjs_require__(77); +var _xfa_object = __w_pdfjs_require__(76); +var _namespaces = __w_pdfjs_require__(78); const DATASETS_NS_ID = _namespaces.NamespaceIds.datasets.id; class Data extends _xfa_object.XmlObject { constructor(attributes) { @@ -62297,7 +62802,7 @@ class DatasetsNamespace { exports.DatasetsNamespace = DatasetsNamespace; /***/ }), -/* 92 */ +/* 93 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -62306,9 +62811,9 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.LocaleSetNamespace = void 0; -var _namespaces = __w_pdfjs_require__(77); -var _xfa_object = __w_pdfjs_require__(75); -var _utils = __w_pdfjs_require__(76); +var _namespaces = __w_pdfjs_require__(78); +var _xfa_object = __w_pdfjs_require__(76); +var _utils = __w_pdfjs_require__(77); const LOCALE_SET_NS_ID = _namespaces.NamespaceIds.localeSet.id; class CalendarSymbols extends _xfa_object.XFAObject { constructor(attributes) { @@ -62555,7 +63060,7 @@ class LocaleSetNamespace { exports.LocaleSetNamespace = LocaleSetNamespace; /***/ }), -/* 93 */ +/* 94 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -62564,8 +63069,8 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SignatureNamespace = void 0; -var _namespaces = __w_pdfjs_require__(77); -var _xfa_object = __w_pdfjs_require__(75); +var _namespaces = __w_pdfjs_require__(78); +var _xfa_object = __w_pdfjs_require__(76); const SIGNATURE_NS_ID = _namespaces.NamespaceIds.signature.id; class Signature extends _xfa_object.XFAObject { constructor(attributes) { @@ -62586,7 +63091,7 @@ class SignatureNamespace { exports.SignatureNamespace = SignatureNamespace; /***/ }), -/* 94 */ +/* 95 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -62595,8 +63100,8 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.StylesheetNamespace = void 0; -var _namespaces = __w_pdfjs_require__(77); -var _xfa_object = __w_pdfjs_require__(75); +var _namespaces = __w_pdfjs_require__(78); +var _xfa_object = __w_pdfjs_require__(76); const STYLESHEET_NS_ID = _namespaces.NamespaceIds.stylesheet.id; class Stylesheet extends _xfa_object.XFAObject { constructor(attributes) { @@ -62617,7 +63122,7 @@ class StylesheetNamespace { exports.StylesheetNamespace = StylesheetNamespace; /***/ }), -/* 95 */ +/* 96 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -62626,8 +63131,8 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.XdpNamespace = void 0; -var _namespaces = __w_pdfjs_require__(77); -var _xfa_object = __w_pdfjs_require__(75); +var _namespaces = __w_pdfjs_require__(78); +var _xfa_object = __w_pdfjs_require__(76); const XDP_NS_ID = _namespaces.NamespaceIds.xdp.id; class Xdp extends _xfa_object.XFAObject { constructor(attributes) { @@ -62660,7 +63165,7 @@ class XdpNamespace { exports.XdpNamespace = XdpNamespace; /***/ }), -/* 96 */ +/* 97 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -62669,10 +63174,10 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.XhtmlNamespace = void 0; -var _xfa_object = __w_pdfjs_require__(75); -var _namespaces = __w_pdfjs_require__(77); -var _html_utils = __w_pdfjs_require__(82); -var _utils = __w_pdfjs_require__(76); +var _xfa_object = __w_pdfjs_require__(76); +var _namespaces = __w_pdfjs_require__(78); +var _html_utils = __w_pdfjs_require__(83); +var _utils = __w_pdfjs_require__(77); const XHTML_NS_ID = _namespaces.NamespaceIds.xhtml.id; const $richText = Symbol(); const VALID_STYLES = new Set(["color", "font", "font-family", "font-size", "font-stretch", "font-style", "font-weight", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "letter-spacing", "line-height", "orphans", "page-break-after", "page-break-before", "page-break-inside", "tab-interval", "tab-stop", "text-align", "text-decoration", "text-indent", "vertical-align", "widows", "kerning-mode", "xfa-font-horizontal-scale", "xfa-font-vertical-scale", "xfa-spacerun", "xfa-tab-stops"]); @@ -62760,9 +63265,9 @@ class XhtmlObject extends _xfa_object.XmlObject { } [_xfa_object.$onText](str, richText = false) { if (!richText) { - str = str.replace(crlfRegExp, ""); + str = str.replaceAll(crlfRegExp, ""); if (!this.style.includes("xfa-spacerun:yes")) { - str = str.replace(spacesRegExp, " "); + str = str.replaceAll(spacesRegExp, " "); } } else { this[$richText] = true; @@ -62864,7 +63369,7 @@ class XhtmlObject extends _xfa_object.XmlObject { } let value; if (this[$richText]) { - value = this[_xfa_object.$content] ? this[_xfa_object.$content].replace(crlfForRichTextRegExp, "\n") : undefined; + value = this[_xfa_object.$content] ? this[_xfa_object.$content].replaceAll(crlfForRichTextRegExp, "\n") : undefined; } else { value = this[_xfa_object.$content] || undefined; } @@ -63076,7 +63581,7 @@ class XhtmlNamespace { exports.XhtmlNamespace = XhtmlNamespace; /***/ }), -/* 97 */ +/* 98 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -63085,8 +63590,8 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.UnknownNamespace = void 0; -var _namespaces = __w_pdfjs_require__(77); -var _xfa_object = __w_pdfjs_require__(75); +var _namespaces = __w_pdfjs_require__(78); +var _xfa_object = __w_pdfjs_require__(76); class UnknownNamespace { constructor(nsId) { this.namespaceId = nsId; @@ -63098,7 +63603,7 @@ class UnknownNamespace { exports.UnknownNamespace = UnknownNamespace; /***/ }), -/* 98 */ +/* 99 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -63109,7 +63614,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.DatasetReader = void 0; var _util = __w_pdfjs_require__(2); var _core_utils = __w_pdfjs_require__(3); -var _xml_parser = __w_pdfjs_require__(64); +var _xml_parser = __w_pdfjs_require__(65); function decodeString(str) { try { return (0, _util.stringToUTF8String)(str); @@ -63165,7 +63670,7 @@ class DatasetReader { exports.DatasetReader = DatasetReader; /***/ }), -/* 99 */ +/* 100 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -63179,13 +63684,13 @@ var _primitives = __w_pdfjs_require__(4); var _parser = __w_pdfjs_require__(15); var _core_utils = __w_pdfjs_require__(3); var _base_stream = __w_pdfjs_require__(5); -var _crypto = __w_pdfjs_require__(65); +var _crypto = __w_pdfjs_require__(66); class XRef { constructor(stream, pdfManager) { this.stream = stream; this.pdfManager = pdfManager; this.entries = []; - this.xrefstms = Object.create(null); + this._xrefStms = new Set(); this._cacheMap = new Map(); this._pendingRefs = new _primitives.RefSet(); this._newPersistentRefNum = null; @@ -63554,7 +64059,7 @@ class XRef { const xrefTagOffset = skipUntil(content, 0, xrefBytes); if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) { xrefStms.push(position - stream.start); - this.xrefstms[position - stream.start] = 1; + this._xrefStms.add(position - stream.start); } position += contentLength; } else if (token.startsWith("trailer") && (token.length === 7 || /\s/.test(token[7]))) { @@ -63671,12 +64176,9 @@ class XRef { this.topDict = dict; } obj = dict.get("XRefStm"); - if (Number.isInteger(obj)) { - const pos = obj; - if (!(pos in this.xrefstms)) { - this.xrefstms[pos] = 1; - this.startXRefQueue.push(pos); - } + if (Number.isInteger(obj) && !this._xrefStms.has(obj)) { + this._xrefStms.add(obj); + this.startXRefQueue.push(obj); } } else if (Number.isInteger(obj)) { if (!Number.isInteger(parser.getObj()) || !(0, _primitives.isCmd)(parser.getObj(), "obj") || !((obj = parser.getObj()) instanceof _base_stream.BaseStream)) { @@ -63714,6 +64216,9 @@ class XRef { } throw new _core_utils.XRefParseException(); } + get lastXRefStreamPos() { + return this._xrefStms.size > 0 ? Math.max(...this._xrefStms) : null; + } getEntry(i) { const xrefEntry = this.entries[i]; if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { @@ -63893,7 +64398,7 @@ class XRef { exports.XRef = XRef; /***/ }), -/* 100 */ +/* 101 */ /***/ ((__unused_webpack_module, exports) => { @@ -63906,7 +64411,7 @@ const isNodeJS = typeof process === "object" && process + "" === "[object proces exports.isNodeJS = isNodeJS; /***/ }), -/* 101 */ +/* 102 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -64319,7 +64824,7 @@ class MessageHandler { exports.MessageHandler = MessageHandler; /***/ }), -/* 102 */ +/* 103 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { @@ -64510,8 +65015,8 @@ Object.defineProperty(exports, "WorkerMessageHandler", ({ } })); var _worker = __w_pdfjs_require__(1); -const pdfjsVersion = '3.4.120'; -const pdfjsBuild = 'af6414988'; +const pdfjsVersion = '3.5.141'; +const pdfjsBuild = 'be0f6ee08'; })(); /******/ return __webpack_exports__;