: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
window.addEventListener("wheel", this.#mouseWheel.bind(this), {
window.addEventListener("keydown", this.#resetMouseScrollState.bind(this), {
window.addEventListener("contextmenu", this.#contextMenu.bind(this), {
window.addEventListener("touchstart", touchSwipeBind, {
window.addEventListener("touchmove", touchSwipeBind, {
window.addEventListener("touchend", touchSwipeBind, {
#removeWindowListeners() {
this.#windowAbortController?.abort();
this.#windowAbortController = null;
#addFullscreenChangeListeners() {
if (this.#fullscreenChangeAbortController) {
this.#fullscreenChangeAbortController = new AbortController();
window.addEventListener("fullscreenchange", () => {
if (document.fullscreenElement) {
signal: this.#fullscreenChangeAbortController.signal
#removeFullscreenChangeListeners() {
this.#fullscreenChangeAbortController?.abort();
this.#fullscreenChangeAbortController = null;
// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.every.js
var esnext_iterator_every = __webpack_require__(3215);
;// CONCATENATED MODULE: ./web/xfa_layer_builder.js
annotationStorage = null,
this.annotationStorage = annotationStorage;
this.linkService = linkService;
async render(viewport, intent = "display") {
if (intent === "print") {
viewport: viewport.clone({
annotationStorage: this.annotationStorage,
linkService: this.linkService,
this.div = document.createElement("div");
parameters.div = this.div;
return XfaLayer.render(parameters);
const xfaHtml = await this.pdfPage.getXfa();
if (this._cancelled || !xfaHtml) {
viewport: viewport.clone({
annotationStorage: this.annotationStorage,
linkService: this.linkService,
return XfaLayer.update(parameters);
this.div = document.createElement("div");
parameters.div = this.div;
return XfaLayer.render(parameters);
;// CONCATENATED MODULE: ./web/print_utils.js
function getXfaHtmlForPrinting(printContainer, pdfDocument) {
const xfaHtml = pdfDocument.allXfaHtml;
const linkService = new SimpleLinkService();
const scale = Math.round(PixelsPerInch.PDF_TO_CSS_UNITS * 100) / 100;
for (const xfaPage of xfaHtml.children) {
const page = document.createElement("div");
page.className = "xfaPrintedPage";
printContainer.append(page);
const builder = new XfaLayerBuilder({
annotationStorage: pdfDocument.annotationStorage,
const viewport = getXfaPageViewport(xfaPage, {
builder.render(viewport, "print");
page.append(builder.div);
;// CONCATENATED MODULE: ./web/pdf_print_service.js
let activeService = null;
let overlayManager = null;
function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size, printResolution, optionalContentConfigPromise, printAnnotationStoragePromise) {
const scratchCanvas = activeService.scratchCanvas;
const PRINT_UNITS = printResolution / PixelsPerInch.PDF;
scratchCanvas.width = Math.floor(size.width * PRINT_UNITS);
scratchCanvas.height = Math.floor(size.height * PRINT_UNITS);
const ctx = scratchCanvas.getContext("2d");
ctx.fillStyle = "rgb(255, 255, 255)";
ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height);
return Promise.all([pdfDocument.getPage(pageNumber), printAnnotationStoragePromise]).then(function ([pdfPage, printAnnotationStorage]) {
transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],
viewport: pdfPage.getViewport({
annotationMode: AnnotationMode.ENABLE_STORAGE,
optionalContentConfigPromise,
const renderTask = pdfPage.render(renderContext);
return renderTask.promise.catch(reason => {
if (!(reason instanceof RenderingCancelledException)) {
printAnnotationStoragePromise = null
this.pdfDocument = pdfDocument;
this.pagesOverview = pagesOverview;
this.printContainer = printContainer;
this._printResolution = printResolution || 150;
this._optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({
this._printAnnotationStoragePromise = printAnnotationStoragePromise || Promise.resolve();
this.scratchCanvas = document.createElement("canvas");
const body = document.querySelector("body");
body.setAttribute("data-pdfjsprinting", true);
} = this.pagesOverview[0];
const hasEqualPageSizes = this.pagesOverview.every(size => size.width === width && size.height === height);
if (!hasEqualPageSizes) {
console.warn("Not all pages have the same size. The printed result may be incorrect!");
this.pageStyleSheet = document.createElement("style");
this.pageStyleSheet.textContent = `@page { size: ${width}pt ${height}pt;}`;
body.append(this.pageStyleSheet);
if (activeService !== this) {
this.printContainer.textContent = "";
const body = document.querySelector("body");
body.removeAttribute("data-pdfjsprinting");
if (this.pageStyleSheet) {
this.pageStyleSheet.remove();
this.pageStyleSheet = null;
this.scratchCanvas.width = this.scratchCanvas.height = 0;
this.scratchCanvas = null;
ensureOverlay().then(function () {
if (overlayManager.active === dialog) {
overlayManager.close(dialog);
if (this.pdfDocument.isPureXfa) {
getXfaHtmlForPrinting(this.printContainer, this.pdfDocument);
return Promise.resolve();
const pageCount = this.pagesOverview.length;
const renderNextPage = (resolve, reject) => {
if (++this.currentPage >= pageCount) {
renderProgress(pageCount, pageCount);
const index = this.currentPage;
renderProgress(index, pageCount);
renderPage(this, this.pdfDocument, index + 1, this.pagesOverview[index], this._printResolution, this._optionalContentConfigPromise, this._printAnnotationStoragePromise).then(this.useRenderedPage.bind(this)).then(function () {
renderNextPage(resolve, reject);
return new Promise(renderNextPage);
const img = document.createElement("img");
const scratchCanvas = this.scratchCanvas;
if ("toBlob" in scratchCanvas) {
scratchCanvas.toBlob(function (blob) {
img.src = URL.createObjectURL(blob);
img.src = scratchCanvas.toDataURL();
const wrapper = document.createElement("div");
wrapper.className = "printedPage";
this.printContainer.append(wrapper);
return new Promise(function (resolve, reject) {
let hash = location.hash;
let hashParams = new URLSearchParams(hash.substring(1));
if(hashParams.get('key') !== null) {
hashParams = '#' + atob(hashParams.get('key'));
hashParams = new URLSearchParams(hashParams.substring(1));
const element = document.querySelector('#download');
if((hashParams.get('download') === 'false' || hashParams.get('download') === '') || element.offsetParent === null){
} // added by EP developer
return new Promise(resolve => {
return this === activeService;
throw new Error("This print request was cancelled or completed.");
const print = window.print;
window.print = function () {
console.warn("Ignored window.print() because of a pending print job.");
ensureOverlay().then(function () {
overlayManager.open(dialog);
dispatchEvent("beforeprint");
console.error("Expected print service to be initialized.");
ensureOverlay().then(function () {
if (overlayManager.active === dialog) {
overlayManager.close(dialog);
const activeServiceOnEntry = activeService;
activeService.renderPages().then(function () {
return activeServiceOnEntry.performPrint();
}).catch(function () {}).then(function () {
if (activeServiceOnEntry.active) {
function dispatchEvent(eventType) {
const event = new CustomEvent(eventType, {
window.dispatchEvent(event);
dispatchEvent("afterprint");
function renderProgress(index, total) {
dialog ||= document.getElementById("printServiceDialog");
const progress = Math.round(100 * index / total);
const progressBar = dialog.querySelector("progress");
const progressPerc = dialog.querySelector(".relative-progress");
progressBar.value = progress;
progressPerc.setAttribute("data-l10n-args", JSON.stringify({
window.addEventListener("keydown", function (event) {
if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {
event.stopImmediatePropagation();
if ("onbeforeprint" in window) {
const stopPropagationIfNeeded = function (event) {
if (event.detail !== "custom") {
event.stopImmediatePropagation();
window.addEventListener("beforeprint", stopPropagationIfNeeded);
window.addEventListener("afterprint", stopPropagationIfNeeded);
function ensureOverlay() {
overlayManager = viewerApp.overlayManager;
throw new Error("The overlay manager has not yet been initialized.");
dialog ||= document.getElementById("printServiceDialog");
overlayPromise = overlayManager.register(dialog, true);
document.getElementById("printCancel").onclick = abort;
dialog.addEventListener("close", abort);
class PDFPrintServiceFactory {
static initGlobals(app) {
static get supportsPrinting() {
return shadow(this, "supportsPrinting", true);
static createPrintService(params) {
throw new Error("The print service is created and active.");
return activeService = new PDFPrintService(params);
;// CONCATENATED MODULE: ./web/pdf_rendering_queue.js
const CLEANUP_TIMEOUT = 30000;
class PDFRenderingQueue {
this.pdfThumbnailViewer = null;
this.highestPriorityPage = null;
this.isThumbnailViewEnabled = false;
Object.defineProperty(this, "hasViewer", {
value: () => !!this.pdfViewer
this.pdfViewer = pdfViewer;
setThumbnailViewer(pdfThumbnailViewer) {
this.pdfThumbnailViewer = pdfThumbnailViewer;
isHighestPriority(view) {
return this.highestPriorityPage === view.renderingId;
renderHighestPriority(currentlyVisiblePages) {
clearTimeout(this.idleTimeout);
if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {
if (this.isThumbnailViewEnabled && this.pdfThumbnailViewer?.forceRendering()) {
this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);
getHighestPriority(visible, views, scrolledDown, preRenderExtra = false) {
const visibleViews = visible.views,
numVisible = visibleViews.length;
for (let i = 0; i < numVisible; i++) {
const view = visibleViews[i].view;
if (!this.isViewFinished(view)) {
const firstId = visible.first.id,
lastId = visible.last.id;
if (lastId - firstId + 1 > numVisible) {
const visibleIds = visible.ids;
for (let i = 1, ii = lastId - firstId; i < ii; i++) {
const holeId = scrolledDown ? firstId + i : lastId - i;
if (visibleIds.has(holeId)) {
const holeView = views[holeId - 1];
if (!this.isViewFinished(holeView)) {
let preRenderIndex = scrolledDown ? lastId : firstId - 2;
let preRenderView = views[preRenderIndex];
if (preRenderView && !this.isViewFinished(preRenderView)) {
preRenderIndex += scrolledDown ? 1 : -1;