define(['base', './pdfJsLoader'], (App, PDFJS) => { const EXTERNAL_LINK_TARGET = '_blank' const REL_NOOPENER = 'noreferrer noopener' App.factory('pdfAnnotations', function() { class pdfAnnotations { constructor(options) { this.annotationsLayerDiv = options.annotations this.viewport = options.viewport this.navigateFn = options.navigateFn } setAnnotations(annotations) { const result = [] for (let annotation of annotations) { switch (annotation.subtype) { case 'Link': result.push(this.addLink(annotation)) break case 'Text': continue default: result.push(undefined) } } } addLink(link) { const element = this.buildLinkElementFromRect(link.rect) this.setLinkTarget(element, link) this.annotationsLayerDiv.appendChild(element) } buildLinkElementFromRect(rect) { rect = this.viewport.convertToViewportRectangle(rect) rect = PDFJS.Util.normalizeRect(rect) const element = document.createElement('a') element.style.left = Math.floor(rect[0]) + 'px' element.style.top = Math.floor(rect[1]) + 'px' element.style.width = Math.ceil(rect[2] - rect[0]) + 'px' element.style.height = Math.ceil(rect[3] - rect[1]) + 'px' return element } setLinkTarget(element, link) { if (link.url) { element.href = link.url element.target = EXTERNAL_LINK_TARGET element.rel = REL_NOOPENER } else if (link.dest) { element.href = `#${link.dest}` element.onclick = () => { this.navigateFn(link) return false } } } } return pdfAnnotations }) })