function SaveAsPdfAToStream(Stream: TStream; const Options: TPdfASaveOptions): Boolean;
SaveAsPdfAToStream — потоковый аналог SaveAsPdfA —
создаёт тот же вывод PDF/A-1b, но записывает результат в любой
поддерживающий позиционирование TStream, предоставленный вызывающим,
вместо использования временного файла. Полезно для конвейеров
загрузки по HTTP, столбцов BLOB, слоёв кэша в памяти, архивных
контейнеров (ZIP / TAR) или любого рабочего процесса, где байты PDF/A
не должны попадать на диск
Логика постобработки идентична SaveAsPdfA(FileName, Options):
сначала выполняется базовый SaveAs, затем инкрементное обновление внедряет
поток метаданных XMP (который преобразует Information-словарь документа
в форму XMP согласно ISO 19005-1 6.7.3 / Cor.1 Table 1 и встраивает описание
схемы расширения pdfaid, требуемое 6.7.8), OutputIntent со ссылкой на
встроенный профиль ICC (по умолчанию sRGB, пользовательский через
Options.IccProfileData), обновление каталога, связывающее их
вместе, и массив /ID трейлера, требуемый 6.1.3. Пустые поля
Options автоматически заполняются из FPDF_GetMetaText и
FPDF_GetFileIdentifier, поэтому типичному вызывающему достаточно
задать только Conformance
Возвращает True в случае успеха. Выходной поток остаётся в
позиции после последнего записанного байта. Возвращает False,
если базовый SaveAs завершился неудачей или если постобработку PDF/A не
удалось прикрепить (обычно потому, что исходный PDF был зашифрован, что PDF/A
запрещает)
Write и Seek — подойдёт TMemoryStream, TFileStream или любой подкласс, поддерживающий обаSaveAsPdfAToStream не сохраняется, если в потоке есть данные после текущей позиции; функция не предполагает семантику перемотки в конецMemory + Size HTTP-клиенту напрямуюsaRemoveSecurity
var
Stream: TMemoryStream;
Opts: TPdfASaveOptions;
begin
Stream := TMemoryStream.Create;
try
Opts := Default(TPdfASaveOptions);
Opts.Conformance := pac1b;
if Pdf1.SaveAsPdfAToStream(Stream, Opts) then
begin
Stream.Position := 0;
UploadToArchive(Stream);
end;
finally
Stream.Free;
end;
end;