2021-06-30 02:32:55 -06:00
|
|
|
/*
|
|
|
|
* Copyright 2021 Netsyms Technologies.
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*/
|
|
|
|
|
|
|
|
const {jsPDF} = window.jspdf;
|
|
|
|
|
2021-07-01 23:18:13 -06:00
|
|
|
var pdfPageScale = 3;
|
2021-06-30 02:32:55 -06:00
|
|
|
var pdfAssumedDPI = 72;
|
|
|
|
var pdfDoc = null;
|
|
|
|
var pageNumber = 0;
|
|
|
|
|
|
|
|
function addPDF() {
|
|
|
|
openFileDialog(function (path) {
|
|
|
|
var filedata = getFileAsUint8Array(path);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Asynchronously downloads PDF.
|
|
|
|
*/
|
|
|
|
pdfjsLib.getDocument(filedata).promise.then(function (pdfDoc_) {
|
|
|
|
pdfDoc = pdfDoc_;
|
|
|
|
|
|
|
|
renderAllPages(pdfDoc);
|
|
|
|
pdfZoom("fitwidth");
|
|
|
|
// Initial/first page rendering
|
|
|
|
//renderPage(pageNum);
|
|
|
|
});
|
2021-07-01 23:18:13 -06:00
|
|
|
}, ".pdf");
|
2021-06-30 02:32:55 -06:00
|
|
|
}
|
|
|
|
|
2021-07-01 23:18:13 -06:00
|
|
|
function generatePDF() {
|
2021-06-30 02:32:55 -06:00
|
|
|
var canvases = $("#page-canvas-container .page-canvas");
|
|
|
|
const pdf = new jsPDF({
|
|
|
|
unit: "in",
|
|
|
|
compress: true
|
|
|
|
});
|
|
|
|
// creating a PDF creates a blank page that we don't want to use,
|
|
|
|
// as we haven't done the calculations yet
|
|
|
|
pdf.deletePage(1);
|
|
|
|
for (var i = 0; i < canvases.length; i++) {
|
|
|
|
var canvas = $("#page-canvas-container .page-canvas")[i];
|
|
|
|
var widthpx = canvas.getContext("2d").canvas.width;
|
|
|
|
var heightpx = canvas.getContext("2d").canvas.height;
|
|
|
|
var pageWidthInches = widthpx / (pdfAssumedDPI * pdfPageScale);
|
|
|
|
var pageHeightInches = heightpx / (pdfAssumedDPI * pdfPageScale);
|
|
|
|
console.log(pageWidthInches + " x " + pageHeightInches);
|
|
|
|
var pageFormat = [pageWidthInches, pageHeightInches];
|
|
|
|
var pageOrientation = (pageWidthInches > pageHeightInches ? "landscape" : "portrait");
|
|
|
|
pdf.addPage(pageFormat, pageOrientation);
|
|
|
|
pdf.addImage($("#page-canvas-container .page-canvas")[i].toDataURL(), 0, 0, pageWidthInches, pageHeightInches);
|
|
|
|
}
|
2021-07-01 23:18:13 -06:00
|
|
|
return pdf;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getPDFAsByteArray(pdf) {
|
|
|
|
return pdf.output("arraybuffer");
|
|
|
|
}
|
|
|
|
|
|
|
|
function makeAndSaveSignedPDF(pdf, savepath, callback) {
|
|
|
|
const hasha = require('hasha');
|
|
|
|
|
|
|
|
var pdfbuffer = pdf.output("arraybuffer");
|
|
|
|
var hashstr = hasha(Buffer.from(pdfbuffer), {algorithm: 'sha256'});
|
|
|
|
|
|
|
|
var message = "HASH:" + hashstr
|
|
|
|
+ "\nNOTARY:" + getStorage("notary_name")
|
|
|
|
+ "\nSTATE:" + getStorage("notary_state")
|
|
|
|
+ "\n";
|
|
|
|
signMessage(message, keymgr, function (sig) {
|
|
|
|
writeToFile(savepath, Buffer.from(pdfbuffer));
|
|
|
|
appendToFile(savepath, sig);
|
|
|
|
|
|
|
|
//writeToFile(savepath + ".notsigned.pdf", Buffer.from(pdfbuffer));
|
|
|
|
writeToFile(savepath + ".sig", sig);
|
|
|
|
callback({
|
|
|
|
signature: sig,
|
|
|
|
hash: hashstr
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function savePDF() {
|
|
|
|
loadKeyFromLocalStorage(function (message, ok) {
|
|
|
|
if (ok) {
|
|
|
|
openSaveFileDialog(function (path) {
|
|
|
|
var pdf = generatePDF();
|
|
|
|
makeAndSaveSignedPDF(pdf, path, function (result) {
|
|
|
|
alert("File signed and saved.\n SHA256 of file (without signature): " + result.hash);
|
|
|
|
});
|
|
|
|
}, "signed.pdf", ".pdf");
|
|
|
|
} else {
|
|
|
|
alert("Error: " + message);
|
|
|
|
}
|
|
|
|
});
|
2021-06-30 02:32:55 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
function pdfZoom(str) {
|
|
|
|
disableGuideBox();
|
|
|
|
var widthpx = $("#page-canvas-container .page-canvas").css("width").replace("px", "") * 1;
|
|
|
|
var zoomstep = 100;
|
|
|
|
console.log(widthpx);
|
|
|
|
switch (str) {
|
|
|
|
case "out":
|
|
|
|
$("#page-canvas-container .page-canvas").css("height", "auto");
|
|
|
|
widthpx -= zoomstep;
|
|
|
|
$("#page-canvas-container .page-canvas").css("width", widthpx + "px");
|
|
|
|
break;
|
|
|
|
case "in":
|
|
|
|
$("#page-canvas-container .page-canvas").css("height", "auto");
|
|
|
|
widthpx += zoomstep;
|
|
|
|
$("#page-canvas-container .page-canvas").css("width", widthpx + "px");
|
|
|
|
break;
|
|
|
|
case "fitwidth":
|
|
|
|
$("#page-canvas-container .page-canvas").css("width", "100%");
|
|
|
|
$("#page-canvas-container .page-canvas").css("height", "auto");
|
|
|
|
break;
|
|
|
|
case "fitheight":
|
|
|
|
$("#page-canvas-container .page-canvas").css("height", "100%");
|
|
|
|
$("#page-canvas-container .page-canvas").css("width", "auto");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function getNewCanvas(pagenumber) {
|
|
|
|
var canvas = document.createElement('canvas');
|
|
|
|
canvas.id = "pdf-canvas-page-" + pagenumber;
|
|
|
|
canvas.className = "page-canvas";
|
|
|
|
return canvas;
|
|
|
|
}
|
|
|
|
|
|
|
|
function addPage() {
|
|
|
|
pageNumber++;
|
|
|
|
var canvas = getNewCanvas(pageNumber);
|
|
|
|
var prevPageCanvas = $("#page-canvas-container .page-canvas#pdf-canvas-page-" + (pageNumber - 1))[0];
|
|
|
|
canvas.width = prevPageCanvas.getContext("2d").canvas.width;
|
|
|
|
canvas.height = prevPageCanvas.getContext("2d").canvas.height;
|
|
|
|
$("#page-canvas-container").append(canvas);
|
|
|
|
}
|
|
|
|
|
|
|
|
function renderAllPages() {
|
|
|
|
var startingPageNumber = pageNumber;
|
|
|
|
var thisDocPageCount = pdfDoc.numPages;
|
|
|
|
for (var i = 1; i <= pdfDoc.numPages; i++) {
|
|
|
|
pdfDoc.getPage(i).then(function (page) {
|
|
|
|
var viewport = page.getViewport({scale: pdfPageScale});
|
|
|
|
var canvas = getNewCanvas(page.pageNumber + startingPageNumber);
|
|
|
|
canvas.height = viewport.height;
|
|
|
|
canvas.width = viewport.width;
|
|
|
|
$("#page-canvas-container").append(canvas);
|
|
|
|
|
|
|
|
// Render PDF page into canvas context
|
|
|
|
var renderContext = {
|
|
|
|
canvasContext: canvas.getContext("2d"),
|
|
|
|
viewport: viewport
|
|
|
|
};
|
|
|
|
|
|
|
|
page.render(renderContext);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
pageNumber = pageNumber + thisDocPageCount;
|
|
|
|
document.getElementById('page_count').textContent = pageNumber;
|
|
|
|
}
|