Skip to content

密文 (Redaction)

密文是一种在保持文档布局不变的前提下,永久删除 PDF 文档中敏感信息的功能。它能帮助用户安全地移除文档中的可见文本和图片,有效保护机密数据,例如社会安全号码、信用卡信息、产品发布日期等。

核心概念: 密文是一种特殊的标记注释。用户首先标记 PDF 文件中需要删除的内容,然后在应用该注释后,标记区域的内容将被永久删除

执行密文操作 (Java 示例):

要使用密文功能,您可以使用以下 API 步骤:

  1. 创建 Redaction 模块:

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

    提示: 如果您在 com.foxit.sdk.common.Library.initialize 函数中使用的授权许可信息未包含 "Redaction" 权限,您将无法使用密文相关函数,并且上述构造函数会抛出 com.foxit.sdk.common.Constants.e_ErrInvalidLicense 异常。

  2. 标记需要密文处理的内容:

    java
    com.foxit.sdk.addon.Redaction.markRedactAnnot(/* 参数:页面对象, 标记区域, ... */);

    调用 com.foxit.sdk.addon.Redaction.markRedactAnnot 方法创建一个密文对象,用于标记需要进行密文处理的页面内容,包括文本对象、图片对象和路径对象。

  3. 应用密文:

    java
    redaction.apply(/* 参数:页面对象, ... */);

    最后,调用 com.foxit.sdk.addon.Redaction.apply 方法在标记区域应用密文,永久删除标记区域的文本和图形。

授权说明

  • 要使用 redaction 功能,请确保授权许可文件中包含 Redaction 模块权限。

将 PDF 文档第一页中的文本 "PDF" 设置为密文

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("@foxitsoftware/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();
        }
    }
}