Skip to content

Redaction

Redaction permanently removes sensitive information from a PDF while preserving document layout. It lets users safely remove visible text and images to protect confidential data such as Social Security numbers, credit card details, and product release dates.

Core concept: Redaction is a special markup annotation. Users first mark content to remove in a PDF file; after the annotation is applied, the marked content is permanently deleted.

Perform Redaction (Java Example)

To use redaction, follow these API steps:

  1. Create a Redaction module:

    java
    com.foxit.sdk.addon.Redaction.Redaction redaction = new com.foxit.sdk.addon.Redaction.Redaction();

    Note: If the license used in com.foxit.sdk.common.Library.initialize does not include the "Redaction" permission, redaction APIs are unavailable and the constructor above throws com.foxit.sdk.common.Constants.e_ErrInvalidLicense.

  2. Mark content for redaction:

    java
    com.foxit.sdk.addon.Redaction.markRedactAnnot(/* parameters: page object, mark region, ... */);

    Call com.foxit.sdk.addon.Redaction.markRedactAnnot to create a redaction object that marks page content for redaction, including text, image, and path objects.

  3. Apply redaction:

    java
    redaction.apply(/* parameters: page object, ... */);

    Finally, call com.foxit.sdk.addon.Redaction.apply to apply redaction in the marked regions and permanently remove text and graphics there.

Licensing

  • To use redaction, ensure your license includes the Redaction module permission.

Redact the Text "PDF" on the First Page of a PDF Document

c++
#include "include/common/fs_common.h"
#include "include/pdf/fs_pdfdoc.h"
#include "include/pdf/fs_pdfpage.h"
#include "include/pdf/fs_search.h"
#include "include/addon/fs_redaction.h"
#include "include/common/fs_render.h"

using namespace foxit;
using namespace common;
using namespace addon;
using namespace pdf;
using namespace foxit::pdf::annots;
...

Redaction redaction(doc);
// Parse PDF page.
PDFPage page = doc.GetPage(0);
page.StartParse(foxit::pdf::PDFPage::e_ParsePageNormal, NULL, false);
//Find Text Object to redact
TextPage text_page(page);
TextSearch text_search(text_page);
text_search.SetPattern(L"PDF");
RectFArray rect_array;
while(text_search.FindNext()) {
	rect_array.Append(text_search.GetMatchRects());
  }
if(rect_array.GetSize() > 0) {
	Redact redact = redaction.MarkRedactAnnot(page, rect_array);
	redact.ResetAppearanceStream();
	doc.SaveAs(output_directory + L"AboutFoxit_redected_default.pdf");

	/ set border color to Green
	redact.SetBorderColor((long)0x00FF00);
	/ set fill color to Blue
	redact.SetFillColor((long)0x0000FF);
	/ set rollover fill color to Red
	redact.SetApplyFillColor((long)0xFF0000);
	redact.ResetAppearanceStream();
	doc.SaveAs(output_directory + L"AboutFoxit_redected_setColor.pdf");

	redact.SetOpacity((float)0.5);
	redact.ResetAppearanceStream();
	doc.SaveAs(output_directory + L"AboutFoxit_redected_setOpacity.pdf");

	if(redaction.Apply())
		cout << "Redact page(0) succeed." << endl;
	else
		cout << "Redact page(0) failed." << endl;
  }
doc.SaveAs(output_directory + L"AboutFoxit_redected_apply.pdf");
C
#include "include/fs_basictypes_c.h"
#include "include/fs_common_c.h"
#include "include/fs_pdfdoc_c.h"
#include "include/fs_pdfpage_c.h"
#include "include/fs_search_c.h"
#include "include/fs_redaction_c.h"
#include "include/fs_render_c.h"
...

