diff --git a/Makefile b/Makefile index 0451f60a5..681d82601 100644 --- a/Makefile +++ b/Makefile @@ -36,6 +36,7 @@ PDF_JS_FILES = \ stream.js \ worker.js \ ../external/jpgjs/jpg.js \ + jpx.js \ $(NULL) # make server diff --git a/README.md b/README.md index 97db68d36..f12fce934 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,6 @@ -# pdf.js +# PDF.JS - -## Overview - pdf.js is an HTML5 technology experiment that explores building a faithful and efficient Portable Document Format (PDF) renderer without native code assistance. @@ -16,7 +13,7 @@ successful. -## Getting started +# Getting started ### Online demo @@ -29,11 +26,12 @@ using the pdf.js API. ### Extension -An up-to-date Firefox extension is also available: +A Firefox extension is also available: + http://mozilla.github.com/pdf.js/extensions/firefox/pdf.js.xpi -(The above link is updated upon every merge to our master branch). +Note that this extension is self-updating, and by default Firefox will auto-update extensions on a +daily basis (you can change this through the `extensions.update.interval` option in `about:config`). For an experimental Chrome extension, get the code as explained below and issue `make extension`. Then open Chrome with the flag `--enable-experimental-extension-apis`, go to `Tools > Extension` @@ -68,12 +66,12 @@ In order to bundle all `src/` files into a final `pdf.js`, issue: This will generate the file `build/pdf.js` that can be included in your final project. (WARNING: That's a large file! Consider minifying it). -## Learning +# Learning Here are some initial pointers to help contributors get off the ground. Additional resources are available in a separate section below. -#### Hello world +### Hello world For a "hello world" example, take a look at: @@ -82,7 +80,7 @@ For a "hello world" example, take a look at: This example illustrates the bare minimum ingredients for integrating pdf.js in a custom project. -#### Introductory video +### Introductory video Check out the presentation by our contributor Julian Viereck on the inner workings of PDF and pdf.js: @@ -92,7 +90,7 @@ workings of PDF and pdf.js: -## Contributing +# Contributing pdf.js is a community-driven project, so contributors are always welcome. Simply fork our repo and contribute away. Good starting places for picking @@ -122,7 +120,7 @@ You can add your name to it! :) -## Running the tests +# Running the tests pdf.js comes with browser-level regression tests that allow one to probe whether it's able to successfully parse PDFs, as well as compare its output @@ -148,7 +146,7 @@ images. The test type `load` simply tests whether the file loads without raising any errors. -## Running tests through our bot +### Running tests through our bot If you are a reviewer, you can use our remote bot to issue comprehensive tests against reference images before merging pull requests. @@ -158,7 +156,7 @@ See the bot repo for details: + https://github.com/mozilla/pdf.js-bot -## Additional resources +# Additional resources Gallery of user projects and modifications: @@ -188,7 +186,7 @@ Follow us on twitter: @pdfjs -## PDF-related resources +### PDF-related resources A really basic overview of PDF is described here: diff --git a/examples/acroforms/index.html b/examples/acroforms/index.html index 5fad4648a..8a9053f78 100644 --- a/examples/acroforms/index.html +++ b/examples/acroforms/index.html @@ -23,6 +23,7 @@ + + + + diff --git a/web/viewer.js b/web/viewer.js index ac3fbff0c..b6b62af83 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -960,22 +960,55 @@ var TextLayerBuilder = function textLayerBuilder(textLayerDiv) { var self = this; var textDivs = this.textDivs; var textLayerDiv = this.textLayerDiv; - this.textLayerTimer = setInterval(function renderTextLayer() { + var renderTimer = null; + var renderingDone = false; + var renderInterval = 0; + var resumeInterval = 500; // in ms + + // Render the text layer, one div at a time + function renderTextLayer() { if (textDivs.length === 0) { - clearInterval(self.textLayerTimer); + clearInterval(renderTimer); + renderingDone = true; return; } var textDiv = textDivs.shift(); - if (textDiv.dataset.textLength >= 1) { // avoid div by zero + if (textDiv.dataset.textLength > 0) { textLayerDiv.appendChild(textDiv); - // Adjust div width (via letterSpacing) to match canvas text - // Due to the .offsetWidth calls, this is slow - textDiv.style.letterSpacing = - ((textDiv.dataset.canvasWidth - textDiv.offsetWidth) / - (textDiv.dataset.textLength - 1)) + 'px'; + + if (textDiv.dataset.textLength > 1) { // avoid div by zero + // Adjust div width (via letterSpacing) to match canvas text + // Due to the .offsetWidth calls, this is slow + // This needs to come after appending to the DOM + textDiv.style.letterSpacing = + ((textDiv.dataset.canvasWidth - textDiv.offsetWidth) / + (textDiv.dataset.textLength - 1)) + 'px'; + } + } // textLength > 0 + } + renderTimer = setInterval(renderTextLayer, renderInterval); + + // Stop rendering when user scrolls. Resume after XXX milliseconds + // of no scroll events + var scrollTimer = null; + function textLayerOnScroll() { + if (renderingDone) { + window.removeEventListener('scroll', textLayerOnScroll, false); + return; } - }, 0); - }; + + // Immediately pause rendering + clearInterval(renderTimer); + + clearTimeout(scrollTimer); + scrollTimer = setTimeout(function textLayerScrollTimer() { + // Resume rendering + renderTimer = setInterval(renderTextLayer, renderInterval); + }, resumeInterval); + }; // textLayerOnScroll + + window.addEventListener('scroll', textLayerOnScroll, false); + }; // endLayout this.appendText = function textLayerBuilderAppendText(text, fontName, fontSize) {