# angular-pdf [](https://travis-ci.org/sayanee/angularjs-pdf) [](https://gemnasium.com/sayanee/angularjs-pdf)
Version: 1.3.0
>An [AngularJS](http://angularjs.org/) [directive](http://docs.angularjs.org/guide/directive) `ng-pdf` to display PDF files with [PDFJS](http://mozilla.github.io/pdf.js/).
## Overview [[demo](http://sayan.ee/angularjs-pdf/)]
Integrate PDF files right into web pages.

## Requirements
Check [`bower.json` file](https://github.com/sayanee/angularjs-pdf/blob/master/bower.json) for dependencies and their versions:
1. [AngularJS](http://angularjs.org/) - get the latest [angular.min.js](https://developers.google.com/speed/libraries/devguide#angularjs)
- [PDFJS](http://mozilla.github.io/pdf.js/) - build the files [`pdf.js` and `pdf.worker.js`](https://github.com/mozilla/pdf.js#building-pdfjs)
- [Evergreen browsers](https://github.com/mozilla/pdf.js/wiki/Frequently-Asked-Questions#what-browsers-are-supported)
## Features
1. next / previous page
- zoom in / out / fit 100%
- rotate clockwise
- jump to a page number
- when scrolling, the pdf controls will get fixed position at the top
- define the view template
- define the path to pdf with scope variable
- handles error
- show loading of pdf
- show progress percentage of loading pdf
- dynamically change the pdf url
- support retina canvas
- set authorization or http headers
## Getting Started
1. Install or copy over the file `dist/angular-pdf.min.js` or `dist/angular-pdf.js`
```shell
bower install angular-pdf
```
- Include the path to the directive file in `index.html`
```html
```
- Include the directive as a dependency when defining the angular app:
```js
var app = angular.module('App', ['pdf']);
```
- Include the directive with the attribute path to the partial under a controller
```html
```
- `scale` as an option
```html
```
`scale` attribute can also be `page-fit`
```html
```
- `page` as an option for initial page number
```html
```
- `canvasid` as an option for `id` of the canvas (default for `canvasid` is `pdf-canvas`)
```html
```
- `usecredentials` as an option to add credentials / authorization
```html
```
- `debug` to enable debugging console output (optional, disabled by default)
```html
```
- Include the `canvas` element to display the pdf in the template-url file
```html
```
- Include the path to the pdf file in the controller
```js
app.controller('DocCtrl', function($scope) {
$scope.pdfUrl = '/pdf/relativity.pdf';
});
```
- Set custom headers, e.g. authorization headers with `$scope.httpHeaders` option
```js
app.controller('DocCtrl', function($scope) {
$scope.pdfUrl = '/pdf/relativity.pdf';
$scope.httpHeaders = { Authorization: 'Bearer some-aleatory-token' };
});
```
### Options
1. **Next / Previous page**: Include the controls in the view file as defined in the attribute `template-url`
```
```
- **Zoom in / out / fit 100%**: Include the controls in the view file as defined in the attribute `template-url`
```
```
- **Rotate clockwise**: Include the controls in the view file as defined in the attribute `template-url` and the initial class `rotate0`
```html
...
```
include the css styles:
```css
.rotate0 {-webkit-transform: rotate(0deg); transform: rotate(0deg); }
.rotate90 {-webkit-transform: rotate(90deg); transform: rotate(90deg); }
.rotate180 {-webkit-transform: rotate(180deg); transform: rotate(180deg); }
.rotate270 {-webkit-transform: rotate(270deg); transform: rotate(270deg); }
```
- **Jump to page number**: Include the controls in the view file as defined in the attribute `template-url`
```html
Page: / {{pageCount}}
```
- **Fixed pdf controls upon scrolling**: Wrap the controls in the view file as defined in the attribute `template-url` with a tag `nav` with an `ng-class`. Amend the scroll amount as required.
```html
```
And include the relevant css styles as required:
```css
.pdf-controls { width: 100%; display: block; background: #eee; padding: 1em;}
.fixed { position: fixed; top: 0; left: calc(50% - 480px); z-index: 100; width: 100%; padding: 1em; background: rgba(238, 238, 238,.9); width: 960px; }
```
- open the file `index.html` with a web server
### When url is base64 or Uint8Array
Create a Blob:
```js
currentBlob = new Blob([result], {type: 'application/pdf'});
$scope.pdfUrl = URL.createObjectURL(currentBlob);
```
### Handle error
In the controller, you can call the function `$scope.onError`:
```js
$scope.onError = function(error) {
// handle the error
// console.log(error);
}
```
### Show loading
In the controller, you can call the function `$scope.onLoad` when the pdf succesfully loaded:
```js
$scope.loading = 'loading';
$scope.onLoad = function() {
// do something when pdf is fully loaded
// $scope.loading = '';
}
```
### Show progress percentage
In the controller, you can call the function `$scope.onProgress`
```js
$scope.onProgress = function(progress) {
// handle a progress bar
// progress% = progress.loaded / progress.total
// console.log(progress);
}
```
## Variations
1. If using with [Angular UI modal](http://angular-ui.github.io/bootstrap/#/modal), `pageNum` attribute is no longer required. [Checkout the implementation](https://github.com/sayanee/angularjs-pdf/issues/12)
## Similar projects
1. [angular-pdf-viewer](https://github.com/winkerVSbecks/angular-pdf-viewer) - a more self-contained directive
- [ng-pdfviewer](https://github.com/akrennmair/ng-pdfviewer)
## Credit
PDF example used is [Relativity: The Special and General Theory by Albert Einstein](http://www.gutenberg.org/ebooks/30155) as kindly organized and made available free by [Project Gutenberg](http://www.gutenberg.org/wiki/Main_Page).
## Contribute
This project is an [OPEN Open Source Project](http://openopensource.org/). This means that:
> Individuals making significant and valuable contributions are given commit-access to the project to contribute as they see fit. This project is more like an open wiki than a standard guarded open source project.
Please see [`CONTRIBUTING.md`](CONTRIBUTING.md) for details.
## Versioning
This repository follows the [Semantic Versioning](http://semver.org/) guidelines:
1. For **patches**, run the command:
```
grunt bump
```
- For **minor release**, run the command:
```
grunt bump:minor
```
- For **major release**, run the command:
```
grunt bump:major
```
## License
(C) Sayanee Basu 2015, released under an MIT license