Skip to content

密文脱敏

密文脱敏注释(Redact)用于永久性地遮盖或移除 PDF 中的敏感内容。与其他注释不同,密文注释有"标记"和"应用"两个阶段:标记阶段创建脱敏区域并预览效果;应用后将被覆盖区域的内容从文档中永久移除。

注意

调用 apply() 后,被脱敏区域的原始内容(文本、图片等)将被永久删除且不可恢复。建议在应用前保存文档备份。

工作流程

  1. 创建脱敏注释 — 在目标区域添加 Redact 注释
  2. 配置外观 — 设置覆盖颜色、叠加文字等
  3. 预览 — 此时注释仅作标记,原始内容仍保留
  4. 应用(Apply) — 永久移除被标记区域的内容,注释本身也被移除

核心方法

方法说明
getQuadPoints() / setQuadPoints(QuadPointsArray)获取/设置脱敏区域(用于文本区域的精确标记)
getFillColor() / setFillColor(int)获取/设置标记阶段的填充颜色(预览时显示)
getApplyFillColor() / setApplyFillColor(int)获取/设置应用后的填充颜色
getOverlayText() / setOverlayText(String)获取/设置叠加文字(应用后显示在脱敏区域上)
isOverlayTextRepeated() / enableRepeatOverlayText(boolean)获取/设置叠加文字是否重复填满区域
getOverlayTextAlignment() / setOverlayTextAlignment(int)获取/设置叠加文字对齐方式
getDefaultAppearance() / setDefaultAppearance(DefaultAppearance)获取/设置叠加文字的字体外观(字体、字号、颜色)
enableAutoFontSize()自动调整叠加文字字号以适应区域大小
apply()应用脱敏 — 永久移除被标记区域的内容

示例:创建并应用密文脱敏

java
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.pdf.annots.Annot;
import com.foxit.sdk.pdf.annots.DefaultAppearance;
import com.foxit.sdk.pdf.annots.Redact;

PDFDoc doc = new PDFDoc("path/to/Sample.pdf");
doc.load(null);
PDFPage page = doc.getPage(0);

// 步骤 1:创建脱敏注释
RectF rect = new RectF(100, 700, 350, 720);
Redact redact = new Redact(page.addAnnot(Annot.e_Redact, rect));

// 步骤 2:设置外观
redact.setFillColor(0xffff0000);            // 标记阶段显示红色
redact.setApplyFillColor(0xff000000);       // 应用后显示黑色

// 设置叠加文字
redact.setOverlayText("已脱敏");
redact.setOverlayTextAlignment(1);           // 居中

DefaultAppearance da = new DefaultAppearance();
da.setText_size(12);
da.setText_color(0xffffffff);                // 白色文字
redact.setDefaultAppearance(da);

redact.resetAppearanceStream();

// 步骤 3:预览效果后应用
// 此时可以保存文档供审阅者预览脱敏标记
doc.saveAs("path/to/preview.pdf", PDFDoc.e_SaveFlagNormal);

// 步骤 4:应用脱敏(永久移除内容)
redact.apply();
doc.saveAs("path/to/redacted.pdf", PDFDoc.e_SaveFlagNormal);

示例:对文本区域进行精确脱敏

对于需要精确标记文本区域的场景,可结合文本搜索和 QuadPoints 使用:

java
import com.foxit.sdk.common.fxcrt.PointF;
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.common.fxcrt.RectFArray;
import com.foxit.sdk.pdf.TextPage;
import com.foxit.sdk.pdf.TextSearch;
import com.foxit.sdk.pdf.annots.Annot;
import com.foxit.sdk.pdf.annots.QuadPoints;
import com.foxit.sdk.pdf.annots.QuadPointsArray;
import com.foxit.sdk.pdf.annots.Redact;

TextSearch textSearch = new TextSearch(doc, null, TextPage.e_ParseTextNormal);
textSearch.setPattern("机密信息");

if (textSearch.findNext()) {
    RectFArray rects = textSearch.getMatchRects();

    QuadPointsArray quadPointsArray = new QuadPointsArray();
    for (int i = 0; i < rects.getSize(); i++) {
        RectF r = rects.getAt(i);
        QuadPoints qp = new QuadPoints();
        qp.setFirst(new PointF(r.getLeft(), r.getTop()));
        qp.setSecond(new PointF(r.getRight(), r.getTop()));
        qp.setThird(new PointF(r.getLeft(), r.getBottom()));
        qp.setFourth(new PointF(r.getRight(), r.getBottom()));
        quadPointsArray.add(qp);
    }

    // 创建 Redact 注释并设置 QuadPoints
    Redact redact = new Redact(
        page.addAnnot(Annot.e_Redact, new RectF(0, 0, 0, 0)));
    redact.setQuadPoints(quadPointsArray);
    redact.setApplyFillColor(0xff000000);
    redact.resetAppearanceStream();

    // 应用脱敏
    redact.apply();
}