From b16a406f3adea369c2402e5ba504f193bdc5ab76 Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Tue, 30 Sep 2014 12:22:38 -0500 Subject: [PATCH 1/2] Packages PDFViewer as a UI component. --- examples/components/simpleviewer.html | 48 ++++++++++++++++++++++++++ examples/components/simpleviewer.js | 43 +++++++++++++++++++++++ examples/learning/helloworld.html | 2 +- examples/learning/prevnext.html | 2 +- make.js | 46 +++++++++++++++++++++++-- web/interfaces.js | 6 +++- web/pdf_viewer.component.js | 32 +++++++++++++++++ web/pdf_viewer.js | 49 ++++++++++++++++++++++++++- 8 files changed, 221 insertions(+), 7 deletions(-) create mode 100644 examples/components/simpleviewer.html create mode 100644 examples/components/simpleviewer.js create mode 100644 web/pdf_viewer.component.js diff --git a/examples/components/simpleviewer.html b/examples/components/simpleviewer.html new file mode 100644 index 000000000..b1d6c9d19 --- /dev/null +++ b/examples/components/simpleviewer.html @@ -0,0 +1,48 @@ + + + + + + + + PDF.js viewer using built components + + + + + + + + + + + + +
+
+
+ + + + + diff --git a/examples/components/simpleviewer.js b/examples/components/simpleviewer.js new file mode 100644 index 000000000..548881768 --- /dev/null +++ b/examples/components/simpleviewer.js @@ -0,0 +1,43 @@ +/* Copyright 2014 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +if (!PDFJS.PDFViewer || !PDFJS.getDocument) { + alert('Please built the library and components using\n' + + ' `node make generic components`'); +} + +// If pdf.js must be execute via eval or pdf.worker.js is located at the +// different location than pdf.js, specify workerSrc. +// +// PDFJS.workerSrc = '../../build/pdf.worker.js'; + +// Some PDFs need external cmaps +// +// PDFJS.cMapUrl = '../../external/bcmaps/'; +// PDFJS.cMapPacked = true; + +var DEFAULT_URL = '../../web/compressed.tracemonkey-pldi-09.pdf'; + +var pdfViewer = new PDFJS.PDFViewer({ + container: document.getElementById('viewerContainer') +}); + +// Loading document. +PDFJS.getDocument(DEFAULT_URL).then(function (pdfDocument) { + // Document loaded, specifying document for the viewer. + pdfViewer.setDocument(pdfDocument); +}); diff --git a/examples/learning/helloworld.html b/examples/learning/helloworld.html index b34474635..9518127ee 100644 --- a/examples/learning/helloworld.html +++ b/examples/learning/helloworld.html @@ -31,7 +31,7 @@ // // If pdf.js must be execute via eval or pdf.worker.js is located at the - // different location that pdf.js, specify workerSrc. + // different location than pdf.js, specify workerSrc. // // PDFJS.workerSrc = '../../build/pdf.worker.js'; diff --git a/examples/learning/prevnext.html b/examples/learning/prevnext.html index 42c1f1b81..4ab65d9e9 100644 --- a/examples/learning/prevnext.html +++ b/examples/learning/prevnext.html @@ -41,7 +41,7 @@ // // If pdf.js must be execute via eval or pdf.worker.js is located at the - // different location that pdf.js, specify workerSrc. + // different location than pdf.js, specify workerSrc. // // PDFJS.workerSrc = '../../build/pdf.worker.js'; diff --git a/make.js b/make.js index 278c505e0..3a4456fec 100644 --- a/make.js +++ b/make.js @@ -49,7 +49,8 @@ var ROOT_DIR = __dirname + '/', // absolute path to project's root GH_PAGES_DIR = BUILD_DIR + 'gh-pages/', GENERIC_DIR = BUILD_DIR + 'generic/', MINIFIED_DIR = BUILD_DIR + 'minified/', - SINGLE_FILE_DIR = BUILD_DIR + '/singlefile/', + SINGLE_FILE_DIR = BUILD_DIR + 'singlefile/', + COMPONENTS_DIR = BUILD_DIR + 'components/', REPO = 'git@github.com:mozilla/pdf.js.git', MOZCENTRAL_PREF_PREFIX = 'pdfjs', FIREFOX_PREF_PREFIX = 'extensions.uriloader@pdf.js', @@ -65,7 +66,8 @@ var DEFINES = { B2G: false, CHROME: false, MINIFIED: false, - SINGLE_FILE: false + SINGLE_FILE: false, + COMPONENTS: false }; // @@ -146,6 +148,43 @@ target.generic = function() { cleanupCSSSource(GENERIC_DIR + '/web/viewer.css'); }; +target.components = function() { + cd(ROOT_DIR); + echo(); + echo('### Creating generic components'); + + rm('-rf', COMPONENTS_DIR); + mkdir('-p', COMPONENTS_DIR); + mkdir('-p', COMPONENTS_DIR + 'images'); + + var defines = builder.merge(DEFINES, {COMPONENTS: true}); + + var COMPONENTS_IMAGES = [ + 'web/images/annotation-*.svg', + 'web/images/loading-icon.gif', + 'web/images/shadow.png', + 'web/images/texture.png', + ]; + + var setup = { + defines: defines, + copy: [ + [COMPONENTS_IMAGES, COMPONENTS_DIR + 'images'], + ['web/compatibility.js', COMPONENTS_DIR], + ], + preprocess: [ + ['web/pdf_viewer.component.js', COMPONENTS_DIR + 'pdf_viewer.js'], + ], + preprocessCSS: [ + ['components', 'web/pdf_viewer.css', COMPONENTS_DIR + 'pdf_viewer.css'], + ] + }; + builder.build(setup); + + cleanupJSSource(COMPONENTS_DIR + 'pdf_viewer.js'); + cleanupCSSSource(COMPONENTS_DIR + 'pdf_viewer.css'); +}; + target.jsdoc = function() { echo(); echo('### Generating jsdoc'); @@ -233,6 +272,7 @@ target.web = function() { target.dist = function() { target.generic(); target.singlefile(); + target.components(); var DIST_DIR = BUILD_DIR + 'dist/'; var DIST_REPO_URL = 'https://github.com/mozilla/pdfjs-dist'; @@ -262,7 +302,7 @@ target.dist = function() { mkdir('-p', DIST_DIR + 'web/'); cp('-R', [ - GENERIC_DIR + 'web/compatibility.js', + COMPONENTS_DIR + '*', ], DIST_DIR + 'web/'); echo(); diff --git a/web/interfaces.js b/web/interfaces.js index 54c2825f0..5f0ad04c6 100644 --- a/web/interfaces.js +++ b/web/interfaces.js @@ -1,5 +1,5 @@ /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* Copyright 2012 Mozilla Foundation +/* Copyright 2014 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,6 +47,10 @@ IPDFLinkService.prototype = { * @param {string} hash */ setHash: function (hash) {}, + /** + * @param {string} action + */ + executeNamedAction: function (action) {}, }; /** diff --git a/web/pdf_viewer.component.js b/web/pdf_viewer.component.js new file mode 100644 index 000000000..22c483854 --- /dev/null +++ b/web/pdf_viewer.component.js @@ -0,0 +1,32 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ +/* Copyright 2014 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*jshint globalstrict: false */ +/* globals PDFJS, PDFViewer */ + +// Initializing PDFJS global object (if still undefined) +if (typeof PDFJS === 'undefined') { + (typeof window !== 'undefined' ? window : this).PDFJS = {}; +} + +(function pdfViewerWrapper() { + 'use strict'; + +//#include ui_utils.js +//#include pdf_viewer.js + + PDFJS.PDFViewer = PDFViewer; +}).call((typeof window === 'undefined') ? this : window); diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js index 146c02e00..f5dd910c3 100644 --- a/web/pdf_viewer.js +++ b/web/pdf_viewer.js @@ -57,7 +57,7 @@ var PDFViewer = (function pdfViewer() { function PDFViewer(options) { this.container = options.container; this.viewer = options.viewer || options.container.firstElementChild; - this.linkService = options.linkService; + this.linkService = options.linkService || new SimpleLinkService(this); this.defaultRenderingQueue = !options.renderingQueue; if (this.defaultRenderingQueue) { @@ -642,6 +642,53 @@ var PDFViewer = (function pdfViewer() { return PDFViewer; })(); +var SimpleLinkService = (function SimpleLinkServiceClosure() { + function SimpleLinkService(pdfViewer) { + this.pdfViewer = pdfViewer; + } + SimpleLinkService.prototype = { + /** + * @returns {number} + */ + get page() { + return this.pdfViewer.currentPageNumber; + }, + /** + * @param {number} value + */ + set page(value) { + this.pdfViewer.currentPageNumber = value; + }, + /** + * @param dest - The PDF destination object. + */ + navigateTo: function (dest) {}, + /** + * @param dest - The PDF destination object. + * @returns {string} The hyperlink to the PDF object. + */ + getDestinationHash: function (dest) { + return '#'; + }, + /** + * @param hash - The PDF parameters/hash. + * @returns {string} The hyperlink to the PDF object. + */ + getAnchorUrl: function (hash) { + return '#'; + }, + /** + * @param {string} hash + */ + setHash: function (hash) {}, + /** + * @param {string} action + */ + executeNamedAction: function (action) {}, + }; + return SimpleLinkService; +})(); + /** * PDFPage object source. * @class From 5740b9602066bb628ad99e862f17cd4d582861bb Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Tue, 30 Sep 2014 12:31:58 -0500 Subject: [PATCH 2/2] Introduces 'pagesinit' event. --- examples/components/simpleviewer.js | 8 +++++++- web/pdf_viewer.js | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/examples/components/simpleviewer.js b/examples/components/simpleviewer.js index 548881768..1934a5a6e 100644 --- a/examples/components/simpleviewer.js +++ b/examples/components/simpleviewer.js @@ -32,8 +32,14 @@ if (!PDFJS.PDFViewer || !PDFJS.getDocument) { var DEFAULT_URL = '../../web/compressed.tracemonkey-pldi-09.pdf'; +var container = document.getElementById('viewerContainer'); var pdfViewer = new PDFJS.PDFViewer({ - container: document.getElementById('viewerContainer') + container: container +}); + +container.addEventListener('pagesinit', function () { + // we can use pdfViewer now, e.g. let's change default scale. + pdfViewer.currentScaleValue = 'page-width'; }); // Loading document. diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js index f5dd910c3..02304d01c 100644 --- a/web/pdf_viewer.js +++ b/web/pdf_viewer.js @@ -270,8 +270,12 @@ var PDFViewer = (function pdfViewer() { } }); + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('pagesinit', true, true, null); + self.container.dispatchEvent(event); + if (this.defaultRenderingQueue) { - firstPagePromise.then(this.update.bind(this)); + this.update(); } }.bind(this)); },