FPdfRedaction aporta inspección conservadora del origen y operaciones geométricas para TPdf.SaveAsRedacted; el método de alto nivel proporciona la transacción, tratamiento de anotaciones, overlays opacos, regeneración de contenido, saneamiento y eliminación de recursos sin uso
Los helpers modifican objetos nativos en la copia transaccional aislada del llamador y lanzan EPdfRedactionGeometry ante geometría no compatible o límites agotados; por sí solos no realizan una exportación segura completa
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);
Todos los rectángulos de redaction y tolerancias de curva usan puntos del espacio de usuario PDF; los puntos del path se transforman al espacio de página antes del recorte, y ObjectIndex es el índice nativo original con base cero que mantiene el orden de dibujo
ExpandRedactionForms separa recursivamente hijos de texto, path e imagen, compone transformaciones no singulares y clips nativos e inserta los objetos expandidos en la posición original del Form; expandir cada instancia compartida por separado evita editar in situ el flujo Form originalClipRedactionPath requiere un path con relleno sólido y sin trazo, aproxima segmentos cúbicos con profundidad limitada, resta cortes rectangulares y conserva el relleno winding o even-odd de los contornos restantesCurveTolerance + 0.001 puntos PDF; la tolerancia limita la aproximación de curvas y puede quitar un pequeño margen adicional fuera del rectángulo solicitadoMaskRedactionImage acepta transformaciones afines no singulares, incluidos giro, reflexión y shear, y muestras decodificadas Gray, BGR, BGRx o BGRA compatibles; mantiene la resolución decodificada y crea una imagen de reemplazo nueva0.001 puntos PDF pierde sus bytes de color y alfa; los píxeles conservados mantienen las muestras de color decodificadasValidateDetailedRedactionText exige texto con relleno normal para conservarlo parcialmente; el mapeo de caracteres y la reconstrucción de fragmentos corresponden al método de alto nivelLa expansión y geometría parcial rechazan transparencia o blend states, tipos de hijos no compatibles, matrices singulares, rellenos con patrón y clips complejos o no redundantes; un clip rectangular redundante compatible debe contener todos los límites del objeto
| Opción | Predeterminado | Significado |
|---|---|---|
MaxFormDepth | 32 | Profundidad de expansión de Forms anidados |
MaxObjects | 1000000 | Límites de enumeración de página y acumulación de hijos expandidos |
MaxPathSegments | 262144 | Segmentos de entrada por path y puntos generados acumulados |
MaxFragments | 1000000 | Regiones rectangulares conservadas y fragmentos de reemplazo acumulados |
MaxImagePixels | 16777216 | Píxeles de imagen decodificados procesados acumulados |
MaxGeometryOperations | 67108864 | Trabajo acumulado de geometría e intersección de píxeles |
CurveTolerance | 0.01 | Tolerancia de aproximación cúbica en puntos PDF |
Inicialice las opciones con TPdfRedactionGeometryOptions.Default y ponga el informe a cero una vez antes de la transacción; mantenga el mismo informe entre llamadas para acumular puntos, píxeles, fragmentos y presupuestos de operaciones
ExpandedFormCount y ScannedChildCount describen la expansión; el recuento de visitas incluye instancias Form raíz e hijos; ClippedPathCount, FlattenedCurveCount y GeneratedPointCount describen paths e incluyen puntos intermedios de recorte; MaskedImageCount, ScannedPixelCount, MaskedPixelCount y PixelIntersectionTestCount describen las imágenes
FragmentCount cuenta objetos de reemplazo, no contornos poligonales ni píxeles, y GeometryOperationCount acumula el trabajo limitado; un informe tras una excepción puede describir trabajo parcial sobre la copia transaccional descartada
ValidateDetailedRedactionSource inspecciona objetos activos y contenido decodificado antes de modificar; TPdf.SaveAsRedacted lo invoca en todos los perfiles, incluida eliminación completa de objetos y el perfil parcial sencillo
/ActualText y /Alt, XFA y semántica de contenido opcional con /OCProperties, /OCG y /OCMDTr desconocidos, y pintura con patrón o espacio de color especial mediante scn/SCN/FlateDecode; la decodificación se limita a 32 MiB por flujo y 64 MiB totalesEl perfil actual no reconstruye Tagged PDF, no conserva transparencia arbitraria, no admite trazos o recortes arbitrarios ni promete conservar sin pérdida imágenes codificadas; la salida segura exige quitar flujos originales y recursos sin uso tras regenerar, como hace TPdf.SaveAsRedacted
Los llamadores directos deben aportar una copia aislada, validar capacidades nativas y límites positivos finitos, descartar la copia si falla, regenerar el contenido modificado y completar saneamiento y limpieza de recursos antes de exportar