密文脱敏
密文脱敏注释(Redact)用于永久性地遮盖或移除 PDF 中的敏感内容。与其他注释不同,密文注释有"标记"和"应用"两个阶段:标记阶段创建脱敏区域并预览效果;应用后将被覆盖区域的内容从文档中永久移除。
注意
调用 apply() 后,被脱敏区域的原始内容(文本、图片等)将被永久删除且不可恢复。建议在应用前保存文档备份。
工作流程
- 创建脱敏注释 — 在目标区域添加 Redact 注释
- 配置外观 — 设置覆盖颜色、叠加文字等
- 预览 — 此时注释仅作标记,原始内容仍保留
- 应用(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();
}