FPdfRedaction ofrece inspección conservadora del origen y operaciones geométricas que usa TPdf.SaveAsRedacted; el método de nivel superior se encarga de la transacción, las anotaciones, las superposiciones opacas, la regeneración de contenido, la limpieza y la eliminación de recursos sin uso
Los helpers modifican objetos nativos en la copia transaccional aislada del llamador y lanzan EPdfRedactionGeometry si la geometría no es compatible o se agotan los límites; 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 redacción y las tolerancias de curvas usan puntos del espacio de usuario PDF; antes del recorte, los puntos del trazado se transforman al espacio de la página, y ObjectIndex es el índice nativo original del objeto de página con base cero, usado para conservar el orden de dibujo
ExpandRedactionForms separa recursivamente los hijos de texto, trazados e imágenes, combina transformaciones de instancia no singulares y recortes nativos, e inserta los objetos expandidos en la posición original del Form; expandir por separado cada instancia compartida evita modificar directamente el flujo Form original compartidoClipRedactionPath exige un trazado con relleno sólido y sin trazo, aproxima los segmentos cúbicos mediante subdivisiones con profundidad limitada, resta los cortes rectangulares y conserva las reglas de relleno winding o even-odd en los contornos retenidosCurveTolerance + 0.001 puntos PDF; la tolerancia limita la aproximación de curvas y puede eliminar un pequeño margen adicional fuera del rectángulo solicitadoMaskRedactionImage acepta transformaciones afines no singulares, incluidas rotación, reflexión y sesgo, y muestras decodificadas Gray, BGR, BGRx o BGRA compatibles; mantiene la resolución decodificada y crea una imagen de reemplazo nueva0.001 puntos PDF se borran los bytes de color y alfa; los píxeles conservados mantienen sus muestras de color decodificadasValidateDetailedRedactionText exige texto con relleno normal para conservarlo parcialmente; el mapeo de caracteres y la reconstrucción de fragmentos siguen a cargo del método de nivel superiorLa expansión y la geometría parcial rechazan estados de transparencia o mezcla, tipos de hijos no compatibles, matrices singulares, rellenos con patrones y trazados de recorte complejos o no redundantes; un recorte rectangular redundante compatible debe contener todos los límites del objeto
| Opción | Valor predeterminado | Significado |
|---|---|---|
MaxFormDepth | 32 | Profundidad de expansión de Form anidados |
MaxObjects | 1000000 | Límites de enumeración de páginas y de hijos expandidos acumulados |
MaxPathSegments | 262144 | Segmentos de entrada por trazado 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 de curvas cúbicas en puntos PDF |
Inicialice las opciones con TPdfRedactionGeometryOptions.Default y ponga el informe en cero una sola vez antes de la transacción; use el mismo informe en las llamadas a los helpers para acumular puntos generados, píxeles de imagen, fragmentos y operaciones
ExpandedFormCount y ScannedChildCount describen la expansión; el conteo de visitados incluye instancias Form raíz y sus hijos; ClippedPathCount, FlattenedCurveCount y GeneratedPointCount describen el trabajo sobre trazados, incluidos los puntos intermedios de recorte; MaskedImageCount, ScannedPixelCount, MaskedPixelCount y PixelIntersectionTestCount describen el trabajo sobre imágenes
FragmentCount cuenta objetos de reemplazo, no contornos de polígonos ni píxeles, y GeometryOperationCount acumula el trabajo limitado de los helpers; el informe que queda tras una excepción puede describir trabajo parcial sobre la copia transaccional descartada
ValidateDetailedRedactionSource inspecciona los objetos activos y el contenido decodificado antes de modificarlos; TPdf.SaveAsRedacted lo llama para todos los perfiles, incluida la eliminación de objetos completos y el perfil parcial más simple
/ActualText y /Alt, XFA y semántica de contenido opcional, incluidos /OCProperties, /OCG y /OCMDTr desconocido, y pintura de patrones o espacios de color especiales con scn/SCN/FlateDecode; la decodificación se limita a 32 MiB por flujo de contenido y 64 MiB en totalEl perfil actual no reconstruye la estructura Tagged PDF, no conserva transparencias arbitrarias, no admite trazos o recortes arbitrarios ni promete conservar sin pérdidas las imágenes codificadas; una salida segura exige eliminar los flujos originales y recursos sin uso después de regenerar, como hace TPdf.SaveAsRedacted
Quienes llamen directamente deben proporcionar una copia aislada del documento, validar capacidades nativas y límites positivos finitos, descartar la copia si hay un error, regenerar el contenido de las páginas modificadas y completar la limpieza y eliminación de recursos sin uso antes de exportar