[api-minor] Let getAnnotations fetch all annotations by default, unless an intent is specified

Currently `getAnnotations` will *only* fetch annotations that are either `viewable` or `printable`. This is "hidden" inside the `core.js` file, meaning that API consumers might be confused as to why they are not recieving *all* the annotations present for a page.

I thus think that the API should, by default, return *all* available annotations unless specifically told otherwise. In e.g. the default viewer, we obviously only want to display annotations that are `viewable`, hence this patch adds an `intent` parameter to `getAnnotations` that makes it possible to decide if only `viewable` or `printable` annotations should be fetched.
This commit is contained in:
Jonas Jenwald 2015-11-22 13:56:52 +01:00
parent aa75c4fe4e
commit b05652ca97
6 changed files with 55 additions and 17 deletions

View File

@ -252,10 +252,16 @@ var Page = (function PageClosure() {
}); });
}, },
getAnnotationsData: function Page_getAnnotationsData() { getAnnotationsData: function Page_getAnnotationsData(intent) {
var annotations = this.annotations; var annotations = this.annotations;
var annotationsData = []; var annotationsData = [];
for (var i = 0, n = annotations.length; i < n; ++i) { for (var i = 0, n = annotations.length; i < n; ++i) {
if (intent) {
if (!(intent === 'display' && annotations[i].viewable) &&
!(intent === 'print' && annotations[i].printable)) {
continue;
}
}
annotationsData.push(annotations[i].data); annotationsData.push(annotations[i].data);
} }
return annotationsData; return annotationsData;
@ -268,7 +274,7 @@ var Page = (function PageClosure() {
for (var i = 0, n = annotationRefs.length; i < n; ++i) { for (var i = 0, n = annotationRefs.length; i < n; ++i) {
var annotationRef = annotationRefs[i]; var annotationRef = annotationRefs[i];
var annotation = annotationFactory.create(this.xref, annotationRef); var annotation = annotationFactory.create(this.xref, annotationRef);
if (annotation && (annotation.viewable || annotation.printable)) { if (annotation) {
annotations.push(annotation); annotations.push(annotation);
} }
} }

View File

@ -447,7 +447,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
handler.on('GetAnnotations', function wphSetupGetAnnotations(data) { handler.on('GetAnnotations', function wphSetupGetAnnotations(data) {
return pdfManager.getPage(data.pageIndex).then(function(page) { return pdfManager.getPage(data.pageIndex).then(function(page) {
return pdfManager.ensure(page, 'getAnnotationsData', []); return pdfManager.ensure(page, 'getAnnotationsData', [data.intent]);
}); });
}); });

View File

@ -649,6 +649,16 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
* @property {string} fontFamily - possible font family * @property {string} fontFamily - possible font family
*/ */
/**
* Page annotation parameters.
*
* @typedef {Object} GetAnnotationsParameters
* @param {string} intent - Determines the annotations that will be fetched,
* can be either 'display' (viewable annotations) or 'print'
* (printable annotations).
* If the parameter is omitted, all annotations are fetched.
*/
/** /**
* Page render parameters. * Page render parameters.
* *
@ -737,12 +747,17 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0); return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);
}, },
/** /**
* @param {GetAnnotationsParameters} params - Annotation parameters.
* @return {Promise} A promise that is resolved with an {Array} of the * @return {Promise} A promise that is resolved with an {Array} of the
* annotation objects. * annotation objects.
*/ */
getAnnotations: function PDFPageProxy_getAnnotations() { getAnnotations: function PDFPageProxy_getAnnotations(params) {
if (!this.annotationsPromise) { var intent = (params && params.intent) || null;
this.annotationsPromise = this.transport.getAnnotations(this.pageIndex);
if (!this.annotationsPromise || this.annotationsIntent !== intent) {
this.annotationsPromise = this.transport.getAnnotations(this.pageIndex,
intent);
this.annotationsIntent = intent;
} }
return this.annotationsPromise; return this.annotationsPromise;
}, },
@ -1470,9 +1485,11 @@ var WorkerTransport = (function WorkerTransportClosure() {
return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref }); return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref });
}, },
getAnnotations: function WorkerTransport_getAnnotations(pageIndex) { getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) {
return this.messageHandler.sendWithPromise('GetAnnotations', return this.messageHandler.sendWithPromise('GetAnnotations', {
{ pageIndex: pageIndex }); pageIndex: pageIndex,
intent: intent,
});
}, },
getDestinations: function WorkerTransport_getDestinations() { getDestinations: function WorkerTransport_getDestinations() {

View File

@ -400,8 +400,18 @@ describe('api', function() {
expect(viewport.height).toEqual(892.92); expect(viewport.height).toEqual(892.92);
}); });
it('gets annotations', function () { it('gets annotations', function () {
var promise = page.getAnnotations(); var defaultPromise = page.getAnnotations();
waitsForPromiseResolved(promise, function (data) { waitsForPromiseResolved(defaultPromise, function (data) {
expect(data.length).toEqual(4);
});
var displayPromise = page.getAnnotations({ intent: 'display' });
waitsForPromiseResolved(displayPromise, function (data) {
expect(data.length).toEqual(4);
});
var printPromise = page.getAnnotations({ intent: 'print' });
waitsForPromiseResolved(printPromise, function (data) {
expect(data.length).toEqual(4); expect(data.length).toEqual(4);
}); });
}); });

