At work I sometimes have to fill in
PDF forms which is boring and time consuming. Today I found a way to fix that.
It needs PDF software that makes it possible to import (data)fields into a PDF form and to import and export fields data. I used the pro version of
PDF Studio.
It also needs a Google Spreadsheet-sheet with a first row with 'fieldnames'.
I imported (data)fields (the Google Spreadsheet-sheet fieldnames) into a PDF form.
To learn how to import data into the (data)fields of the PDF-form I first had to export data into a xfdf-file (the export option I choose for).
The (xml-like) xfdf-file has a head, a trunk and a tail,
The head contains (among other things) the name of the PDF file and a modified-something and a original something.
The trunk contains information about the fieldnames and the values.
The tail contains ... the tail.
function pdfFormMerging(){
var ss = SpreadsheetApp.openById("XXX");
var sheet = ss.getSheetByName("YYY");
var range = sheet.getRange(1,1,sheet.getMaxRows(),sheet.getMaxColumns());
var data = range.getValues();
var uniqueAnchor = "ZZZ";
var object = {};
object = makesObjectOfRowInSpreadsheetWithUniqueAnchor(object,uniqueAnchor,data);
var modified = "aaa";
var original = "bbb";
var formName = "ccc.pdf";
var fileName = "ddd.xfdf"
//the head
var text = '<?xml version="1.0" encoding="UTF-8"?>';
text += '<xfdf xml:space="preserve" xmlns="http://ns.adobe.com/xfdf/">';
text += '<f href="' + formName + '"/>';
text += '<ids modified="' + modified + '" original="' + original + '"/>';
text += '<fields>';
//the trunk
for(var k in object){
text += '<field name="' + k + '"><value>' + object[k] + '</value></field>';
}
//the tail
text += '</fields>';
text += '</xfdf>';
DriveApp.createFile(fileName,text,"text/xml");
}
function makesObjectOfRowInSpreadsheetWithUniqueAnchor(rowObject,uniqueAnchor,data){
var fieldNames = data[0];
for(var i=0;i<data.length;i++){
if(data[i].indexOf(uniqueAnchor) !== -1){
for(var j=0;j<fieldNames.length;j++){
if(fieldNames[j] !== ""){
rowObject[fieldNames[j]] = data[i][j];
}
}
}
}
return rowObject;
}