FS_REDACTION_HANDLE redaction;
FSDK_Redaction_Create(doc, &redaction);
// Parse PDF page.
FS_PDFPAGE_HANDLE page;
FSDK_PDFDoc_GetPage(doc, 0, &page);
FS_PROGRESSIVE_HANDLE progressive;
FSDK_PDFPage_StartParse(page, e_FSParseFlagsParsePageNormal, NULL, false, &progressive);
//Find Text Object to redact
FS_TEXTPAGE_HANDLE text_page;
FSDK_TextPage_Create(page, 0, &text_page);
FS_TEXTSEARCH_HANDLE text_search;
FSDK_TextSearch_Create1(text_page, &text_search);
FS_BOOL return_code;
FSDK_TextSearch_SetPattern(text_search, L"PDF", &return_code);
FSRectF* rect_array = NULL;
FS_BOOL return_FindNext;
FSDK_TextSearch_FindNext(text_search, return_FindNext);
while(return_FindNext) {
	FSRectF* rect = NULL;
	FS_UINT32 return_array_length = 0;
	FSDK_TextSearch_GetMatchRects(text_search, rect, &return_array_length);
	rect = malloc( return_array_length * sizeof(FSRectF));
	FSDK_TextSearch_GetMatchRects(text_search, rect, &return_array_length);
	for (int i = 0; i < return_array_length; i++) {
	   FSRectF rectF = rect[i];
                  rectarray = (FSRectF*)realloc(rectarray, count * sizeof(FSRectF));
                  rectarray[count - 1] = rect[i];
	}
	free(rect);
	FSDK_TextSearch_FindNext(text_search, &return_FindNext);
  }
if(rect_array.GetSize() > 0) {
	FSRectF* rect = malloc(rectarray.size() * sizeof(FSRectF));
	for (int i = 0; i < rectarray.size(); i++)
	   rect[i] = rect_array[i];
	FS_REDACTION_HANDLE redact;
	FSDK_Redaction_MarkRedactAnnot(redaction, page, rect, rect_array.size(), &redact);
	free(rect);
	FS_BOOL return_code;
	FSDK_Annot_ResetAppearanceStream(redact, &return_code);
               wchar_t save_pdf_path[MAX_FILE_PATH] = { 0 };
	swprintf_s(save_pdf_path, MAX_FILE_PATH, L"%lsAboutFoxit_redected_default.pdf", output_directory);
	FS_PROGRESSIVE_HANDLE return_StartSaveAs1;
	FSDK_PDFDoc_StartSaveAs(doc, save_pdf_patth, e_FSSaveFlagsSaveFlagNormal, NULL, &return_StartSaveAs1);

	/ set border color to Green
	FSDK_Annot_SetBorderColor(redact, (long)0x00FF00);
	/ set fill color to Blue
	FSDK_Redact_SetFillColor(redact, (long)0x0000FF);
	/ set rollover fill color to Red
	FSDK_Redact_SetApplyFillColor(redact, (long)0xFF0000);
	FSDK_Annot_ResetAppearanceStream(redact, &return_code);
	swprintf_s(save_pdf_path1, MAX_FILE_PATH, L"%ls AboutFoxit_redected_setColor.pdf", output_directory);
	FS_PROGRESSIVE_HANDLE return_StartSaveAs2;
	FSDK_PDFDoc_StartSaveAs(doc, save_pdf_path1, e_FSSaveFlagsSaveFlagNormal, NULL, &return_StartSaveAs2);

	FSDK_Markup_SetOpacity(redact, (float)0.5);
	FSDK_Annot_ResetAppearanceStream(redact, &return_code);               
	wchar_t save_pdf_patth2[MAX_FILE_PATH];
swprintf_s(save_pdf_patth2, MAX_FILE_PATH, L"%lsAboutFoxit_redected_setOpacity.pdf", output_directory);
	FS_PROGRESSIVE_HANDLE return_StartSaveAs3;
	FSDK_PDFDoc_StartSaveAs(doc, save_pdf_patth2, e_FSSaveFlagsSaveFlagNormal, NULL, &return_StartSaveAs3);
	FSDK_Redaction_Apply(redaction, &return_code);
	if(return_code)
		printf("Redact page(0) succeed.\n");
	else
		printf("Redact page(0) failed.\n");
  }
