Andrey
1
Q: I am trying to redact all the annotations created by WebViewer, but haven’t been applied yet. I want to apply or burn-in redactions server-side.
A:
PDFNet.Initialize();
string output_path = "../../TestFiles/Output/";
PDFDoc doc = new PDFDoc(../../TestFiles/ToBeRedacted.pdf");
doc.InitSecurityHandler();
ArrayList rarr = new ArrayList();
for (PageIterator itr = doc.GetPageIterator(); itr.HasNext(); itr.Next())
{
Page page = itr.Current();
int num_annots = page.GetNumAnnots();
for (int i = 0; i < num_annots; ++i)
{
Annot annot = page.GetAnnot(i);
if (!annot.IsValid()) continue;
if (annot.GetType().ToString().Equals("e_Redact"))
{
rarr.Add(new Redactor.Redaction(annot.GetPage().GetIndex(), annot.GetRect(), false, "Top Secret"));
}
}
}
try
{
Redactor.Appearance app = new Redactor.Appearance();
app.RedactionOverlay = true;
app.Border = false;
app.ShowRedactedContentRegions = true;
Redactor.Redact(doc, rarr, app, false, true);
doc.Save(output_path + "redacted.pdf", SDFDoc.SaveOptions.e_linearized);
}
catch (PDFNetException e)
{
Console.WriteLine(e.Message);
}
Andrey
2
Here is a code snippet for applying redactions server-side from PDF coming from WebViewer in Java.
//---------------------------------------------------------------------------------------
// Copyright (c) 2001-2020 by PDFTron Systems Inc. All Rights Reserved.
// Consult legal.txt regarding legal and license information.
//---------------------------------------------------------------------------------------
import java.lang.*;
import java.awt.*;
import java.util.ArrayList;
import com.pdftron.pdf.*;
import com.pdftron.sdf.SDFDoc;
public class PDFRedactTest {
public static void redact(PDFDoc doc, String output, Redactor.Redaction[] vec, Redactor.Appearance app) {
try {
Redactor.redact(doc, vec, app, false, true);
doc.save(output, SDFDoc.SaveMode.REMOVE_UNUSED, null);
doc.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Redactor.Redaction[] createRedactionArray(PDFDoc doc) {
try {
ArrayList<Redactor.Redaction> redactArrayList = new ArrayList<Redactor.Redaction>();
int page_num = 1;
for (PageIterator itr = doc.getPageIterator(); itr.hasNext();) {
System.out.println("Page " + (page_num++) + ": ");
Page page = itr.next();
int num_annots = page.getNumAnnots();
for (int i = 0; i < num_annots; ++i) {
Annot annot = page.getAnnot(i);
if (annot.isValid() == false)
continue;
switch (annot.getType()) {
case Annot.e_Redact: {
double[] rectOfAnnot = annot.getRect().get();
Rect newRect = new Rect(rectOfAnnot[0], rectOfAnnot[1], rectOfAnnot[2], rectOfAnnot[3]);
redactArrayList.add(new Redactor.Redaction(page_num-1, newRect, false, "Hehe"));
}
break;
default:
break;
}
}
}
Redactor.Redaction[] redactArray = new Redactor.Redaction[redactArrayList.size()];
redactArray = redactArrayList.toArray(redactArray);
return redactArray;
} catch (Exception e) {
e.printStackTrace();
Redactor.Redaction[] redactArray = new Redactor.Redaction[0];
return redactArray;
}
}
public static void main(String[] args) {
// Relative paths to folders containing test files.
String input_path = "../../TestFiles/";
String output_path = "../../TestFiles/Output/";
PDFNet.initialize();
try {
PDFDoc doc = new PDFDoc((input_path + "docToRedact.pdf"));
doc.initSecurityHandler();
Redactor.Redaction[] vec = createRedactionArray(doc);
Redactor.Appearance app = new Redactor.Appearance();
app.redactionOverlay = true;
app.border = false;
app.showRedactedContentRegions = true;
redact(doc, output_path + "redacted.pdf", vec, app);
System.out.println("Done...");
} catch (Exception e) {
e.printStackTrace();
}
}
}