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 revisión única 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 primero elimina las entradas del catálogo
(/OpenAction, /AA, /Names,
/AF,
/AcroForm, /Metadata) mediante
StripDictionaryEntries como actualización incremental, y después
ejecuta PruneUnreachablePdfStream para reescribir el archivo como
una única revisión clásica limpia
La actualización del catálogo y del 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 una sola matriz de bytes
Cuando la poda está habilitada, el espacio de trabajo intermedio es un
TPdfRandomAccessStore gobernado por
SaveMemoryLimit y SaveTemporaryDirectory
Su memoria máxima y su estado de vuelco 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 toman False de forma predeterminada
porque eliminan campos de formulario y metadatos que los llamadores pueden
querer conservar
La salida es siempre una única revisión sin historial incremental
cuando RemoveUnreachable=True
Options — registro TPdfSanitiseOptions; use Default para el perfil de seguridad estándarReport — recibe el número de entradas eliminadas, el número de objetos podados, los recuentos de bytes y cualquier errorStripNames elimina todo el diccionario /Names, incluidos /JavaScript, /EmbeddedFiles, /Dests y /AP; esto es intencionadamente agresivo para el saneadoStripAssociatedFiles elimina la entrada /AF a nivel de catálogo y toma True de forma predeterminadaStripMetadata 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/AcroForm suprime 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;