diff --git a/MCS.FOI.S3FileConversion/MCS.FOI.MSGToPDF/MSGFileProcessor.cs b/MCS.FOI.S3FileConversion/MCS.FOI.MSGToPDF/MSGFileProcessor.cs
index 19ad3c9ab..4fc11c07a 100644
--- a/MCS.FOI.S3FileConversion/MCS.FOI.MSGToPDF/MSGFileProcessor.cs
+++ b/MCS.FOI.S3FileConversion/MCS.FOI.MSGToPDF/MSGFileProcessor.cs
@@ -521,6 +521,10 @@ private string GenerateHtmlfromMsg(Storage.Message msg)
" + msg.Subject + " | ");
DateTime sentDate = Convert.ToDateTime(msg.SentOn);
+ if(sentDate == DateTime.MinValue)
+ {
+ sentDate = Convert.ToDateTime(msg.CreationTime);
+ }
if (TimeZone.CurrentTimeZone.StandardName != "Pacific Standard Time")
{
diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py
index 89fded2ef..bb08b2a84 100644
--- a/computingservices/DocumentServices/services/dts/redactionsummary.py
+++ b/computingservices/DocumentServices/services/dts/redactionsummary.py
@@ -72,6 +72,14 @@ def __packaggesummary(self, message, documentids, pageflags, programareas):
_data["pagecount"] = len(pageflag['docpageflags'])
_data["sections"] = self.__format_redaction_summary(pageflag["description"], pageflag['docpageflags'], message.category)
summarydata.append(_data)
+ #remove duplicate and NR for oipc review redline
+ def removeduplicateandnr(pageflag):
+ if pageflag['flagname'].lower() != 'duplicate' and pageflag['flagname'].lower() != 'not responsive':
+ return True
+ return False
+ if message.category == "oipcreviewredline":
+ print("\n removing duplicate and not responsive pages from summary")
+ summarydata = list(filter(removeduplicateandnr, summarydata))
except (Exception) as err:
traceback.print_exc()
print('error occured in __packaggesummary redaction dts service: ', err)
@@ -451,7 +459,7 @@ def __get_pages_by_flagid(self, _docpageflags, deletedpages, totalpages, flagid,
def __get_skippagenos(self, _docpageflags, category):
skippages = []
- if category in ['responsepackage', 'CFD_responsepackage']:
+ if category in ['responsepackage', 'CFD_responsepackage', 'oipcreviewredline']:
for x in _docpageflags:
if x['flagid'] in (5,6) and x['page'] not in skippages:
skippages.append(x['page'])
@@ -459,7 +467,7 @@ def __get_skippagenos(self, _docpageflags, category):
def __calcstitchedpageno(self, pageno, totalpages, category, skippages, deletedpages):
skipcount = 0
- if category in ["responsepackage", 'CFD_responsepackage']:
+ if category in ["responsepackage", 'CFD_responsepackage', 'oipcreviewredline']:
skipcount = self.__calculateskipcount(pageno, skippages)
skipcount = self.__calculateskipcount(pageno, deletedpages, skipcount)
return (pageno+totalpages)-skipcount
diff --git a/web/src/components/FOI/Home/CreateResponsePDF/useSaveRedlineForSignOff.js b/web/src/components/FOI/Home/CreateResponsePDF/useSaveRedlineForSignOff.js
index f926f9663..b35bcab3d 100644
--- a/web/src/components/FOI/Home/CreateResponsePDF/useSaveRedlineForSignOff.js
+++ b/web/src/components/FOI/Home/CreateResponsePDF/useSaveRedlineForSignOff.js
@@ -784,7 +784,7 @@ const useSaveRedlineForSignoff = (initDocInstance, initDocViewer) => {
let documentsObjArr = [];
let divisionstitchpages = [];
let divCount = 0;
- console.log("RES:",res)
+ // console.log("RES:",res)
for (let div of res.divdocumentList) {
divCount++;
let docCount = 0;
@@ -985,7 +985,7 @@ const useSaveRedlineForSignoff = (initDocInstance, initDocViewer) => {
includenrpages: includeNRPages,
};
if (stitchedDocPath) {
- console.log("stitchedDocPath:",stitchedDocPath)
+ // console.log("stitchedDocPath:",stitchedDocPath)
const stitchedDocPathArray = stitchedDocPath?.split("/");
let fileName =
stitchedDocPathArray[stitchedDocPathArray.length - 1].split("?")[0];
@@ -1457,8 +1457,9 @@ const stampPageNumberRedline = async (
);
}
- let string = await stitchObject.extractXFDF()
+ let string = await stitchObject.extractXFDF();
+ // for redline - formatted annots
let xmlObj = parser.parseFromString(string.xfdfString);
let annots = parser.parseFromString('' + formattedAnnotationXML + '');
let annotsObj = xmlObj.getElementsByTagName('annots')
@@ -1467,57 +1468,115 @@ const stampPageNumberRedline = async (
} else {
xmlObj.children.push(annots)
}
-
let xfdfString = parser.toString(xmlObj);
+ // for oipc review - re-apply annots after redaction - annots only no widgets/form fields
+ let xmlObj1 = parser.parseFromString(string.xfdfString);
+ xmlObj1.children = [];
+ xmlObj1.children.push(annots);
+ let xfdfString1 = parser.toString(xmlObj1);
+
//OIPC - Special Block (Redact S.14) : Begin
if(redlineCategory === "oipcreview") {
- const rarr = [];
let annotationManager = docInstance?.Core.annotationManager;
let s14_sectionStamps = await annotationSectionsMapping(xfdfString, formattedAnnotationXML);
- let rects = [];
+ let s14annots = [];
for (const [key, value] of Object.entries(s14_sectionStamps)) {
let s14annoation = annotationManager.getAnnotationById(key);
if ( s14annoation.Subject === "Redact") {
- rects = rects.concat(
- s14annoation.getQuads().map((q) => {
- return {
- pageno: s14_sectionStamps[key],
- recto: q.toRect(),
- vpageno: s14annoation.getPageNumber()
- };
- })
- );
- }
-
-
- }
- for (const rect of rects) {
- let height = docViewer.getPageHeight(rect.vpageno);
- let pageRotation = docViewer.getDocument()?.getPageRotation(rect.vpageno);
- let pageWidth = docViewer.getPageWidth(rect.vpageno);
- /**Fix for oipc redline displaying s.14 marked page content partially */
- let adjustedRect = await getAdjustedRedactionCoordinates(pageRotation, rect.recto, PDFNet,pageWidth, height);
- //rarr.push(await PDFNet.Redactor.redactionCreate(rect.pageno, (await PDFNet.Rect.init(rect.recto.x1,height-rect.recto.y1,rect.recto.x2,height-rect.recto.y2)), false, ''));
- rarr.push(await PDFNet.Redactor.redactionCreate(rect.pageno, adjustedRect, false, ''));
- }
- if (rarr.length > 0) {
- const app = {};
- app.redaction_overlay = true;
- app.border = false;
- app.show_redacted_content_regions = false;
- const doc = await stitchObject.getPDFDoc();
- await PDFNet.Redactor.redact(doc, rarr, app);
+ s14annots.push(s14annoation);
+ }
}
+
+ let doc = docViewer.getDocument();
+ await annotationManager.applyRedactions(s14annots);
+
await stampPageNumberRedline(
stitchObject,
PDFNet,
redlineStitchInfo[divisionid]["stitchpages"],
isSingleRedlinePackage
);
- }
+
+ /** apply redaction and save to s3 - newXfdfString is needed to display
+ * the freetext(section name) on downloaded file.*/
+ doc
+ .getFileData({
+ // export the document to arraybuffer
+ // xfdfString: xfdfString,
+ downloadType: downloadType,
+ flatten: true,
+ })
+ .then(async (_data) => {
+ const _arr = new Uint8Array(_data);
+ const _blob = new Blob([_arr], { type: "application/pdf" });
+
+ await docInstance?.Core.createDocument(_data, {
+ loadAsPDF: true,
+ useDownloader: false, // Added to fix BLANK page issue
+ }).then( async (docObj) => {
+
+ /**must apply redactions before removing pages*/
+ if (redlinepageMappings["pagestoremove"][divisionid].length > 0) {
+ await docObj.removePages(redlinepageMappings["pagestoremove"][divisionid]);
+ }
+
+ docObj.getFileData({
+ // saves the document with annotations in it
+ xfdfString: xfdfString1,
+ downloadType: downloadType,
+ flatten: true,
+ })
+ .then(async (__data) => {
+ const __arr = new Uint8Array(__data);
+ const __blob = new Blob([__arr], { type: "application/pdf" });
+
+ saveFilesinS3(
+ { filepath: redlineStitchInfo[divisionid]["s3path"] },
+ __blob,
+ (_res) => {
+ // ######### call another process for zipping and generate download here ##########
+ toast.update(toastId.current, {
+ render: `Redline PDF saved to Object Storage`,
+ type: "success",
+ className: "file-upload-toast",
+ isLoading: false,
+ autoClose: 3000,
+ hideProgressBar: true,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ closeButton: true,
+ });
+ triggerRedlineZipper(
+ redlineIncompatabileMappings[divisionid],
+ redlineStitchInfo[divisionid]["s3path"],
+ divisionCountForToast,
+ isSingleRedlinePackage
+ );
+ },
+ (_err) => {
+ console.log(_err);
+ toast.update(toastId.current, {
+ render: "Failed to save redline pdf to Object Storage",
+ type: "error",
+ className: "file-upload-toast",
+ isLoading: false,
+ autoClose: 3000,
+ hideProgressBar: true,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ closeButton: true,
+ });
+ }
+ );
+ });
+ });
+ });
//OIPC - Special Block : End
- stitchObject
+ } else {
+ stitchObject
.getFileData({
// saves the document with annotations in it
xfdfString: xfdfString,
@@ -1571,6 +1630,7 @@ const stampPageNumberRedline = async (
}
);
});
+ }
}
}
};
diff --git a/web/src/components/FOI/Home/CreateResponsePDF/useSaveResponsePackage.js b/web/src/components/FOI/Home/CreateResponsePDF/useSaveResponsePackage.js
index 5d12ea826..aeb885798 100644
--- a/web/src/components/FOI/Home/CreateResponsePDF/useSaveResponsePackage.js
+++ b/web/src/components/FOI/Home/CreateResponsePDF/useSaveResponsePackage.js
@@ -264,7 +264,12 @@ const useSaveResponsePackage = () => {
/**must apply redactions before removing pages*/
if (pagesToRemove.length > 0) {
await doc.removePages(pagesToRemove);
- }
+ }
+ doc.setWatermark({
+ diagonal: {
+ text: ''
+ }
+ })
const { PDFNet } = _instance.Core;
PDFNet.initialize();
diff --git a/web/src/components/FOI/Home/Redlining.js b/web/src/components/FOI/Home/Redlining.js
index 5d916353e..3dad804af 100644
--- a/web/src/components/FOI/Home/Redlining.js
+++ b/web/src/components/FOI/Home/Redlining.js
@@ -1373,6 +1373,8 @@ const Redlining = React.forwardRef(
}
},
});
+ docViewer?.refreshAll();
+ docViewer?.updateView();
}
//Cleanup Function: removes previous event listeiner to ensure handleCreateResponsePDFClick event is not called multiple times on click
return () => {