From 75035a2970733bb6ddf9dc402ff972f39d09fb1e Mon Sep 17 00:00:00 2001 From: Tim van der Meij Date: Thu, 8 Aug 2013 21:59:59 +0200 Subject: [PATCH] Named actions implementation --- src/annotation.js | 2 ++ web/viewer.js | 52 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/annotation.js b/src/annotation.js index fd7ad4872..a6487d77e 100644 --- a/src/annotation.js +++ b/src/annotation.js @@ -629,6 +629,8 @@ var LinkAnnotation = (function LinkAnnotationClosure() { } data.url = url; data.dest = action.get('D'); + } else if (linkType === 'Named') { + data.action = action.get('N').name; } else { TODO('unrecognized link type: ' + linkType); } diff --git a/web/viewer.js b/web/viewer.js index 47e0a4cd5..4e61e371f 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -1614,6 +1614,52 @@ var PageView = function pageView(container, id, scale, link.className = 'internalLink'; } + function bindNamedAction(link, action) { + link.onclick = function pageViewSetupNamedActionOnClick() { + // See PDF reference, table 8.45 - Named action + switch (action) { + case 'GoToPage': + document.getElementById('pageNumber').focus(); + break; + + case 'GoBack': + PDFHistory.back(); + break; + + case 'GoForward': + PDFHistory.forward(); + break; + + case 'Find': + if (!PDFView.supportsIntegratedFind) { + PDFFindBar.toggle(); + } + break; + + case 'NextPage': + PDFView.page++; + break; + + case 'PrevPage': + PDFView.page--; + break; + + case 'LastPage': + PDFView.page = PDFView.pages.length; + break; + + case 'FirstPage': + PDFView.page = 1; + break; + + default: + break; // No action according to spec + } + return false; + }; + link.className = 'internalLink'; + } + pdfPage.getAnnotations().then(function(annotationsData) { viewport = viewport.clone({ dontFlip: true }); for (var i = 0; i < annotationsData.length; i++) { @@ -1646,7 +1692,11 @@ var PageView = function pageView(container, id, scale, CustomStyle.setProp('transformOrigin', element, transformOriginStr); if (data.subtype === 'Link' && !data.url) { - bindLink(element, ('dest' in data) ? data.dest : null); + if (data.action) { + bindNamedAction(element, data.action); + } else { + bindLink(element, ('dest' in data) ? data.dest : null); + } } annotationsDiv.appendChild(element);