swprintf_s(save_pdf_path3, MAX_FILE_PATH, L"%lsAboutFoxit_redected_apply.pdf", output_directory);
FS_PROGRESSIVE_HANDLE return_StartSaveAs;
FSDK_PDFDoc_StartSaveAs(doc, save_pdf_patth3, e_FSSaveFlagsSaveFlagNormal, NULL, &return_StartSaveAs);
java
import com.foxit.sdk.common.fxcrt.RectFArray;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.pdf.TextPage;
import com.foxit.sdk.pdf.TextSearch;
import com.foxit.sdk.addon.Redaction;
import com.foxit.sdk.pdf.annots.Redact;
...

// Assuming PDFDoc doc has been loaded.
...

Redaction redaction = new Redaction(doc);
PDFPage page = doc.getPage(0);
// Parse PDF page.
page.startParse(PDFPage.e_ParsePageNormal, null, false);
TextPage text_page = new TextPage(page, TextPage.e_ParseTextNormal);
TextSearch text_search = new TextSearch(text_page);
text_search.setPattern("PDF");
RectFArray matched_rect_array = new RectFArray();
while (text_search.findNext()) {
    RectFArray temp_rect_array = text_search.getMatchRects();
    for (int z=0; z<temp_rect_array.getSize(); z++)
        matched_rect_array.add(temp_rect_array.getAt(z));
}
if (matched_rect_array.getSize()>0) {
    Redact redact = redaction.markRedactAnnot(page, matched_rect_array);
    redact.resetAppearanceStream();
    doc.saveAs(output_path + "AboutFoxit_redected_default.pdf", PDFDoc.e_SaveFlagNormal);
 
    / set border color to Green
    redact.setBorderColor((long)0x00FF00);
    / set fill color to Blue
    redact.setFillColor((long)0x0000FF);
    / set rollover fill color to Red
    redact.setApplyFillColor((long)0xFF0000);
    redact.resetAppearanceStream();
    doc.saveAs(output_path + "AboutFoxit_redected_setColor.pdf", PDFDoc.e_SaveFlagNormal);
 
    redact.setOpacity((float)0.5);
    redact.resetAppearanceStream();
    doc.saveAs(output_path+"AboutFoxit_redected_setOpacity.pdf", PDFDoc.e_SaveFlagNormal);
 
    redaction.apply();
}
...
py
import sys
import site

if sys.version_info.major == 2:
    _PYTHON2_ = True
else:
    _PYTHON2_ = False

if _PYTHON2_:
    # replace with the python2 lib path
    site.addsitedir(‘../../../’)
    from FoxitPDFSDKPython2 import *
else:
    from FoxitPDFSDKPython3 import *

...
redaction = Redaction(doc)
# Parse PDF page.
page = doc.GetPage(0)
page.StartParse(PDFPage.e_ParsePageNormal, None, False)
text_page = TextPage(page)
text_search = TextSearch(text_page)
text_search.SetPattern("PDF")
rect_array = RectFArray()
while text_search.FindNext():
    itemArray = text_search.GetMatchRects()
    rect_array.InsertAt(rect_array.GetSize(), itemArray)

if rect_array.GetSize() > 0:
    redact = redaction.MarkRedactAnnot(page, rect_array)
    redact.ResetAppearanceStream()
    doc.SaveAs(output_directory + "AboutFoxit_redected_default.pdf")

    # Set border color to green.
    redact.SetBorderColor(0x00FF00)
    # Set fill color to blue.
    redact.SetFillColor(0x0000FF)
    # Set rollover fill color to red.
    redact.SetApplyFillColor(0xFF0000)
    redact.ResetAppearanceStream()
    doc.SaveAs(output_directory + "AboutFoxit_redected_setColor.pdf")

    redact.SetOpacity(0.5)
    redact.ResetAppearanceStream()
    doc.SaveAs(output_directory + "AboutFoxit_redected_setOpacity.pdf")

    if redaction.Apply():
        print("Redact page(0) succeed.")
    else:
        print("Redact page(0) failed.")

