procedure LoadCustomDocument(AStream: TStream; AOwnsStream: Boolean = False);
procedure LoadCustomDocument(AStream: TStream; AOwnsStream: Boolean; const Options: TPdfLoadOptions; out Report: TPdfLoadReport);
LoadCustomDocument é a contraparte em streaming das sobrecargas
LoadDocument em buffer. Ele é implementado sobre o ponto
de entrada FPDF_LoadCustomDocument do PDFium por meio da
classe auxiliar TPdfStreamAdapter introduzida na v1.8.0.
O PDFium puxa blocos de AStream apenas quando necessário,
de modo que o stream não é copiado para a memória: um
TFileStream sobre um PDF de 4 GB, um TStream sobre HTTP ou um stream de
BLOB de banco de dados tornam-se utilizáveis sem estagiar todo o
conteúdo na RAM primeiro
O AStream deve suportar busca (seek). Seu tempo de vida
deve se estender até que o documento seja fechado (chame
UnloadDocument ou retorne
Active para False). Passe
AOwnsStream = True para transferir a propriedade do stream
para este TPdf — o adaptador então libera
AStream quando UnloadDocument é executado.
Passe False quando quem chama quiser manter o stream
vivo depois que o documento fechar
LoadCustomDocument é intencionalmente um método separado (não outra
sobrecarga de LoadDocument) para que quem chama passando uma subclasse
de TMemoryStream não se vincule acidentalmente à
sobrecarga em buffer LoadDocument(TMemoryStream, Boolean)
— a forma dos argumentos Pascal é idêntica, mas a semântica é
muito diferente (em buffer vs. sob demanda)
A sobrecarga com políticas aplica o mesmo comportamento compatível, estrito ou de recuperação e a mesma auditoria limitada de xref documentada por LoadDocument. A auditoria usa leituras posicionadas e restaura o cursor da origem antes que o PDFium continue seu acesso sob demanda
TPdfLoadOptions carrega Mode, AuditByteLimit, MaxIssues, MaxXrefSections, MaxXrefEntries, MaxObjectNumber, ValidateObjectOffsets e RequireFinalEndOfFileMarker, além da função de classe Default
Password antes de chamar LoadCustomDocument ao abrir documentos criptografadosAStream — ele pode ser um TFileStream, um TMemoryStream ou qualquer subclasse de TStream que honre Seek e 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;