FPdfRedaction fornisce l'ispezione prudenziale della sorgente e le operazioni geometriche usate da TPdf.SaveAsRedacted; il metodo di livello superiore gestisce transazione, annotazioni, coperture opache, rigenerazione del contenuto, sanitizzazione ed eliminazione delle risorse inutilizzate
Gli helper modificano gli oggetti nativi nella copia transazionale isolata del chiamante e sollevano EPdfRedactionGeometry per geometria non supportata o limiti esauriti; da soli non eseguono un'esportazione sicura 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);
Tutti i rettangoli di redazione e le tolleranze delle curve usano punti nello spazio utente PDF; i punti dei tracciati sono trasformati nello spazio pagina prima del clipping e ObjectIndex è l'indice nativo originale a base zero dell'oggetto pagina, usato per mantenere l'ordine di disegno
ExpandRedactionForms stacca ricorsivamente elementi di testo, tracciati e immagini, compone trasformazioni di istanza non singolari e clip nativi, poi inserisce gli oggetti espansi nella posizione originale del Form; espandere separatamente ogni istanza condivisa evita modifiche dirette allo stream Form condiviso originaleClipRedactionPath richiede un tracciato con riempimento uniforme e senza tratto, approssima i segmenti cubici con profondità di suddivisione limitata, sottrae tagli rettangolari e mantiene riempimento winding o even-odd nei contorni conservatiCurveTolerance + 0.001 punti PDF; la tolleranza limita l'approssimazione delle curve e può eliminare un piccolo margine aggiuntivo fuori dal rettangolo richiestoMaskRedactionImage accetta trasformazioni affini non singolari, incluse rotazione, riflessione e skew, e campioni decodificati supportati Gray, BGR, BGRx o BGRA; mantiene la risoluzione decodificata e crea un'immagine sostitutiva nuova0.001 punti PDF ha azzerati sia i byte colore sia quelli alpha; i pixel conservati mantengono i campioni colore decodificatiValidateDetailedRedactionText richiede normale testo riempito per il mantenimento parziale; mappatura dei caratteri e ricostruzione dei frammenti restano compiti del metodo di livello superioreEspansione e geometria parziale rifiutano stati di trasparenza o blending, tipi di elementi non supportati, matrici singolari, riempimenti con pattern e clip complessi o non ridondanti; un clip rettangolare ridondante supportato deve contenere tutti i limiti dell'oggetto
| Opzione | Valore predefinito | Significato |
|---|---|---|
MaxFormDepth | 32 | Profondità di espansione dei Form annidati |
MaxObjects | 1000000 | Limiti dell'enumerazione di pagina e degli elementi espansi cumulativi |
MaxPathSegments | 262144 | Segmenti di input per tracciato e punti generati cumulativi |
MaxFragments | 1000000 | Regioni rettangolari mantenute e frammenti sostitutivi cumulativi |
MaxImagePixels | 16777216 | Pixel immagine decodificati elaborati cumulativamente |
MaxGeometryOperations | 67108864 | Lavoro cumulativo di geometria e intersezione dei pixel |
CurveTolerance | 0.01 | Tolleranza dell'approssimazione cubica in punti PDF |
Inizializzare le opzioni con TPdfRedactionGeometryOptions.Default e azzerare il report una sola volta prima della transazione; riutilizzare il report tra chiamate agli helper, così che punti generati, pixel, frammenti e limiti operativi si accumulino
ExpandedFormCount e ScannedChildCount descrivono l'espansione; il conteggio delle visite include istanze Form radice ed elementi figli. ClippedPathCount, FlattenedCurveCount e GeneratedPointCount descrivono il lavoro sui tracciati, inclusi punti intermedi di clipping; MaskedImageCount, ScannedPixelCount, MaskedPixelCount e PixelIntersectionTestCount descrivono il lavoro sulle immagini
FragmentCount conta oggetti sostitutivi, non contorni poligonali o pixel, e GeometryOperationCount accumula il lavoro limitato degli helper; un report lasciato da un'eccezione può descrivere lavoro parziale sulla copia transazionale scartata
ValidateDetailedRedactionSource esamina oggetti attivi e contenuto decodificato prima delle modifiche; TPdf.SaveAsRedacted lo invoca per ogni profilo, compresi rimozione di interi oggetti e profilo parziale semplificato
/ActualText e /Alt, XFA e semantica del contenuto opzionale, inclusi /OCProperties, /OCG e /OCMDTr sconosciuti e disegno scn/SCN con pattern o spazi colore speciali/FlateDecode; la decodifica è limitata a 32 MiB per stream di contenuto e 64 MiB totaliIl profilo attuale non ricostruisce la struttura Tagged PDF, non mantiene trasparenze arbitrarie, non supporta qualsiasi tratto o clip e non promette di conservare senza perdite le immagini codificate; un output sicuro richiede la rimozione degli stream originali e delle risorse inutilizzate dopo la rigenerazione, come fa TPdf.SaveAsRedacted
Chi chiama direttamente gli helper deve fornire una copia isolata del documento, verificare capacità native e limiti finiti positivi, scartare la copia in caso di errore, rigenerare il contenuto delle pagine modificate e completare sanitizzazione e pulizia delle risorse prima dell'esportazione