您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Combines all the forms into a single PDF and downloads it.
// ==UserScript== // @name AlmaScript - Download Alma Start Process as PDF // @namespace https://greasyfork.org/en/users/8332-sreyemnayr // @version 2019.9.24.1 // @description Combines all the forms into a single PDF and downloads it. // @author Ryan Meyers // @match https://sges.getalma.com/workflows/processes/*/*/* // @require https://greasyfork.org/scripts/388210-html2pdf-js/code/html2pdfjs.js?version=722443 // @require https://unpkg.com/[email protected]/dist/pdf-lib.min.js // @require https://unpkg.com/[email protected]/dist/FileSaver.min.js // @grant none // ==/UserScript== (async function() { 'use strict'; var newStyle = document.createElement('style'); newStyle.innerHTML = ".pure-button-pdf { color: #eb6841; background: #fff; } .pdfIcon { margin-left:10px; margin-right:10px;} .lds-circle { display: inline-block; transform: translateZ(1px); } .lds-circle { display: inline-block; animation: lds-circle 2.4s cubic-bezier(0, 0.2, 0.8, 1) infinite; } @keyframes lds-circle { 0%, 100% { animation-timing-function: cubic-bezier(0.5, 0, 1, 0.5); } 0% { transform: rotateY(0deg); } 50% { transform: rotateY(1800deg); animation-timing-function: cubic-bezier(0, 0.5, 0.5, 1); } 100% { transform: rotateY(3600deg); } }"; document.getElementsByTagName('head')[0].append(newStyle); var pdfIcon = document.createElement('button'); pdfIcon.classList.add('pure-button', 'pure-button-pdf', 'pure-button-large'); var iconElement = document.createElement('i'); iconElement.classList.add('fas','fa-file-pdf','fa-1x', 'pdfIcon'); pdfIcon.append(iconElement); var pdfButtonText = document.createElement('span'); pdfButtonText.innerHTML = "Download PDF"; var pdfButtonProgress = document.createElement('span'); pdfIcon.append(pdfButtonText); pdfIcon.append(pdfButtonProgress); document.getElementsByClassName("profile-user")[0].append(pdfIcon); pdfIcon.onclick = async function() { iconElement.classList.add('lds-circle'); pdfButtonText.innerHTML = "Generating..."; pdfButtonProgress.innerHTML = "0%"; var completedTasks = document.getElementsByClassName("task-completed"); var allHTML = []; var numDone = 0; var totalTasks = completedTasks.length; const bigPdf = await PDFLib.PDFDocument.create(); for (var task of completedTasks) { var taskUri = task.dataset.href; var formUri = taskUri.replace("task-details","form"); let headers = new Headers({ "Accept" : "application/json", "Content-Type" : "application/json", "X-Requested-With": "XMLHttpRequest" }); var taskNum = parseInt(taskUri.match(/task=([0-9]+)/)[1]); console.log(taskNum); await fetch(formUri, {method: "GET", headers: headers}) .then(function(response) { if (!response.ok){ return {'Message': {'html': '', 'header':''}} } return response.json(); }) .then(function(myJson) { console.log(myJson); var jsonHTML = myJson.Message.html; jsonHTML = jsonHTML.replace(/form-section/g,"form-section-off"); jsonHTML = jsonHTML.replace(/<ul class/g,"<ul style=\"display:none;\" class"); console.log(jsonHTML); //var files = jsonHTML.match(/<a href="(\/workflows\/processes\/.*\/get-file\?id=[a-zA-z0-9]*)">/g); var files = jsonHTML.match(/\/workflows\/processes\/.*\/get-file\?id=[a-zA-z0-9]*/g); if (files) { totalTasks += files.length; for (var file of files) { fetch(file).then(function(response) { return response.blob(); } ).then(async function(blob) { console.log(blob.type); let reader = new FileReader(); reader.readAsArrayBuffer(blob); reader.onload = async function() { //blob.arrayBuffer().then(async function(myBuffer){ if (blob.type === "application/pdf") { const pdf = await PDFLib.PDFDocument.load(reader.result); console.log(pdf); const numPages = pdf.getPages().length; const copiedPages = await bigPdf.copyPages(pdf, Array.from(Array(numPages).keys())); copiedPages.forEach((page) => { bigPdf.addPage(page); }); } else if (blob.type === "image/jpeg") { // Embed the JPG image bytes and PNG image bytes const jpgImage = await bigPdf.embedJpg(reader.result) // Get the width/height of the JPG image scaled down to 25% of its original size const jpgDims = jpgImage.scale(.5) // Add a blank page to the document const page = bigPdf.addPage([jpgDims.width, jpgDims.height]) // Draw the JPG image in the center of the page page.drawImage(jpgImage, { x: page.getWidth() / 2 - jpgDims.width / 2, y: page.getHeight() / 2 - jpgDims.height / 2, width: jpgDims.width, height: jpgDims.height, }); } //bigPdf.addPage(pdf); // console.log(pdf); //var objectURL = URL.createObjectURL(myBlob); //let reader = new FileReader(); //reader.readAsDataURL(myBlob); //reader.onload = function() { // console.log(myBlob); //allHTML += "<embed src=\""+reader.result+"\" width=\"850\" height=\"1100\" class=\"page-break\" type=\"application/pdf\">"; numDone += 1; pdfButtonProgress.innerHTML = parseInt(100 * (numDone / (totalTasks + 3) )).toString() + "%"; if (numDone === totalTasks){ html2pdf().set({ html2canvas: { scale: 2 }, pagebreak: { before: '.page-break', avoid: ['div','h1','.form-section-offs'] } }).from("<div style=\"padding:100px;\">"+allHTML.join(" ")+"</div>").output('datauristring').then(async function (pdfAsString) { pdfButtonProgress.innerHTML = parseInt(100 * (numDone / (totalTasks + 2))).toString() + "%"; const htmlPdf = await PDFLib.PDFDocument.load(pdfAsString); pdfButtonProgress.innerHTML = parseInt(100 * (numDone / (totalTasks + 1.5))).toString() + "%"; const numPages = bigPdf.getPages().length; const copiedPages = await htmlPdf.copyPages(bigPdf, Array.from(Array(numPages).keys())); pdfButtonProgress.innerHTML = parseInt(100 * (numDone / (totalTasks + 1.2))).toString() + "%"; copiedPages.forEach((page) => { htmlPdf.addPage(page); }); pdfButtonProgress.innerHTML = parseInt(100 * (numDone / (totalTasks + 1))).toString() + "%"; //const pdfUrl = URL.createObjectURL( // new Blob([await htmlPdf.save()], { type: 'application/pdf' }), //); var studentName = document.getElementsByClassName("fn")[0].innerText; var processName = document.getElementById("page-header").innerText; saveAs(new Blob([await htmlPdf.save()]), studentName+" - "+processName+".pdf"); pdfButtonProgress.innerHTML = parseInt(100 * (numDone / totalTasks)).toString() + "%"; iconElement.classList.remove('lds-circle'); pdfButtonText.innerHTML = "PDF Saved!"; pdfButtonProgress.innerHTML = ""; //htmlPdf.save(); }); // const bigPdf = await PDFLib.PDFDocument.load(FormPdf); // bigPdf.addPage(pdf); } //}; }; }); } } console.log(files); var jsonHeader = myJson.Message.header; allHTML[taskNum] = "<h1>"+jsonHeader+"</h1>"+jsonHTML; numDone += 1; pdfButtonProgress.innerHTML = parseInt(100 * (numDone / (totalTasks + 3))).toString() + "%"; // <a href="/workflows/processes/5d0a73db7b86eb6fe20f6092/5d1a18b97b86eb0a7532e0f9/5d1a18b97b86eb39037d417d/get-file?id=5d372340a814e42a0d1872e1"> if (numDone === totalTasks){ html2pdf().set({ html2canvas: { scale: 2 }, pagebreak: { before: '.page-break', avoid: ['div','h1','.form-section-offs'] } }).from("<div style=\"padding:100px;\">"+allHTML.join(" ")+"</div>").output('datauristring').then(async function (pdfAsString) { pdfButtonProgress.innerHTML = parseInt(100 * (numDone / (totalTasks + 2))).toString() + "%"; const htmlPdf = await PDFLib.PDFDocument.load(pdfAsString); pdfButtonProgress.innerHTML = parseInt(100 * (numDone / (totalTasks + 1.5))).toString() + "%"; const numPages = bigPdf.getPages().length; const copiedPages = await htmlPdf.copyPages(bigPdf, Array.from(Array(numPages).keys())); pdfButtonProgress.innerHTML = parseInt(100 * (numDone / (totalTasks + 1.2))).toString() + "%"; copiedPages.forEach((page) => { htmlPdf.addPage(page); }); pdfButtonProgress.innerHTML = parseInt(100 * (numDone / (totalTasks + 1))).toString() + "%"; //const pdfUrl = URL.createObjectURL( // new Blob([await htmlPdf.save()], { type: 'application/pdf' }), //); var studentName = document.getElementsByClassName("fn")[0].innerText; var processName = document.getElementById("page-header").innerText; saveAs(new Blob([await htmlPdf.save()]), studentName+" - "+processName+".pdf"); pdfButtonProgress.innerHTML = parseInt(100 * (numDone / totalTasks)).toString() + "%"; iconElement.classList.remove('lds-circle'); pdfButtonText.innerHTML = "Saved"; pdfButtonProgress.innerHTML = ""; //htmlPdf.save(); }); //saveAs(await htmlPdf.save(), "Form.pdf"); //window.open(pdfUrl, '_blank'); //htmlPdf.save(); // }); // console.log(allHTML); } }).catch( (e) => {console.log(e)}); } }; // Your code here... })();