function SaveAsSanitised(Stream: TStream;
const Options: TPdfSanitiseOptions;
out Report: TPdfSanitiseReport): Boolean; overload;
function SaveAsSanitised(const FileName: string;
const Options: TPdfSanitiseOptions;
out Report: TPdfSanitiseReport): Boolean; overload;
SaveAsSanitised produce una copia PDF saneada de una sola revisión que elimina los vectores de contenido activo del catálogo del documento y luego ejecuta opcionalmente una poda de alcanzabilidad para eliminar los objetos huérfanos del cuerpo del archivo
La canalización de dos etapas elimina primero las entradas del
catálogo (/OpenAction, /AA,
/Names, /AF,
/AcroForm, /Metadata) mediante
StripDictionaryEntries como actualización incremental,
y luego ejecuta PruneUnreachablePdfStream para
reescribir el archivo como una única revisión clásica limpia
La actualización del catálogo y el trailer usa búsqueda xref dispersa, ventanas de análisis de como máximo 1 MiB y copia de rangos de 64 KiB en la ruta xref normal en lugar de materializar el PDF guardado completo en un solo arreglo de bytes
Cuando la poda está habilitada, el área de trabajo intermedia
es un TPdfRandomAccessStore gobernado por
SaveMemoryLimit y SaveTemporaryDirectory.
Su memoria máxima y su estado de desbordamiento se incluyen en
LastSaveLargestMemoryBuffer y
LastSaveSpillCount
Cada marca de eliminación es independiente.
TPdfSanitiseOptions.Default habilita el perfil de
seguridad completo: StripOpenAction,
StripCatalogActions, StripNames,
StripAssociatedFiles, más la poda
RemoveUnreachable. StripAcroForm
y StripMetadata son False de forma
predeterminada porque eliminan campos de formulario y metadatos
que los llamadores pueden querer conservar
La salida siempre es una única revisión sin historial
incremental cuando RemoveUnreachable=True
Options — registro TPdfSanitiseOptions; use Default para el perfil de seguridad estándarReport — recibe el conteo de entradas eliminadas, el conteo de objetos podados, los conteos de bytes y cualquier errorStripNames elimina el diccionario /Names completo, incluidos /JavaScript, /EmbeddedFiles, /Dests y /AP; esto es deliberadamente agresivo para el saneamientoStripAssociatedFiles elimina la entrada /AF a nivel de catálogo y su valor predeterminado es TrueStripMetadata elimina tanto el /Metadata del catálogo (XMP) como el /Info del trailer/AA y /A por anotación no se eliminan en este método; solo se elimina el contenido activo a nivel de catálogoTryReadTrailerInfo subyacente/AcroForm elimina los campos de firma e invalida las firmas existentes
var
Options: TPdfSanitiseOptions;
Report: TPdfSanitiseReport;
begin
Pdf1.FileName := 'C:\Untrusted.pdf';
Pdf1.Active := True;
Options := TPdfSanitiseOptions.Default;
Pdf1.SaveAsSanitised('C:\Sanitised.pdf', Options, Report);
end;