123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- import { AnnotationLayer } from "pdfjs-lib";
- import { NullL10n } from "./l10n_utils.js";
- import { PresentationModeState } from "./ui_utils.js";
- class AnnotationLayerBuilder {
- #numAnnotations = 0;
- #onPresentationModeChanged = null;
-
- constructor({
- pageDiv,
- pdfPage,
- linkService,
- downloadManager,
- annotationStorage = null,
- imageResourcesPath = "",
- renderForms = true,
- l10n = NullL10n,
- enableScripting = false,
- hasJSActionsPromise = null,
- fieldObjectsPromise = null,
- annotationCanvasMap = null,
- accessibilityManager = null,
- }) {
- this.pageDiv = pageDiv;
- this.pdfPage = pdfPage;
- this.linkService = linkService;
- this.downloadManager = downloadManager;
- this.imageResourcesPath = imageResourcesPath;
- this.renderForms = renderForms;
- this.l10n = l10n;
- this.annotationStorage = annotationStorage;
- this.enableScripting = enableScripting;
- this._hasJSActionsPromise = hasJSActionsPromise || Promise.resolve(false);
- this._fieldObjectsPromise = fieldObjectsPromise || Promise.resolve(null);
- this._annotationCanvasMap = annotationCanvasMap;
- this._accessibilityManager = accessibilityManager;
- this.div = null;
- this._cancelled = false;
- this._eventBus = linkService.eventBus;
- }
-
- async render(viewport, intent = "display") {
- if (this.div) {
- if (this._cancelled || this.#numAnnotations === 0) {
- return;
- }
-
-
- AnnotationLayer.update({
- viewport: viewport.clone({ dontFlip: true }),
- div: this.div,
- annotationCanvasMap: this._annotationCanvasMap,
- });
- return;
- }
- const [annotations, hasJSActions, fieldObjects] = await Promise.all([
- this.pdfPage.getAnnotations({ intent }),
- this._hasJSActionsPromise,
- this._fieldObjectsPromise,
- ]);
- if (this._cancelled) {
- return;
- }
- this.#numAnnotations = annotations.length;
-
-
- this.div = document.createElement("div");
- this.div.className = "annotationLayer";
- this.pageDiv.append(this.div);
- if (this.#numAnnotations === 0) {
- this.hide();
- return;
- }
- AnnotationLayer.render({
- viewport: viewport.clone({ dontFlip: true }),
- div: this.div,
- annotations,
- page: this.pdfPage,
- imageResourcesPath: this.imageResourcesPath,
- renderForms: this.renderForms,
- linkService: this.linkService,
- downloadManager: this.downloadManager,
- annotationStorage: this.annotationStorage,
- enableScripting: this.enableScripting,
- hasJSActions,
- fieldObjects,
- annotationCanvasMap: this._annotationCanvasMap,
- accessibilityManager: this._accessibilityManager,
- });
- this.l10n.translate(this.div);
-
-
- if (this.linkService.isInPresentationMode) {
- this.#updatePresentationModeState(PresentationModeState.FULLSCREEN);
- }
- if (!this.#onPresentationModeChanged) {
- this.#onPresentationModeChanged = evt => {
- this.#updatePresentationModeState(evt.state);
- };
- this._eventBus?._on(
- "presentationmodechanged",
- this.#onPresentationModeChanged
- );
- }
- }
- cancel() {
- this._cancelled = true;
- if (this.#onPresentationModeChanged) {
- this._eventBus?._off(
- "presentationmodechanged",
- this.#onPresentationModeChanged
- );
- this.#onPresentationModeChanged = null;
- }
- }
- hide() {
- if (!this.div) {
- return;
- }
- this.div.hidden = true;
- }
- #updatePresentationModeState(state) {
- if (!this.div) {
- return;
- }
- let disableFormElements = false;
- switch (state) {
- case PresentationModeState.FULLSCREEN:
- disableFormElements = true;
- break;
- case PresentationModeState.NORMAL:
- break;
- default:
- return;
- }
- for (const section of this.div.childNodes) {
- if (section.hasAttribute("data-internal-link")) {
- continue;
- }
- section.inert = disableFormElements;
- }
- }
- }
- export { AnnotationLayerBuilder };
|