procedure LoadCustomDocument(AStream: TStream; AOwnsStream: Boolean = False);
LoadCustomDocument — streaming counterpart buffered overloads LoadDocument. Он основан на точке входа PDFium FPDF_LoadCustomDocument через helper class TPdfStreamAdapter, введенный в v1.8.0. PDFium забирает блоки из AStream только когда они нужны, поэтому stream не копируется в memory: TFileStream поверх PDF на 4 GB, HTTP-backed TStream или database BLOB stream становятся пригодными без предварительной раскладки всего payload в RAM
AStream должен поддерживать seeking. Его lifetime должен длиться до закрытия документа (вызовите UnloadDocument или верните Active в False). Передайте AOwnsStream = True, чтобы передать ownership stream этому TPdf — тогда adapter освобождает AStream, когда выполняется UnloadDocument. Передавайте False, когда вызывающий код хочет сохранить stream живым после закрытия документа
LoadCustomDocument намеренно является отдельным методом, а не еще одной overload LoadDocument, чтобы вызывающие коды, передающие подкласс TMemoryStream, случайно не связались с buffered overload LoadDocument(TMemoryStream, Boolean) — форма аргументов в Pascal одинакова, но semantics очень разные (buffered vs. on-demand)
PasswordAStream — это может быть TFileStream, TMemoryStream или любой подкласс TStream, который соблюдает Seek и ReadAOwnsStream = True
// Streaming load with stream ownership transferred to Pdf1
var
Stream: TFileStream;
begin
Stream := TFileStream.Create('C:\Huge.pdf', fmOpenRead or fmShareDenyWrite);
Pdf1.LoadCustomDocument(Stream, True); // Pdf1 frees Stream on UnloadDocument
Pdf1.Active := True;
ShowMessage('Pages: ' + IntToStr(Pdf1.PageCount));
end;
// Externally-owned stream — caller frees it after UnloadDocument
var
Stream: TFileStream;
begin
Stream := TFileStream.Create('C:\Live.pdf', fmOpenRead or fmShareDenyNone);
try
Pdf1.LoadCustomDocument(Stream, False);
Pdf1.Active := True;
DoWork;
Pdf1.Active := False;
finally
Stream.Free;
end;
end;