FPdfRedaction fornece inspeção conservadora da origem e operações de geometria usadas pelo TPdf.SaveAsRedacted; o método de nível mais alto fornece a transação, o processamento de anotações, as sobreposições opacas, a regeneração de conteúdo, a sanitização e a poda de recursos
Os auxiliares mutam objetos nativos na cópia isolada da transação de quem chama e geram EPdfRedactionGeometry diante de geometria não suportada ou orçamentos esgotados; por si sós, eles não realizam uma exportação 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 os retângulos de redaction e as tolerâncias de curva usam pontos do user space PDF; os pontos de caminho são transformados para o espaço da página antes do recorte, e ObjectIndex é o índice nativo original de base zero do objeto de página, usado para preservar a ordem de pintura
ExpandRedactionForms desanexa recursivamente filhos de texto, caminho e imagem, compõe transformações de instância não singulares e clips nativos, e insere os objetos expandidos na posição original do Form; a expansão separada de cada instância compartilhada evita editar no lugar o stream original do Form compartilhadoClipRedactionPath exige um caminho preenchido sólido, sem stroke, achata segmentos cúbicos com uma profundidade de subdivisão limitada, subtrai os cortes retangulares e preserva o preenchimento winding ou even-odd pelos contornos retidosCurveTolerance + 0.001 pontos PDF; a tolerância limita a aproximação de curvas e pode remover uma pequena margem adicional fora do retângulo solicitadoMaskRedactionImage aceita transformações afins não singulares, incluindo rotação, reflexão e cisalhamento, e amostras decodificadas suportadas Gray, BGR, BGRx ou BGRA; ele mantém a resolução decodificada e cria uma imagem de substituição nova0.001 pontos PDF tem seus bytes de cor e de alfa zerados; os pixels retidos mantêm suas amostras de cor decodificadasValidateDetailedRedactionText exige texto preenchido normal para retenção parcial; o mapeamento de caracteres e a reconstrução de fragmentos continuam sendo responsabilidade do método de nível mais altoExpansão e geometria parcial rejeitam estados de transparência ou blending, tipos de filhos não suportados, matrizes singulares, preenchimentos com pattern e caminhos de clip complexos ou não redundantes; um clip retangular redundante suportado deve conter os limites completos do objeto
| Opção | Padrão | Significado |
|---|---|---|
MaxFormDepth | 32 | Profundidade de expansão de Forms aninhados |
MaxObjects | 1000000 | Enumeração de páginas e limites acumulados de filhos expandidos |
MaxPathSegments | 262144 | Segmentos de entrada por caminho e pontos acumulados de caminhos gerados |
MaxFragments | 1000000 | Regiões retangulares retidas e fragmentos de substituição acumulados |
MaxImagePixels | 16777216 | Pixels acumulados de imagens decodificadas processadas |
MaxGeometryOperations | 67108864 | Trabalho acumulado de geometria e de testes de interseção de pixels |
CurveTolerance | 0.01 | Tolerância de achatamento de cúbicas em pontos PDF |
Inicialize as opções com TPdfRedactionGeometryOptions.Default e zere o relatório uma vez antes de uma transação; mantenha o mesmo relatório entre as chamadas dos auxiliares para que os pontos gerados, os pixels de imagem, os fragmentos e os orçamentos de operações se acumulem
ExpandedFormCount e ScannedChildCount descrevem a expansão; a contagem de visitados inclui as instâncias raiz de Forms além dos filhos; ClippedPathCount, FlattenedCurveCount e GeneratedPointCount descrevem o trabalho com caminhos, incluindo pontos intermediários de recorte; MaskedImageCount, ScannedPixelCount, MaskedPixelCount e PixelIntersectionTestCount descrevem o trabalho com imagens
FragmentCount conta objetos de substituição, e não contornos de polígonos nem pixels, e GeometryOperationCount acumula o trabalho limitado dos auxiliares; um relatório deixado por uma exceção pode descrever trabalho parcial na cópia da transação descartada
ValidateDetailedRedactionSource inspeciona objetos ativos e conteúdo decodificado antes da mutação; TPdf.SaveAsRedacted o invoca para cada perfil, incluindo a remoção de objetos inteiros e o perfil parcial mais simples
/ActualText e /Alt, XFA e semântica de optional content, incluindo /OCProperties, /OCG e /OCMD, são rejeitadasTr desconhecido, e pintura com pattern ou espaço de cor especial via scn/SCN são rejeitados/FlateDecode; a decodificação é limitada a 32 MiB por stream de conteúdo e 64 MiB no totalO perfil atual não reconstrói a estrutura de Tagged PDF, não preserva transparência arbitrária, não suporta strokes ou recortes arbitrários nem promete preservação sem perdas de imagens codificadas; a saída segura exige a remoção dos streams originais e dos recursos não usados após a regeneração, como feito pelo TPdf.SaveAsRedacted
Quem chamar diretamente deve fornecer uma cópia isolada do documento, validar capacidades nativas e orçamentos finitos positivos, descartar a cópia em caso de falha, regenerar o conteúdo das páginas modificadas e completar a sanitização e a poda de recursos antes de exportar