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 | Največja zmogljivost rezervnega pomnilnika posamezne notranje shrambe za shranjevanje, preden ta preliva; privzeto 64 MiB |
| SaveTemporaryDirectory | Obstoječa mapa za prelivalne datoteke; prazna vrednost uporabi začasno mapo procesa |
| LastSaveSpillCount | Število notranjih delovnih shramb, ki so se prelile v najbolj nedavnem shranjevalnem cevovodu |
| LastSaveLargestMemoryBuffer | Največja posamezna zmogljivost rezervnega pomnilnika, opažena v najbolj nedavnem shranjevalnem cevovodu |
TPdfRandomAccessStore izhaja iz TStream in poleg pozicioniranega V/I, neodvisnega od kazalca, podpira običajno zaporedno branje, pisanje, premike in določanje velikosti
Podatki ostanejo v dinamično velikostnem pomnilniškem medpomnilniku, dokler je njihov logični konec na MemoryLimit ali pod njim
Prva operacija, ki prečka mejo, ustvari izključno začasno datoteko, enkrat prekopira obstoječe bajte, počisti pomnilniški medpomnilnik in za preostanek življenjske dobe shrambe obdrži datotečno zaledje
Začasen handle uporablja zastavici delete-on-close in naključnega dostopa, ne dopušča skupne rabe in se odstrani ob običajnem uničenju ali povrnitvi konstruktorja
Posamezne operacije serializira notranji kritični razdelek; ReadAt in WriteAt so prednostne, kadar si sočasni klicatelji ne smejo tekmovati za zaporedni kazalec
Shrambo je mogoče podati neposredno v LoadCustomDocument; blokovski povratni klici PDFium uporabljajo pozicionirana branja in ne spremenijo kazalca shrambe
TPdf nastavljeno politiko uporabi za osnovna shranjevanja, vsak delovni prostor poobdelave shranjenega dokumenta PDF in vmesne priprave za pretvorbe standardov, preverjanje, šifriranje, DSS in PAdES
Izvorno popravilo inkrementalnih xref tokov prebere okni repa in slovarja fiksne velikosti, nato pa uveljavi preverjene spremembe, medtem ko kopira nespremenjene obsege v omejenih kosih
MemoryBytes poroča zmogljivost rezervnega medpomnilnika in ne logične velikosti vsebinePeakMemoryBytes nikoli ne preseže MemoryLimitLastSaveLargestMemoryBuffer je največja posamezna notranja shramba, ne vsota hkrati dejavnih shrambTBytes, ki jih še ustvarjajo posamezni razčlenjevalniki, stiskalniki, validatorji ali podpisnikiMemoryLimit mora biti med nič in High(Integer)FPDF_FILEACCESS v sistemih Windows ohrani svojo omejitev dolžine datoteke 4 GiB, tudi kadar ima rezervna shramba sama večjo velikost Int64TemporaryFileName je samo diagnostičen; dejavna datoteka je odprta izključno in je klicatelj ne sme znova odpreti
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;