const PdfDefaultStorageMemoryLimit = 64 * 1024 * 1024;
type TPdfStorageBackend = (psbMemory, psbTemporaryFile);
constructor TPdfRandomAccessStore.Create(AMemoryLimit: Int64 = PdfDefaultStorageMemoryLimit; const ATemporaryDirectory: string = '');
destructor Destroy; override;
function Read(var Buffer; Count: Longint): Longint; override;
function Seek(Offset: Int64; Origin: TSeekOrigin): Int64; override;
function Write(const Buffer; Count: Longint): Longint; override;
function ReadAt(Offset: Int64; var Buffer; Count: Longint): Longint;
function WriteAt(Offset: Int64; const Buffer; Count: Longint): Longint;
procedure CopyToStream(Destination: TStream; BufferSize: Integer = 1048576);
procedure Flush;
procedure SpillToDisk;
property Backend: TPdfStorageBackend;
property MemoryBytes: Int64;
property MemoryLimit: Int64;
property PeakMemoryBytes: Int64;
property Spilled: Boolean;
property TemporaryDirectory: string;
property TemporaryFileName: string;
property SaveMemoryLimit: Int64;
property SaveTemporaryDirectory: string;
property LastSaveSpillCount: Integer;
property LastSaveLargestMemoryBuffer: Int64;
| SaveMemoryLimit | Didžiausia kiekvienos vidinės įrašymo saugyklos pareminės atminties talpa, kol ji perpilama; numatytoji — 64 MiB |
| SaveTemporaryDirectory | Esamas katalogas, kuriame laikomi perpilti failai; tuščia reikšmė naudoja proceso laikinąjį katalogą |
| LastSaveSpillCount | Vidinių darbinių saugyklų, perpiltų paskutinės įrašymo grandinės metu, skaičius |
| LastSaveLargestMemoryBuffer | Didžiausia viena pareminės atminties talpa, užfiksuota paskutinės įrašymo grandinės metu |
TPdfRandomAccessStore kildinamas iš TStream ir, be nuo žymeklio nepriklausomų pozicinių įvedimo-išvedimo operacijų, palaiko įprastus nuoseklius skaitymus, rašymus, pozicionavimą ir dydžio keitimą
Duomenys lieka dinamiškai didinamame atminties buferyje, kol jo loginė pabaiga nesiekia MemoryLimit arba yra lygi jam
Pirma operacija, peržengianti ribą, sukuria išskirtinį laikinąjį failą, vieną kartą nukopijuoja esamus baitus, išvalo atminties buferį ir likusiam saugyklos gyvavimo laikui palieka failo galinę sistemą
Laikinoji rankena naudoja trynimo uždarant ir atsitiktinės prieigos požymius, neleidžia jokio bendrinimo ir pašalinama normaliai sunaikinant arba atšaukus konstruktorių
Atskiros operacijos nuoseklinamos vidine kritine sekcija; ReadAt ir WriteAt pageidautinos, kai lygiagretūs kreipėjai neturi varžytis dėl nuosekliojo žymeklio
Saugyklą galima perduoti tiesiogiai LoadCustomDocument; PDFium blokų atgaliniai iškvietimai naudoja pozicinius skaitymus ir nekeičia saugyklos žymeklio
TPdf sukonfigūruotą politiką taiko pagrindiniams įrašymams, kiekvienai įrašyto PDF tolesnio apdorojimo darbinei erdvei ir tarpinei standartų konversijai, tikrinimui, šifravimui, DSS bei PAdES paruošimui
Natyvus prieauginis xref srauto remontas skaito fiksuoto dydžio uodegos ir žodynų langus, o tada, kopijuodamas nepakeistus intervalus apribotais gabalais, taiko patikrintus redagavimus
MemoryBytes praneša pareminio buferio talpą, o ne loginį turinio dydįPeakMemoryBytes niekada neviršija MemoryLimitLastSaveLargestMemoryBuffer yra didžiausia atskira vidinė saugykla, o ne vienu metu aktyvių saugyklų sumaTBytes, kuriuos vis dar sukuria konkretus analizatorius, glaudintuvas, tikrintuvas ar pasirašytojasMemoryLimit turi būti tarp nulio ir High(Integer)FPDF_FILEACCESS ABI išlaiko savo 4 GiB failo ilgio ribą, net kai pati pareminė saugykla turi didesnį Int64 dydįTemporaryFileName yra tik diagnostinis; gyvasis failas atveriamas išskirtinai ir kreipėjas jo negali atverti pakartotinai
var
Store: TPdfRandomAccessStore;
begin
Pdf.SaveMemoryLimit := 16 * 1024 * 1024;
Pdf.SaveTemporaryDirectory := TPath.GetTempPath;
Pdf.SaveAs('output.pdf');
Log(Pdf.LastSaveSpillCount, Pdf.LastSaveLargestMemoryBuffer);
Store := TPdfRandomAccessStore.Create(4 * 1024 * 1024);
try
Store.CopyFrom(SourceStream, SourceStream.Size);
Store.Position := 0;
Pdf.LoadCustomDocument(Store, False);
finally
Pdf.Active := False;
Store.Free;
end;
end;