procedure LoadCustomDocument(AStream: TStream; AOwnsStream: Boolean = False);
procedure LoadCustomDocument(AStream: TStream; AOwnsStream: Boolean; const Options: TPdfLoadOptions; out Report: TPdfLoadReport);
LoadCustomDocument — потоковый аналог буферизованных перегрузок LoadDocument. Он опирается на точку входа PDFium FPDF_LoadCustomDocument через вспомогательный класс TPdfStreamAdapter, появившийся в v1.8.0. PDFium извлекает блоки из AStream только по мере необходимости, поэтому поток не копируется в память: TFileStream поверх PDF на 4 ГБ, TStream поверх HTTP или поток BLOB из базы данных становятся пригодны к работе без предварительного размещения всего содержимого в RAM
AStream должен поддерживать позиционирование. Его время жизни должно простираться до закрытия документа (вызовите UnloadDocument или верните Active в False). Передайте AOwnsStream = True, чтобы отдать владение потоком этому TPdf — тогда адаптер освободит AStream при выполнении UnloadDocument. Передайте False, если вызывающая сторона хочет сохранить поток живым после закрытия документа
LoadCustomDocument намеренно сделан отдельным методом (а не ещё одной перегрузкой LoadDocument), чтобы вызывающий код, передающий подкласс TMemoryStream, не смог случайно привязаться к буферизованной перегрузке LoadDocument(TMemoryStream, Boolean) — форма аргументов в Pascal совпадает, но семантика совершенно разная (буферизация против чтения по запросу)
Перегрузка с политикой применяет то же совместимое, строгое или восстановительное поведение и ограниченный аудит xref, что задокументированы в LoadDocument. Аудит использует позиционные чтения и восстанавливает курсор источника, прежде чем PDFium продолжит доступ по запросу
TPdfLoadOptions несёт Mode, AuditByteLimit, MaxIssues, MaxXrefSections, MaxXrefEntries, MaxObjectNumber, ValidateObjectOffsets и RequireFinalEndOfFileMarker, а также классовую функцию Default
Password до вызова LoadCustomDocumentAStream — это может быть 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;