aboutsummaryrefslogtreecommitdiff
path: root/pdf-as-web/src/main/webapp/assets/js/pdf.js/web/app.js
diff options
context:
space:
mode:
Diffstat (limited to 'pdf-as-web/src/main/webapp/assets/js/pdf.js/web/app.js')
-rw-r--r--pdf-as-web/src/main/webapp/assets/js/pdf.js/web/app.js420
1 files changed, 368 insertions, 52 deletions
diff --git a/pdf-as-web/src/main/webapp/assets/js/pdf.js/web/app.js b/pdf-as-web/src/main/webapp/assets/js/pdf.js/web/app.js
index 361169bb..6e16c306 100644
--- a/pdf-as-web/src/main/webapp/assets/js/pdf.js/web/app.js
+++ b/pdf-as-web/src/main/webapp/assets/js/pdf.js/web/app.js
@@ -1,31 +1,163 @@
+//
+//A global status object
+//
+var global_status = new statusObject();
-function setFileForParent(file) {
+//
+//statusObject Definition
+//
+function statusObject() {
+ this.pdf_url = null;
+ this.redirect_url = null;
+ this.connector = null;
+ this.file_path = null;
+ this.file = null;
+ this.signature = null,
+
+ this.setFile = function(f) {
+ this.file = f;
+ }
+
+ this.getFile = function() {
+ return this.file;
+ }
+
+ this.setPdfUlr = function(pdfurl) {
+ this.pdf_url = pdfurl;
+ }
+
+ this.getPdfUrl = function() {
+ return this.pdf_url;
+ }
+
+ this.setRedirectUrl = function(rurl) {
+ this.redirect_url = rurl;
+ }
+
+ this.getRedirectUrl = function() {
+ return this.redirect_url;
+ }
+
+ this.setConnector = function(con) {
+ this.connector = con;
+ }
+
+ this.getConnector = function() {
+ return this.connector;
+ }
+
+ this.setFilePath = function(f) {
+ this.file_path = f;
+ }
+
+ this.getFilePath = function() {
+ return this.file_path;
+ }
+
+ this.setSignature = function(s) {
+ this.signature = s;
+ }
+
+ this.getSignature = function() {
+ return this.signature;
+ }
+ }
+
+//
+//Updates the selected File for the current Frame as well as
+//for the parent frame if such exists
+//This function is called if a new File is opened via the
+//PDF.js Menu-Bar
+//
+function setFile(pdf_file) {
if (window.self != window.parent) {
- window.parent.file = file;
+ window.parent.file = pdf_file;
}
+ global_status.setFile(pdf_file);
+ removeSignature();
}
-window.addEventListener("message", handlePostMessage, false);
+//
+//Returns selected File of the parent Frame
+//
+function getFileFromParent() {
+ if (window.self !== window.parent) {
+ return window.parent.file;
+ } else {
+ return false;
+ }
+}
-function handlePostMessage(evt) {
- var file = evt.data;
- var signature_placed_manually = false;
+//
+//Opens and displays a selected file.
+//
+function displayPdf() {
+ var file = null;
+ if(window.self !== window.parent) { //Take file selected in the parent if we are in an Iframe.
+ file = getFileFromParent();
+ } else {
+ file = global_status.getFile();
+ }
+ if(!file) {
+ return;
+ }
var fileReader = new FileReader();
-
fileReader.onload = function(evt) {
var buffer = evt.target.result;
var uint8Array = new Uint8Array(buffer);
PDFView.open(uint8Array, 0);
- $("#placeSignature").bind("click", placeSignature);
- $("#secondaryPlaceSignature").bind("click", placeSignature);
- $("#delSignature").bind("click", removeSignature);
- $("#secondaryDelSignature").bind("click", removeSignature);
+ registerSignaturePlacementEventHandlers();
};
-
fileReader.readAsArrayBuffer(file);
}
-function isSignaturePlaced() {
+//
+//Attaches event handlers to the signature placement icons
+//
+function registerSignaturePlacementEventHandlers() {
+ $("#placeSignature").bind("click", placeSignature);
+ $("#secondaryPlaceSignature").bind("click", placeSignature);
+ $("#delSignature").bind("click", removeSignature);
+ $("#secondaryDelSignature").bind("click", removeSignature);
+
+ //
+ //Catches events where PDF.js has finished rendering a new page.
+ //PDF.js only renders a small subset of all pages of a PDF document
+ //at a given time.
+ //This causes a placed signature block to disappear,
+ //if a user scrolls too far away from the page where the signature has
+ //been placed. To address this issue the following function is used.
+ //Every time a page is rendered, it is checked whether it is true that
+ //a signautre has been placed manually but is currently not in the DOM Tree.
+ //In that case we have to check whether the page we placed the signature on
+ //is in the DOM tree. If thats true, we can restore the signature on that page.
+ //
+ document.addEventListener('pagerendered', function(evt) {
+ if(!isSignatureInDomTree() && isSignaturePlaced()) {
+ var page = global_status.getSignature().page;
+ if(isPageInDomTree(page)) {
+ placeSignature(null, page, global_status.getSignature().sig[0].outerHTML);
+ }
+ }
+ });
+}
+
+//
+//Checks whether a particular page is contained in the current DOM tree
+//
+function isPageInDomTree(p) {
+ var page = $("#pageContainer" + p);
+ if($(page).attr("data-loaded") === "true") {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+//
+//Checks whether a signature block is contained in the current DOM tree
+//
+function isSignatureInDomTree() {
var signature = $(".cl_signature");
if(signature.length > 0) {
return true;
@@ -34,46 +166,86 @@ function isSignaturePlaced() {
}
}
-function placeSignature(evt) {
+//
+//Checks if a signature has been manually placed by a user
+//
+function isSignaturePlaced() {
+ return global_status.getSignature() != null
+}
+
+//
+//Places signature given by parameter s on the page provided by the page_to_place parameter or on the current page if no such
+//parameter is provided. If the parameter s is omitted a default signature is placed.
+//
+function placeSignature(evt, page_to_place, s) {
var current_scale = PDFViewerApplication.pdfViewer.currentScale;
var sig_size = Math.floor(96 * current_scale);
- var current_page = PDFView.page;
+ var defaultSignature = "<img src='/pdf-as-web/visblock?r=" + sig_size.toString() + "' alt='Signature' id='img_signature' class='cl_signature' draggable='true' style='position: absolute; z-index:4; cursor:move'>";
+ if (typeof page_to_place === 'undefined') { page_to_place = PDFView.page;}
+ if (typeof s === 'undefined') { s = defaultSignature}
- if(isSignaturePlaced()) {
+ if(isSignaturePlaced() && isSignatureInDomTree()) {
removeSignature();
}
-
- $("#pageContainer"+current_page).prepend("<img src='http://localhost:8080/pdf-as-web/visblock?r=" + sig_size.toString() + "' data-pos-x='0' data-pos-y='0' data-page='" + current_page + "' alt='Signature' id='img_signature' class='cl_signature' draggable='true' style='position: absolute; z-index:4; cursor:move'>");
- makeSignatureDraggable($(".cl_signature"));
+
+ $("#pageContainer" + page_to_place).prepend(s);
+ global_status.setSignature({
+ page: (s === defaultSignature) ? page_to_place : global_status.getSignature().page,
+ posx: (s === defaultSignature) ? "0" : global_status.getSignature().posx,
+ posy: (s === defaultSignature) ? "0" : global_status.getSignature().posy,
+ sig: $(".cl_signature")
+ });
+ updateSignaturePosition(global_status.getSignature());
+ makeSignatureDraggable(global_status.getSignature());
}
+//
+//Makes a placed signature block draggable and keep track of
+//the position of the signature block within the page where it has been placed.
+//
function makeSignatureDraggable(signature) {
- var current_page = PDFView.page;
- var canvas_height = $("#page" + current_page.toString()).attr("height");
- var current_scale = PDFViewerApplication.pdfViewer.currentScale;
-
- signature.draggable({
+ signature.sig.draggable({
drag: function() {
- var $this = $(this);
- var thisPos = $this.position({my: "left bottom"});
- var parentPos = $this.parent().position();
- var x = thisPos.left - parentPos.left;
- var y = thisPos.top - parentPos.top;
- $(this).attr("data-pos-x", (Math.floor(x / current_scale / (4.0/3.0))).toString()); //width shrink again by 4/3?
- $(this).attr("data-pos-y", Math.floor((parseInt(canvas_height) + parentPos.top - (thisPos.top + parentPos.top)) / current_scale / (4.0/3.0)).toString()); //height shrink again by 4/3?
+ updateSignaturePosition(signature)
},
containment: "parent"
});
}
+//
+//Update the position of the signature block, e.g. if the signature block is dragged.
+//The position is is saved in the html attributes 'data-pos-x' and 'data-pos-y' of the
+//signature element.
+//
+function updateSignaturePosition(signature) {
+ var page = signature.page;
+ var canvas_height = $("#page" + page.toString()).attr("height");
+ var current_scale = PDFViewerApplication.pdfViewer.currentScale;
+ var thisPos = $(signature.sig).position();
+ var x = thisPos.left;
+ var y = thisPos.top;
+ signature.posx = (Math.floor(x / current_scale / (4.0/3.0))).toString();
+ signature.posy = Math.floor((parseInt(canvas_height) - (thisPos.top)) / current_scale / (4.0/3.0)).toString();
+}
+
+//
+//Remove a manually placed signature block.
+//
function removeSignature() {
if(isSignaturePlaced()) {
$(".cl_signature").remove();
+ global_status.setSignature(null);
}
}
$(document).ready(function() {
- //http://localhost:8080/pdf-as-web/assets/js/pdf.js/web/viewer.html?connector=jks&pdfurl=http://www.example.net/pdf.pdf
+ if(window.self !== window.parent) { //We are in an Iframe and return
+ return;
+ }
+
+ //
+ //Function that return the value of the provided HTML get parameter
+ //
$.urlParam = function(name){
var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
if(!results) {
@@ -83,31 +255,175 @@ $(document).ready(function() {
}
}
- var connector = $.urlParam("connector");
- var pdfurl = $.urlParam("pdfurl");
+ global_status.setConnector($.urlParam("connector"));
+ global_status.setPdfUlr($.urlParam("pdfurl"));
+ global_status.setFilePath($.urlParam("file"));
- if(!connector || !pdfurl) {
+ if(global_status.getFilePath()) { //if a filepath is given via the file HTML get parameter, try to fetch the file and display it
+ fetchFile(global_status.getFilePath()).then(function(result) {
+ setFile(result);
+ displayPdf();
+ }, function() {
+ alert("Failed loading PDF");
+ });
+ } else if(global_status.getConnector() && global_status.getPdfUrl()) { //if connector and pdfUrl is given, start the sign process straight away
+ quickSign(global_status.getConnector(), global_status.getPdfUrl());
return;
- } else {
- var fd = new FormData();
- fd.append("source", "internal");
- fd.append("pdf-url", pdfurl);
- fd.append("connector", connector);
-
- $.ajax({
- url: "http://localhost:8080/pdf-as-web/Sign",
- data: fd,
- processData: false,
- contentType: false,
- type: "POST",
- success: function(response) {
- $("html").empty();
- $("html").html(response);
- }
- });
}
+
+ addConnector();
+ addConnectorEventHandler();
+ setConnector(global_status);
+ addSignButton();
+ addSignButtonEventHandler(global_status);
+ registerSignaturePlacementEventHandlers();
+
});
+//
+//Fetches the file given via filepath from the server.
+//Returns a promise that is being resolved if the file could
+//be successfully fetched, and rejected otherwise.
+//
+function fetchFile(filepath) {
+ return new Promise(function(resolve, reject) {
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function(){
+ if (this.readyState == 4 && this.status == 200) {
+ resolve(this.response);
+ } else if (this.readyState == 4 && this.status != 200) {
+ reject();
+ }
+ }
+ xhr.open('GET', filepath);
+ xhr.responseType = 'blob';
+ xhr.send();
+ });
+}
+
+//
+//Adds a drop down menu to the PDF.js menu bar where a user can select
+//between different sign methods
+//
+function addConnector() {
+ var sign_method_html = "<span class='dropdownToolbarButton'><select id='connectorSelect' title='Sign Method' tabindex='24' style='min-width: 166px;'>"
+ + "<option id='mobilebku' value='mobilebku'>Handy</option>"
+ + "<option id='bku' value='bku'>Local BKU</option>"
+ + "<option id='obku' value='onlinebku'>Online BKU</option>"
+ + "<option id='jks' value='jks'>Keystore</option>"
+ + "</select></span>";
+ $("#toolbarViewerRight").prepend(sign_method_html);
+}
+
+//
+//Adds change event handler to the connector select field.
+//
+function addConnectorEventHandler() {
+ $("#connectorSelect").bind("change", function(evt) {
+ global_status.setConnector($("#connectorSelect").val());
+ });
+}
+
+//
+//Adds a button to the PDF.js menu bar, that allows the user to start the sign process
+//
+function addSignButton() {
+ var sign_button_html = "<button id='sign' class='toolbarButton sign hiddenLargeView' title='Sign document' tabindex='30' data-l10n-id='Sign Document'>"
+ + "<span data-l10n-id='sign_document_label'>Sign document</span>"
+ + "</button>";
+ $("#toolbarViewerRight").prepend(sign_button_html);
+}
+
+//
+//Attaches event Handler to the sign button.
+//
+function addSignButtonEventHandler(status) {
+ $("#sign").bind("click", function(evt) {
+ sign(status);
+ });
+}
+
+//
+//Selects a particular connector
+//
+function setConnector(statusObj) {
+ if(!statusObj) {
+ return;
+ }
+ var default_connector = "mobilebku";
+ var con = statusObj.getConnector();
+ if(!con || $("#connectorSelect #" + con).length === 0) {
+ $("#connectorSelect").val(default_connector);
+ statusObj.setConnector(default_connector);
+ } else {
+ $("#connectorSelect").val(statusObj.getConnector());
+ }
+}
+//
+//If pdf-url and connector are provided by means of HTML get parameters
+//the document is signed straight away by calling the Sign servlet
+//
+function quickSign(connector, pdfurl) {
+ var fd = new FormData();
+ fd.append("source", "internal");
+ fd.append("connector", connector);
+ fd.append("pdf-url", pdfurl);
+
+ $.ajax({
+ url: "/pdf-as-web/Sign",
+ data: fd,
+ processData: false,
+ contentType: false,
+ type: "POST",
+ success: function(response) {
+ $("html").empty();
+ $("html").html(response);
+ }
+ });
+}
+//
+//function that is called once the sign button has been pressed.
+//takes a statusobject as it's only parameter, which can be used
+//to decide what action should happen. Currently it only calls
+//the sign servlet.
+//
+function sign(statusObj) {
+ var file = statusObj.getFile();
+ if(!file) {
+ alert("No File Opened");
+ return;
+ }
+ var fd = new FormData();
+ fd.append("source", "internal");
+ fd.append("connector", global_status.getConnector());
+ fd.append("pdf-file", global_status.getFile());
+ if(isSignaturePlaced()) {
+ fd.append("sig-pos-x", global_status.getSignature().posx);
+ fd.append("sig-pos-y", global_status.getSignature().posy);
+ fd.append("sig-pos-p", global_status.getSignature().page);
+ }
+
+ $.ajax({
+ url: "/pdf-as-web/Sign",
+ data: fd,
+ processData: false,
+ contentType: false,
+ type: "POST",
+ success: function(response) {
+ $("#fade").remove();
+ $("#popup").remove();
+ var fade_div = "<div id='fade' class='black_overlay'></div>";
+ var popup_div = "<div id='popup' class='white_content'><a href='javascript:void(0)' id='closelink'>Close</a><div id='resp'></div></div>"
+ $("body").append(fade_div);
+ $("body").append(popup_div);
+ $("#resp").html(response);
+ $("#closelink").bind("click", function(evt) {
+ $("#fade").remove();
+ $("#popup").remove();
+ });
+ }
+ });
+}