View File

@ -45,9 +45,10 @@ var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() {
/** /**
* @param {PageViewport} viewport * @param {PageViewport} viewport
* @param {string} intent (default value is 'display')
*/ */
setupAnnotations: setupAnnotations:
function AnnotationsLayerBuilder_setupAnnotations(viewport) { function AnnotationsLayerBuilder_setupAnnotations(viewport, intent) {
function bindLink(link, dest) { function bindLink(link, dest) {
link.href = linkService.getDestinationHash(dest); link.href = linkService.getDestinationHash(dest);
link.onclick = function annotationsLayerBuilderLinksOnclick() { link.onclick = function annotationsLayerBuilderLinksOnclick() {
@ -73,8 +74,12 @@ var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() {
var linkService = this.linkService; var linkService = this.linkService;
var pdfPage = this.pdfPage; var pdfPage = this.pdfPage;
var self = this; var self = this;
var getAnnotationsParams = {
intent: (intent === undefined ? 'display' : intent),
};
pdfPage.getAnnotations().then(function (annotationsData) { pdfPage.getAnnotations(getAnnotationsParams).then(
function (annotationsData) {
viewport = viewport.clone({ dontFlip: true }); viewport = viewport.clone({ dontFlip: true });
var transform = viewport.transform; var transform = viewport.transform;
var transformStr = 'matrix(' + transform.join(',') + ')'; var transformStr = 'matrix(' + transform.join(',') + ')';

View File

@ -275,7 +275,7 @@ var PDFPageView = (function PDFPageViewClosure() {
} }
if (redrawAnnotations && this.annotationLayer) { if (redrawAnnotations && this.annotationLayer) {
this.annotationLayer.setupAnnotations(this.viewport); this.annotationLayer.setupAnnotations(this.viewport, 'display');
} }
}, },
@ -507,7 +507,7 @@ var PDFPageView = (function PDFPageViewClosure() {
this.annotationLayer = this.annotationsLayerFactory. this.annotationLayer = this.annotationsLayerFactory.
createAnnotationsLayerBuilder(div, this.pdfPage); createAnnotationsLayerBuilder(div, this.pdfPage);
} }
this.annotationLayer.setupAnnotations(this.viewport); this.annotationLayer.setupAnnotations(this.viewport, 'display');
} }
div.setAttribute('data-loaded', true); div.setAttribute('data-loaded', true);