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 создаёт очищенную копию PDF с одной ревизией, удаляющую векторы активного содержимого из каталога документа, а затем опционально выполняет обрезку по достижимости, устраняющую осиротевшие объекты из тела файла
Двухэтапный конвейер сначала вырезает записи каталога
(/OpenAction, /AA, /Names,
/AF,
/AcroForm, /Metadata) через
StripDictionaryEntries в виде инкрементального обновления, затем
запускает PruneUnreachablePdfStream, который перезаписывает файл
как одну чистую классическую ревизию
Обновление каталога и trailer использует разреженный поиск по xref, окна парсера не крупнее 1 МиБ и копирование диапазонами по 64 КиБ на обычном пути xref вместо материализации всего сохраняемого PDF в одном массиве байтов
Когда обрезка включена, промежуточное рабочее пространство — это
TPdfRandomAccessStore, управляемый
SaveMemoryLimit и SaveTemporaryDirectory
Его пиковая память и состояние переноса на диск учитываются в
LastSaveLargestMemoryBuffer и
LastSaveSpillCount
Каждый флаг вырезания независим
TPdfSanitiseOptions.Default включает полный профиль
безопасности: StripOpenAction,
StripCatalogActions, StripNames,
StripAssociatedFiles плюс обрезка
RemoveUnreachable. StripAcroForm
и StripMetadata по умолчанию False,
поскольку они удаляют поля форм и метаданные, которые вызывающий код
может хотеть сохранить
Вывод всегда является единственной ревизией без инкрементальной
истории, когда RemoveUnreachable=True
Options — запись TPdfSanitiseOptions; используйте Default для стандартного профиля безопасностиReport — получает количество вырезанных записей, количество обрезанных объектов, счётчики байтов и любую ошибкуStripNames удаляет весь словарь /Names, включая /JavaScript, /EmbeddedFiles, /Dests и /AP; это намеренно агрессивная мера для очисткиStripAssociatedFiles удаляет запись /AF уровня каталога и по умолчанию TrueStripMetadata удаляет и каталоговый /Metadata (XMP), и /Info в trailer/AA и /A на уровне отдельных аннотаций этим методом не вырезаются; удаляется только активное содержимое уровня каталогаTryReadTrailerInfo в основе/AcroForm удаляет поля подписи и делает существующие подписи недействительными
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;