Steps to Generate PDF from the script
- Create a table General Document Template(u_general_document_template) – Which will contains all the script
- Create a table PDF Script(u_pdf_script) – Which will contains all the custom pdf script
- Create a script include PDFUtil – that can generate html based on template and create pdf
- Call script Include form workflow or UI Action.
Table : General Document Template
Table have 4 fields. Number(u_number), Name(u_name), Active(u_active) and Body(u_body)
See a sample screenshot of the above table
Table: PDF Script
PDF Script table have 4 fields Number(u_number),Name(u_name),Active(u_active),Script(u_script)
see a sample record screenshot for above table
Sample Script for PDF Script:
answer = (function runScript(current) { var gr = new GlideRecord('sc_req_item'); gr.addEncodedQuery('sys_id=' + current.sys_id); gr.query(); if (gr.next()) { var out=gr.variables.services_payment_firm+'-'+gr.variables.services_payment_vendor; var location = gr.variables.services_payment_location; if(location != '')out=out+'-'+location; return out; } })(current);
Script Include: PDFUtil
var PDFUtil = Class.create(); PDFUtil.prototype = { initialize: function(template) { this.body; this.getTemplate(template); }, getTemplate: function(template) { var grT = new GlideRecord('u_general_document_template'); grT.addEncodedQuery('u_number=' + template + '^ORu_name=' + template + '^u_active=true'); grT.query(); if (grT.next()) { this.body = grT.getValue('u_body'); } else { gs.log('PDF: Template not found'); } }, generatePDF: function(targetTable, record) { var gr = new GlideRecord(targetTable); gr.addEncodedQuery('sys_id=' + record + '^ORnumber=' + record); gr.query(); if (gr.next()) { var pdf_scripts = this.body.match(/\$\{pdf_script:.*?\}/g); if (pdf_scripts) { var pdfScriptNames = ''; for (var i = 0; i < pdf_scripts.length; i++) { if (i == 0) pdfScriptNames += pdf_scripts[i].substring(13, pdf_scripts[i].length - 1); else pdfScriptNames += ',' + pdf_scripts[i].substring(13, pdf_scripts[i].length - 1); } pdfScriptNames = pdfScriptNames.split(','); for (var s in pdfScriptNames) { var ps = '${pdf_script:' + pdfScriptNames[s] + '}'; this.body = this.body.replace(ps, this.evalScript(pdfScriptNames[s], gr)); } } var html = this.body.match(/\$\{.*?\}/g); for (var i = 0; i < html.length; i++) { var temp = html[i]; temp = temp.replace('${', ''); temp = temp.replace('}', ''); var field = 'gr.' + temp + '.getDisplayValue()'; var value = eval(field); this.body = this.body.replace(html[i], value); } var v = new sn_pdfgeneratorutils.PDFGenerationAPI; var result = v.convertToPDF(this.body, targetTable, record, gr.getDisplayValue()); // gs.log('PDF: Complete - ' +JSON.stringify(result)); } else { gs.log('PDF: Target record nor found check generatePDF function'); } }, evalScript: function(scriptName, rec) { var gr = new GlideRecord('u_pdf_script'); //gr.addQuery('u_name', scriptName); //gr.addQuery('u_active',true); gr.addEncodedQuery('u_active=true^u_name='+scriptName+'^ORu_number='+scriptName); gr.query(); if (gr.next()) { var vars = { 'current': rec, 'answer': null }; var evaluator = new GlideScopedEvaluator(); evaluator.evaluateScript(gr, 'u_script', vars); return evaluator.getVariable('answer'); }else return ''; }, type: 'PDFUtil' };
Call Script Include from UI Action or Workflow
var t = new PDFUtil('PDF0001005'); t.generatePDF('sc_req_item',current.sys_id);
You can directly download XML FIle and use our code:
No responses yet