From 5e604bfeab171fb9612d2396d0816696907c6d44 Mon Sep 17 00:00:00 2001 From: Pdf Bot Date: Tue, 15 Dec 2015 18:08:16 +0000 Subject: [PATCH] PDF.js version 1.3.88 - See mozilla/pdf.js@1b5940edd2f167f026d1ba209a4c68204a777b9f --- bower.json | 2 +- build/pdf.combined.js | 147 +++++++++++++++++++++++++++++++----------- build/pdf.js | 147 +++++++++++++++++++++++++++++++----------- build/pdf.worker.js | 4 +- package.json | 2 +- web/pdf_viewer.css | 4 ++ web/pdf_viewer.js | 116 +++++++-------------------------- 7 files changed, 246 insertions(+), 176 deletions(-) diff --git a/bower.json b/bower.json index 6dada667e..f040c6cbb 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.3.81", + "version": "1.3.88", "main": [ "build/pdf.js", "build/pdf.worker.js" diff --git a/build/pdf.combined.js b/build/pdf.combined.js index 37d23daa8..0246da249 100644 --- a/build/pdf.combined.js +++ b/build/pdf.combined.js @@ -20,8 +20,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.3.81'; -PDFJS.build = '7f34d40'; +PDFJS.version = '1.3.88'; +PDFJS.build = '1b5940e'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -7135,10 +7135,9 @@ PDFJS.CustomStyle = CustomStyle; var ANNOT_MIN_SIZE = 10; // px -var AnnotationUtils = (function AnnotationUtilsClosure() { +var AnnotationLayer = (function AnnotationLayerClosure() { // TODO(mack): This dupes some of the logic in CanvasGraphics.setFont() function setTextStyles(element, item, fontObj) { - var style = element.style; style.fontSize = item.fontSize + 'px'; style.direction = item.fontDirection < 0 ? 'rtl': 'ltr'; @@ -7159,34 +7158,43 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { style.fontFamily = fontFamily + fallbackName; } - function initContainer(item) { + function getContainer(data, page, viewport) { var container = document.createElement('section'); - var cstyle = container.style; - var width = item.rect[2] - item.rect[0]; - var height = item.rect[3] - item.rect[1]; + var width = data.rect[2] - data.rect[0]; + var height = data.rect[3] - data.rect[1]; - // Border - if (item.borderStyle.width > 0) { - // Border width - container.style.borderWidth = item.borderStyle.width + 'px'; - if (item.borderStyle.style !== AnnotationBorderStyleType.UNDERLINE) { + container.setAttribute('data-annotation-id', data.id); + + data.rect = Util.normalizeRect([ + data.rect[0], + page.view[3] - data.rect[1] + page.view[1], + data.rect[2], + page.view[3] - data.rect[3] + page.view[1] + ]); + + CustomStyle.setProp('transform', container, + 'matrix(' + viewport.transform.join(',') + ')'); + CustomStyle.setProp('transformOrigin', container, + -data.rect[0] + 'px ' + -data.rect[1] + 'px'); + + if (data.borderStyle.width > 0) { + container.style.borderWidth = data.borderStyle.width + 'px'; + if (data.borderStyle.style !== AnnotationBorderStyleType.UNDERLINE) { // Underline styles only have a bottom border, so we do not need // to adjust for all borders. This yields a similar result as // Adobe Acrobat/Reader. - width = width - 2 * item.borderStyle.width; - height = height - 2 * item.borderStyle.width; + width = width - 2 * data.borderStyle.width; + height = height - 2 * data.borderStyle.width; } - // Horizontal and vertical border radius - var horizontalRadius = item.borderStyle.horizontalCornerRadius; - var verticalRadius = item.borderStyle.verticalCornerRadius; + var horizontalRadius = data.borderStyle.horizontalCornerRadius; + var verticalRadius = data.borderStyle.verticalCornerRadius; if (horizontalRadius > 0 || verticalRadius > 0) { var radius = horizontalRadius + 'px / ' + verticalRadius + 'px'; CustomStyle.setProp('borderRadius', container, radius); } - // Border style - switch (item.borderStyle.style) { + switch (data.borderStyle.style) { case AnnotationBorderStyleType.SOLID: container.style.borderStyle = 'solid'; break; @@ -7211,24 +7219,27 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { break; } - // Border color - if (item.color) { + if (data.color) { container.style.borderColor = - Util.makeCssRgb(item.color[0] | 0, - item.color[1] | 0, - item.color[2] | 0); + Util.makeCssRgb(data.color[0] | 0, + data.color[1] | 0, + data.color[2] | 0); } else { // Transparent (invisible) border, so do not draw it at all. container.style.borderWidth = 0; } } - cstyle.width = width + 'px'; - cstyle.height = height + 'px'; + container.style.left = data.rect[0] + 'px'; + container.style.top = data.rect[1] + 'px'; + + container.style.width = width + 'px'; + container.style.height = height + 'px'; + return container; } - function getHtmlElementForTextWidgetAnnotation(item, commonObjs) { + function getHtmlElementForTextWidgetAnnotation(item, page) { var element = document.createElement('div'); var width = item.rect[2] - item.rect[0]; var height = item.rect[3] - item.rect[1]; @@ -7244,7 +7255,7 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { content.style.display = 'table-cell'; var fontObj = item.fontRefName ? - commonObjs.getData(item.fontRefName) : null; + page.commonObjs.getData(item.fontRefName) : null; setTextStyles(content, item, fontObj); element.appendChild(content); @@ -7252,7 +7263,7 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { return element; } - function getHtmlElementForTextAnnotation(item) { + function getHtmlElementForTextAnnotation(item, page, viewport) { var rect = item.rect; // sanity check because of OOo-generated PDFs @@ -7263,7 +7274,7 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { rect[2] = rect[0] + (rect[3] - rect[1]); // make it square } - var container = initContainer(item); + var container = getContainer(item, page, viewport); container.className = 'annotText'; var image = document.createElement('img'); @@ -7369,8 +7380,30 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { return container; } - function getHtmlElementForLinkAnnotation(item) { - var container = initContainer(item); + function getHtmlElementForLinkAnnotation(item, page, viewport, linkService) { + function bindLink(link, dest) { + link.href = linkService.getDestinationHash(dest); + link.onclick = function annotationsLayerBuilderLinksOnclick() { + if (dest) { + linkService.navigateTo(dest); + } + return false; + }; + if (dest) { + link.className = 'internalLink'; + } + } + + function bindNamedAction(link, action) { + link.href = linkService.getAnchorUrl(''); + link.onclick = function annotationsLayerBuilderNamedActionOnClick() { + linkService.executeNamedAction(action); + return false; + }; + link.className = 'internalLink'; + } + + var container = getContainer(item, page, viewport); container.className = 'annotLink'; var link = document.createElement('a'); @@ -7380,29 +7413,65 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { link.target = LinkTargetStringMap[PDFJS.externalLinkTarget]; } + if (!item.url) { + if (item.action) { + bindNamedAction(link, item.action); + } else { + bindLink(link, ('dest' in item) ? item.dest : null); + } + } + container.appendChild(link); return container; } - function getHtmlElement(data, objs) { + function getHtmlElement(data, page, viewport, linkService) { switch (data.annotationType) { case AnnotationType.WIDGET: - return getHtmlElementForTextWidgetAnnotation(data, objs); + return getHtmlElementForTextWidgetAnnotation(data, page); case AnnotationType.TEXT: - return getHtmlElementForTextAnnotation(data); + return getHtmlElementForTextAnnotation(data, page, viewport); case AnnotationType.LINK: - return getHtmlElementForLinkAnnotation(data); + return getHtmlElementForLinkAnnotation(data, page, viewport, + linkService); default: throw new Error('Unsupported annotationType: ' + data.annotationType); } } + function render(viewport, div, annotations, page, linkService) { + for (var i = 0, ii = annotations.length; i < ii; i++) { + var data = annotations[i]; + if (!data || !data.hasHtml) { + continue; + } + + var element = getHtmlElement(data, page, viewport, linkService); + div.appendChild(element); + } + } + + function update(viewport, div, annotations) { + for (var i = 0, ii = annotations.length; i < ii; i++) { + var data = annotations[i]; + var element = div.querySelector( + '[data-annotation-id="' + data.id + '"]'); + if (element) { + CustomStyle.setProp('transform', element, + 'matrix(' + viewport.transform.join(',') + ')'); + } + } + div.removeAttribute('hidden'); + } + return { - getHtmlElement: getHtmlElement + render: render, + update: update }; })(); -PDFJS.AnnotationUtils = AnnotationUtils; + +PDFJS.AnnotationLayer = AnnotationLayer; /** diff --git a/build/pdf.js b/build/pdf.js index f12e99a04..c7ab44916 100644 --- a/build/pdf.js +++ b/build/pdf.js @@ -20,8 +20,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.3.81'; -PDFJS.build = '7f34d40'; +PDFJS.version = '1.3.88'; +PDFJS.build = '1b5940e'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -7194,10 +7194,9 @@ PDFJS.CustomStyle = CustomStyle; var ANNOT_MIN_SIZE = 10; // px -var AnnotationUtils = (function AnnotationUtilsClosure() { +var AnnotationLayer = (function AnnotationLayerClosure() { // TODO(mack): This dupes some of the logic in CanvasGraphics.setFont() function setTextStyles(element, item, fontObj) { - var style = element.style; style.fontSize = item.fontSize + 'px'; style.direction = item.fontDirection < 0 ? 'rtl': 'ltr'; @@ -7218,34 +7217,43 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { style.fontFamily = fontFamily + fallbackName; } - function initContainer(item) { + function getContainer(data, page, viewport) { var container = document.createElement('section'); - var cstyle = container.style; - var width = item.rect[2] - item.rect[0]; - var height = item.rect[3] - item.rect[1]; + var width = data.rect[2] - data.rect[0]; + var height = data.rect[3] - data.rect[1]; - // Border - if (item.borderStyle.width > 0) { - // Border width - container.style.borderWidth = item.borderStyle.width + 'px'; - if (item.borderStyle.style !== AnnotationBorderStyleType.UNDERLINE) { + container.setAttribute('data-annotation-id', data.id); + + data.rect = Util.normalizeRect([ + data.rect[0], + page.view[3] - data.rect[1] + page.view[1], + data.rect[2], + page.view[3] - data.rect[3] + page.view[1] + ]); + + CustomStyle.setProp('transform', container, + 'matrix(' + viewport.transform.join(',') + ')'); + CustomStyle.setProp('transformOrigin', container, + -data.rect[0] + 'px ' + -data.rect[1] + 'px'); + + if (data.borderStyle.width > 0) { + container.style.borderWidth = data.borderStyle.width + 'px'; + if (data.borderStyle.style !== AnnotationBorderStyleType.UNDERLINE) { // Underline styles only have a bottom border, so we do not need // to adjust for all borders. This yields a similar result as // Adobe Acrobat/Reader. - width = width - 2 * item.borderStyle.width; - height = height - 2 * item.borderStyle.width; + width = width - 2 * data.borderStyle.width; + height = height - 2 * data.borderStyle.width; } - // Horizontal and vertical border radius - var horizontalRadius = item.borderStyle.horizontalCornerRadius; - var verticalRadius = item.borderStyle.verticalCornerRadius; + var horizontalRadius = data.borderStyle.horizontalCornerRadius; + var verticalRadius = data.borderStyle.verticalCornerRadius; if (horizontalRadius > 0 || verticalRadius > 0) { var radius = horizontalRadius + 'px / ' + verticalRadius + 'px'; CustomStyle.setProp('borderRadius', container, radius); } - // Border style - switch (item.borderStyle.style) { + switch (data.borderStyle.style) { case AnnotationBorderStyleType.SOLID: container.style.borderStyle = 'solid'; break; @@ -7270,24 +7278,27 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { break; } - // Border color - if (item.color) { + if (data.color) { container.style.borderColor = - Util.makeCssRgb(item.color[0] | 0, - item.color[1] | 0, - item.color[2] | 0); + Util.makeCssRgb(data.color[0] | 0, + data.color[1] | 0, + data.color[2] | 0); } else { // Transparent (invisible) border, so do not draw it at all. container.style.borderWidth = 0; } } - cstyle.width = width + 'px'; - cstyle.height = height + 'px'; + container.style.left = data.rect[0] + 'px'; + container.style.top = data.rect[1] + 'px'; + + container.style.width = width + 'px'; + container.style.height = height + 'px'; + return container; } - function getHtmlElementForTextWidgetAnnotation(item, commonObjs) { + function getHtmlElementForTextWidgetAnnotation(item, page) { var element = document.createElement('div'); var width = item.rect[2] - item.rect[0]; var height = item.rect[3] - item.rect[1]; @@ -7303,7 +7314,7 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { content.style.display = 'table-cell'; var fontObj = item.fontRefName ? - commonObjs.getData(item.fontRefName) : null; + page.commonObjs.getData(item.fontRefName) : null; setTextStyles(content, item, fontObj); element.appendChild(content); @@ -7311,7 +7322,7 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { return element; } - function getHtmlElementForTextAnnotation(item) { + function getHtmlElementForTextAnnotation(item, page, viewport) { var rect = item.rect; // sanity check because of OOo-generated PDFs @@ -7322,7 +7333,7 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { rect[2] = rect[0] + (rect[3] - rect[1]); // make it square } - var container = initContainer(item); + var container = getContainer(item, page, viewport); container.className = 'annotText'; var image = document.createElement('img'); @@ -7428,8 +7439,30 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { return container; } - function getHtmlElementForLinkAnnotation(item) { - var container = initContainer(item); + function getHtmlElementForLinkAnnotation(item, page, viewport, linkService) { + function bindLink(link, dest) { + link.href = linkService.getDestinationHash(dest); + link.onclick = function annotationsLayerBuilderLinksOnclick() { + if (dest) { + linkService.navigateTo(dest); + } + return false; + }; + if (dest) { + link.className = 'internalLink'; + } + } + + function bindNamedAction(link, action) { + link.href = linkService.getAnchorUrl(''); + link.onclick = function annotationsLayerBuilderNamedActionOnClick() { + linkService.executeNamedAction(action); + return false; + }; + link.className = 'internalLink'; + } + + var container = getContainer(item, page, viewport); container.className = 'annotLink'; var link = document.createElement('a'); @@ -7439,29 +7472,65 @@ var AnnotationUtils = (function AnnotationUtilsClosure() { link.target = LinkTargetStringMap[PDFJS.externalLinkTarget]; } + if (!item.url) { + if (item.action) { + bindNamedAction(link, item.action); + } else { + bindLink(link, ('dest' in item) ? item.dest : null); + } + } + container.appendChild(link); return container; } - function getHtmlElement(data, objs) { + function getHtmlElement(data, page, viewport, linkService) { switch (data.annotationType) { case AnnotationType.WIDGET: - return getHtmlElementForTextWidgetAnnotation(data, objs); + return getHtmlElementForTextWidgetAnnotation(data, page); case AnnotationType.TEXT: - return getHtmlElementForTextAnnotation(data); + return getHtmlElementForTextAnnotation(data, page, viewport); case AnnotationType.LINK: - return getHtmlElementForLinkAnnotation(data); + return getHtmlElementForLinkAnnotation(data, page, viewport, + linkService); default: throw new Error('Unsupported annotationType: ' + data.annotationType); } } + function render(viewport, div, annotations, page, linkService) { + for (var i = 0, ii = annotations.length; i < ii; i++) { + var data = annotations[i]; + if (!data || !data.hasHtml) { + continue; + } + + var element = getHtmlElement(data, page, viewport, linkService); + div.appendChild(element); + } + } + + function update(viewport, div, annotations) { + for (var i = 0, ii = annotations.length; i < ii; i++) { + var data = annotations[i]; + var element = div.querySelector( + '[data-annotation-id="' + data.id + '"]'); + if (element) { + CustomStyle.setProp('transform', element, + 'matrix(' + viewport.transform.join(',') + ')'); + } + } + div.removeAttribute('hidden'); + } + return { - getHtmlElement: getHtmlElement + render: render, + update: update }; })(); -PDFJS.AnnotationUtils = AnnotationUtils; + +PDFJS.AnnotationLayer = AnnotationLayer; /** diff --git a/build/pdf.worker.js b/build/pdf.worker.js index 550698a2a..3934fa29c 100644 --- a/build/pdf.worker.js +++ b/build/pdf.worker.js @@ -20,8 +20,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.3.81'; -PDFJS.build = '7f34d40'; +PDFJS.version = '1.3.88'; +PDFJS.build = '1b5940e'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it diff --git a/package.json b/package.json index 538455628..abffaf875 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.3.81", + "version": "1.3.88", "description": "Generic build of Mozilla's PDF.js library.", "keywords": [ "Mozilla", diff --git a/web/pdf_viewer.css b/web/pdf_viewer.css index 47f63c878..61cc782fa 100644 --- a/web/pdf_viewer.css +++ b/web/pdf_viewer.css @@ -82,6 +82,10 @@ } +.annotationLayer section { + position: absolute; +} + .annotationLayer .annotLink > a:hover { opacity: 0.2; background: #ff0; diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js index c7cc94f3d..9f98d8d2c 100644 --- a/web/pdf_viewer.js +++ b/web/pdf_viewer.js @@ -1143,7 +1143,7 @@ var PDFPageView = (function PDFPageViewClosure() { } if (redrawAnnotations && this.annotationLayer) { - this.annotationLayer.setupAnnotations(this.viewport, 'display'); + this.annotationLayer.render(this.viewport, 'display'); } }, @@ -1363,7 +1363,7 @@ var PDFPageView = (function PDFPageViewClosure() { this.annotationLayer = this.annotationsLayerFactory. createAnnotationsLayerBuilder(div, this.pdfPage); } - this.annotationLayer.setupAnnotations(this.viewport, 'display'); + this.annotationLayer.render(this.viewport, 'display'); } div.setAttribute('data-loaded', true); @@ -1776,8 +1776,6 @@ DefaultTextLayerFactory.prototype = { * @class */ var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() { - var CustomStyle = PDFJS.CustomStyle; - /** * @param {AnnotationsLayerBuilderOptions} options * @constructs AnnotationsLayerBuilder @@ -1789,6 +1787,7 @@ var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() { this.div = null; } + AnnotationsLayerBuilder.prototype = /** @lends AnnotationsLayerBuilder.prototype */ { @@ -1796,118 +1795,47 @@ var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() { * @param {PageViewport} viewport * @param {string} intent (default value is 'display') */ - setupAnnotations: - function AnnotationsLayerBuilder_setupAnnotations(viewport, intent) { - function bindLink(link, dest) { - link.href = linkService.getDestinationHash(dest); - link.onclick = function annotationsLayerBuilderLinksOnclick() { - if (dest) { - linkService.navigateTo(dest); - } - return false; - }; - if (dest) { - link.className = 'internalLink'; - } - } - - function bindNamedAction(link, action) { - link.href = linkService.getAnchorUrl(''); - link.onclick = function annotationsLayerBuilderNamedActionOnClick() { - linkService.executeNamedAction(action); - return false; - }; - link.className = 'internalLink'; - } - - var linkService = this.linkService; - var pdfPage = this.pdfPage; + render: function AnnotationsLayerBuilder_render(viewport, intent) { var self = this; - var getAnnotationsParams = { + var parameters = { intent: (intent === undefined ? 'display' : intent), }; - pdfPage.getAnnotations(getAnnotationsParams).then( - function (annotationsData) { + this.pdfPage.getAnnotations(parameters).then(function (annotations) { viewport = viewport.clone({ dontFlip: true }); - var transform = viewport.transform; - var transformStr = 'matrix(' + transform.join(',') + ')'; - var data, element, i, ii; if (self.div) { // If an annotationLayer already exists, refresh its children's - // transformation matrices - for (i = 0, ii = annotationsData.length; i < ii; i++) { - data = annotationsData[i]; - element = self.div.querySelector( - '[data-annotation-id="' + data.id + '"]'); - if (element) { - CustomStyle.setProp('transform', element, transformStr); - } - } - // See PDFPageView.reset() - self.div.removeAttribute('hidden'); + // transformation matrices. + PDFJS.AnnotationLayer.update(viewport, self.div, annotations); } else { - for (i = 0, ii = annotationsData.length; i < ii; i++) { - data = annotationsData[i]; - if (!data || !data.hasHtml) { - continue; - } - - element = PDFJS.AnnotationUtils.getHtmlElement(data, - pdfPage.commonObjs); - element.setAttribute('data-annotation-id', data.id); - if (typeof mozL10n !== 'undefined') { - mozL10n.translate(element); - } - - var rect = data.rect; - var view = pdfPage.view; - rect = PDFJS.Util.normalizeRect([ - rect[0], - view[3] - rect[1] + view[1], - rect[2], - view[3] - rect[3] + view[1] - ]); - element.style.left = rect[0] + 'px'; - element.style.top = rect[1] + 'px'; - element.style.position = 'absolute'; - - CustomStyle.setProp('transform', element, transformStr); - var transformOriginStr = -rect[0] + 'px ' + -rect[1] + 'px'; - CustomStyle.setProp('transformOrigin', element, transformOriginStr); - - if (data.subtype === 'Link' && !data.url) { - var link = element.getElementsByTagName('a')[0]; - if (link) { - if (data.action) { - bindNamedAction(link, data.action); - } else { - bindLink(link, ('dest' in data) ? data.dest : null); - } - } - } + // Create an annotation layer div and render the annotations + // if there is at least one annotation. + if (annotations.length === 0) { + return; + } - if (!self.div) { - var annotationLayerDiv = document.createElement('div'); - annotationLayerDiv.className = 'annotationLayer'; - self.pageDiv.appendChild(annotationLayerDiv); - self.div = annotationLayerDiv; - } + self.div = document.createElement('div'); + self.div.className = 'annotationLayer'; + self.pageDiv.appendChild(self.div); - self.div.appendChild(element); + PDFJS.AnnotationLayer.render(viewport, self.div, annotations, + self.pdfPage, self.linkService); + if (typeof mozL10n !== 'undefined') { + mozL10n.translate(self.div); } } }); }, - hide: function () { + hide: function AnnotationsLayerBuilder_hide() { if (!this.div) { return; } this.div.setAttribute('hidden', 'true'); } }; + return AnnotationsLayerBuilder; })();