FPdfRedaction 提供 TPdf.SaveAsRedacted 所用的保守源检查和几何操作;高层方法负责事务、注解处理、不透明覆盖、内容重生成、清理及资源裁剪
辅助函数修改调用方隔离的事务副本中的原生对象,遇到不支持的几何或预算耗尽时抛出 EPdfRedactionGeometry;仅调用它们不能完成完整的安全导出
type
EPdfRedactionGeometry = class(Exception);
TPdfRedactionGeometryOptions = record
MaxFormDepth, MaxObjects, MaxPathSegments, MaxFragments: Integer;
MaxImagePixels, MaxGeometryOperations: Int64;
CurveTolerance: Double;
class function Default: TPdfRedactionGeometryOptions; static;
end;
TPdfRedactionGeometryReport = record
ExpandedFormCount, ScannedChildCount, ClippedPathCount: Integer;
FlattenedCurveCount, GeneratedPointCount, FragmentCount: Integer;
MaskedImageCount: Integer;
ScannedPixelCount, MaskedPixelCount, PixelIntersectionTestCount: Int64;
GeometryOperationCount: Int64;
end;
procedure ValidateDetailedRedactionSource(Source: TStream);
procedure ValidateDetailedRedactionText(PageObject: FPDF_PAGEOBJECT);
procedure ExpandRedactionForms(Page: FPDF_PAGE;
const Options: TPdfRedactionGeometryOptions;
var Report: TPdfRedactionGeometryReport);
procedure ClipRedactionPath(Page: FPDF_PAGE; PageObject: FPDF_PAGEOBJECT;
ObjectIndex: Integer; const Redactions: array of FS_RECTF;
const Options: TPdfRedactionGeometryOptions;
var Report: TPdfRedactionGeometryReport);
procedure MaskRedactionImage(Document: FPDF_DOCUMENT; Page: FPDF_PAGE;
PageObject: FPDF_PAGEOBJECT; ObjectIndex: Integer;
const Redactions: array of FS_RECTF;
const Options: TPdfRedactionGeometryOptions;
var Report: TPdfRedactionGeometryReport);
所有擦除矩形和曲线容差均使用 PDF 用户空间点;裁剪前路径点先转换到页面空间,ObjectIndex 是原生页面对象原始的零基索引,用于保留绘制顺序
ExpandRedactionForms 递归分离文本、路径和图像子对象,组合非奇异实例变换及原生裁剪,并将展开对象插回原 Form 位置;共享实例分别展开,避免就地修改原共享 Form 流ClipRedactionPath 要求路径为无描边的实色填充,按受限细分深度展平三次曲线段,减去矩形切除区,并为保留轮廓维持非零环绕或奇偶填充规则CurveTolerance + 0.001 PDF 点向外扩展;容差限制曲线近似误差,可能额外移除请求矩形外的一小圈内容MaskRedactionImage 接受旋转、反射和倾斜等非奇异仿射变换,以及受支持的解码 Gray、BGR、BGRx 或 BGRA 采样;保留解码分辨率并生成全新的替换图像0.001 PDF 点的擦除矩形,其颜色和 alpha 字节就全部清零;保留像素维持解码后的颜色采样ValidateDetailedRedactionText 要求部分保留的文本采用普通填充;字符映射和片段重建仍由高层方法负责展开及部分几何处理拒绝透明或混合状态、不支持的子对象类型、奇异矩阵、图案填充和复杂或非冗余裁剪路径;受支持的冗余矩形裁剪须包含整个对象边界
| 选项 | 默认值 | 含义 |
|---|---|---|
MaxFormDepth | 32 | 嵌套 Form 展开深度 |
MaxObjects | 1000000 | 页面枚举和累计展开子对象上限 |
MaxPathSegments | 262144 | 每路径输入段数及累计生成路径点数 |
MaxFragments | 1000000 | 保留矩形区域及累计替换片段上限 |
MaxImagePixels | 16777216 | 累计处理的解码图像像素 |
MaxGeometryOperations | 67108864 | 累计几何和像素相交工作量 |
CurveTolerance | 0.01 | 以 PDF 点计的三次曲线展平容差 |
使用 TPdfRedactionGeometryOptions.Default 初始化选项,在事务开始前将报告清零一次;后续辅助调用共用该报告,使生成点、图像像素、片段和操作预算累计计算
ExpandedFormCount 和 ScannedChildCount 描述展开工作,访问计数包含根 Form 实例和子对象;ClippedPathCount、FlattenedCurveCount 和 GeneratedPointCount 描述路径工作,包括中间裁剪点;MaskedImageCount、ScannedPixelCount、MaskedPixelCount 和 PixelIntersectionTestCount 描述图像工作
FragmentCount 统计替换对象,而不是多边形轮廓或像素;GeometryOperationCount 累计受限辅助操作,异常后的报告可能记录已丢弃事务副本上完成的部分工作
ValidateDetailedRedactionSource 在修改前检查有效对象和解码内容;TPdf.SaveAsRedacted 对所有处理配置都会调用它,包括整个对象移除和较简单的部分保留配置
/ActualText 和 /Alt 替代数据、XFA,以及 /OCProperties、/OCG 和 /OCMD 等可选内容语义Tr 操作数,以及 scn/SCN 图案或特殊色彩空间绘制/FlateDecode 过滤器;解码上限为每内容流 32 MiB、累计 64 MiB当前配置不重建 Tagged PDF 结构,不保留任意透明度,不支持任意描边或裁剪,也不承诺编码图像无损保留;安全输出须在重生成后移除原始流和未使用资源,TPdf.SaveAsRedacted 会完成这些步骤
直接调用者须提供隔离文档副本,验证原生能力及有限正数预算,失败时丢弃副本,重生成已修改页面内容,并在导出前完成清理和资源裁剪