doc.SaveAs(output_directory + "AboutFoxit_redected_apply.pdf")
objc
#include "FSPDFObjC.h"
...

// Assuming that FSPDFDoc doc has been loaded.
...

FSRedaction *redaction = [[FSRedaction alloc] initWithDocument:doc];
// Parse PDF page.
FSPDFPage *page = [doc getPage:0];
[page startParse:FSPDFPageParsePageNormal pause:nil is_reparse:NO];
FSTextPage *text_page = [[FSTextPage alloc] initWithPage:page flags:FSTextPageParseTextNormal];
FSTextSearch *text_search = [[FSTextSearch alloc] initWithText_page:text_page];
[text_search setPattern:@"PDF"];
FSRectFArray *rect_array = [[FSRectFArray alloc] init];
while ([text_search findNext]) {
    FSRectFArray *matchrects = [text_search getMatchRects];
    for (int z = 0; z < [matchrects getSize]; z++) {
        FSRectF *temp_rect = [matchrects getAt:z];
        [rect_array add:temp_rect];
    }
}
if ([rect_array getSize] > 0) {
    FSRedact *redact = [redaction markRedactAnnot:page rects:rect_array];
    [redact resetAppearanceStream];
    [doc saveAs:[output_directory stringByAppendingString:@"AboutFoxit_redected_default.pdf"] save_flags:FSPDFDocSaveFlagNormal];
    
    / set border color to Green.
    [redact setBorderColor:0x00FF00];
    / set fill color to Blue.
    [redact setFillColor:0x0000FF];
    / set rollover fill color to Red.
    [redact setApplyFillColor:0xFF0000];
    [redact resetAppearanceStream];
    [doc saveAs:[output_directory stringByAppendingString:@"AboutFoxit_redected_setColor.pdf"] save_flags:FSPDFDocSaveFlagNormal];
    
    [redact setOpacity:0.5];
    [redact resetAppearanceStream];
    [doc saveAs:[output_directory stringByAppendingString:@"AboutFoxit_redected_setOpacity.pdf"] save_flags:FSPDFDocSaveFlagNormal];
}
js
const FSDK = require("@fuxinsoft/foxit-pdf-sdk-node");

...
let redaction = new FSDK.Redaction(doc);
// Parse PDF page.
let page = doc.GetPage(0);
page.StartParse(FSDK.PDFPage.e_ParsePageNormal, null, false);
let text_page = new FSDK.TextPage(page, FSDK.TextPage.e_ParseTextNormal);
let text_search = new FSDK.TextSearch(text_page);
text_search.SetPattern("PDF");
let rect_array = new FSDK.RectFArray();
while(text_search.FindNext()) {
  itemArray = text_search.GetMatchRects()
  rect_array.InsertAt(rect_array.GetSize(), itemArray)
}
if(rect_array.GetSize() > 0) {
  let redact = redaction.MarkRedactAnnot(page, rect_array);
  redact.ResetAppearanceStream();
  doc.SaveAs(output_directory + "AboutFoxit_redected_default.pdf", FSDK.PDFDoc.e_SaveFlagNormal);

  / Set border color to green.
  redact.SetBorderColor(0x00FF00);
  / Set fill color to blue.
  redact.SetFillColor(0x0000FF);
  / Set rollover fill color to red.
  redact.SetApplyFillColor(0xFF0000);
  redact.ResetAppearanceStream();
  doc.SaveAs(output_directory + "AboutFoxit_redected_setColor.pdf", FSDK.PDFDoc.e_SaveFlagNormal);

  redact.SetOpacity(0.5);
  redact.ResetAppearanceStream();
  doc.SaveAs(output_directory + "AboutFoxit_redected_setOpacity.pdf", FSDK.PDFDoc.e_SaveFlagNormal);

  if(redaction.Apply())
    console.log("Redact page(0) succeed.");
  else
    console.log("Redact page(0) succeed.");
}
doc.SaveAs(output_directory + "AboutFoxit_redected_apply.pdf", FSDK.PDFDoc.e_SaveFlagNormal);
csharp
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
using foxit.addon;
using foxit.pdf.annots;  
  
