procedure LoadCustomDocument(AStream: TStream; AOwnsStream: Boolean = False);
LoadCustomDocument은 buffered LoadDocument overload에 대한 streaming 대응입니다. 이는 v1.8.0에서 도입된 TPdfStreamAdapter helper class를 통해 PDFium의 FPDF_LoadCustomDocument entry point에 연결됩니다. PDFium은 필요할 때만 AStream에서 block을 가져오므로 stream을 메모리로 복사하지 않습니다: 4 GB PDF를 담은 TFileStream, HTTP 기반 TStream, database BLOB stream도 전체 payload를 먼저 RAM에 올리지 않고 사용할 수 있습니다
AStream은 seeking을 지원해야 합니다. lifetime은 document가 닫힐 때까지 이어져야 합니다(UnloadDocument를 호출하거나 Active를 다시 False로 설정하세요). AOwnsStream = True를 넘기면 stream ownership을 이 TPdf에 넘기게 되며 — 그러면 adapter가 UnloadDocument가 실행될 때 AStream을 해제합니다. document가 닫힌 뒤에도 caller가 stream을 살려 두고 싶다면 False를 넘기세요
LoadCustomDocument은 일부러 별도 method이며 다른 LoadDocument overload가 아닙니다. 그래야 TMemoryStream 파생형을 넘기는 caller가 buffered LoadDocument(TMemoryStream, Boolean) overload에 실수로 바인드되는 일을 막을 수 있습니다. Pascal argument shape는 같지만 의미는 매우 다릅니다(buffered vs. on-demand)
LoadCustomDocument를 호출하기 전에 Password를 설정하세요AStream에 대해서는 TPdf가 아무 가정도 하지 않습니다 — Seek와 Read를 따르는 TFileStream, TMemoryStream 또는 어떤 TStream subclass도 될 수 있습니다TPdf가 해제하기 전에 stream을 닫거나 해제하면 PDFium 수준에서 undefined behaviour가 발생합니다. 확실하지 않으면 AOwnsStream = True로 ownership을 넘기세요
// stream ownership을 Pdf1에 넘기는 streaming load
var
Stream: TFileStream;
begin
Stream := TFileStream.Create('C:\Huge.pdf', fmOpenRead or fmShareDenyWrite);
Pdf1.LoadCustomDocument(Stream, True); // Pdf1이 UnloadDocument 시 Stream을 해제합니다
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;