Trying to use Javascript to Overwrite an Audit File via document.saveAs
Hello,
I'm working on digitalizing a document that is subject to some strict standards about editing, and therefore auditing. As a way to accomodate this, I wanted to create and/or update an audit file that will keep track of the contents of the form, who changed them, and when.
I created a folder-level function that gets called upon a user triggering the document "willSave" action. This function checks for an audit file, and if it doesn't exist, creates one and saves contents appropriately. However, if the audit file already exists, it will try to open it up, edit it appropriately, and then overwrite it. However, it fails when it tries to overwrite it.
These are the error messages I get:
This one happens some of the time (doesn't seem to be a result of my code - when I debug, I can't get this to pop-up):

This one happens every time via saveAs (confirmed via debug):

I have debugged my code and it for sure is failing on the saveAs call. Referencing this article by Thom Parker, https://acrobatusers.com/tutorials/how-save-pdf-acrobat-javascript/, I thought overwriting should be possible. I tried this with a .txt file at first, but thought maybe it was a bug or limitation of not using a .pdf. Then I switched to a .pdf audit file, and it's the same issue.
Would really appreciate some insight!! See my folder level script below.
function saveItself(doc) {
app.beginPriv();
app.alert("I ran!");
doc.saveAs(doc.path);
app.endPriv();
}
function closePls(doc){
app.beginPriv();
doc.closeDoc(true);
app.endPriv();
}
function openPls(auditPath) {
app.beginPriv();
app.alert("open ran!");
return app.openDoc({cPath: auditPath});
app.endPriv();
}
var vertBar="|";
var underscore="_";
var dateString=util.printd("dd-mmm-yyyy HH:MM:ss",new Date());
function trustedAuditFunction (doc) {
app.beginPriv();
var activeDocArr=[];
var cnt = 0;
var thisFile="";
var pathPDF=doc.path.replace(/.pdf/,"")+" - output.pdf";
var fileName=doc.documentFileName.replace(/.pdf/,"")+" - output.pdf";
var mostRecentSaveSnapshot="\n\nForm State on: "+dateString+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\nCompletion\n"+doc.getField("Completion").value+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\nDate"+vertBar+"WO"+vertBar+"Customer"+vertBar+"FF"+"Assembly Number"+vertBar+"Assembly Rev\n"+doc.getField("Date").value+vertBar+doc.getField("WO").value+vertBar+doc.getField("Customer").value+vertBar+doc.getField("FF").value+vertBar+doc.getField("Assembly Number").value+vertBar+doc.getField("Assembly Rev").value+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\nPrior"+vertBar+"ECN"+vertBar+"Additional\n"+doc.getField("Prior").value+" "+doc.getField("ECN").value+" "+doc.getField("Additional").value+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\nPerformed byRow1"+vertBar+"Date_33"+vertBar+"Line StationRow1"+vertBar+"Check Box1"+vertBar+"Check Box11"+vertBar+"Verified byYes No NA"+vertBar+"Date_3"+vertBar+"Verified byYes No NA10"+vertBar+"Date_13"+vertBar+"Check Box21"+vertBar+"Check Box31"+vertBar+"Check Box41"+vertBar+"Verified byYes No NA20"+vertBar+"Date_23\n"+doc.getField("Performed byRow1").value+vertBar+doc.getField("Date_33").value+vertBar+doc.getField("Line StationRow1").value+vertBar+doc.getField("Check Box1").value+vertBar+doc.getField("Check Box11").value+vertBar+doc.getField("Verified byYes No NA").value+vertBar+doc.getField("Date_3").value+vertBar+doc.getField("Verified byYes No NA10").value+vertBar+doc.getField("Date_13").value+vertBar+doc.getField("Check Box21").value+vertBar+doc.getField("Check Box31").value+vertBar+doc.getField("Check Box41").value+vertBar+doc.getField("Verified byYes No NA20").value+vertBar+doc.getField("Date_23").value+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\nPerformed byRow2"+vertBar+"Date_34"+vertBar+"Line StationRow2"+vertBar+"Check Box2"+vertBar+"Check Box12"+vertBar+"Verified byYes No NA1"+vertBar+"Date_4"+vertBar+"Verified byYes No NA11"+vertBar+"Date_14"+vertBar+"Check Box22"+vertBar+"Check Box32"+vertBar+"Check Box42"+vertBar+"Verified byYes No NA21"+vertBar+"Date_24\n"+doc.getField("Performed byRow2").value+vertBar+doc.getField("Date_34").value+vertBar+doc.getField("Line StationRow2").value+vertBar+doc.getField("Check Box2").value+vertBar+doc.getField("Check Box12").value+vertBar+doc.getField("Verified byYes No NA1").value+vertBar+doc.getField("Date_4").value+vertBar+doc.getField("Verified byYes No NA11").value+vertBar+doc.getField("Date_14").value+vertBar+doc.getField("Check Box22").value+vertBar+doc.getField("Check Box32").value+vertBar+doc.getField("Check Box42").value+vertBar+doc.getField("Verified byYes No NA21").value+vertBar+doc.getField("Date_24").value+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\nPerformed byRow3"+vertBar+"Date_35"+vertBar+"Line StationRow3"+vertBar+"Check Box3"+vertBar+"Check Box13"+vertBar+"Verified byYes No NA2"+vertBar+"Date_5"+vertBar+"Verified byYes No NA12"+vertBar+"Date_15"+vertBar+"Check Box23"+vertBar+"Check Box33"+vertBar+"Check Box43"+vertBar+"Verified byYes No NA22"+vertBar+"Date_25\n"+doc.getField("Performed byRow3").value+vertBar+doc.getField("Date_35").value+vertBar+doc.getField("Line StationRow3").value+vertBar+doc.getField("Check Box3").value+vertBar+doc.getField("Check Box13").value+vertBar+doc.getField("Verified byYes No NA2").value+vertBar+doc.getField("Date_5").value+vertBar+doc.getField("Verified byYes No NA12").value+vertBar+doc.getField("Date_15").value+vertBar+doc.getField("Check Box23").value+vertBar+doc.getField("Check Box33").value+vertBar+doc.getField("Check Box43").value+vertBar+doc.getField("Verified byYes No NA22").value+vertBar+doc.getField("Date_25").value+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\nPerformed byRow4"+vertBar+"Date_36"+vertBar+"Line StationRow4"+vertBar+"Check Box4"+vertBar+"Check Box14"+vertBar+"Verified byYes No NA3"+vertBar+"Date_6"+vertBar+"Verified byYes No NA13"+vertBar+"Date_16"+vertBar+"Check Box24"+vertBar+"Check Box34"+vertBar+"Check Box44"+vertBar+"Verified byYes No NA23"+vertBar+"Date_26\n"+doc.getField("Performed byRow4").value+vertBar+doc.getField("Date_36").value+vertBar+doc.getField("Line StationRow4").value+vertBar+doc.getField("Check Box4").value+vertBar+doc.getField("Check Box14").value+vertBar+doc.getField("Verified byYes No NA3").value+vertBar+doc.getField("Date_6").value+vertBar+doc.getField("Verified byYes No NA13").value+vertBar+doc.getField("Date_16").value+vertBar+doc.getField("Check Box24").value+vertBar+doc.getField("Check Box34").value+vertBar+doc.getField("Check Box44").value+vertBar+doc.getField("Verified byYes No NA23").value+vertBar+doc.getField("Date_26").value+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\nPerformed byRow5"+vertBar+"Date_37"+vertBar+"Line StationRow5"+vertBar+"Check Box5"+vertBar+"Check Box15"+vertBar+"Verified byYes No NA4"+vertBar+"Date_7"+vertBar+"Verified byYes No NA14"+vertBar+"Date_17"+vertBar+"Check Box25"+vertBar+"Check Box35"+vertBar+"Check Box45"+vertBar+"Verified byYes No NA24"+vertBar+"Date_27\n"+doc.getField("Performed byRow5").value+vertBar+doc.getField("Date_37").value+vertBar+doc.getField("Line StationRow5").value+vertBar+doc.getField("Check Box5").value+vertBar+doc.getField("Check Box15").value+vertBar+doc.getField("Verified byYes No NA4").value+vertBar+doc.getField("Date_7").value+vertBar+doc.getField("Verified byYes No NA14").value+vertBar+doc.getField("Date_17").value+vertBar+doc.getField("Check Box25").value+vertBar+doc.getField("Check Box35").value+vertBar+doc.getField("Check Box45").value+vertBar+doc.getField("Verified byYes No NA24").value+vertBar+doc.getField("Date_27").value+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\nPerformed byRow6"+vertBar+"Date_38"+vertBar+"Line StationRow6"+vertBar+"Check Box6"+vertBar+"Check Box16"+vertBar+"Verified byYes No NA5"+vertBar+"Date_8"+vertBar+"Verified byYes No NA15"+vertBar+"Date_18"+vertBar+"Check Box26"+vertBar+"Check Box36"+vertBar+"Check Box46"+vertBar+"Verified byYes No NA25"+vertBar+"Date_28\n"+doc.getField("Performed byRow6").value+vertBar+doc.getField("Date_38").value+vertBar+doc.getField("Line StationRow6").value+vertBar+doc.getField("Check Box6").value+vertBar+doc.getField("Check Box16").value+vertBar+doc.getField("Verified byYes No NA5").value+vertBar+doc.getField("Date_8").value+vertBar+doc.getField("Verified byYes No NA15").value+vertBar+doc.getField("Date_18").value+vertBar+doc.getField("Check Box26").value+vertBar+doc.getField("Check Box36").value+vertBar+doc.getField("Check Box46").value+vertBar+doc.getField("Verified byYes No NA25").value+vertBar+doc.getField("Date_28").value+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\nPerformed byRow7"+vertBar+"Date_39"+vertBar+"Line StationRow7"+vertBar+"Check Box7"+vertBar+"Check Box17"+vertBar+"Verified byYes No NA6"+vertBar+"Date_9"+vertBar+"Verified byYes No NA16"+vertBar+"Date_19"+vertBar+"Check Box27"+vertBar+"Check Box37"+vertBar+"Check Box47"+vertBar+"Verified byYes No NA26"+vertBar+"Date_29\n"+doc.getField("Performed byRow7").value+vertBar+doc.getField("Date_39").value+vertBar+doc.getField("Line StationRow7").value+vertBar+doc.getField("Check Box7").value+vertBar+doc.getField("Check Box17").value+vertBar+doc.getField("Verified byYes No NA6").value+vertBar+doc.getField("Date_9").value+vertBar+doc.getField("Verified byYes No NA16").value+vertBar+doc.getField("Date_19").value+vertBar+doc.getField("Check Box27").value+vertBar+doc.getField("Check Box37").value+vertBar+doc.getField("Check Box47").value+vertBar+doc.getField("Verified byYes No NA26").value+vertBar+doc.getField("Date_29").value+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\nPerformed byRow8"+vertBar+"Date_40"+vertBar+"Line StationRow8"+vertBar+"Check Box8"+vertBar+"Check Box18"+vertBar+"Verified byYes No NA7"+vertBar+"Date_10"+vertBar+"Verified byYes No NA17"+vertBar+"Date_20"+vertBar+"Check Box28"+vertBar+"Check Box38"+vertBar+"Check Box48"+vertBar+"Verified byYes No NA27"+vertBar+"Date_30\n"+doc.getField("Performed byRow8").value+vertBar+doc.getField("Date_40").value+vertBar+doc.getField("Line StationRow8").value+vertBar+doc.getField("Check Box8").value+vertBar+doc.getField("Check Box18").value+vertBar+doc.getField("Verified byYes No NA7").value+vertBar+doc.getField("Date_10").value+vertBar+doc.getField("Verified byYes No NA17").value+vertBar+doc.getField("Date_20").value+vertBar+doc.getField("Check Box28").value+vertBar+doc.getField("Check Box38").value+vertBar+doc.getField("Check Box48").value+vertBar+doc.getField("Verified byYes No NA27").value+vertBar+doc.getField("Date_30").value+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\nPerformed byRow9"+vertBar+"Date_41"+vertBar+"Line StationRow9"+vertBar+"Check Box9"+vertBar+"Check Box19"+vertBar+"Verified byYes No NA8"+vertBar+"Date_11"+vertBar+"Verified byYes No NA18"+vertBar+"Date_21"+vertBar+"Check Box29"+vertBar+"Check Box39"+vertBar+"Check Box49"+vertBar+"Verified byYes No NA28"+vertBar+"Date_31\n"+doc.getField("Performed byRow9").value+vertBar+doc.getField("Date_41").value+vertBar+doc.getField("Line StationRow9").value+vertBar+doc.getField("Check Box9").value+vertBar+doc.getField("Check Box19").value+vertBar+doc.getField("Verified byYes No NA8").value+vertBar+doc.getField("Date_11").value+vertBar+doc.getField("Verified byYes No NA18").value+vertBar+doc.getField("Date_21").value+vertBar+doc.getField("Check Box29").value+vertBar+doc.getField("Check Box39").value+vertBar+doc.getField("Check Box49").value+vertBar+doc.getField("Verified byYes No NA28").value+vertBar+doc.getField("Date_31").value+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\nPerformed byRow10"+vertBar+"Date_42"+vertBar+"Line StationRow10"+vertBar+"Check Box10"+vertBar+"Check Box20"+vertBar+"Verified byYes No NA9"+vertBar+"Date_12"+vertBar+"Verified byYes No NA19"+vertBar+"Date_22"+vertBar+"Check Box30"+vertBar+"Check Box40"+vertBar+"Check Box50"+vertBar+"Verified byYes No NA29"+vertBar+"Date_32\n"+doc.getField("Performed byRow10").value+vertBar+doc.getField("Date_42").value+vertBar+doc.getField("Line StationRow10").value+vertBar+doc.getField("Check Box10").value+vertBar+doc.getField("Check Box20").value+vertBar+doc.getField("Verified byYes No NA9").value+vertBar+doc.getField("Date_12").value+vertBar+doc.getField("Verified byYes No NA19").value+vertBar+doc.getField("Date_22").value+vertBar+doc.getField("Check Box30").value+vertBar+doc.getField("Check Box40").value+vertBar+doc.getField("Check Box50").value+vertBar+doc.getField("Verified byYes No NA29").value+vertBar+doc.getField("Date_32").value+"\n\n----- ----- ----- ----- ----- ----- ----- ----- ----- -----\n\n";
try {
var oFile = util.readFileIntoStream(pathPDF);
if (oFile!==null){
//case when output file already exists. Append snapshot to it.
var doc2=openTheAuditDoc(pathPDF);
var exportFieldPDF=doc2.getField(doc2.getNthFieldName(0));
exportFieldPDF.value=mostRecentSaveSnapshot+exportFieldPDF.value;
exportFieldPDF.readonly=false;
auditSaveItself(doc2);
auditCloseDoc(doc2);
} else {
//case when no output file exists. Just save snapshot of document. We really shouldn't ever hit this code, because readFileIntoStream should throw an exception when the file doesn't exist.
var aCropRect = this.getPageBox("Crop",0);
var nMiddle = aCropRect[2]/2;
var rectFld = [];
rectFld[0] = nMiddle-900;
rectFld[1] = aCropRect[3]+1000;
rectFld[2] = nMiddle+900;
rectFld[3] = aCropRect[3];
//pdf file
var oReport = new Report();
oReport.size = 1.2;
oReport.style = "DefaultNoteText";
var doc2=oReport.open(fileName);
var exportFieldPDF=doc2.addField({cName: "Audit", cFieldType: "text", nPageNum: 0, oCoords:rectFld});//"Form State on "+dateString, cFieldType: "text", nPageNum: 0, oCoords:rectFld});
exportFieldPDF.multiline=true;
exportFieldPDF.readonly=true;
exportFieldPDF.value=mostRecentSaveSnapshot;
doc2.disclosed=true;
app.setTimeOut(doc2.saveAs({cPath: pathPDF}), 3000);
auditCloseDoc(doc2);
}
}
catch (e) {
app.alert("exception e: "+e);
if (oFile==null){
//case when no output file exists. Just save snapshot of document.
var aCropRect = this.getPageBox("Crop",0);
var nMiddle = aCropRect[2]/2;
var rectFld = [];
rectFld[0] = nMiddle-900; // Left side is 75pts to the left of the middle
rectFld[1] = aCropRect[3]+1000; // Top side is 20pts above the bottom
rectFld[2] = nMiddle+900; // Right side is 75pts to the right of the middle
rectFld[3] = aCropRect[3]; // Bottom is the same as the Crop Box
//pdf file
var oReport = new Report();
oReport.size = 1.2;
oReport.style = "DefaultNoteText";
var doc2=oReport.open(fileName);
var exportFieldPDF=doc2.addField({cName: "Audit", cFieldType: "text", nPageNum: 0, oCoords:rectFld});
exportFieldPDF.multiline=true;
exportFieldPDF.readonly=true;
doc2.disclosed=true;
exportFieldPDF.value=mostRecentSaveSnapshot;
app.setTimeOut(doc2.saveAs({cPath: pathPDF}), 3000);
auditCloseDoc(doc2);
} else {
app.alert("Unknown error.");
}
}
app.endPriv();
}
var trustedFunction=app.trustedFunction(trustedAuditFunction);
var openTheAuditDoc=app.trustedFunction(openPls);
var auditCloseDoc=app.trustedFunction(closePls);
var auditSaveItself=app.trustedFunction(saveItself);