...  
using (Redaction redaction = new Redaction(doc))
{
    using (PDFPage page = doc.GetPage(0))
    {
        / Parse PDF page.
        page.StartParse((int)foxit.pdf.PDFPage.ParseFlags.e_ParsePageNormal, null, false);
        TextPage text_page = new TextPage(page, (int)foxit.pdf.TextPage.TextParseFlags.e_ParseTextNormal);
        TextSearch text_search = new TextSearch(text_page);
        text_search.SetPattern("PDF");
        RectFArray rect_array = new RectFArray();
        while (text_search.FindNext())
        {
            RectFArray itemArray = text_search.GetMatchRects();
            rect_array.InsertAt(rect_array.GetSize(), itemArray);
        }
        if (rect_array.GetSize() > 0)
        {
            Redact redact = redaction.MarkRedactAnnot(page, rect_array);
            redact.ResetAppearanceStream();
            doc.SaveAs(output_path + "AboutFoxit_redected_default.pdf", (int)foxit.pdf.PDFDoc.SaveFlags.e_SaveFlagNormal);
 
            / set border color to Green
            redact.SetBorderColor(0x00FF00);
            / set fill color to Blue
            redact.SetFillColor(0x0000FF);
            / set rollover fill color to Red
            redact.SetApplyFillColor(0xFF0000);
            redact.ResetAppearanceStream();
            doc.SaveAs(output_path + "AboutFoxit_redected_setColor.pdf", (int)foxit.pdf.PDFDoc.SaveFlags.e_SaveFlagNormal);
 
            redact.SetOpacity((float)0.5);
            redact.ResetAppearanceStream();
            doc.SaveAs(output_path + "AboutFoxit_redected_setOpacity.pdf", (int)foxit.pdf.PDFDoc.SaveFlags.e_SaveFlagNormal);
 
            if (redaction.Apply())
                Console.WriteLine("Redact page(0) succeed.");
            else
                Console.WriteLine("Redact page(0) failed.");
            redact.Dispose();
        }
    }
}
go
import (
."foxit.com/fsdk"
“fmt”
)
...
redaction := NewRedaction(doc)
# Parse PDF page.
page := doc.GetPage(0)
page.StartParse(PDFPageE_ParsePageNormal)
text_page := NewTextPage(page)
text_search := NewTextSearch(text_page)
text_search.SetPattern("PDF")
rect_array := RectFArray()
for text_search.FindNext() {
    itemArray := text_search.GetMatchRects()
    rect_array.InsertAt(rect_array.GetSize(), itemArray)
}
if rect_array.GetSize() > 0{
    redact := redaction.MarkRedactAnnot(page, rect_array)
    redact.ResetAppearanceStream()
    doc.SaveAs(output_directory + "AboutFoxit_redected_default.pdf")

    # Set border color to green.
    redact.SetBorderColor(0x00FF00)
    # Set fill color to blue.
    redact.SetFillColor(0x0000FF)
    # Set rollover fill color to red.
    redact.SetApplyFillColor(0xFF0000)
    redact.ResetAppearanceStream()
    doc.SaveAs(output_directory + "AboutFoxit_redected_setColor.pdf")

    redact.SetOpacity(0.5)
    redact.ResetAppearanceStream()
    doc.SaveAs(output_directory + "AboutFoxit_redected_setOpacity.pdf")

    if redaction.Apply(){
        fmt.Printf("Redact page(0) succeed.")
}
    else{
        fmt.Printf("Redact page(0) failed.")
}
}
doc.SaveAs(output_directory + "AboutFoxit_redected_apply.pdf")