284 lines
8.8 KiB
JavaScript
284 lines
8.8 KiB
JavaScript
/**
|
|
* jQuery PDF-DOC Plugin
|
|
*
|
|
* LICENSE
|
|
*
|
|
* This source file is subject to the Apache Licence, Version 2.0 that is bundled
|
|
* with this package in the file LICENSE.txt.
|
|
* It is also available through the world-wide-web at this URL:
|
|
* http://dev.funkynerd.com/projects/hazaar/wiki/licence
|
|
* If you did not receive a copy of the license and are unable to
|
|
* obtain it through the world-wide-web, please send an email
|
|
* to license@funkynerd.com so we can send you a copy immediately.
|
|
*
|
|
* @copyright Copyright (c) 2012 Jamie Carl (http://www.funkynerd.com)
|
|
* @license http://dev.funkynerd.com/projects/hazaar/wiki/licence Apache Licence, Version 2.0
|
|
* @version 0.7
|
|
*/
|
|
|
|
//PDFJS.workerSrc = 'hazaar/js/pdf.js';
|
|
|
|
PDFJS.disableWorker = true;
|
|
|
|
(function ( $ ){
|
|
$.fn.PDFDoc = function( options ) {
|
|
|
|
renderPage = function (pdf, the_page, canvas, scale){
|
|
|
|
// Using promise to fetch the page
|
|
pdf.getPage(the_page).then(function(page) {
|
|
|
|
var viewport = page.getViewport(scale);
|
|
|
|
var context = canvas.getContext('2d');
|
|
|
|
canvas.height = viewport.height;
|
|
|
|
canvas.width = viewport.width;
|
|
|
|
page.render( { canvasContext: context, viewport: viewport } );
|
|
|
|
$('#h-page-input').val(the_page);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
var settings = $.extend( {
|
|
'page' : 1,
|
|
'scale' : 1
|
|
}, options);
|
|
|
|
if(!settings.source){
|
|
|
|
$.error('No PDF document source was given');
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
var mydoc = this;
|
|
|
|
var page_count = 0;
|
|
|
|
mydoc.addClass('h-pdf-container');
|
|
|
|
var canvas_container = $('<div>', { 'class' : 'h-pdf-canvas-container' } );
|
|
|
|
var canvas = $('<canvas>', { 'class' : 'h-pdf-canvas'});
|
|
|
|
canvas.dblclick(function(event){
|
|
|
|
var scale = mydoc.data('scale');
|
|
|
|
scale += 0.5;
|
|
|
|
mydoc.data('scale', scale);
|
|
|
|
renderPage(mydoc.data('pdf'), mydoc.data('current_page'), $(this).get()[0], scale);
|
|
|
|
$('#page-zoom').val(scale);
|
|
|
|
});
|
|
|
|
|
|
/*
|
|
*Create the toolbar layouts
|
|
*/
|
|
var toolbar = $('<div>', { 'class' : 'h-pdf-toolbar'});
|
|
|
|
var toolbar_left = $('<div>', { 'class' : 'h-pdf-toolbar-left' } );
|
|
|
|
var toolbar_right = $('<div>', { 'class' : 'h-pdf-toolbar-right' } );
|
|
|
|
var toolbar_center = $('<div>').addClass('h-pdf-toolbar-center');
|
|
|
|
toolbar.append(toolbar_left).append(toolbar_right).append(toolbar_center);
|
|
|
|
mydoc.append(toolbar);
|
|
|
|
/*
|
|
* Create the nav buttons
|
|
*/
|
|
var but_next = $('<div>', { 'class' : 'h-pdf-button h-pdf-next', 'title' : 'Next Page' } ).click(function(){
|
|
|
|
var current_page = mydoc.data('current_page');
|
|
|
|
if(current_page < page_count){
|
|
|
|
current_page++;
|
|
|
|
renderPage(mydoc.data('pdf'), current_page, canvas.get()[0], mydoc.data('scale'));
|
|
|
|
}
|
|
|
|
mydoc.data('current_page', current_page);
|
|
|
|
});
|
|
|
|
var but_prev = $('<div>', { 'class' : 'h-pdf-button h-pdf-prev', 'title' : 'Previous Page' } ).click(function(){
|
|
|
|
var current_page = mydoc.data('current_page');
|
|
|
|
if(current_page > 1){
|
|
|
|
current_page--;
|
|
|
|
renderPage(mydoc.data('pdf'), current_page, canvas.get()[0], mydoc.data('scale'));
|
|
|
|
}
|
|
|
|
mydoc.data('current_page', current_page);
|
|
|
|
});
|
|
|
|
/*
|
|
* Create the page input
|
|
*/
|
|
var page_text = $('<span>', { 'class' : 'h-pdf-pagetext', 'html' : 'Page:' } );
|
|
|
|
var page_input = $('<input>', { 'type' : 'text', 'class' : 'h-pdf-pageinput', 'value' : settings.page, 'id' : 'h-page-input' } );
|
|
|
|
page_input.keypress(function(event){
|
|
|
|
if(event.which == 13){
|
|
|
|
current_page = $(this).val();
|
|
|
|
renderPage(mydoc.data('pdf'), current_page, canvas.get()[0], mydoc.data('scale'));
|
|
|
|
mydoc.data('current_page', current_page);
|
|
|
|
}else if((event.which < 48 || event.which > 57) && ( event.which != 8 && event.which != 0)){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
var of_text = $('<span>', { 'class' : 'h-pdf-pagetext', 'html' : 'of ' });
|
|
|
|
var pages_text = $('<span>', { 'class' : 'h-pdf-pagecount', 'html' : page_count, 'id' : 'pagecount' });
|
|
|
|
/*
|
|
* Create the zoom droplist
|
|
*/
|
|
var zoomModes = { 3 : '300%', 2 : '200%', 1.5 : '150%', 1 : 'Actual Size', 0.5 : 'Half Size', 0.25 : '25%', 0.1 : '10%' };
|
|
|
|
var zoom = $('<span>', { 'class' : 'h-pdf-zoom' } );
|
|
|
|
var zoom_select = $('<select>', { 'class' : 'h-pdf-zoom-select', 'id' : 'page-zoom' } );
|
|
|
|
zoom.append(zoom_select);
|
|
|
|
$.each( zoomModes, function(key, value) {
|
|
|
|
var op = zoom_select.append($("<option></option>").attr("value",key).text(value));
|
|
|
|
});
|
|
|
|
zoom_select.change(function(){
|
|
|
|
var scale = parseFloat($(this).val());
|
|
|
|
renderPage(mydoc.data('pdf'), mydoc.data('current_page'), canvas.get()[0], scale);
|
|
|
|
mydoc.data('scale', scale);
|
|
}).val(settings.scale);
|
|
|
|
/*
|
|
* Add the nav buttons, page input and zoom droplist to the center toolbar
|
|
*/
|
|
toolbar_center.append($('<div>', { 'class' : 'h-pdf-toolbar-group' } ).append(but_prev).append(but_next))
|
|
.append(page_text)
|
|
.append(page_input)
|
|
.append(of_text)
|
|
.append(pages_text)
|
|
.append(zoom);
|
|
|
|
toolbar.append($('<div>', { 'class' : 'h-pdf-toolbar-center-outer' } ).append(toolbar_center));
|
|
|
|
/*
|
|
* Create the direct download button
|
|
*/
|
|
var but_dl = $('<div>', { 'class' : 'h-pdf-button h-pdf-download' } );
|
|
|
|
but_dl.click(function(){
|
|
|
|
var delim = '?';
|
|
|
|
if( url =~ /\?/){
|
|
|
|
delim = '&';
|
|
|
|
}
|
|
|
|
var url = settings.source + delim + "action=download";
|
|
|
|
window.open(url, '_parent');
|
|
|
|
});
|
|
|
|
toolbar_right.append(but_dl);
|
|
|
|
var resize_canvas = function(){
|
|
|
|
canvas_container.css('height', mydoc.height() - toolbar.height());
|
|
|
|
}
|
|
|
|
resize_canvas();
|
|
|
|
mydoc.append(canvas_container.append(progress));
|
|
|
|
var progress = $('<div>', { 'class' : 'h-pdf-progress' } );
|
|
|
|
progress.css( { top : (canvas_container.height() / 2) - (progress.height() / 2), left : (canvas_container.width() / 2) - (progress.width() / 2) } );
|
|
|
|
progress.append($('<div>', { 'class' : 'h-pdf-progress-bar' } ).append($('<div>', { 'class' : 'h-pdf-progress-bar-overlay' } )));
|
|
|
|
canvas_container.append(progress);
|
|
|
|
PDFJS.getDocument(settings.source).then(
|
|
function getDocumentCallback(pdf) {
|
|
|
|
canvas_container.html(canvas);
|
|
|
|
page_count = pdf.numPages;
|
|
|
|
$('#pagecount').html(page_count);
|
|
|
|
mydoc.data('pdf', pdf);
|
|
|
|
renderPage(pdf, settings.page, canvas.get()[0], settings.scale);
|
|
|
|
},
|
|
function getDocumentError(message, exception) {
|
|
|
|
|
|
},
|
|
function getDocumentProgress(progressData) {
|
|
|
|
var pct = 100 * (progressData.loaded / progressData.total);
|
|
|
|
progress.children('div').css('width', pct + '%');
|
|
|
|
}
|
|
);
|
|
|
|
this.data('current_page', settings.page);
|
|
|
|
this.data('scale', settings.scale);
|
|
|
|
$(window).resize(function(){
|
|
|
|
resize_canvas();
|
|
|
|
});
|
|
|
|
return this;
|
|
|
|
};
|
|
})( jQuery );
|