[Edit][History] last modified February 2

Accessing the BookReader on the Internet Archive

To use the BookReader, click on the "Read Online" link on the left side of an archive.org details page.

Examples

Report a bug or request a feature!

Contributors

  • Raj Kumar (raj) - Bookreader Core - archive.org
  • Michael Ang (mang) - Bookreader Core - archive.org
  • Rebecca Malamud (webchick) - OLPC interface - invisible.net
  • Anand Chitipothu (anandology) - OLPC interface - gmail.com
  • Peter Binkley (pbinkley) - hasCovers patch - ualberta.ca
  • Alex Osborne (aosborne) - back button fix - nla.gov.au

External Users

Attribution

The Bookreader is licensed under the GNU Affero General Public License v3.0. It is built upon these open source tools:

Download source code

The BookReader source code is available in the openlibrary.org github repository. Click here to access the source code using git.. You can also just download the latest release.

BookReader demo

Once you've downloaded the source code you can open BookReaderDemo/index.html in your web browser and you should see an example book. To use your own images you would modify BookReaderJSSimple.js to connect the BookReader with your book's page images and metadata.

Embed example

For books hosted on the Internet Archive the BookReader can be embedded on any site that allows you to add an iframe, for example using the code below.

<iframe src='http://www.archive.org/stream/abroadcranethoma00craniala.html?ui=embed'
  width='450px' height='450px'></iframe>

You can also link to a specific page and specify that two-page mode should be used:

<iframe src='http://www.archive.org/stream/abroadcranethoma00craniala.html?ui=embed#mode/2up/page/18'
  width='450px' height='400'></iframe>

Improvements on old Flipbook code

  • Single-Page mode
  • Zoom
  • Larger Two-page mode
  • Can handle pages with different sizes
  • Search results easier to navigate

How the Book Reader works

In the case of the Standalone Demo, operation is fairly simple. Images are numbered sequentially and stored in a directory called "StandAloneImages". The images are all the same size, and two functions in GnuBookJSSimple.js, getPageWidth() and getPageHeight(), return the page size. Scaling is done in the web browser.

For books scanned by the Internet Archive and stored on archive.org, bookreader operation is a bit more complex. During the book scanning process, each page is imaged using a high-resolution digital camera, and then each page is cropped and deskewed. The size of the cropped image is stored in a file called scandata.xml. During this process, some images, such as color cards, white cards, and tissue paper pages, are marked as pages that should not be displayed. This information is also stored in scandata.xml. The cropped and deskewed images are stored in JPEG 2000 format in a zip file called bookid_jp2.zip. The raw images, the cropped and deskewed images, and the scandata.xml file are available for each book on archive.org.

Because crop boxes can vary between pages for Internet Archive books, the getPageWidth() and getPageHeight() functions can return a different size for each image in the book. Also, since some pages are not supposed to be displayed, the getPageURI() function maps an "index number" that the book reader uses to a "leaf number" that corresponds to an image in the jp2.zip file. These functions use information from scandata.xml to determine size and url for each page.

Because web browsers cannot display JPEG2000 images, a piece of code called GnuBookJP2.php performs on-the-fly JPEG2000 to JPEG conversion on the archive.org cluster. For efficiency, this code also provides server-side image scaling.

Unit Testing

The BookReader is starting to have unit tests, written in QUnit. We are setting up a BookReader TestSwarm server.

Requested Features

  • Ability to work with non-archive books (which means the bookreader should not expect data in any pre-definied format)
  • Ability to embed into any webpage with ease
  • Ability to keep multiple books in the same page (no global state)

To make is it easier to work with other sources, the bookreader can expect a book interface from the client with the following methods.

getPageCount()
getPage(index)
getPageWidth(index)
getPageHeight(index)

The book reader can have optional functionality which is enabled only when the book implementation has a specific method defined. For example, bookmarks functionality can be enabled only when the book interface has getBookmarks method defined.

getBookmarks(index)

Typical usage:

<script src="/js/bookreader.js" type="text/javascript"/>
<script src="/js/archivebook.js" type="text/javascript"/>

<div id="book1"></div>

<script>
    document.onload = function() {
        var b = bookreader("book1", ArchiveBook("tomsawyer"));
       b.showPage(42);
    }
</script>

← Back to "About the Open Library"